From b04b9bb6d2698df4a7e4443f477df24140def9d7 Mon Sep 17 00:00:00 2001 From: zhaolong Date: Sat, 13 Jun 2020 12:44:54 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=8A=B6=E6=80=81=E5=9B=BE=E6=A0=87?= =?UTF-8?q?=E9=A2=9C=E8=89=B2=E5=8F=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将状态图标由SVG图标换为自定义绘制控件,该控件可随系统活动主题色变化而变化 Log: 修复网络,蓝牙插件设备状态图标颜色不会随系统活动色变化而变化的问题 Bug: https://pms.uniontech.com/zentao/bug-view-31253.html --- frame/util/imageutil.h | 1 + frame/util/statebutton.cpp | 86 +++++++++++ frame/util/statebutton.h | 37 +++++ plugins/bluetooth/CMakeLists.txt | 4 +- plugins/bluetooth/bluetoothapplet.cpp | 22 +-- plugins/bluetooth/bluetoothitem.cpp | 18 +-- plugins/bluetooth/componments/adapteritem.cpp | 72 ++++----- .../bluetooth/componments/adaptersmanager.cpp | 24 +-- plugins/bluetooth/componments/deviceitem.cpp | 98 +++++------- plugins/bluetooth/componments/deviceitem.h | 6 +- plugins/network/CMakeLists.txt | 4 +- .../network/item/applet/accesspointwidget.cpp | 44 +----- .../network/item/applet/accesspointwidget.h | 7 +- plugins/network/item/wireditem.cpp | 142 +++++++----------- plugins/network/item/wireditem.h | 39 +---- 15 files changed, 302 insertions(+), 302 deletions(-) create mode 100644 frame/util/statebutton.cpp create mode 100644 frame/util/statebutton.h diff --git a/frame/util/imageutil.h b/frame/util/imageutil.h index ec986808c..e357d6983 100644 --- a/frame/util/imageutil.h +++ b/frame/util/imageutil.h @@ -22,6 +22,7 @@ #ifndef IMAGEUTIL_H #define IMAGEUTIL_H +#include #include #include diff --git a/frame/util/statebutton.cpp b/frame/util/statebutton.cpp new file mode 100644 index 000000000..690569860 --- /dev/null +++ b/frame/util/statebutton.cpp @@ -0,0 +1,86 @@ +#include "statebutton.h" + +#include +#include +#include + +StateButton::StateButton(QWidget *parent) + : QWidget(parent) +{ + setAttribute(Qt::WA_TranslucentBackground, true); +} + +void StateButton::setType(StateButton::Type type) +{ + m_type = type; + update(); +} + +void StateButton::paintEvent(QPaintEvent *event) +{ + QWidget::paintEvent(event); + QPainter painter(this); + painter.setRenderHint(QPainter::Antialiasing, true); + + int radius = qMin(width(), height()); + painter.setPen(QPen(Qt::NoPen)); + painter.setBrush(palette().color(QPalette::Highlight)); + painter.drawPie(rect(), 0, 360 * 16); + + QPen pen(palette().color(QPalette::Text), radius / 100.0 * 6.20, Qt::SolidLine, Qt::SquareCap, Qt::MiterJoin); + switch (m_type) { + case Check: drawCheck(painter, pen, radius); break; + case Fork: drawFork(painter, pen, radius); break; + } +} + +void StateButton::mousePressEvent(QMouseEvent *event) +{ + QWidget::mousePressEvent(event); + emit click(); +} + +void StateButton::enterEvent(QEvent *event) +{ + QWidget::enterEvent(event); + setType(Fork); +} + +void StateButton::leaveEvent(QEvent *event) +{ + QWidget::leaveEvent(event); + setType(Check); +} + +void StateButton::drawCheck(QPainter &painter, QPen &pen, int radius) +{ + painter.setPen(pen); + + QPointF points[3] = { + QPointF(radius / 100.0 * 32, radius / 100.0 * 57), + QPointF(radius / 100.0 * 45, radius / 100.0 * 70), + QPointF(radius / 100.0 * 75, radius / 100.0 * 35) + }; + + painter.drawPolyline(points, 3); +} + +void StateButton::drawFork(QPainter &painter, QPen &pen, int radius) +{ + pen.setCapStyle(Qt::RoundCap); + painter.setPen(pen); + + QPointF pointsl[2] = { + QPointF(radius / 100.0 * 35, radius / 100.0 * 35), + QPointF(radius / 100.0 * 65, radius / 100.0 * 65) + }; + + painter.drawPolyline(pointsl, 2); + + QPointF pointsr[2] = { + QPointF(radius / 100.0 * 65, radius / 100.0 * 35), + QPointF(radius / 100.0 * 35, radius / 100.0 * 65) + }; + + painter.drawPolyline(pointsr, 2); +} diff --git a/frame/util/statebutton.h b/frame/util/statebutton.h new file mode 100644 index 000000000..9dbaec23b --- /dev/null +++ b/frame/util/statebutton.h @@ -0,0 +1,37 @@ +#ifndef STATEBUTTON_H +#define STATEBUTTON_H + +#include + +class StateButton : public QWidget +{ + Q_OBJECT + +public: + enum Type { + Check, + Fork + }; + +public: + explicit StateButton(QWidget *parent = nullptr); + void setType(Type type); + +signals: + void click(); + +protected: + void paintEvent(QPaintEvent *event) override; + void mousePressEvent(QMouseEvent *event) override; + void enterEvent(QEvent *event) override; + void leaveEvent(QEvent *event) override; + +private: + void drawCheck(QPainter &painter, QPen &pen, int radius); + void drawFork(QPainter &painter, QPen &pen, int radius); + +private: + Type m_type; +}; + +#endif // STATEBUTTON_H diff --git a/plugins/bluetooth/CMakeLists.txt b/plugins/bluetooth/CMakeLists.txt index 59f7cb91f..7cf605189 100644 --- a/plugins/bluetooth/CMakeLists.txt +++ b/plugins/bluetooth/CMakeLists.txt @@ -4,7 +4,9 @@ set(PLUGIN_NAME "bluetooth") project(${PLUGIN_NAME}) # Sources files -file(GLOB_RECURSE SRCS "*.h" "*.cpp" "../../widgets/*.h" "../../widgets/*.cpp" "../../frame/util/imageutil.h" "../../frame/util/imageutil.cpp") +file(GLOB_RECURSE SRCS "*.h" "*.cpp" "../../widgets/*.h" "../../widgets/*.cpp" + "../../frame/util/imageutil.h" "../../frame/util/imageutil.cpp" + "../../frame/util/statebutton.h" "../../frame/util/statebutton.cpp") find_package(PkgConfig REQUIRED) find_package(Qt5Widgets REQUIRED) diff --git a/plugins/bluetooth/bluetoothapplet.cpp b/plugins/bluetooth/bluetoothapplet.cpp index 1401239a8..1683cb39f 100644 --- a/plugins/bluetooth/bluetoothapplet.cpp +++ b/plugins/bluetooth/bluetoothapplet.cpp @@ -292,18 +292,18 @@ void BluetoothApplet::getDevieInitStatus(AdapterItem *item) } switch (deviceState) { - case Device::StateConnected: - emit deviceStateChanged(deviceState); - break; - case Device::StateUnavailable: - emit deviceStateChanged(otherDeviceState); - break; - case Device::StateAvailable: { - if (otherDeviceState != Device::StateConnected) + case Device::StateConnected: emit deviceStateChanged(deviceState); - else + break; + case Device::StateUnavailable: emit deviceStateChanged(otherDeviceState); - } - break; + break; + case Device::StateAvailable: { + if (otherDeviceState != Device::StateConnected) + emit deviceStateChanged(deviceState); + else + emit deviceStateChanged(otherDeviceState); + } + break; } } diff --git a/plugins/bluetooth/bluetoothitem.cpp b/plugins/bluetooth/bluetoothitem.cpp index 740a04e3a..90d4df57e 100644 --- a/plugins/bluetooth/bluetoothitem.cpp +++ b/plugins/bluetooth/bluetoothitem.cpp @@ -128,15 +128,15 @@ void BluetoothItem::refreshIcon() if (m_adapterPowered) { switch (m_devState) { - case Device::StateConnected: - stateString = "active"; - break; - case Device::StateAvailable: { - return ; - } - case Device::StateUnavailable: { - stateString = "disable"; - } break; + case Device::StateConnected: + stateString = "active"; + break; + case Device::StateAvailable: { + return ; + } + case Device::StateUnavailable: { + stateString = "disable"; + } break; } } else { stateString = "disable"; diff --git a/plugins/bluetooth/componments/adapteritem.cpp b/plugins/bluetooth/componments/adapteritem.cpp index 8c09036ed..c75dbe8c3 100644 --- a/plugins/bluetooth/componments/adapteritem.cpp +++ b/plugins/bluetooth/componments/adapteritem.cpp @@ -212,34 +212,34 @@ void AdapterItem::deviceChangeState(const Device::State state) DeviceItem *deviceItem = m_deviceItems.value(device->id()); if (deviceItem) { switch (state) { - case Device::StateUnavailable: { - int index = m_sortUnConnect.indexOf(deviceItem); - if (index < 0) { - m_sortConnected.removeOne(deviceItem); - m_sortUnConnect << deviceItem; - qSort(m_sortUnConnect); - moveDeviceItem(state, deviceItem); + case Device::StateUnavailable: { + int index = m_sortUnConnect.indexOf(deviceItem); + if (index < 0) { + m_sortConnected.removeOne(deviceItem); + m_sortUnConnect << deviceItem; + qSort(m_sortUnConnect); + moveDeviceItem(state, deviceItem); + } } - } - break; - case Device::StateAvailable: { - int index = m_sortUnConnect.indexOf(deviceItem); - if (index < 0) - m_sortConnected.removeOne(deviceItem); - else - m_sortUnConnect.removeOne(deviceItem); - } - break; - case Device::StateConnected: { - int index = m_sortConnected.indexOf(deviceItem); - if (index < 0) { - m_sortUnConnect.removeOne(deviceItem); - m_sortConnected << deviceItem; - qSort(m_sortConnected); - moveDeviceItem(state, deviceItem); + break; + case Device::StateAvailable: { + int index = m_sortUnConnect.indexOf(deviceItem); + if (index < 0) + m_sortConnected.removeOne(deviceItem); + else + m_sortUnConnect.removeOne(deviceItem); } - } - break; + break; + case Device::StateConnected: { + int index = m_sortConnected.indexOf(deviceItem); + if (index < 0) { + m_sortUnConnect.removeOne(deviceItem); + m_sortConnected << deviceItem; + qSort(m_sortConnected); + moveDeviceItem(state, deviceItem); + } + } + break; } } @@ -259,16 +259,16 @@ void AdapterItem::moveDeviceItem(Device::State state, DeviceItem *item) int size = m_sortConnected.size(); int index = 0; switch (state) { - case Device::StateUnavailable: - case Device::StateAvailable: { - index = m_sortUnConnect.indexOf(item); - index += size; - } - break; - case Device::StateConnected: { - index = m_sortUnConnect.indexOf(item); - } - break; + case Device::StateUnavailable: + case Device::StateAvailable: { + index = m_sortUnConnect.indexOf(item); + index += size; + } + break; + case Device::StateConnected: { + index = m_sortUnConnect.indexOf(item); + } + break; } index += 2; m_deviceLayout->removeWidget(item); diff --git a/plugins/bluetooth/componments/adaptersmanager.cpp b/plugins/bluetooth/componments/adaptersmanager.cpp index 9761a014a..f8d9a9c87 100644 --- a/plugins/bluetooth/componments/adaptersmanager.cpp +++ b/plugins/bluetooth/componments/adaptersmanager.cpp @@ -131,18 +131,18 @@ void AdaptersManager::connectDevice(Device *device) if (device) { QDBusObjectPath path(device->id()); switch (device->state()) { - case Device::StateUnavailable: { - m_bluetoothInter->ConnectDevice(path); - qDebug() << "connect to device: " << device->name(); - } - break; - case Device::StateAvailable: - break; - case Device::StateConnected: { - m_bluetoothInter->DisconnectDevice(path); - qDebug() << "disconnect device: " << device->name(); - } - break; + case Device::StateUnavailable: { + m_bluetoothInter->ConnectDevice(path); + qDebug() << "connect to device: " << device->name(); + } + break; + case Device::StateAvailable: + break; + case Device::StateConnected: { + m_bluetoothInter->DisconnectDevice(path); + qDebug() << "disconnect device: " << device->name(); + } + break; } } } diff --git a/plugins/bluetooth/componments/deviceitem.cpp b/plugins/bluetooth/componments/deviceitem.cpp index 517a274e9..b86cd376e 100644 --- a/plugins/bluetooth/componments/deviceitem.cpp +++ b/plugins/bluetooth/componments/deviceitem.cpp @@ -23,7 +23,8 @@ #include "deviceitem.h" #include "constants.h" #include "bluetoothconstants.h" -#include "../frame/util/imageutil.h" +#include "util/imageutil.h" +#include "util/statebutton.h" #include #include @@ -38,7 +39,7 @@ extern void initFontColor(QWidget *widget); DeviceItem::DeviceItem(Device *d, QWidget *parent) : QWidget(parent) , m_title(new QLabel(this)) - , m_state(new QLabel(this)) + , m_state(new StateButton(this)) , m_loadingStat(new DSpinner) , m_line(new HorizontalSeparator(this)) , m_typeIcon(new QLabel(this)) @@ -50,21 +51,17 @@ DeviceItem::DeviceItem(Device *d, QWidget *parent) QString iconPrefix; QString iconSuffix; switch (themeType) { - case DApplicationHelper::UnknownType: - case DApplicationHelper::LightType: { - iconPrefix = LIGHTICON; - iconSuffix = LIGHTICONSUFFIX; - m_stateSuffix = LIGHTSUFFIX; + case DApplicationHelper::UnknownType: + case DApplicationHelper::LightType: { + iconPrefix = LIGHTICON; + iconSuffix = LIGHTICONSUFFIX; + } + break; + case DApplicationHelper::DarkType: { + iconPrefix = DARKICON; + iconSuffix = DARKICONSUFFIX; + } } - break; - case DApplicationHelper::DarkType: { - iconPrefix = DARKICON; - m_stateSuffix = DARKSUFFIX; - iconSuffix = DARKICONSUFFIX; - } - } - - m_state->setPixmap(QPixmap(":/select" + m_stateSuffix)); QString iconString; if (!m_device->deviceType().isEmpty()) @@ -76,11 +73,14 @@ DeviceItem::DeviceItem(Device *d, QWidget *parent) themeChanged(DApplicationHelper::instance()->themeType()); + m_state->setType(StateButton::Check); + m_state->setFixedSize(PLUGIN_ICON_MAX_SIZE, PLUGIN_ICON_MAX_SIZE); + m_state->setVisible(false); + m_title->setText(nameDecorated(m_device->name())); initFontColor(m_title); m_line->setVisible(true); - m_state->setVisible(false); m_loadingStat->setFixedSize(20, 20); m_loadingStat->setVisible(false); @@ -123,52 +123,30 @@ void DeviceItem::mousePressEvent(QMouseEvent *event) QWidget::mousePressEvent(event); } -void DeviceItem::enterEvent(QEvent *event) -{ - QWidget::enterEvent(event); - if (m_device) { - if (Device::StateConnected == m_device->state()) { - m_state->setPixmap(QPixmap(":/disconnect" + m_stateSuffix)); - } - } -} - -void DeviceItem::leaveEvent(QEvent *event) -{ - QWidget::enterEvent(event); - if (m_device) { - if (Device::StateConnected == m_device->state()) { - m_state->setPixmap(QPixmap(":/select" + m_stateSuffix)); - } - } -} - void DeviceItem::changeState(const Device::State state) { switch (state) { - case Device::StateUnavailable: { - m_state->setPixmap(QPixmap(":/disconnect" + m_stateSuffix)); - m_state->setVisible(false); - m_loadingStat->stop(); - m_loadingStat->hide(); - m_loadingStat->setVisible(false); - } - break; - case Device::StateAvailable: { - m_state->setVisible(false); - m_loadingStat->start(); - m_loadingStat->show(); - m_loadingStat->setVisible(true); - } - break; - case Device::StateConnected: { - m_state->setPixmap(QPixmap(":/select" + m_stateSuffix)); - m_loadingStat->stop(); - m_loadingStat->hide(); - m_loadingStat->setVisible(false); - m_state->setVisible(true); - } - break; + case Device::StateUnavailable: { + m_state->setVisible(false); + m_loadingStat->stop(); + m_loadingStat->hide(); + m_loadingStat->setVisible(false); + } + break; + case Device::StateAvailable: { + m_state->setVisible(false); + m_loadingStat->start(); + m_loadingStat->show(); + m_loadingStat->setVisible(true); + } + break; + case Device::StateConnected: { + m_loadingStat->stop(); + m_loadingStat->hide(); + m_loadingStat->setVisible(false); + m_state->setVisible(true); + } + break; } } diff --git a/plugins/bluetooth/componments/deviceitem.h b/plugins/bluetooth/componments/deviceitem.h index 85e377491..d82467f85 100644 --- a/plugins/bluetooth/componments/deviceitem.h +++ b/plugins/bluetooth/componments/deviceitem.h @@ -31,6 +31,7 @@ DWIDGET_USE_NAMESPACE +class StateButton; class HorizontalSeparator; class DeviceItem : public QWidget { @@ -47,8 +48,6 @@ public: protected: void mousePressEvent(QMouseEvent *event) override; - void enterEvent(QEvent *event) override; - void leaveEvent(QEvent *event) override; signals: void clicked(Device *); @@ -61,11 +60,10 @@ private: private: QLabel *m_title; - QLabel *m_state; + StateButton *m_state; DSpinner *m_loadingStat; Device *m_device; HorizontalSeparator *m_line; - QString m_stateSuffix; QLabel *m_typeIcon; }; diff --git a/plugins/network/CMakeLists.txt b/plugins/network/CMakeLists.txt index 462051480..708db3f81 100644 --- a/plugins/network/CMakeLists.txt +++ b/plugins/network/CMakeLists.txt @@ -4,7 +4,9 @@ set(PLUGIN_NAME "network") project(${PLUGIN_NAME}) # Sources files -file(GLOB_RECURSE SRCS "*.h" "*.cpp" "../../widgets/*.h" "../../widgets/*.cpp" "../../frame/util/imageutil.h" "../../frame/util/imageutil.cpp") +file(GLOB_RECURSE SRCS "*.h" "*.cpp" "../../widgets/*.h" "../../widgets/*.cpp" + "../../frame/util/imageutil.h" "../../frame/util/imageutil.cpp" + "../../frame/util/statebutton.h" "../../frame/util/statebutton.cpp") find_package(PkgConfig REQUIRED) find_package(Qt5Widgets REQUIRED) diff --git a/plugins/network/item/applet/accesspointwidget.cpp b/plugins/network/item/applet/accesspointwidget.cpp index f88aebbc2..0dea26672 100644 --- a/plugins/network/item/applet/accesspointwidget.cpp +++ b/plugins/network/item/applet/accesspointwidget.cpp @@ -25,6 +25,7 @@ #include "../frame/util/imageutil.h" #include "../wireditem.h" #include "constants.h" +#include "util/statebutton.h" #include #include @@ -49,7 +50,7 @@ AccessPointWidget::AccessPointWidget() , m_ssidBtn(new SsidButton(this)) , m_securityLabel(new QLabel) , m_strengthLabel(new QLabel) - , m_stateButton(new StateLabel(this)) + , m_stateButton(new StateButton(this)) { m_ssidBtn->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); @@ -58,13 +59,11 @@ AccessPointWidget::AccessPointWidget() bool isLight = (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType); - auto pixpath = QString(":/wireless/resources/wireless/select"); - pixpath = isLight ? pixpath + DarkType : pixpath + LightType; - auto iconPix = Utils::renderSVG(pixpath, QSize(PLUGIN_ICON_MAX_SIZE, PLUGIN_ICON_MAX_SIZE), devicePixelRatioF()); - m_stateButton->setPixmap(iconPix); + m_stateButton->setFixedSize(PLUGIN_ICON_MAX_SIZE, PLUGIN_ICON_MAX_SIZE); + m_stateButton->setType(StateButton::Check); m_stateButton->setVisible(false); - pixpath = QString(":/wireless/resources/wireless/security"); + auto pixpath = QString(":/wireless/resources/wireless/security"); pixpath = isLight ? pixpath + DarkType : pixpath + LightType; m_securityPixmap = Utils::renderSVG(pixpath, QSize(16, 16), devicePixelRatioF()); m_securityIconSize = m_securityPixmap.size(); @@ -100,9 +99,7 @@ AccessPointWidget::AccessPointWidget() setStrengthIcon(m_ap.strength()); }); - connect(m_stateButton, &StateLabel::click, this, &AccessPointWidget::disconnectBtnClicked); - connect(m_stateButton, &StateLabel::enter, this , &AccessPointWidget::buttonEnter); - connect(m_stateButton, &StateLabel::leave, this , &AccessPointWidget::buttonLeave); + connect(m_stateButton, &StateButton::click, this, &AccessPointWidget::disconnectBtnClicked); setStrengthIcon(m_ap.strength()); } @@ -190,13 +187,6 @@ void AccessPointWidget::setStrengthIcon(const int strength) m_securityPixmap = QIcon::fromTheme(isLight ? ":/wireless/resources/wireless/security_dark.svg" : ":/wireless/resources/wireless/security.svg").pixmap(s * devicePixelRatioF()); m_securityPixmap.setDevicePixelRatio(devicePixelRatioF()); m_securityLabel->setPixmap(m_securityPixmap); - - if (NetworkDevice::Activated == m_activeState) { - auto pixpath = QString(":/wireless/resources/wireless/select"); - pixpath = isLight ? pixpath + DarkType : pixpath + LightType; - auto iconPix = Utils::renderSVG(pixpath, QSize(PLUGIN_ICON_MAX_SIZE, PLUGIN_ICON_MAX_SIZE), devicePixelRatioF()); - m_stateButton->setPixmap(iconPix); - } } void AccessPointWidget::ssidClicked() @@ -213,25 +203,3 @@ void AccessPointWidget::disconnectBtnClicked() setActiveState(NetworkDevice::Unknow); emit requestDeactiveAP(m_ap); } - -void AccessPointWidget::buttonEnter() -{ - bool isLight = (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType); - if (NetworkDevice::Activated == m_activeState) { - auto pixpath = QString(":/wireless/resources/wireless/disconnect"); - pixpath = isLight ? pixpath + DarkType : pixpath + LightType; - auto iconPix = Utils::renderSVG(pixpath, QSize(PLUGIN_ICON_MAX_SIZE, PLUGIN_ICON_MAX_SIZE), devicePixelRatioF()); - m_stateButton->setPixmap(iconPix); - } -} - -void AccessPointWidget::buttonLeave() -{ - bool isLight = (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType); - if (NetworkDevice::Activated == m_activeState) { - auto pixpath = QString(":/wireless/resources/wireless/select"); - pixpath = isLight ? pixpath + DarkType : pixpath + LightType; - auto iconPix = Utils::renderSVG(pixpath, QSize(PLUGIN_ICON_MAX_SIZE, PLUGIN_ICON_MAX_SIZE), devicePixelRatioF()); - m_stateButton->setPixmap(iconPix); - } -} diff --git a/plugins/network/item/applet/accesspointwidget.h b/plugins/network/item/applet/accesspointwidget.h index a57472f97..03f1e9fd9 100644 --- a/plugins/network/item/applet/accesspointwidget.h +++ b/plugins/network/item/applet/accesspointwidget.h @@ -30,7 +30,7 @@ #include #include -class StateLabel; +class StateButton; class SsidButton : public QLabel { Q_OBJECT @@ -77,9 +77,6 @@ private: private slots: void ssidClicked(); void disconnectBtnClicked(); - void buttonEnter(); - void buttonLeave(); - private: dde::network::NetworkDevice::DeviceStatus m_activeState; @@ -88,7 +85,7 @@ private: SsidButton *m_ssidBtn; QLabel *m_securityLabel; QLabel *m_strengthLabel; - StateLabel *m_stateButton; + StateButton *m_stateButton; QPixmap m_securityPixmap; QSize m_securityIconSize; diff --git a/plugins/network/item/wireditem.cpp b/plugins/network/item/wireditem.cpp index 6686f5fdf..5b10825d9 100644 --- a/plugins/network/item/wireditem.cpp +++ b/plugins/network/item/wireditem.cpp @@ -25,11 +25,15 @@ #include "applet/horizontalseperator.h" #include "../widgets/tipswidget.h" #include "util/utils.h" +#include "util/statebutton.h" #include -#include + +#include #include +#include + DGUI_USE_NAMESPACE const int ItemHeight = 30; @@ -42,7 +46,7 @@ WiredItem::WiredItem(WiredDevice *device, const QString &deviceName, QWidget *pa , m_deviceName(deviceName) , m_connectedName(new QLabel(this)) , m_wiredIcon(new QLabel(this)) - , m_stateButton(new StateLabel(this)) + , m_stateButton(new StateButton(this)) , m_loadingStat(new DSpinner(this)) { setFixedHeight(ItemHeight); @@ -56,11 +60,8 @@ WiredItem::WiredItem(WiredDevice *device, const QString &deviceName, QWidget *pa m_wiredIcon->setPixmap(iconPix); m_wiredIcon->setVisible(false); - pixpath = QString(":/wireless/resources/wireless/select"); - pixpath = isLight ? pixpath + DarkType : pixpath + LightType; - iconPix = Utils::renderSVG(pixpath, QSize(PLUGIN_ICON_MAX_SIZE, PLUGIN_ICON_MAX_SIZE), devicePixelRatioF()); - m_stateButton->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); - m_stateButton->setPixmap(iconPix); + m_stateButton->setFixedSize(PLUGIN_ICON_MAX_SIZE, PLUGIN_ICON_MAX_SIZE); + m_stateButton->setType(StateButton::Check); m_stateButton->setVisible(false); m_loadingStat->setFixedSize(PLUGIN_ICON_MAX_SIZE, PLUGIN_ICON_MAX_SIZE); m_loadingStat->setVisible(false); @@ -93,12 +94,10 @@ WiredItem::WiredItem(WiredDevice *device, const QString &deviceName, QWidget *pa connect(static_cast(m_device.data()), &WiredDevice::activeWiredConnectionInfoChanged, this, &WiredItem::changedActiveWiredConnectionInfo); - connect(m_stateButton, &StateLabel::click, this, [&] { + connect(m_stateButton, &StateButton::click, this, [&] { auto enableState = m_device->enabled(); emit requestSetDeviceEnable(path(), !enableState); }); - connect(m_stateButton, &StateLabel::enter, this, &WiredItem::buttonEnter); - connect(m_stateButton, &StateLabel::leave, this, &WiredItem::buttonLeave); deviceStateChanged(m_device->status()); } @@ -134,19 +133,19 @@ WiredItem::WiredStatus WiredItem::getDeviceState() } switch (m_device->status()) { - case NetworkDevice::Unknow: return Unknow; - case NetworkDevice::Unmanaged: - case NetworkDevice::Unavailable: return Nocable; - case NetworkDevice::Disconnected: return Disconnected; - case NetworkDevice::Prepare: - case NetworkDevice::Config: return Connecting; - case NetworkDevice::NeedAuth: return Authenticating; - case NetworkDevice::IpConfig: - case NetworkDevice::IpCheck: - case NetworkDevice::Secondaries: return ObtainingIP; - case NetworkDevice::Activated: return Connected; - case NetworkDevice::Deactivation: - case NetworkDevice::Failed: return Failed; + case NetworkDevice::Unknow: return Unknow; + case NetworkDevice::Unmanaged: + case NetworkDevice::Unavailable: return Nocable; + case NetworkDevice::Disconnected: return Disconnected; + case NetworkDevice::Prepare: + case NetworkDevice::Config: return Connecting; + case NetworkDevice::NeedAuth: return Authenticating; + case NetworkDevice::IpConfig: + case NetworkDevice::IpCheck: + case NetworkDevice::Secondaries: return ObtainingIP; + case NetworkDevice::Activated: return Connected; + case NetworkDevice::Deactivation: + case NetworkDevice::Failed: return Failed; } Q_UNREACHABLE(); } @@ -164,53 +163,44 @@ void WiredItem::setThemeType(DGuiApplicationHelper::ColorType themeType) pixpath = isLight ? pixpath + "-dark.svg" : pixpath + LightType; auto iconPix = Utils::renderSVG(pixpath, QSize(PLUGIN_ICON_MAX_SIZE, PLUGIN_ICON_MAX_SIZE), devicePixelRatioF()); m_wiredIcon->setPixmap(iconPix); - - if (m_device) { - if (NetworkDevice::Activated == m_device->status()) { - pixpath = QString(":/wireless/resources/wireless/select"); - pixpath = isLight ? pixpath + DarkType : pixpath + LightType; - auto iconPix = Utils::renderSVG(pixpath, QSize(PLUGIN_ICON_MAX_SIZE, PLUGIN_ICON_MAX_SIZE), devicePixelRatioF()); - m_stateButton->setPixmap(iconPix); - } - } } void WiredItem::deviceStateChanged(NetworkDevice::DeviceStatus state) { QPixmap iconPix; switch (state) { - case NetworkDevice::Unknow: - case NetworkDevice::Unmanaged: - case NetworkDevice::Unavailable: - case NetworkDevice::Disconnected: - case NetworkDevice::Deactivation: - case NetworkDevice::Failed: { - m_loadingStat->stop(); - m_loadingStat->hide(); - m_loadingStat->setVisible(false); - if (!m_device->enabled()) + case NetworkDevice::Unknow: + case NetworkDevice::Unmanaged: + case NetworkDevice::Unavailable: + case NetworkDevice::Disconnected: + case NetworkDevice::Deactivation: + case NetworkDevice::Failed: { + m_loadingStat->stop(); + m_loadingStat->hide(); + m_loadingStat->setVisible(false); + if (!m_device->enabled()) + m_stateButton->setVisible(false); + } + break; + case NetworkDevice::Prepare: + case NetworkDevice::Config: + case NetworkDevice::NeedAuth: + case NetworkDevice::IpConfig: + case NetworkDevice::IpCheck: + case NetworkDevice::Secondaries: { m_stateButton->setVisible(false); - } - break; - case NetworkDevice::Prepare: - case NetworkDevice::Config: - case NetworkDevice::NeedAuth: - case NetworkDevice::IpConfig: - case NetworkDevice::IpCheck: - case NetworkDevice::Secondaries: { - m_stateButton->setVisible(false); - m_loadingStat->setVisible(true); - m_loadingStat->start(); - m_loadingStat->show(); - } - break; - case NetworkDevice::Activated: { - m_loadingStat->stop(); - m_loadingStat->hide(); - m_loadingStat->setVisible(false); - m_stateButton->setVisible(true); - } - break; + m_loadingStat->setVisible(true); + m_loadingStat->start(); + m_loadingStat->show(); + } + break; + case NetworkDevice::Activated: { + m_loadingStat->stop(); + m_loadingStat->hide(); + m_loadingStat->setVisible(false); + m_stateButton->setVisible(true); + } + break; } emit wiredStateChanged(); @@ -235,29 +225,3 @@ void WiredItem::changedActiveWiredConnectionInfo(const QJsonObject &connInfo) emit activeConnectionChanged(); } - -void WiredItem::buttonEnter() -{ - if (m_device) { - bool isLight = (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType); - if (NetworkDevice::Activated == m_device->status()) { - auto pixpath = QString(":/wireless/resources/wireless/disconnect"); - pixpath = isLight ? pixpath + DarkType : pixpath + LightType; - auto iconPix = Utils::renderSVG(pixpath, QSize(PLUGIN_ICON_MAX_SIZE, PLUGIN_ICON_MAX_SIZE), devicePixelRatioF()); - m_stateButton->setPixmap(iconPix); - } - } -} - -void WiredItem::buttonLeave() -{ - if (m_device) { - bool isLight = (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType); - if (NetworkDevice::Activated == m_device->status()) { - auto pixpath = QString(":/wireless/resources/wireless/select"); - pixpath = isLight ? pixpath + DarkType : pixpath + LightType; - auto iconPix = Utils::renderSVG(pixpath, QSize(PLUGIN_ICON_MAX_SIZE, PLUGIN_ICON_MAX_SIZE), devicePixelRatioF()); - m_stateButton->setPixmap(iconPix); - } - } -} diff --git a/plugins/network/item/wireditem.h b/plugins/network/item/wireditem.h index 93852858e..53034c2a3 100644 --- a/plugins/network/item/wireditem.h +++ b/plugins/network/item/wireditem.h @@ -29,15 +29,14 @@ #include #include -#include - using namespace dde::network; DGUI_USE_NAMESPACE DWIDGET_USE_NAMESPACE +class QLabel; class TipsWidget; class HorizontalSeperator; -class StateLabel; +class StateButton; class WiredItem : public DeviceItem { Q_OBJECT @@ -78,47 +77,15 @@ signals: private slots: void deviceStateChanged(NetworkDevice::DeviceStatus state); void changedActiveWiredConnectionInfo(const QJsonObject &connInfo); - void buttonEnter(); - void buttonLeave(); private: QString m_deviceName; QLabel *m_connectedName; QLabel *m_wiredIcon; - StateLabel *m_stateButton; + StateButton *m_stateButton; DSpinner *m_loadingStat; HorizontalSeperator *m_line; }; -class StateLabel : public QLabel -{ - Q_OBJECT -public: - explicit StateLabel(QWidget *parent = nullptr) - : QLabel(parent) {} - -signals: - void enter(); - void leave(); - void click(); - -protected: - void mousePressEvent(QMouseEvent *event) override - { - QLabel::mousePressEvent(event); - emit click(); - } - void enterEvent(QEvent *event) override - { - QLabel::enterEvent(event); - emit enter(); - } - void leaveEvent(QEvent *event) override - { - QLabel::leaveEvent(event); - emit leave(); - } -}; - #endif // WIREDITEM_H