From 6a100691a07fdad2c6df5e890c13aadf9e6dfd33 Mon Sep 17 00:00:00 2001 From: shaojun Date: Tue, 3 Sep 2019 09:35:11 +0800 Subject: [PATCH] feat(shutdown):change shutdown ui --- interfaces/constants.h | 6 ++ plugins/shutdown/pluginwidget.cpp | 101 ++++++++++++++++++++++++++---- plugins/shutdown/pluginwidget.h | 11 +++- 3 files changed, 105 insertions(+), 13 deletions(-) diff --git a/interfaces/constants.h b/interfaces/constants.h index bb25f0362..c85ecce3d 100644 --- a/interfaces/constants.h +++ b/interfaces/constants.h @@ -30,6 +30,12 @@ namespace Dock { #define DOCK_PLUGIN_API_VERSION "1.2.1" #define PROP_DISPLAY_MODE "DisplayMode" + +#define PLUGIN_BACKGROUND_MAX_SIZE 40 +#define PLUGIN_BACKGROUND_MIN_SIZE 20 + +#define PLUGIN_ICON_MAX_SIZE 20 +#define PLUGIN_ICON_MIN_SIZE 17 /// /// \brief The DisplayMode enum /// spec dock display mode diff --git a/plugins/shutdown/pluginwidget.cpp b/plugins/shutdown/pluginwidget.cpp index 7a8bd7852..1e8c25456 100644 --- a/plugins/shutdown/pluginwidget.cpp +++ b/plugins/shutdown/pluginwidget.cpp @@ -27,14 +27,23 @@ #include #include +#include + +DWIDGET_USE_NAMESPACE; + PluginWidget::PluginWidget(QWidget *parent) : QWidget(parent) + , m_hover(false) + , m_pressed(false) { + setMouseTracking(true); + setMinimumSize(PLUGIN_ICON_MIN_SIZE, PLUGIN_ICON_MIN_SIZE); + setMaximumSize(PLUGIN_BACKGROUND_MAX_SIZE, PLUGIN_BACKGROUND_MAX_SIZE); } QSize PluginWidget::sizeHint() const { - return QSize(26, 26); + return QSize(PLUGIN_ICON_MIN_SIZE, PLUGIN_ICON_MIN_SIZE); } void PluginWidget::paintEvent(QPaintEvent *e) @@ -44,18 +53,39 @@ void PluginWidget::paintEvent(QPaintEvent *e) QPixmap pixmap; QString iconName = "system-shutdown"; int iconSize; - const Dock::DisplayMode displayMode = qApp->property(PROP_DISPLAY_MODE).value(); - - if (displayMode == Dock::Efficient) { - iconName = iconName + "-symbolic"; - iconSize = 16; - } else { - iconSize = std::min(width(), height()) * 0.8; - } - - pixmap = loadSvg(iconName, QSize(iconSize, iconSize)); QPainter painter(this); + + QColor color = QColor::fromRgb(40, 40, 40);; + + if (m_hover) { + color = QColor::fromRgb(60, 60, 60); + } + + if (m_pressed) { + color = QColor::fromRgb(20, 20, 20); + } + + if (rect().height() > PLUGIN_BACKGROUND_MIN_SIZE) { + painter.setRenderHint(QPainter::Antialiasing, true); + painter.setOpacity(0.5); + + DStyleHelper dstyle(style()); + const int radius = dstyle.pixelMetric(DStyle::PM_FrameRadius); + + QPainterPath path; + path.addRoundedRect(rect(), radius, radius); + painter.fillPath(path, color); + + iconSize = PLUGIN_ICON_MAX_SIZE; + } else { + iconSize = PLUGIN_ICON_MIN_SIZE; + iconName = iconName + "-symbolic"; + } + + painter.setOpacity(1); + + pixmap = loadSvg(iconName, QSize(iconSize, iconSize)); painter.drawPixmap(rect().center() - pixmap.rect().center() / devicePixelRatioF(), pixmap); } @@ -69,3 +99,52 @@ const QPixmap PluginWidget::loadSvg(const QString &fileName, const QSize &size) return pixmap; } + +void PluginWidget::mousePressEvent(QMouseEvent *event) +{ + m_pressed = true; + update(); + + QWidget::mousePressEvent(event); +} + +void PluginWidget::mouseReleaseEvent(QMouseEvent *event) +{ + m_pressed = false; + m_hover = false; + update(); + + QWidget::mouseReleaseEvent(event); +} + +void PluginWidget::mouseMoveEvent(QMouseEvent *event) +{ + m_hover = true; + QWidget::mouseMoveEvent(event); +} + +void PluginWidget::leaveEvent(QEvent *event) +{ + if (!rect().contains(mapFromGlobal(QCursor::pos()))) { + m_hover = false; + m_pressed = false; + update(); + } + + QWidget::leaveEvent(event); +} + +void PluginWidget::resizeEvent(QResizeEvent *event) +{ + const Dock::Position position = qApp->property(PROP_POSITION).value(); + // 保持横纵比 + if (position == Dock::Bottom || position == Dock::Top) { + setMinimumWidth(height()); + setMinimumHeight(PLUGIN_ICON_MIN_SIZE); + } else { + setMinimumWidth(PLUGIN_ICON_MIN_SIZE); + setMinimumHeight(width()); + } + + QWidget::resizeEvent(event); +} diff --git a/plugins/shutdown/pluginwidget.h b/plugins/shutdown/pluginwidget.h index 01dd2053c..e6f5cdf7e 100644 --- a/plugins/shutdown/pluginwidget.h +++ b/plugins/shutdown/pluginwidget.h @@ -34,14 +34,21 @@ public: explicit PluginWidget(QWidget *parent = 0); protected: - QSize sizeHint() const; - void paintEvent(QPaintEvent *e); + QSize sizeHint() const override; + void paintEvent(QPaintEvent *e) override; + void mousePressEvent(QMouseEvent *event) override; + void mouseReleaseEvent(QMouseEvent *event) override; + void mouseMoveEvent(QMouseEvent *event) override; + void leaveEvent(QEvent *event) override; + void resizeEvent(QResizeEvent *event) override; private: const QPixmap loadSvg(const QString &fileName, const QSize &size) const; private: Dock::DisplayMode m_displayMode; + bool m_hover; + bool m_pressed; }; #endif // PLUGINWIDGET_H