diff --git a/CMakeLists.txt b/CMakeLists.txt index 43fa9bb0..541c8404 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -56,8 +56,8 @@ add_subdirectory("src") add_subdirectory("dcc-network") add_subdirectory("tests") # add_subdirectory("example") -#add_subdirectory("dock-network-plugin") +add_subdirectory("dock-network-plugin") add_subdirectory("dss-network-plugin") -add_subdirectory("dss_example") +# add_subdirectory("dss_example") #add_subdirectory("dock-example") add_subdirectory("network-service-plugin") diff --git a/debian/control b/debian/control index c6c52e23..bf3d4668 100644 --- a/debian/control +++ b/debian/control @@ -8,6 +8,7 @@ Build-Depends: debhelper-compat (= 12), pkg-config, libgtest-dev, dde-control-center-dev, + dde-tray-loader-dev, dde-session-shell-dev, libudev-dev, qt6-base-dev, @@ -39,6 +40,12 @@ Depends: ${misc:Depends},${shlibs:Depends},network-manager-integration-plugins,l Description: the plugin of network for dde control center dcc-network-plugin module +Package: dock-network-plugin +Architecture: any +Depends: ${misc:Depends},${shlibs:Depends},libdde-network-core (= ${binary:Version}) +Description: the plugin of network for dde-dock + dock-plugin module + Package: dss-network-plugin Architecture: any Depends: ${misc:Depends},${shlibs:Depends},libdde-network-core (= ${binary:Version}) diff --git a/debian/dock-network-plugin.install b/debian/dock-network-plugin.install new file mode 100644 index 00000000..7d1fd578 --- /dev/null +++ b/debian/dock-network-plugin.install @@ -0,0 +1,3 @@ +usr/lib/dde-dock/plugins/system-trays/libdock-network-plugin.so +usr/share/dock-network-plugin/translations +usr/share/dde-dock/icons/dcc-setting \ No newline at end of file diff --git a/debian/dss-network-plugin.install b/debian/dss-network-plugin.install index 8fcdcd1c..791814f0 100644 --- a/debian/dss-network-plugin.install +++ b/debian/dss-network-plugin.install @@ -1,3 +1,3 @@ usr/lib/dde-session-shell/modules/libdss-network-plugin.so usr/share/dss-network-plugin/translations -usr/share/polkit-1/rules.d/50-dss-network-plugin.rules +var/lib/polkit-1/localauthority/10-vendor.d/10-network-manager.pkla diff --git a/dock-network-plugin/CMakeLists.txt b/dock-network-plugin/CMakeLists.txt index aec5a404..86b7f0da 100644 --- a/dock-network-plugin/CMakeLists.txt +++ b/dock-network-plugin/CMakeLists.txt @@ -1,70 +1,76 @@ -cmake_minimum_required(VERSION 3.7) +# SPDX-FileCopyrightText: 2025 UnionTech Software Technology Co., Ltd. +# +# SPDX-License-Identifier: CC0-1.0 set(PLUGIN_NAME "dock-network-plugin") +set(QT_NS Qt6) +set(DTK_NS Dtk6) + project(${PLUGIN_NAME}) +include(GNUInstallDirs) # 启用 qt moc 的支持 set(CMAKE_AUTOMOC ON) # 启用 qrc 资源文件的支持 set(CMAKE_AUTORCC ON) -file(GLOB_RECURSE SRCS "*.h" "*.cpp" "item/*.h" "item/*.cpp" "../common-plugin/*.h" "../common-plugin/*.cpp") +file(GLOB_RECURSE SRCS + "networkplugin.h" + "networkplugin.cpp" + "quickpanelwidget.h" + "quickpanelwidget.cpp" + "dockcontentwidget.h" + "../net-view/*.h" + "../net-view/*.cpp" + "widget/jumpsettingbutton.h" + "widget/jumpsettingbutton.cpp" + "widget/commoniconbutton.h" + "widget/commoniconbutton.cpp" +) -find_package(Qt5 COMPONENTS Core Widgets DBus Network LinguistTools REQUIRED) +find_package(${QT_NS} COMPONENTS Core Widgets DBus Network LinguistTools REQUIRED) find_package(PkgConfig REQUIRED) -find_package(Qt5Svg REQUIRED) -find_package(DtkCore REQUIRED) -find_package(DtkWidget REQUIRED) - -set(DTKCORE_INCLUDE_DIR DTKCORE_INCLUDE_DIRS) - +find_package(${DTK_NS} REQUIRED COMPONENTS Widget) +find_package(KF6NetworkManagerQt REQUIRED) find_package(DdeDock REQUIRED) -find_package(KF5NetworkManagerQt REQUIRED) -pkg_check_modules(QGSettings REQUIRED gsettings-qt) -pkg_check_modules(DDE-Dock REQUIRED dde-dock) +#if (CMAKE_BUILD_TYPE STREQUAL "Debug") +# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -fsanitize=address -O0") +# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -fsanitize=address -O0") +#endif() file(GLOB TS_FILES "translations/*.ts") -qt5_add_translation(QM_FILES ${TS_FILES}) +qt_add_translation(QM_FILES ${TS_FILES}) add_custom_target(language ALL DEPENDS ${QM_FILES}) add_definitions("${QT_DEFINITIONS} -DQT_PLUGIN") -add_library(${PLUGIN_NAME} SHARED ${SRCS} ../common-plugin/network.qrc) - -get_target_property(KF5_QT_INCLUDE_DIRS KF5::NetworkManagerQt INTERFACE_INCLUDE_DIRECTORIES) - -set(TRY_KF5_LIBRARIES -IMPORTED_LOCATION_DEBIAN -IMPORTED_LOCATION_NOCONFIG -) +add_library(${PLUGIN_NAME} SHARED ${SRCS} ../net-view/window/qrc/network.qrc) +set_target_properties(${PLUGIN_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ../../dde-dock) -if (NOT KF5_QT_LIBRARIES) - find_library(KF5_QT_LIBRARIES libKF5NetworkManagerQt.so) -endif() +# get_target_property(KF6_QT_INCLUDE_DIRS KF6::NetworkManagerQt INTERFACE_INCLUDE_DIRECTORIES) target_include_directories(${PLUGIN_NAME} PUBLIC - ${DtkWidget_INCLUDE_DIRS} - ${Qt5DBus_INCLUDE_DIRS} - ${QGSettings_INCLUDE_DIRS} - ${DDE-Network-Core_INCLUDE_DIRS} - ${DDE_DOCK_INCLUDE_DIR} - ${Qt5Network_INCLUDE_DIRS} - ${KF5_QT_INCLUDE_DIRS} - ${NETINTERFACEINCLUDE} - "../common-plugin/" + ${DTK_NS}::Widget + ${QT_NS}::Dbus + ${QT_NS}::Network + KF6::NetworkManagerQt + # "../../../interfaces" + "../net-view/operation" + "../net-view/window" + "../src" ) target_link_libraries(${PLUGIN_NAME} PRIVATE - ${DtkWidget_LIBRARIES} - ${Qt5Widgets_LIBRARIES} - ${Qt5Svg_LIBRARIES} - ${Qt5DBus_LIBRARIES} - ${QGSettings_LIBRARIES} - ${DDE-Network-Core_LIBRARIES} - ${KF5_QT_LIBRARIES} - ${Qt5Network_LIBRARIES} + ${QT_NS}::Widgets + ${QT_NS}::DBus + ${QT_NS}::Network + ${DTK_NS}::Widget + KF6::NetworkManagerQt + dde-network-core6 ) -install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION lib/dde-dock/plugins/quick-trays) +install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION lib/dde-dock/plugins/system-trays) # 安装 .qm 文件 install(FILES ${QM_FILES} DESTINATION ${CMAKE_INSTALL_DATADIR}/${PLUGIN_NAME}/translations) +# 安装显示在控制中心-个性化-任务栏-插件区域的图标 +install(FILES "resources/dcc-network.dci" DESTINATION share/dde-dock/icons/dcc-setting) diff --git a/dock-network-plugin/dockcontentwidget.h b/dock-network-plugin/dockcontentwidget.h new file mode 100644 index 00000000..bdc5d13c --- /dev/null +++ b/dock-network-plugin/dockcontentwidget.h @@ -0,0 +1,103 @@ +// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: LGPL-3.0-or-later + +#ifndef DOCKCONTENTWIDGET_H +#define DOCKCONTENTWIDGET_H + +#include "netmanager.h" +#include "netview.h" +#include "widget/jumpsettingbutton.h" +#include "constants.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace dde { +namespace network { + +class DockContentWidget : public QWidget +{ + Q_OBJECT +public: + explicit DockContentWidget(NetView *netView, NetManager *netManager, QWidget *parent = nullptr) + : QWidget(parent) + , m_mainLayout(new QVBoxLayout(this)) + , m_netView(netView) + , m_minHeight(-1) + { + m_netView->installEventFilter(this); + m_netView->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); + connect(m_netView, &NetView::updateSize, this, &DockContentWidget::updateSize); + + m_netSetBtn = new JumpSettingButton(this); + m_netSetBtn->setIcon(QIcon::fromTheme("network-setting")); + m_netSetBtn->setDescription(tr("Network settings")); + connect(m_netSetBtn, &JumpSettingButton::clicked, netManager, &NetManager::gotoControlCenter); + + m_netCheckBtn = new JumpSettingButton(this); + m_netCheckBtn->setIcon(QIcon::fromTheme("network-check")); + m_netCheckBtn->setDescription(tr("Network Detection")); + connect(m_netCheckBtn, &JumpSettingButton::clicked, netManager, &NetManager::gotoCheckNet); + + QWidget *buttonWidget = new QWidget(this); + QVBoxLayout *buttonLayout = new QVBoxLayout; + buttonLayout->setContentsMargins(10, 10, 10, 10); + buttonLayout->setSpacing(10); + buttonLayout->addWidget(m_netCheckBtn); + buttonLayout->addWidget(m_netSetBtn); + buttonWidget->setLayout(buttonLayout); + + m_mainLayout->setContentsMargins(0, 10, 0, 0); + m_mainLayout->addWidget(m_netView, 0, Qt::AlignTop | Qt::AlignHCenter); + m_mainLayout->addStretch(); + m_mainLayout->addSpacing(10); + m_mainLayout->addWidget(buttonWidget, 0, Qt::AlignBottom); + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + setMaximumHeight(Dock::DOCK_POPUP_WIDGET_MAX_HEIGHT); + } + + ~DockContentWidget() override { } + + void setMainLayoutMargins(const QMargins &margin) { + m_mainLayout->setContentsMargins(margin); + } + void setMinHeight(int minHeight) { m_minHeight = minHeight; } + void updateSize() { + auto h = Dock::DOCK_POPUP_WIDGET_MAX_HEIGHT - 20 - m_mainLayout->contentsMargins().top() - (m_netCheckBtn->isVisible() ? (m_netSetBtn->height() + m_netCheckBtn->height() + 10) : m_netSetBtn->height()); + m_netView->setMaxHeight(h); + if (m_netView->height() > h) + m_netView->setFixedHeight(h); + setFixedSize(m_netView->width(), qMax(m_minHeight, m_netView->height() + 20 + m_mainLayout->contentsMargins().top() + (m_netCheckBtn->isVisible() ? (m_netSetBtn->height() + m_netCheckBtn->height() + 10) : m_netSetBtn->height()))); + } + void setNetCheckBtnVisible(bool visible) { + m_netCheckBtn->setVisible(visible); + updateSize(); + } + +protected: + bool eventFilter(QObject *watch, QEvent *event) override + { + if ((watch == m_netView && event->type() == QEvent::Resize) || event->type() == QEvent::Show) { + updateSize(); + } + return QWidget::eventFilter(watch, event); + } + +private: + QVBoxLayout *m_mainLayout; + NetView *m_netView; + int m_minHeight; + JumpSettingButton *m_netSetBtn; + JumpSettingButton *m_netCheckBtn; +}; + +} // namespace network +} // namespace dde +#endif // DOCKCONTENTWIDGET_H diff --git a/dock-network-plugin/lupdate.sh b/dock-network-plugin/lupdate.sh index f1456e52..994ccf3e 100755 --- a/dock-network-plugin/lupdate.sh +++ b/dock-network-plugin/lupdate.sh @@ -3,8 +3,6 @@ if [ ! -d "translations/" ];then mkdir translations fi cd ./translations -rm -f dock-hotspot-plugin_en_US.ts -lupdate ../ ../../src ../../common-plugin -ts -no-ui-lines -locations none -no-obsolete dock-network-plugin_en_US.ts +rm -f dock-network-plugin.ts +lupdate ../ ../../net-view/ -ts -no-ui-lines -locations none -no-obsolete dock-network-plugin.ts cd ../ - -tx push -s --branch m23 diff --git a/dock-network-plugin/network.json b/dock-network-plugin/network.json index 5060fce0..7181b169 100644 --- a/dock-network-plugin/network.json +++ b/dock-network-plugin/network.json @@ -1,5 +1,4 @@ { - "api": "2.0.0", - "primary" : true, + "api": "1.1.1", "depends-daemon-dbus-service": "org.deepin.dde.Network1" } diff --git a/dock-network-plugin/network_v2.json b/dock-network-plugin/network_v2.json new file mode 100644 index 00000000..593c9c60 --- /dev/null +++ b/dock-network-plugin/network_v2.json @@ -0,0 +1,4 @@ +{ + "api": "2.0.0", + "depends-daemon-dbus-service": "org.deepin.dde.Network1" +} diff --git a/dock-network-plugin/networkplugin.cpp b/dock-network-plugin/networkplugin.cpp index f40556d4..11de5ee0 100644 --- a/dock-network-plugin/networkplugin.cpp +++ b/dock-network-plugin/networkplugin.cpp @@ -1,45 +1,68 @@ // SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. // -// SPDX-License-Identifier: LGPL-3.0-or-later +// SPDX-License-Identifier: GPL-3.0-or-later #include "networkplugin.h" -#include "networkpluginhelper.h" -#include "networkdialog.h" -#include "quickpanel.h" -#include "item/devicestatushandler.h" -#include "networkdialog/thememanager.h" -#include +#include "dockcontentwidget.h" +#include "netmanager.h" +#include "netstatus.h" +#include "netview.h" +#include "quickpanelwidget.h" +#include + +#include +#include +#include #include -#include -#include -#include -#include +#include #define STATE_KEY "enabled" -NETWORKPLUGIN_USE_NAMESPACE +using namespace dde::network; +DGUI_USE_NAMESPACE + +static Q_LOGGING_CATEGORY(DNC, "org.deepin.dde.dock.network"); +namespace dde { +namespace network { NetworkPlugin::NetworkPlugin(QObject *parent) : QObject(parent) - , m_networkHelper(Q_NULLPTR) - , m_networkDialog(Q_NULLPTR) - , m_quickPanel(Q_NULLPTR) - , m_clickTime(-10000) + , m_trayIcon(nullptr) + , m_tipsWidget(nullptr) + , m_manager(nullptr) + , m_netView(nullptr) + , m_netStatus(nullptr) + , m_isLockScreen(false) + , m_replacesId(0) + , m_dockContentWidget(nullptr) + , m_netCheckAvailable(false) + , m_netLimited(false) { - NetworkController::setIPConflictCheck(true); QTranslator *translator = new QTranslator(this); - QString languagePath = QStandardPaths::locate(QStandardPaths::GenericDataLocation, - QString("dock-network-plugin/translations"), - QStandardPaths::LocateDirectory); - translator->load(QString(languagePath+"/dock-network-plugin_%1.qm").arg(QLocale::system().name())); - QCoreApplication::installTranslator(translator); + if (translator->load(QString("/usr/share/dock-network-plugin/translations/dock-network-plugin_%1").arg(QLocale().name()))) { + QCoreApplication::installTranslator(translator); + } } NetworkPlugin::~NetworkPlugin() { + if (m_netView) + m_netView->deleteLater(); + + if (m_netStatus) + delete m_netStatus; + + if (m_manager) + delete m_manager; + + if (m_tipsWidget) + m_tipsWidget->deleteLater(); + + if (m_trayIcon) + m_trayIcon->deleteLater(); } const QString NetworkPlugin::pluginName() const @@ -55,30 +78,55 @@ const QString NetworkPlugin::pluginDisplayName() const void NetworkPlugin::init(PluginProxyInterface *proxyInter) { m_proxyInter = proxyInter; - if (m_networkHelper) + if (m_manager) return; - m_networkDialog = new NetworkDialog(this); - m_networkDialog->setServerName("dde-network-dialog" + QString::number(getuid()) + "dock"); - m_networkHelper.reset(new NetworkPluginHelper(m_networkDialog)); - connect(m_networkHelper.data(), &NetworkPluginHelper::iconChanged, this, &NetworkPlugin::onIconUpdated); - m_quickPanel = new QuickPanel(); + m_manager = new NetManager(NetType::Net_DockFlags,this); + m_manager->setServerKey("dock"); + m_netView = new NetView(m_manager); + m_netStatus = new NetStatus(m_manager); + m_dockContentWidget = new DockContentWidget(m_netView, m_manager); + + m_netStatus->setDirection(position() == Dock::Top || position() == Dock::Bottom ? QBoxLayout::LeftToRight : QBoxLayout::TopToBottom); if (!pluginIsDisable()) loadPlugin(); - connect(m_networkDialog, &NetworkDialog::requestShow, this, &NetworkPlugin::showNetworkDialog); - - connect(m_quickPanel, &QuickPanel::iconClicked, this, [this]() { - m_networkHelper->invokeMenuItem(m_quickPanel->userData().toString()); + connect(m_netStatus, &NetStatus::networkStatusChanged, this, &NetworkPlugin::onNetworkStatusChanged); + connect(m_manager, &NetManager::netCheckAvailableChanged, this, &NetworkPlugin::onNetCheckAvailableChanged); + connect(m_netView, &NetView::requestShow, this, &NetworkPlugin::showNetworkDialog); + connect(m_manager, &NetManager::toControlCenter, this, [ = ] { + m_proxyInter->requestSetAppletVisible(this, NETWORK_KEY, false); }); - connect(m_quickPanel, &QuickPanel::panelClicked, this, &NetworkPlugin::showNetworkDialog); - m_networkHelper->setIconDark(Dtk::Gui::DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::DarkType); - // 主题发生变化触发的信号 - connect(Dtk::Gui::DGuiApplicationHelper::instance(), &Dtk::Gui::DGuiApplicationHelper::themeTypeChanged, this, [this]() { - m_networkHelper->setIconDark(Dtk::Gui::DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::DarkType); - }); + m_netCheckAvailable = m_manager->netCheckAvailable(); + + connect(m_manager, + &NetManager::networkNotify, + this, + [ this ](const QString &inAppName, + int replacesId, + const QString &appIcon, + const QString &summary, + const QString &body, + const QStringList &actions, + const QVariantMap &hints, + int expireTimeout) { + QDBusMessage notify = QDBusMessage::createMethodCall("org.freedesktop.Notifications", "/org/freedesktop/Notifications", "org.freedesktop.Notifications", "Notify"); + uint id = replacesId == -1 ? m_replacesId : static_cast(replacesId); + notify << inAppName << id << appIcon << summary << body << actions << hints << expireTimeout; + QDBusConnection::sessionBus().callWithCallback(notify, this, SLOT(onNotify(uint))); + }); + connect(m_netStatus, &NetStatus::hasDeviceChanged, this, &NetworkPlugin::refreshPluginItemsVisible); + connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, &NetworkPlugin::updateIconColor); + QDBusConnection::sessionBus().connect("org.deepin.dde.LockFront1", "/org/deepin/dde/LockFront1", "org.deepin.dde.LockFront1", "Visible", this, SLOT(updateLockScreenStatus(bool))); +} + +void NetworkPlugin::positionChanged(const Dock::Position position) +{ + m_proxyInter->itemUpdate(this, pluginName()); + if (m_netStatus) + m_netStatus->setDirection(position == Dock::Top || position == Dock::Bottom ? QBoxLayout::LeftToRight : QBoxLayout::TopToBottom); } void NetworkPlugin::invokedMenuItem(const QString &itemKey, const QString &menuId, const bool checked) @@ -86,13 +134,13 @@ void NetworkPlugin::invokedMenuItem(const QString &itemKey, const QString &menuI Q_UNUSED(checked) if (itemKey == NETWORK_KEY) - m_networkHelper->invokeMenuItem(menuId); + m_netStatus->invokeMenuItem(menuId); } void NetworkPlugin::refreshIcon(const QString &itemKey) { if (itemKey == NETWORK_KEY) - emit m_networkHelper->viewUpdate(); + m_netStatus->refreshIcon(); } void NetworkPlugin::pluginStateSwitched() @@ -102,6 +150,11 @@ void NetworkPlugin::pluginStateSwitched() refreshPluginItemsVisible(); } +bool NetworkPlugin::pluginIsAllowDisable() +{ + return true; +} + bool NetworkPlugin::pluginIsDisable() { return !m_proxyInter->getValue(this, STATE_KEY, true).toBool(); @@ -110,12 +163,12 @@ bool NetworkPlugin::pluginIsDisable() const QString NetworkPlugin::itemCommand(const QString &itemKey) { Q_UNUSED(itemKey) - if (m_networkHelper->needShowControlCenter()) { + if (m_netStatus->needShowControlCenter()) { return QString("dbus-send --print-reply " - "--dest=org.deepin.dde.ControlCenter1" - "/org/deepin/dde/ControlCenter1" + "--dest=org.deepin.dde.ControlCenter1 " + "/org/deepin/dde/ControlCenter1 " "org.deepin.dde.ControlCenter1.ShowModule " - "\"string:network\""); + "string:network"); } return QString(); @@ -123,21 +176,51 @@ const QString NetworkPlugin::itemCommand(const QString &itemKey) const QString NetworkPlugin::itemContextMenu(const QString &itemKey) { + if (itemKey == NETWORK_KEY) + return m_netStatus->contextMenu(true); + return QString(); } QWidget *NetworkPlugin::itemWidget(const QString &itemKey) { - if (itemKey == QUICK_ITEM_KEY) { - return m_quickPanel; + if (itemKey == NETWORK_KEY) { + if (m_trayIcon.isNull()) { + m_trayIcon = m_netStatus->createDockIconWidget(); + positionChanged(position()); + updateIconColor(); + m_trayIcon->installEventFilter(this); + } + return m_trayIcon.data(); + } + if (itemKey == "quick_item_key") { // QUICK_ITEM_KEY + if (m_quickPanel.isNull()) { + m_quickPanel = new QuickPanelWidget(); + m_netStatus->initQuickData(); + m_quickPanel->setActive(m_netStatus->networkActive()); + m_quickPanel->setText(m_netStatus->quickTitle()); + m_quickPanel->setDescription(m_netStatus->quickDescription()); + m_quickPanel->setIcon(m_netStatus->quickIcon()); + connect(m_quickPanel.data(), &QuickPanelWidget::iconClicked, this, &NetworkPlugin::onQuickIconClicked); + connect(m_quickPanel.data(), &QuickPanelWidget::panelClicked, this, &NetworkPlugin::onQuickPanelClicked); + connect(m_netStatus, &NetStatus::quickTitleChanged, m_quickPanel.data(), &QuickPanelWidget::setText); + connect(m_netStatus, &NetStatus::quickDescriptionChanged, m_quickPanel.data(), &QuickPanelWidget::setDescription); + connect(m_netStatus, &NetStatus::quickIconChanged, m_quickPanel.data(), &QuickPanelWidget::setIcon); + connect(m_netStatus, &NetStatus::networkActiveChanged, m_quickPanel.data(), &QuickPanelWidget::setActive); + } + return m_quickPanel.data(); } return Q_NULLPTR; } QWidget *NetworkPlugin::itemTipsWidget(const QString &itemKey) { - if (itemKey == NETWORK_KEY && !m_networkDialog->panel()->isVisible()) - return m_networkHelper->itemTips(); + if (itemKey == NETWORK_KEY && !m_netView->isVisible()) { + if (m_tipsWidget.isNull()) + m_tipsWidget = m_netStatus->createDockItemTips(); + + return m_tipsWidget.data(); + } return Q_NULLPTR; } @@ -145,13 +228,13 @@ QWidget *NetworkPlugin::itemTipsWidget(const QString &itemKey) QWidget *NetworkPlugin::itemPopupApplet(const QString &itemKey) { Q_UNUSED(itemKey); - return m_networkDialog->panel(); + return m_dockContentWidget; } int NetworkPlugin::itemSortKey(const QString &itemKey) { const QString key = QString("pos_%1_%2").arg(itemKey).arg(Dock::Efficient); - return m_proxyInter->getValue(this, key, 3).toInt(); + return m_proxyInter->getValue(this, key, 1).toInt(); } void NetworkPlugin::setSortKey(const QString &itemKey, const int order) @@ -165,179 +248,158 @@ void NetworkPlugin::pluginSettingsChanged() refreshPluginItemsVisible(); } -PluginFlags NetworkPlugin::flags() const -{ - return PluginFlag::Type_Common | PluginFlag::Quick_Multi | PluginFlag::Attribute_CanDrag | PluginFlag::Attribute_CanInsert | PluginFlag::Attribute_CanSetting; -} - void NetworkPlugin::loadPlugin() { - m_proxyInter->itemAdded(this, NETWORK_KEY); + if (m_netStatus && m_netStatus->hasDevice()) { + m_proxyInter->itemAdded(this, NETWORK_KEY); + } } void NetworkPlugin::refreshPluginItemsVisible() { - if (pluginIsDisable()) + if (pluginIsDisable() || !m_netStatus->hasDevice()) m_proxyInter->itemRemoved(this, NETWORK_KEY); else m_proxyInter->itemAdded(this, NETWORK_KEY); } -void NetworkPlugin::updateQuickPanel() -{ - QList devices = NetworkController::instance()->devices(); - int wiredConnectionCount = 0; - int wirelessConnectionCount = 0; - QString wiredConnection; - QString wirelessConnection; - QList wiredList; - QList wirelessList; - - for (NetworkDeviceBase *device : devices) { - switch (device->deviceType()) { - case DeviceType::Wired: { - WiredDevice *wiredDevice = static_cast(device); - wiredList.append(wiredDevice); - if (wiredDevice->isConnected()) { - QList items = wiredDevice->items(); - for (WiredConnection *item : items) { - if (item->status() == ConnectionStatus::Activated) { - wiredConnectionCount++; - wiredConnection = item->connection()->id(); - } - } - } - } break; - case DeviceType::Wireless: { - WirelessDevice *wirelessDevice = static_cast(device); - wirelessList.append(wirelessDevice); - if (wirelessDevice->isConnected()) { - QList items = wirelessDevice->items(); - for (WirelessConnection *item : items) { - if (item->status() == ConnectionStatus::Activated) { - wirelessConnectionCount++; - wirelessConnection = item->connection()->ssid(); - } - } - } - } break; - default: - break; +bool NetworkPlugin::eventFilter(QObject *watched, QEvent *event) +{ + switch (event->type()) { + case QEvent::ParentChange: { + if (watched == m_trayIcon && m_trayIcon->parentWidget()) { + m_trayIcon->parentWidget()->setMouseTracking(true); + m_trayIcon->parentWidget()->installEventFilter(this); } + } break; + case QEvent::Resize: { + if (m_trayIcon && watched == m_trayIcon->parentWidget()) + updateIconColor(); + } break; + case QEvent::Enter: + case QEvent::MouseMove: { + const QPoint &p = m_trayIcon->mapFromGlobal(QCursor::pos()); + const bool isHorizontal = position() == Dock::Top || position() == Dock::Bottom; + m_netStatus->setHoverTips((isHorizontal ? p.x() : p.y()) > ((isHorizontal ? m_trayIcon->width() : m_trayIcon->height()) / 2) && m_netStatus->vpnAndProxyIconVisibel() + ? NetStatus::HoverType::vpnAndProxy : NetStatus::HoverType::Network); + } break; + default: + break; } + return QObject::eventFilter(watched, event); +} - if (!wirelessList.isEmpty()) { - NetDeviceStatus status = DeviceStatusHandler::wirelessStatus(wirelessList); - updateQuickPanelDescription(status, wirelessConnectionCount, wirelessConnection, NetworkPluginHelper::MenuWirelessEnable); - m_quickPanel->setText(tr("Wireless Network")); - m_quickPanel->setIcon(QIcon::fromTheme(ThemeManager::ref().getIcon("wireless-80-symbolic"))); - } else if (!wiredList.isEmpty()) { - NetDeviceStatus status = DeviceStatusHandler::wiredStatus(wiredList); - updateQuickPanelDescription(status, wiredConnectionCount, wiredConnection, NetworkPluginHelper::MenuWiredEnable); - m_quickPanel->setText(tr("Wired Network")); - m_quickPanel->setIcon(QIcon::fromTheme(ThemeManager::ref().getIcon("network-wired-symbolic"))); - } else { - m_quickPanel->setText(pluginDisplayName()); - m_quickPanel->setDescription(description()); - m_quickPanel->setActive(false); - m_quickPanel->setUserData(NetworkPluginHelper::MenuSettings); - m_quickPanel->setIcon(QIcon::fromTheme(ThemeManager::ref().getIcon("network-error-symbolic"))); - } +void NetworkPlugin::updateLockScreenStatus(bool visible) +{ + m_isLockScreen = visible; + m_manager->setEnabled(!m_isLockScreen); } -void NetworkPlugin::updateQuickPanelDescription(NetDeviceStatus status, int connectionCount, const QString &Connection, int enableMenu) +void NetworkPlugin::updateIconColor() { - QString statusName = networkStateName(status); - bool isEnabled = (status != NetDeviceStatus::Disabled); + if (m_trayIcon.isNull()) + return; - if (statusName.isEmpty() && connectionCount != 0) { - if (connectionCount == 1) { - m_quickPanel->setDescription(Connection); - } else { - m_quickPanel->setDescription(tr("Connected") + QString(" (%1)").arg(connectionCount)); - } - } else { - m_quickPanel->setDescription(statusName); + Qt::GlobalColor color = Qt::white; + if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) { + color = Qt::black; } - m_quickPanel->setActive(isEnabled); - m_quickPanel->setUserData(isEnabled ? (enableMenu + 1) : enableMenu); -} - -QString NetworkPlugin::networkStateName(NetDeviceStatus status) const -{ - switch (status) { - case NetDeviceStatus::Disabled: - return tr("Device disabled"); - case NetDeviceStatus::Unknown: - case NetDeviceStatus::Nocable: - return tr("Network cable unplugged"); - case NetDeviceStatus::Disconnected: - return tr("Not connected"); - case NetDeviceStatus::Connecting: - case NetDeviceStatus::Authenticating: - return tr("Connecting"); - case NetDeviceStatus::ObtainingIP: - case NetDeviceStatus::ObtainIpFailed: - return tr("Obtaining address"); - case NetDeviceStatus::ConnectNoInternet: - return tr("Connected but no Internet access"); - case NetDeviceStatus::IpConflicted: - return tr("IP conflict"); - case NetDeviceStatus::ConnectFailed: - return tr("Connection failed"); - default: - break; + QPalette p = m_trayIcon->palette(); + if (p.brightText() != color) { + p.setColor(QPalette::BrightText, color); + m_trayIcon->setPalette(p); } - return QString(); } -void NetworkPlugin::onIconUpdated() +void NetworkPlugin::onNotify(uint replacesId) { - // update quick panel - m_proxyInter->updateDockInfo(this, DockPart::QuickPanel); - // update quick plugin area - m_proxyInter->updateDockInfo(this, DockPart::QuickShow); - - updateQuickPanel(); + m_replacesId = replacesId; } -QIcon NetworkPlugin::icon(const DockPart &dockPart, DGuiApplicationHelper::ColorType themeType) +void NetworkPlugin::onNetworkStatusChanged(NetStatus::NetworkStatus networkStatus) { - switch(dockPart) { - case DockPart::DCCSetting: - case DockPart::QuickShow: - return m_networkHelper->icon(themeType); + switch (networkStatus) { + case NetStatus::NetworkStatus::ConnectNoInternet: + case NetStatus::NetworkStatus::WirelessConnectNoInternet: + case NetStatus::NetworkStatus::WiredConnectNoInternet: + case NetStatus::NetworkStatus::WiredIpConflicted: + case NetStatus::NetworkStatus::WirelessIpConflicted: + m_netLimited = true; + break; default: + m_netLimited = false; break; } - - return QIcon(); + updateNetCheckVisible(); } -PluginsItemInterface::PluginMode NetworkPlugin::status() const +void NetworkPlugin::onNetCheckAvailableChanged(const bool &netCheckAvailable) { - // get the plugin status - PluginState plugState = m_networkHelper->getPluginState(); - switch (plugState) { - case PluginState::Unknown: - case PluginState::Disabled: - case PluginState::Nocable: - return PluginMode::Disabled; - default: - break; + if (m_netCheckAvailable != netCheckAvailable) { + m_netCheckAvailable = netCheckAvailable; + updateNetCheckVisible(); } +} + +void NetworkPlugin::updateNetCheckVisible() +{ + m_dockContentWidget->setNetCheckBtnVisible(m_netLimited && m_netCheckAvailable); +} + - return PluginMode::Active; +void NetworkPlugin::onQuickIconClicked() +{ + if (m_netStatus->needShowControlCenter()) { + m_manager->gotoControlCenter(); + } else { + m_netStatus->toggleNetworkActive(); + } } -QString NetworkPlugin::description() const +void NetworkPlugin::onQuickPanelClicked() { - return m_quickPanel ? m_quickPanel->description() : QString(); + if (m_netStatus->needShowControlCenter()) { + m_manager->gotoControlCenter(); + } else { + showNetworkDialog(); + } } void NetworkPlugin::showNetworkDialog() { - if (m_networkDialog->panel()->isVisible()) + // 第一次连接隐藏网络会回弹,此时锁屏和任务栏都会收到信号 + if (m_isLockScreen || m_netView->isVisible()) return; m_proxyInter->requestSetAppletVisible(this, NETWORK_KEY, true); } + +#ifdef USE_NEW_DOCK_API + +QString NetworkPlugin::message(const QString &msg) +{ + QJsonParseError jsonParseError; + const QJsonDocument &resultDoc = QJsonDocument::fromJson(msg.toLocal8Bit(), &jsonParseError); + if (jsonParseError.error != QJsonParseError::NoError || resultDoc.isEmpty()) { + qCWarning(DNC) << "Result json parse error"; + return "{}"; + } + + const auto &msgObj = resultDoc.object(); + if (msgObj.value(Dock::MSG_TYPE).toString() == Dock::MSG_SET_APPLET_MIN_HEIGHT) { + const int minHeight = msgObj.value(Dock::MSG_DATA).toInt(-1); + if (m_dockContentWidget && minHeight > 0) + m_dockContentWidget->setMinHeight(minHeight); + } + + if (msgObj.value(Dock::MSG_TYPE).toString() == Dock::MSG_APPLET_CONTAINER && m_dockContentWidget) { + m_dockContentWidget->setMainLayoutMargins(QMargins(0, msgObj.value(Dock::MSG_DATA).toInt(-1) == + Dock::APPLET_CONTAINER_QUICK_PANEL ? 6 : 10, 0, 0)); + } + + return "{}"; +} + +#endif //USE_NEW_DOCK_API + +} // namespace network +} // namespace dde diff --git a/dock-network-plugin/networkplugin.h b/dock-network-plugin/networkplugin.h index 21d66162..5d700dad 100644 --- a/dock-network-plugin/networkplugin.h +++ b/dock-network-plugin/networkplugin.h @@ -1,33 +1,61 @@ // SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. // -// SPDX-License-Identifier: LGPL-3.0-or-later +// SPDX-License-Identifier: GPL-3.0-or-later #ifndef NETWORKPLUGIN_H #define NETWORKPLUGIN_H #include "pluginsiteminterface.h" -#include "../common-plugin/utils.h" +#include "constants.h" +#include "netstatus.h" + +#ifdef DOCK_API_VERSION +#if (DOCK_API_VERSION >= DOCK_API_VERSION_CHECK(2, 0, 0)) + #define USE_NEW_DOCK_API +#endif +#endif + +#ifdef USE_NEW_DOCK_API +#include "pluginsiteminterface_v2.h" +#endif #define NETWORK_KEY "network-item-key" -NETWORKPLUGIN_BEGIN_NAMESPACE -class NetworkPluginHelper; -class NetworkDialog; -class TrayIcon; -NETWORKPLUGIN_END_NAMESPACE +class QDBusMessage; -class QuickPanel; -enum class NetDeviceStatus; +namespace dde { +namespace network { +class NetManager; +class NetView; +class NetStatus; +class QuickPanelWidget; +class DockContentWidget; +#ifdef USE_NEW_DOCK_API +class NetworkPlugin : public QObject, PluginsItemInterfaceV2 +#else class NetworkPlugin : public QObject, PluginsItemInterface +#endif { Q_OBJECT +#ifdef USE_NEW_DOCK_API + Q_INTERFACES(PluginsItemInterfaceV2) + Q_PLUGIN_METADATA(IID ModuleInterface_iid_V2 FILE "network_v2.json") +#else Q_INTERFACES(PluginsItemInterface) - Q_PLUGIN_METADATA(IID "com.deepin.dock.PluginsItemInterface" FILE "network.json") + Q_PLUGIN_METADATA(IID ModuleInterface_iid FILE "network.json") +#endif public Q_SLOTS: void showNetworkDialog(); + void updateLockScreenStatus(bool visible); + void updateIconColor(); + void onNotify(uint replacesId); + void onQuickIconClicked(); + void onQuickPanelClicked(); + void onNetworkStatusChanged(NetStatus::NetworkStatus networkStatus); + void onNetCheckAvailableChanged(const bool &netCheckAvailable); public: explicit NetworkPlugin(QObject *parent = Q_NULLPTR); @@ -36,43 +64,51 @@ public Q_SLOTS: const QString pluginName() const override; const QString pluginDisplayName() const override; void init(PluginProxyInterface *proxyInter) override; - void invokedMenuItem(const QString &itemKey, const QString &menuId, const bool checked) override; + void invokedMenuItem(const QString &itemKey, const QString &menuId, bool checked) override; void refreshIcon(const QString &itemKey) override; void pluginStateSwitched() override; - bool pluginIsAllowDisable() override { return true; } + bool pluginIsAllowDisable() override; bool pluginIsDisable() override; const QString itemCommand(const QString &itemKey) override; const QString itemContextMenu(const QString &itemKey) override; QWidget *itemWidget(const QString &itemKey) override; QWidget *itemTipsWidget(const QString &itemKey) override; QWidget *itemPopupApplet(const QString &itemKey) override; + PluginSizePolicy pluginSizePolicy() const override { return Custom; } int itemSortKey(const QString &itemKey) override; - void setSortKey(const QString &itemKey, const int order) override; + void setSortKey(const QString &itemKey, int order) override; void pluginSettingsChanged() override; - PluginFlags flags() const override; + + void updateNetCheckVisible(); + +#ifdef USE_NEW_DOCK_API + virtual Dock::PluginFlags flags() const override { return Dock::Type_Quick | Dock::Quick_Panel_Multi | Dock::Attribute_Normal; } + virtual QString message(const QString &msg) override; +#endif protected: - QIcon icon(const DockPart &dockPart, DGuiApplicationHelper::ColorType themeType) override; - PluginMode status() const override; - QString description() const override; + void positionChanged(const Dock::Position position) override; private: void loadPlugin(); void refreshPluginItemsVisible(); - void updateQuickPanel(); - void updateQuickPanelDescription(NetDeviceStatus status, int connectionCount, const QString &Connection, int enableMenu); - QString networkStateName(NetDeviceStatus status) const; - -private Q_SLOTS: - void onIconUpdated(); + bool eventFilter(QObject *watched, QEvent *event) override; private: - QScopedPointer m_networkHelper; - NETWORKPLUGIN_NAMESPACE::NetworkDialog *m_networkDialog; - QuickPanel *m_quickPanel; - int m_clickTime; + QPointer m_trayIcon; + QPointer m_tipsWidget; + dde::network::NetManager *m_manager; + dde::network::NetView *m_netView; + dde::network::NetStatus *m_netStatus; + QPointer m_quickPanel; + bool m_isLockScreen; + uint m_replacesId; + DockContentWidget *m_dockContentWidget; + bool m_netCheckAvailable; + bool m_netLimited; }; - +} // namespace network +} // namespace dde #endif // NETWORKPLUGIN_H diff --git a/dock-network-plugin/quickpanel.cpp b/dock-network-plugin/quickpanel.cpp deleted file mode 100644 index 70fb749b..00000000 --- a/dock-network-plugin/quickpanel.cpp +++ /dev/null @@ -1,212 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: LGPL-3.0-or-later - -#include "quickpanel.h" - -#include -#include -#include - -#include -#include -#include - -DWIDGET_USE_NAMESPACE - -const QSize IconSize(24, 24); // 图标大小 - -class HighlightIconEngine : public QIconEngine -{ -public: - explicit HighlightIconEngine(QIcon icon = QIcon()) - : QIconEngine() - , m_icon(icon) - { - } - - virtual void paint(QPainter *painter, const QRect &rect, QIcon::Mode mode, QIcon::State state) - { - QSize pixmapSize = rect.size(); - qreal scale = 1; - if (painter->device() && (!QCoreApplication::testAttribute(Qt::AA_UseHighDpiPixmaps))) - scale = painter->device()->devicePixelRatioF(); - - pixmapSize *= scale; - - QPixmap pm = m_icon.pixmap(pixmapSize, mode, state); - if (pm.isNull()) - return; - - if (state == QIcon::On) { - QPainter pa(&pm); - pa.setCompositionMode(QPainter::CompositionMode_SourceIn); - pa.fillRect(pm.rect(), qApp->palette().highlight()); - } - - pm.setDevicePixelRatio(scale); - painter->drawPixmap(rect, pm); - } - - virtual QIconEngine *clone() const - { - return new HighlightIconEngine(m_icon); - } - -private: - QIcon m_icon; -}; - -QuickPanel::QuickPanel(QWidget *parent) - : QWidget(parent) - , m_iconButton(new DIconButton(this)) - , m_text(new DLabel(this)) - , m_description(new DLabel(this)) - , m_hover(false) -{ - initUi(); - initConnect(); -} - -const QVariant &QuickPanel::userData() const -{ - return m_userData; -} - -void QuickPanel::setUserData(const QVariant &data) -{ - m_userData = data; -} - -const QString QuickPanel::text() const -{ - return m_text->text(); -} - -const QString QuickPanel::description() const -{ - return m_description->text(); -} - -void QuickPanel::setIcon(const QIcon &icon) -{ - m_iconButton->setIcon(QIcon(new HighlightIconEngine(icon))); -} - -void QuickPanel::setText(const QString &text) -{ - m_text->setText(text); -} - -void QuickPanel::setDescription(const QString &description) -{ - m_description->setText(description); - m_description->setToolTip(description); -} - -void QuickPanel::setActive(bool active) -{ - m_iconButton->setChecked(active); -} - -void QuickPanel::paintEvent(QPaintEvent *event) -{ - QPainter painter(this); - painter.setRenderHint(QPainter::RenderHint::Antialiasing); - const DPalette &dp = palette(); - painter.setPen(Qt::NoPen); - painter.setBrush(dp.brush(m_hover ? DPalette::ObviousBackground : DPalette::ItemBackground)); - painter.drawRoundedRect(rect(), 8, 8); -} - -void QuickPanel::mouseReleaseEvent(QMouseEvent *event) -{ - if (!m_iconButton->rect().contains(event->pos()) && rect().contains(event->pos())) { - emit panelClicked(); - } -} - -void QuickPanel::enterEvent(QEvent *event) -{ - setHover(true); -} - -void QuickPanel::leaveEvent(QEvent *event) -{ - setHover(false); -} - -bool QuickPanel::eventFilter(QObject *watched, QEvent *event) -{ - switch (event->type()) { - case QEvent::Enter: - setHover(false); - break; - case QEvent::Leave: - setHover(true); - break; - default: - break; - } - return QWidget::eventFilter(watched, event); -} - -void QuickPanel::initUi() -{ - QHBoxLayout *mainLayout = new QHBoxLayout(this); - // 文本 - QWidget *labelWidget = new QWidget(this); - QVBoxLayout *layout = new QVBoxLayout(labelWidget); - layout->setContentsMargins(0, 10, 0, 10); - layout->setSpacing(0); - QFont nameFont = DFontSizeManager::instance()->t6(); - nameFont.setBold(true); - m_text->setFont(nameFont); - m_text->setElideMode(Qt::ElideRight); - layout->addWidget(m_text); - m_description->setFont(DFontSizeManager::instance()->t10()); - m_description->setElideMode(Qt::ElideRight); - layout->addWidget(m_description); - - // 图标 - m_iconButton->setEnabledCircle(true); - m_iconButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - m_iconButton->setIconSize(IconSize); - m_iconButton->installEventFilter(this); - m_iconButton->setCheckable(true); - - // 进入图标 - QWidget *expandWidget = new QWidget(this); - QVBoxLayout *expandLayout = new QVBoxLayout(expandWidget); - QLabel *enterIcon = new QLabel(expandWidget); - qreal ratio = devicePixelRatioF(); - QSize size = QCoreApplication::testAttribute(Qt::AA_UseHighDpiPixmaps) ? QSize(16, 16) : QSize(16, 16) * ratio; - QPixmap enterPixmap = DStyle::standardIcon(style(), DStyle::SP_ArrowEnter).pixmap(size); - enterPixmap.setDevicePixelRatio(ratio); - enterIcon->setPixmap(enterPixmap); - expandLayout->setContentsMargins(0, 0, 0, 0); - expandLayout->setSpacing(0); - expandLayout->addWidget(enterIcon); - - mainLayout->setContentsMargins(10, 0, 10, 0); - mainLayout->setSpacing(0); - mainLayout->addWidget(m_iconButton); - mainLayout->addSpacing(10); - mainLayout->addWidget(labelWidget); - mainLayout->addStretch(); - mainLayout->addWidget(expandWidget); -} - -void QuickPanel::initConnect() -{ - connect(m_iconButton, &DIconButton::clicked, this, &QuickPanel::iconClicked); -} - -void QuickPanel::setHover(bool hover) -{ - if (hover == m_hover) - return; - - m_hover = hover; - update(); -} diff --git a/dock-network-plugin/quickpanel.h b/dock-network-plugin/quickpanel.h deleted file mode 100644 index 98b1ab9e..00000000 --- a/dock-network-plugin/quickpanel.h +++ /dev/null @@ -1,62 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: LGPL-3.0-or-later - -#ifndef QUICKPANEL_H -#define QUICKPANEL_H - -#include -#include -#include - -namespace Dtk { -namespace Widget { -class DLabel; -class DIconButton; -} -} - -class QuickPanel : public QWidget -{ - Q_OBJECT - -public: - explicit QuickPanel(QWidget *parent = nullptr); - const QVariant &userData() const; - void setUserData(const QVariant &data); - const QString text() const; - const QString description() const; - -public Q_SLOTS: - void setIcon(const QIcon &icon); - void setText(const QString &text); - void setDescription(const QString &description); - void setActive(bool active); - -Q_SIGNALS: - void panelClicked(); - void iconClicked(); - -protected: - void paintEvent(QPaintEvent *event) override; - void mouseReleaseEvent(QMouseEvent *event) override; - void enterEvent(QEvent *event) override; - void leaveEvent(QEvent *event) override; - bool eventFilter(QObject *watched, QEvent *event) override; - -private: - void initUi(); - void initConnect(); - void setHover(bool hover); - -private: - QVariant m_userData; - - Dtk::Widget::DIconButton *m_iconButton; - Dtk::Widget::DLabel *m_text; - Dtk::Widget::DLabel *m_description; - - bool m_hover; -}; - -#endif // QUICKPANEL_H diff --git a/dock-network-plugin/quickpanelwidget.cpp b/dock-network-plugin/quickpanelwidget.cpp new file mode 100644 index 00000000..910571ea --- /dev/null +++ b/dock-network-plugin/quickpanelwidget.cpp @@ -0,0 +1,192 @@ +// Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. +// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: LGPL-3.0-or-later + +#include "quickpanelwidget.h" + +#include +#include +#include + +#include +#include +#include +#include +#include + +DGUI_USE_NAMESPACE +DWIDGET_USE_NAMESPACE + +const QSize IconSize(22, 22); // 图标大小 + +namespace dde { +namespace network { +class QuickButton : public DFloatingButton +{ +public: + QuickButton(QWidget *parent = nullptr) + : DFloatingButton(parent) + { + } + +protected: + void initStyleOption(DStyleOptionButton *option) const override + { + DFloatingButton::initStyleOption(option); + QColor bgColor = option->dpalette.color(backgroundRole()); + QColor textColor = option->dpalette.color(foregroundRole()); + if (backgroundRole() == QPalette::Highlight) { + textColor = Qt::white; + if (!option->state.testFlag(QStyle::State_Raised)) { // press + bgColor.setHslF(bgColor.hslHueF(), bgColor.hslSaturationF(), bgColor.lightnessF() * 0.9); + textColor.setAlphaF(0.8); + } else if (option->state.testFlag(QStyle::State_MouseOver)) { // hover + bgColor.setHslF(bgColor.hslHueF(), bgColor.hslSaturationF(), bgColor.lightnessF() * 1.1); + } + } else { + textColor.setAlphaF(1); + if (!option->state.testFlag(QStyle::State_Raised)) { // press + bgColor.setAlphaF(0.2); + } else if (option->state.testFlag(QStyle::State_MouseOver)) { // hover + bgColor.setAlphaF(0.15); + } else { // normal + bgColor.setAlphaF(0.1); + } + } + option->palette.setBrush(QPalette::Button, bgColor); + option->palette.setBrush(QPalette::ButtonText, textColor); + option->palette.setBrush(QPalette::WindowText, Qt::red); + option->state.setFlag(QStyle::State_MouseOver, false); + option->state.setFlag(QStyle::State_Sunken, false); + option->state.setFlag(QStyle::State_Raised, true); + } +}; + +QuickPanelWidget::QuickPanelWidget(QWidget *parent) + : QWidget(parent) + , m_iconWidget(new QuickButton(this)) + , m_nameLabel(new DLabel(this)) + , m_stateLabel(new DLabel(this)) + , m_expandLabel(new DIconButton(this)) +{ + initUi(); + initConnection(); +} + +QuickPanelWidget::~QuickPanelWidget() { } + +void QuickPanelWidget::setIcon(const QIcon &icon) +{ + + // DDciIcon dciIcon = DDciIcon::fromTheme(icon.name()); + // if(dciIcon.isNull()){ + m_iconWidget->setIcon(icon); + // }else{ + // m_iconWidget->setIcon(dciIcon); + // } + // m_iconWidget->setIcon(icon); + // // "network-wireless-6-offline-secure-symbolic" + // DDciIcon::fromTheme("network-wireless-6-offline-secure-symbolic"); + // m_iconWidget->setIcon(DDciIcon::fromTheme("network-wireless-6-offline-secure-symbolic")); + // DDciIcon::fromTheme("network-wireless-6-offline-secure-symbolic"); + // m_iconWidget->setIcon(QIcon::fromTheme("network-wireless-6-offline-secure-symbolic")); + // network-wireless-6-signal-full-secure-symbolic_16px.svg +} + +void QuickPanelWidget::setText(const QString &text) +{ + m_nameLabel->setText(text); +} + +void QuickPanelWidget::setDescription(const QString &description) +{ + m_stateLabel->setText(description); +} + +void QuickPanelWidget::setActive(bool active) +{ + m_iconWidget->setBackgroundRole(active ? QPalette::Highlight : QPalette::BrightText); +} + +void QuickPanelWidget::mousePressEvent(QMouseEvent *event) +{ + switch (event->button()) { + case Qt::LeftButton: + m_clickPoint = event->pos(); + break; + default: + break; + } + QWidget::mousePressEvent(event); +} + +void QuickPanelWidget::mouseReleaseEvent(QMouseEvent *event) +{ + switch (event->button()) { + case Qt::LeftButton: + if (m_clickPoint == event->pos()) + Q_EMIT panelClicked(); + break; + default: + break; + } + m_clickPoint = QPoint(); + return QWidget::mouseReleaseEvent(event); +} + +void QuickPanelWidget::initUi() +{ + QWidget *labelWidget = new QWidget(this); + + DFontSizeManager::instance()->bind(m_nameLabel, DFontSizeManager::T6, QFont::Normal); + m_nameLabel->setElideMode(Qt::ElideRight); + DToolTip::setToolTipShowMode(m_nameLabel, DToolTip::ShowWhenElided); + m_nameLabel->setContentsMargins(0, 2, 0, 0); + m_nameLabel->setForegroundRole(QPalette::BrightText); + + DFontSizeManager::instance()->bind(m_stateLabel, DFontSizeManager::T10); + m_stateLabel->setElideMode(Qt::ElideRight); + DToolTip::setToolTipShowMode(m_stateLabel, DToolTip::ShowWhenElided); + + QVBoxLayout *layout = new QVBoxLayout(labelWidget); + layout->setContentsMargins(0, 8, 0, 8); + layout->setSpacing(0); + layout->addWidget(m_nameLabel); + layout->addWidget(m_stateLabel); + + // 图标 + m_iconWidget->setEnabledCircle(true); + m_iconWidget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + m_iconWidget->setIconSize(IconSize); + m_iconWidget->setCheckable(false); + m_iconWidget->setFixedSize(QSize(40, 40)); + m_iconWidget->setFocusPolicy(Qt::NoFocus); + + // 进入图标 + m_expandLabel->setIcon(DStyle::standardIcon(style(), DStyle::SP_ArrowEnter)); + m_expandLabel->setFlat(true); + m_expandLabel->setFocusPolicy(Qt::NoFocus); + + m_expandLabel->setAttribute(Qt::WA_TransparentForMouseEvents); + + QHBoxLayout *mainLayout = new QHBoxLayout(this); + mainLayout->setContentsMargins(10, 0, 10, 0); + mainLayout->setSpacing(0); + mainLayout->addWidget(m_iconWidget); + mainLayout->addSpacing(10); + mainLayout->addWidget(labelWidget); + mainLayout->addStretch(1); + mainLayout->addWidget(m_expandLabel); + + setActive(true); + setFixedSize(150, 60); +} + +void QuickPanelWidget::initConnection() +{ + connect(m_iconWidget, &DFloatingButton::clicked, this, &QuickPanelWidget::iconClicked); +} + +} // namespace network +} // namespace dde diff --git a/dock-network-plugin/quickpanelwidget.h b/dock-network-plugin/quickpanelwidget.h new file mode 100644 index 00000000..77dd0a15 --- /dev/null +++ b/dock-network-plugin/quickpanelwidget.h @@ -0,0 +1,55 @@ +// Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. +// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: LGPL-3.0-or-later + +#ifndef QUICKPANELWIDGET_H +#define QUICKPANELWIDGET_H + +#include +#include + +#include + +class QLabel; + +namespace dde { +namespace network { +class QuickButton; + +class QuickPanelWidget : public QWidget +{ + Q_OBJECT + +public: + explicit QuickPanelWidget(QWidget *parent = nullptr); + ~QuickPanelWidget() override; + +public Q_SLOTS: + void setIcon(const QIcon &icon); + void setText(const QString &text); + void setDescription(const QString &description); + void setActive(bool active); + +Q_SIGNALS: + void panelClicked(); + void iconClicked(); + +protected: + void mousePressEvent(QMouseEvent *event) override; + void mouseReleaseEvent(QMouseEvent *event) override; + +private: + void initUi(); + void initConnection(); + +private: + QuickButton *m_iconWidget; + Dtk::Widget::DLabel *m_nameLabel; + Dtk::Widget::DLabel *m_stateLabel; + Dtk::Widget::DIconButton *m_expandLabel; + QPoint m_clickPoint; +}; +} // namespace network +} // namespace dde +#endif // QUICKPANELWIDGET_H diff --git a/net-view/window/qrc/icons/network-wireless-signal-full-symbolic.dci b/dock-network-plugin/resources/dcc-network.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-signal-full-symbolic.dci rename to dock-network-plugin/resources/dcc-network.dci diff --git a/dock-network-plugin/widget/commoniconbutton.cpp b/dock-network-plugin/widget/commoniconbutton.cpp new file mode 100644 index 00000000..6d260a8e --- /dev/null +++ b/dock-network-plugin/widget/commoniconbutton.cpp @@ -0,0 +1,223 @@ +// SPDX-FileCopyrightText: 2019 - 2022 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: LGPL-3.0-or-later +#include "commoniconbutton.h" + +#include +#include +#include + +#include + +DGUI_USE_NAMESPACE + +CommonIconButton::CommonIconButton(QWidget *parent) + : QWidget(parent) + , m_refreshTimer(nullptr) + , m_rotateAngle(0) + , m_clickable(false) + , m_rotatable(false) + , m_hover(false) + , m_state(Default) + , m_lightThemeColor(Qt::black) + , m_darkThemeColor(Qt::white) + , m_activeState(false) + , m_hoverEnable(true) + , m_iconSize(QSize()) +{ + setAccessibleName("IconButton"); + setFixedSize(24, 24); + if (parent) + setForegroundRole(parent->foregroundRole()); + + connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, &CommonIconButton::refreshIcon); +} + +void CommonIconButton::setStateIconMapping(QMap> mapping) +{ + m_fileMapping = mapping; +} + +void CommonIconButton::setState(State state) +{ + m_state = state; + if (m_fileMapping.contains(state)) { + auto pair = m_fileMapping.value(state); + setIcon(pair.first, pair.second); + } + if (!m_icon.isNull()) { + updatePalette(); + } +} + +void CommonIconButton::setIcon(const QIcon &icon, QColor lightThemeColor, QColor darkThemeColor) +{ + m_icon = icon; + if (lightThemeColor.isValid() && darkThemeColor.isValid()) { + m_lightThemeColor = lightThemeColor; + m_darkThemeColor = darkThemeColor; + } + + updatePalette(); +} + +void CommonIconButton::updatePalette() +{ + if (m_lightThemeColor.isValid() && m_darkThemeColor.isValid()) { + QColor color = DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType ? m_lightThemeColor : m_darkThemeColor; + if (m_activeState) + color = palette().color(QPalette::Highlight); + auto pa = palette(); + pa.setColor(QPalette::WindowText, color); + setPalette(pa); + } + + update(); +} + +void CommonIconButton::setActiveState(bool state) +{ + m_activeState = state; + if (m_lightThemeColor.isValid() && m_darkThemeColor.isValid()) { + updatePalette(); + } else { + setForegroundRole(state ? QPalette::Highlight : QPalette::NoRole); + } +} + +void CommonIconButton::setHoverEnable(bool enable) +{ + m_hoverEnable = enable; +} + +void CommonIconButton::setIcon(const QString &icon, const QString &fallback, const QString &suffix) +{ + if (!m_fileMapping.contains(Default)) { + m_fileMapping.insert(Default, QPair(icon, fallback)); + } + + QString tmp = icon; + QString tmpFallback = fallback; + + static auto addDarkMark = [suffix] (QString &file) { + if (file.contains(suffix)) { + file.replace(suffix, "-dark" + suffix); + } else { + file.append("-dark"); + } + }; + if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) { + addDarkMark(tmp); + addDarkMark(tmpFallback); + } + m_icon = QIcon::fromTheme(tmp, QIcon::fromTheme(tmpFallback)); + update(); +} + +void CommonIconButton::setHoverIcon(const QIcon &icon) +{ + m_hoverIcon = icon; +} + +void CommonIconButton::setClickable(bool clickable) +{ + m_clickable = clickable; +} + +void CommonIconButton::setRotatable(bool rotatable) +{ + m_rotatable = rotatable; + if (!m_rotatable) { + if (m_refreshTimer) + delete m_refreshTimer; + m_refreshTimer = nullptr; + } +} + +void CommonIconButton::startRotate() +{ + if (!m_refreshTimer) { + m_refreshTimer = new QTimer(this); + m_refreshTimer->setInterval(50); + connect(m_refreshTimer, &QTimer::timeout, this, &CommonIconButton::startRotate); + } + m_refreshTimer->start(); + m_rotateAngle += 54; + update(); + if (m_rotateAngle >= 360) { + stopRotate(); + } +} + +void CommonIconButton::stopRotate() +{ + m_refreshTimer->stop(); + m_rotateAngle = 0; + update(); +} + +bool CommonIconButton::event(QEvent *e) +{ + switch (e->type()) { + case QEvent::Leave: + case QEvent::Enter: + m_hover = e->type() == QEvent::Enter; + update(); + break; + default: + break; + } + return QWidget::event(e); +} + +void CommonIconButton::paintEvent(QPaintEvent *e) +{ + QWidget::paintEvent(e); + QPainter painter(this); + painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); + + if (m_rotateAngle != 0) { + painter.translate(this->width() / 2, this->height() / 2); + painter.rotate(m_rotateAngle); + painter.translate(-(this->width() / 2), -(this->height() / 2)); + } + + if (m_hoverEnable && m_hover && !m_hoverIcon.isNull()) { + m_hoverIcon.paint(&painter, rect()); + } else if (!m_icon.isNull()) { + if (!m_iconSize.isEmpty()) { + const int left = (width() - m_iconSize.width()) / 2; + const int top = (height() - m_iconSize.height()) / 2; + m_icon.paint(&painter, rect().marginsRemoved(QMargins(left, top, left, top))); + } else { + m_icon.paint(&painter, rect()); + } + } +} + +void CommonIconButton::mousePressEvent(QMouseEvent *event) +{ + m_pressPos = event->pos(); + return QWidget::mousePressEvent(event); +} + +void CommonIconButton::mouseReleaseEvent(QMouseEvent *event) +{ + if (m_clickable && rect().contains(m_pressPos) && rect().contains(event->pos()) && (!m_refreshTimer || !m_refreshTimer->isActive())) { + if (m_rotatable) + startRotate(); + Q_EMIT clicked(); + return; + } + return QWidget::mouseReleaseEvent(event); +} + +void CommonIconButton::refreshIcon() +{ + setState(m_state); +} + +void CommonIconButton::setIconSize(const QSize &size) +{ + m_iconSize = size; +} diff --git a/dock-network-plugin/widget/commoniconbutton.h b/dock-network-plugin/widget/commoniconbutton.h new file mode 100644 index 00000000..2a504299 --- /dev/null +++ b/dock-network-plugin/widget/commoniconbutton.h @@ -0,0 +1,73 @@ +// SPDX-FileCopyrightText: 2019 - 2022 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: LGPL-3.0-or-later +#ifndef ICONBUTTON_H +#define ICONBUTTON_H + +#include +#include +#include + +class CommonIconButton : public QWidget +{ +public: + enum State { + Default, + On, + Off + }; + + Q_OBJECT +public: + explicit CommonIconButton(QWidget *parent = nullptr); + + void setStateIconMapping(QMap> mapping); + void setState(State state); + void setActiveState(bool state); + bool activeState() const { return m_activeState; } + void setHoverEnable(bool enable); + void setIconSize(const QSize &size); + +public Q_SLOTS: + void setIcon(const QString &icon, const QString &fallback = "", const QString &suffix = ".svg"); + void setIcon(const QIcon &icon, QColor lightThemeColor = QColor(), QColor darkThemeColor = QColor()); + void setHoverIcon(const QIcon &icon); + + void setClickable(bool clickable); + void setRotatable(bool rotatable); + +signals: + void clicked(); + +protected: + bool event(QEvent *e) override; + void paintEvent(QPaintEvent *e) override; + void mousePressEvent(QMouseEvent *event) override; + void mouseReleaseEvent(QMouseEvent *event) override; + + void startRotate(); + void stopRotate(); + +private: + void refreshIcon(); + void updatePalette(); + +private: + QTimer *m_refreshTimer; + QIcon m_icon; + QIcon m_hoverIcon; + QPoint m_pressPos; + int m_rotateAngle; + bool m_clickable; + bool m_rotatable; + bool m_hover; + QMap> m_fileMapping; + State m_state; + QColor m_lightThemeColor; + QColor m_darkThemeColor; + bool m_activeState; + bool m_hoverEnable; + QSize m_iconSize; +}; + +#endif // DOCKICONBUTTON_H diff --git a/dock-network-plugin/widget/jumpsettingbutton.cpp b/dock-network-plugin/widget/jumpsettingbutton.cpp new file mode 100644 index 00000000..b4f4b517 --- /dev/null +++ b/dock-network-plugin/widget/jumpsettingbutton.cpp @@ -0,0 +1,138 @@ +// SPDX-FileCopyrightText: 2019 - 2023 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: LGPL-3.0-or-later + +#include "jumpsettingbutton.h" + +#include + +#include +#include +#include +#include +#include + +DWIDGET_USE_NAMESPACE +DGUI_USE_NAMESPACE + +JumpSettingButton::JumpSettingButton(QWidget *parent) + : QFrame(parent) + , m_hover(false) + , m_autoShowPage(true) + , m_iconButton(new CommonIconButton(this)) + , m_descriptionLabel(new DLabel(this)) +{ + initUI(); +} + +JumpSettingButton::JumpSettingButton(const QIcon& icon, const QString& description, QWidget* parent) + : QFrame(parent) + , m_hover(false) + , m_autoShowPage(true) + , m_iconButton(new CommonIconButton(this)) + , m_descriptionLabel(new DLabel(this)) +{ + initUI(); + + m_iconButton->setIcon(icon); + m_descriptionLabel->setText(description); +} + +JumpSettingButton::~JumpSettingButton() +{ + +} + +void JumpSettingButton::initUI() +{ + setFixedHeight(36); + setForegroundRole(QPalette::BrightText); + m_iconButton->setFixedSize(16, 16); + m_iconButton->setForegroundRole(QPalette::BrightText); + + m_descriptionLabel->setElideMode(Qt::ElideRight); + m_descriptionLabel->setForegroundRole(foregroundRole()); + DFontSizeManager::instance()->bind(m_descriptionLabel, DFontSizeManager::T6); + + auto* layout = new QHBoxLayout(this); + layout->setContentsMargins(10, 0, 10, 0); + layout->addWidget(m_iconButton); + layout->addWidget(m_descriptionLabel); + layout->addStretch(); +} + +void JumpSettingButton::setIcon(const QIcon &icon) +{ + m_iconButton->setIcon(icon, Qt::black, Qt::white); +} + +void JumpSettingButton::setDescription(const QString& description) +{ + m_descriptionLabel->setText(description); +} + +bool JumpSettingButton::event(QEvent* e) +{ + switch (e->type()) { + case QEvent::Leave: + case QEvent::Enter: + m_hover = e->type() == QEvent::Enter; + update(); + break; + default: + break; + } + return QWidget::event(e); +} + +void JumpSettingButton::paintEvent(QPaintEvent* e) +{ + Q_UNUSED(e) + QPainter p(this); + QPalette palette = this->palette(); + QColor bgColor, textColor; + if (m_hover) { + textColor = palette.highlightedText().color(); + bgColor = palette.color(QPalette::Active, QPalette::Highlight); + } else { + textColor = palette.brightText().color(); + bgColor = palette.brightText().color(); + bgColor.setAlphaF(0.05); + } + palette.setBrush(QPalette::BrightText, textColor); + m_iconButton->setPalette(palette); + m_descriptionLabel->setPalette(palette); + + p.setBrush(bgColor); + p.setRenderHint(QPainter::Antialiasing); + p.setPen(Qt::NoPen); + p.drawRoundedRect(rect(), 8, 8); + return QFrame::paintEvent(e); +} + +void JumpSettingButton::mouseReleaseEvent(QMouseEvent* event) +{ + if (underMouse()) { + Q_EMIT clicked(); + if (m_autoShowPage && !m_fistPage.isEmpty()) { + DDBusSender() + .service("org.deepin.dde.ControlCenter1") + .path("/org/deepin/dde/ControlCenter1") + .interface("org.deepin.dde.ControlCenter1") + .method(QString("ShowPage")) + .arg(QString(m_fistPage)) + .arg(QString(m_secondPage)) + .call(); + Q_EMIT showPageRequestWasSended(); + } + return; + } + return QWidget::mouseReleaseEvent(event); +} + + +void JumpSettingButton::setDccPage(const QString &first, const QString &second) +{ + m_fistPage = first; + m_secondPage = second; +} diff --git a/dock-network-plugin/widget/jumpsettingbutton.h b/dock-network-plugin/widget/jumpsettingbutton.h new file mode 100644 index 00000000..9a6ba9e4 --- /dev/null +++ b/dock-network-plugin/widget/jumpsettingbutton.h @@ -0,0 +1,49 @@ +// SPDX-FileCopyrightText: 2019 - 2023 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: LGPL-3.0-or-later + +#ifndef JUMPSETTINGBUTTON_H +#define JUMPSETTINGBUTTON_H + +#include "commoniconbutton.h" + +#include +#include + +#include + +class JumpSettingButton : public QFrame +{ + Q_OBJECT +public: + explicit JumpSettingButton(QWidget *parent = nullptr); + JumpSettingButton(const QIcon& icon, const QString& description, QWidget *parent = nullptr); + ~JumpSettingButton(); + + void setDccPage(const QString &module, const QString &page); + void setAutoShowPage(bool autoShowPage) { m_autoShowPage = autoShowPage; } + void setIcon(const QIcon &icon); + void setDescription(const QString& description); + +signals: + void clicked(); + void showPageRequestWasSended(); + +protected: + bool event(QEvent* e) override; + void paintEvent(QPaintEvent* e) override; + void mouseReleaseEvent(QMouseEvent* event) override; + +private: + void initUI(); + +private: + bool m_hover; + bool m_autoShowPage; + QString m_fistPage; + QString m_secondPage; + CommonIconButton *m_iconButton; + Dtk::Widget::DLabel *m_descriptionLabel; +}; + +#endif diff --git a/dss-network-plugin/10-network-manager.pkla b/dss-network-plugin/10-network-manager.pkla new file mode 100644 index 00000000..a18196e4 --- /dev/null +++ b/dss-network-plugin/10-network-manager.pkla @@ -0,0 +1,6 @@ +[Greeter Active WIFI Connection] +Identity=unix-user:lightdm +Action=org.freedesktop.NetworkManager.* +ResultAny=no +ResultInactive=no +ResultActive=yes diff --git a/dss-network-plugin/50-dss-network-plugin.rules b/dss-network-plugin/50-dss-network-plugin.rules deleted file mode 100644 index 2f8b337c..00000000 --- a/dss-network-plugin/50-dss-network-plugin.rules +++ /dev/null @@ -1,8 +0,0 @@ -/* -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- */ - -polkit.addRule(function(action, subject) { - if ((action.id.indexOf("org.freedesktop.NetworkManager.") == 0) && - subject.user == "lightdm") { - return polkit.Result.YES; - } -}); diff --git a/dss-network-plugin/CMakeLists.txt b/dss-network-plugin/CMakeLists.txt index fe2c2f12..ccbdcbf3 100644 --- a/dss-network-plugin/CMakeLists.txt +++ b/dss-network-plugin/CMakeLists.txt @@ -4,25 +4,41 @@ set(PLUGIN_NAME "dss-network-plugin") project(${PLUGIN_NAME}) +include(GNUInstallDirs) # 启用 qt moc 的支持 set(CMAKE_AUTOMOC ON) # 启用 qrc 资源文件的支持 set(CMAKE_AUTORCC ON) +set(NET_USE_NOTIFICATION ON) -file(GLOB_RECURSE SRCS "*.h" "*.cpp" "../common-plugin/*.h" "../common-plugin/*.cpp") +file(GLOB_RECURSE SRCS "networkmodule.h" "networkmodule.cpp" "../net-view/*.h" "../net-view/*.cpp") find_package(Qt6 COMPONENTS Core Widgets DBus Network LinguistTools REQUIRED) find_package(PkgConfig REQUIRED) -find_package(Dtk6 COMPONENTS Widget REQUIRED) +# find_package(Qt5Svg REQUIRED) +find_package(Dtk6 COMPONENTS Widget REQUIRED) find_package(KF6NetworkManagerQt REQUIRED) find_package(DdeSessionShell REQUIRED) +# if (CMAKE_BUILD_TYPE STREQUAL "Debug") +# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -fsanitize=address -O0") +# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -fsanitize=address -O0") +# endif() + + file(GLOB TS_FILES "translations/*.ts") qt_add_translation(QM_FILES ${TS_FILES}) add_custom_target(${TARGET_NAME}_language ALL DEPENDS ${QM_FILES}) add_definitions("${QT_DEFINITIONS} -DQT_PLUGIN") -add_library(${PLUGIN_NAME} SHARED ${SRCS} ../common-plugin/network.qrc) + +if (NET_USE_NOTIFICATION) + add_definitions(-DNET_USE_NOTIFICATION) + file(GLOB_RECURSE NOTIFICATION_SRCS "notification/*.h" "notification/*.cpp") + set(SRCS ${SRCS} ${NOTIFICATION_SRCS}) +endif() + +add_library(${PLUGIN_NAME} SHARED ${SRCS} ../net-view/window/qrc/network.qrc) target_include_directories(${PLUGIN_NAME} PUBLIC Dtk6::Widget @@ -31,7 +47,8 @@ target_include_directories(${PLUGIN_NAME} PUBLIC Qt6::Widgets ${DDESESSIONSHELL_INCLUDE_DIR} KF6::NetworkManagerQt - "../common-plugin/" + "../net-view/operation" + "../net-view/window" "../src" ) @@ -48,4 +65,4 @@ install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION lib/dde-session-shell/modules # 安装 .qm 文件 install(FILES ${QM_FILES} DESTINATION ${CMAKE_INSTALL_DATADIR}/${PLUGIN_NAME}/translations) -install(FILES 50-dss-network-plugin.rules DESTINATION share/polkit-1/rules.d) +install(FILES 10-network-manager.pkla DESTINATION ${CMAKE_INSTALL_FULL_LOCALSTATEDIR}/lib/polkit-1/localauthority/10-vendor.d) diff --git a/dss-network-plugin/dockpopupwindow.cpp b/dss-network-plugin/dockpopupwindow.cpp deleted file mode 100644 index e98194fd..00000000 --- a/dss-network-plugin/dockpopupwindow.cpp +++ /dev/null @@ -1,174 +0,0 @@ -// SPDX-FileCopyrightText: 2011 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: LGPL-3.0-or-later - -#include "dockpopupwindow.h" -#include "utils.h" - -#include -#include -#include -#include -#include - -DWIDGET_USE_NAMESPACE - -DockPopupWindow::DockPopupWindow(QWidget *parent) - : DArrowRectangle(ArrowBottom, FloatWidget, parent) - , m_model(false) - , m_regionInter(new DRegionMonitor(this)) - , m_enableMouseRelease(true) -{ - setMargin(0); - m_wmHelper = DWindowManagerHelper::instance(); - - compositeChanged(); - - setWindowFlags(Qt::X11BypassWindowManagerHint | Qt::WindowStaysOnTopHint); - - setShadowBlurRadius(20); - setRadius(6); - setShadowYOffset(2); - setShadowXOffset(0); - setArrowWidth(18); - setArrowHeight(10); - - connect(m_wmHelper, &DWindowManagerHelper::hasCompositeChanged, this, &DockPopupWindow::compositeChanged); - connect(m_regionInter, &DRegionMonitor::buttonRelease, this, &DockPopupWindow::onGlobMouseRelease); -} - -DockPopupWindow::~DockPopupWindow() -{ -} - -bool DockPopupWindow::model() const -{ - return isVisible() && m_model; -} - -void DockPopupWindow::setContent(QWidget *content) -{ - QWidget *lastWidget = getContent(); - if (lastWidget) - lastWidget->removeEventFilter(this); - content->installEventFilter(this); - - QAccessibleEvent event(this, QAccessible::NameChanged); - QAccessible::updateAccessibility(&event); - - if (!content->objectName().trimmed().isEmpty()) - setAccessibleName(content->objectName() + "-popup"); - - DArrowRectangle::setContent(content); -} - -void DockPopupWindow::show(const QPoint &pos, const bool model) -{ - m_model = model; - m_lastPoint = pos; - - show(pos.x(), pos.y()); - - if (m_regionInter->registered()) { - m_regionInter->unregisterRegion(); - } - - if (m_model) { - m_regionInter->registerRegion(); - } - blockButtonRelease(); -} - -void DockPopupWindow::show(const int x, const int y) -{ - m_lastPoint = QPoint(x, y); - blockButtonRelease(); - - DArrowRectangle::show(x, y); -} - -void DockPopupWindow::blockButtonRelease() -{ - // 短暂的不处理鼠标release事件,防止出现刚显示又被隐藏的情况 - m_enableMouseRelease = false; - QTimer::singleShot(10, this, [this] { - m_enableMouseRelease = true; - }); -} - -void DockPopupWindow::hide() -{ - if (m_regionInter->registered()) - m_regionInter->unregisterRegion(); - - DArrowRectangle::hide(); -} - -void DockPopupWindow::showEvent(QShowEvent *e) -{ - DArrowRectangle::showEvent(e); - - QTimer::singleShot(1, this, &DockPopupWindow::ensureRaised); -} - -void DockPopupWindow::enterEvent(QEnterEvent *e) -{ - DArrowRectangle::enterEvent(e); - - QTimer::singleShot(1, this, &DockPopupWindow::ensureRaised); -} - -bool DockPopupWindow::eventFilter(QObject *o, QEvent *e) -{ - if (o != getContent() || e->type() != QEvent::Resize) - return false; - - // FIXME: ensure position move after global mouse release event - if (isVisible()) { - QTimer::singleShot(10, this, [=] { - // NOTE(sbw): double check is necessary, in this time, the popup maybe already hided. - if (isVisible()) - show(m_lastPoint, m_model); - }); - } - - return false; -} - -void DockPopupWindow::onGlobMouseRelease(const QPoint &mousePos, const int flag) -{ - Q_ASSERT(m_model); - - if (!m_enableMouseRelease) - return; - - if ((flag != DRegionMonitor::WatchedFlags::Button_Left) && (flag != DRegionMonitor::WatchedFlags::Button_Right)) { - return; - } - - const QRect rect = QRect(pos(), size()); - if (rect.contains(mousePos)) - return; - - emit accept(); - - m_regionInter->unregisterRegion(); -} - -void DockPopupWindow::compositeChanged() -{ - setBackgroundColor(QColor(235, 235, 235, 80)); - setBorderColor(QColor(235, 235, 235, 80)); -} - -void DockPopupWindow::ensureRaised() -{ - if (isVisible()) { - QWidget *content = getContent(); - if (!content || !content->isVisible()) { - this->setVisible(false); - } else { - raise(); - } - } -} diff --git a/dss-network-plugin/dockpopupwindow.h b/dss-network-plugin/dockpopupwindow.h deleted file mode 100644 index 181182be..00000000 --- a/dss-network-plugin/dockpopupwindow.h +++ /dev/null @@ -1,60 +0,0 @@ -// SPDX-FileCopyrightText: 2011 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: LGPL-3.0-or-later - -#ifndef DOCKPOPUPWINDOW_H -#define DOCKPOPUPWINDOW_H - -#include -#include -#include - -DWIDGET_USE_NAMESPACE -DGUI_USE_NAMESPACE - -class DockPopupWindow : public Dtk::Widget::DArrowRectangle -{ - Q_OBJECT - -public: - explicit DockPopupWindow(QWidget *parent = nullptr); - ~DockPopupWindow(); - - bool model() const; - - void setContent(QWidget *content); - -public slots: - void show(const QPoint &pos, const bool model = false); - void show(const int x, const int y); - void hide(); - -signals: - void accept() const; - // 在把专业版的仓库降级到debian的stable时, dock出现了一个奇怪的问题: - // 在plugins/tray/system-trays/systemtrayitem.cpp中的showPopupWindow函数中 - // 无法连接到上面这个信号: "accept", qt给出一个运行时警告提示找不到信号 - // 目前的解决方案就是在下面增加了这个信号 - void unusedSignal(); - -protected: - void showEvent(QShowEvent *e); - void enterEvent(QEnterEvent *e); - bool eventFilter(QObject *o, QEvent *e); - void blockButtonRelease(); - -private slots: - void onGlobMouseRelease(const QPoint &mousePos, const int flag); - void compositeChanged(); - void ensureRaised(); - -private: - bool m_model; - QPoint m_lastPoint; - - DRegionMonitor *m_regionInter; - DWindowManagerHelper *m_wmHelper; - bool m_enableMouseRelease; -}; - -#endif // DOCKPOPUPWINDOW_H diff --git a/dss-network-plugin/lupdate.sh b/dss-network-plugin/lupdate.sh index 7558cc97..b4ed6bcf 100755 --- a/dss-network-plugin/lupdate.sh +++ b/dss-network-plugin/lupdate.sh @@ -3,8 +3,6 @@ if [ ! -d "translations/" ];then mkdir translations fi cd ./translations -rm -f dss-network-plugin_en_US.ts -lupdate ../ ../../src ../../common-plugin -ts -no-ui-lines -locations none -no-obsolete dss-network-plugin_en_US.ts +rm -f dss-network-plugin.ts +lupdate ../ ../../net-view/ -ts -no-ui-lines -locations none -no-obsolete dss-network-plugin.ts cd ../ - -tx push -s --branch m23 diff --git a/dss-network-plugin/network.json b/dss-network-plugin/network.json index abae0a1a..0b3bf7f6 100644 --- a/dss-network-plugin/network.json +++ b/dss-network-plugin/network.json @@ -1,3 +1,4 @@ { - "api": "1.0.1" + "api": "2.0.0", + "pluginType": "Tray" } diff --git a/dss-network-plugin/network_module.cpp b/dss-network-plugin/network_module.cpp deleted file mode 100644 index bb879da9..00000000 --- a/dss-network-plugin/network_module.cpp +++ /dev/null @@ -1,564 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: LGPL-3.0-or-later - -#include "network_module.h" -#include "networkpluginhelper.h" -#include "networkdialog.h" -#include "secretagent.h" -#include "notificationmanager.h" -#include "networkdialog/thememanager.h" - -#include -#include -#include -#include -#include - -#include -#include - -#include -#include - -#include -#include -#include -#include -#include -#include - -#define NETWORK_KEY "network-item-key" - -using namespace NetworkManager; - -DWIDGET_USE_NAMESPACE -NETWORKPLUGIN_USE_NAMESPACE - -namespace dss { -namespace module { - -NetworkModule::NetworkModule(QObject *parent) - : QObject(parent) - , m_lastState(NetworkManager::Device::State::UnknownState) - , m_initilized(false) -{ - QDBusConnection::sessionBus().connect("org.deepin.dde.LockFront1", "/org/deepin/dde/LockFront1", "org.deepin.dde.LockFront1", "Visible", this, SLOT(updateLockScreenStatus(bool))); - m_isLockModel = (-1 == qAppName().indexOf("greeter")); - - m_networkDialog = new NetworkDialog(this); - m_networkHelper = new NetworkPluginHelper(m_networkDialog, this); - m_panelContainer = new NetworkPanelContainer(m_networkDialog); - connect(m_networkHelper, &NetworkPluginHelper::pluginStateChanged, m_panelContainer, &NetworkPanelContainer::onPluginStateChanged); - m_panelContainer->onPluginStateChanged(m_networkHelper->getPluginState()); - - installTranslator(QLocale::system().name()); - ThemeManager::ref().setThemeType(m_isLockModel ? ThemeManager::LockType : ThemeManager::GreeterType); - if (m_isLockModel) { - m_networkDialog->setServerName("dde-network-dialog" + QString::number(getuid()) + "lock"); - } else { - QDBusMessage lock = QDBusMessage::createMethodCall("org.deepin.dde.LockService1", "/org/deepin/dde/LockService1", "org.deepin.dde.LockService1", "CurrentUser"); - QDBusConnection::systemBus().callWithCallback(lock, this, SLOT(onUserChanged(QString))); - QDBusConnection::systemBus().connect("org.deepin.dde.LockService1", "/org/deepin/dde/LockService1", "org.deepin.dde.LockService1", "UserChanged", this, SLOT(onUserChanged(QString))); - - m_secretAgent = new NETWORKPLUGIN_NAMESPACE::SecretAgent(true, this); - connect(m_networkDialog, &NetworkDialog::inputPassword, m_secretAgent, &NETWORKPLUGIN_NAMESPACE::SecretAgent::onInputPassword); - connect(m_secretAgent, &NETWORKPLUGIN_NAMESPACE::SecretAgent::requestPassword, m_networkDialog, &NetworkDialog::setConnectWireless); - } -} - -NetworkModule::~NetworkModule() -{ - if (m_panelContainer) { - m_panelContainer->deleteLater(); - m_panelContainer.clear(); - } -} - -QWidget *NetworkModule::content() -{ - return m_panelContainer; -} - -QWidget *NetworkModule::itemTipsWidget() const -{ - QWidget *itemTips = m_networkHelper->itemTips(); - if (itemTips) { - QPalette palette = itemTips->palette(); - palette.setColor(QPalette::BrightText, Qt::white); - itemTips->setPalette(palette); - } - return itemTips; -} - -const QString NetworkModule::itemContextMenu() const -{ - return m_networkHelper->contextMenu(false); -} - -void NetworkModule::invokedMenuItem(const QString &menuId, const bool checked) const -{ - Q_UNUSED(checked); - m_networkHelper->invokeMenuItem(menuId); -} - -void NetworkModule::updateLockScreenStatus(bool visible) -{ - m_isLockModel = true; - m_isLockScreen = visible; -} - -void NetworkModule::onAddDevice(const QString &devicePath) -{ - if (m_isLockModel) { - return; - } - // 登录界面才监听该信号,用于横幅、密码错误处理 - if (!m_devicePaths.contains(devicePath)) { - Device::Ptr device(new Device(devicePath)); - Device *nmDevice = nullptr; - if (device->type() == Device::Wifi) { - NetworkManager::WirelessDevice *wDevice = new NetworkManager::WirelessDevice(devicePath, this); - nmDevice = wDevice; - connect(wDevice, &NetworkManager::WirelessDevice::activeAccessPointChanged, this, [this](const QString &ap) { - m_lastActiveWirelessDevicePath = static_cast(sender())->uni() + NetworkManager::AccessPoint(ap).ssid(); - }); - } else if (device->type() == Device::Ethernet) { - NetworkManager::WiredDevice *wDevice = new NetworkManager::WiredDevice(devicePath, this); - nmDevice = wDevice; - addFirstConnection(wDevice); - } - if (nmDevice) { - connect(nmDevice, &NetworkManager::Device::stateChanged, this, &NetworkModule::onDeviceStatusChanged); - m_devicePaths.insert(devicePath); - } - } -} - -void NetworkModule::onUserChanged(QString json) -{ - QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8()); - if (doc.isObject()) { - int uid = doc.object().value("Uid").toInt(); - QDBusInterface user("org.deepin.dde.Accounts1", QString("/org/deepin/dde/Accounts1/User%1").arg(uid), "org.deepin.dde.Accounts1.User", QDBusConnection::systemBus()); - installTranslator(user.property("Locale").toString().split(".").first()); - } - if (!m_initilized) { - m_initilized = true; - connect(m_networkHelper, &NetworkPluginHelper::addDevice, this, &NetworkModule::onAddDevice); - for (dde::network::NetworkDeviceBase *device : dde::network::NetworkController::instance()->devices()) { - onAddDevice(device->path()); - } - } -} - -void NetworkModule::installTranslator(QString locale) -{ - static QTranslator translator; - static QString localTmp; - if (localTmp == locale) { - return; - } - localTmp = locale; - QApplication::removeTranslator(&translator); - QString languagePath = QStandardPaths::locate(QStandardPaths::GenericDataLocation, - QString("dss-network-plugin/translations"), - QStandardPaths::LocateDirectory); - translator.load(QString(languagePath+"/dss-network-plugin_%1.qm").arg(locale)); - QApplication::installTranslator(&translator); - dde::network::NetworkController::instance()->retranslate(locale); - m_networkHelper->updateTooltips(); - m_panelContainer->onPluginStateChanged(m_networkHelper->getPluginState()); -} - -const QString NetworkModule::connectionMatchName() const -{ - NetworkManager::Connection::List connList = listConnections(); - QStringList connNameList; - int connSuffixNum = 1; - - for (NetworkManager::Connection::Ptr conn : connList) { - if (conn->settings()->connectionType() == ConnectionSettings::ConnectionType::Wired) - connNameList.append(conn->name()); - } - - QString matchConnName = QString(tr("Wired Connection")) + QString(" %1"); - for (int i = 1; i <= connNameList.size(); ++i) { - if (!connNameList.contains(matchConnName.arg(i))) { - connSuffixNum = i; - break; - } - if (i == connNameList.size()) - connSuffixNum = i + 1; - } - - return matchConnName.arg(connSuffixNum); -} - -bool NetworkModule::hasConnection(NetworkManager::WiredDevice *nmDevice, NetworkManager::Connection::List &unSaveDevices) -{ - bool connIsEmpty = false; - // 获取所有的连接列表,遍历连接列表,如果当前连接中的MAC地址不为空且不等于当前网卡的MAC地址,则认为它不是当前网卡的连接 - // 在获取所有连接之前,需要手动调用一下当前设备的availableConnections接口,否则获取到的连接列表就不是最新的(具体原因待查)。 - nmDevice->availableConnections(); - NetworkManager::Connection::List connList = listConnections(); - for (NetworkManager::Connection::Ptr conn : connList) { - WiredSetting::Ptr settings = conn->settings()->setting(Setting::Wired).staticCast(); - // 如果当前连接的MAC地址不为空且连接的MAC地址不等于当前设备的MAC地址,则认为不是当前的连接,跳过 - if (settings.isNull() || - (!settings->macAddress().isEmpty() && nmDevice->hardwareAddress().compare(settings->macAddress().toHex(':'), Qt::CaseInsensitive) != 0) || - (conn->settings()->interfaceName() != nmDevice->interfaceName())) - continue; - - // 将未保存的连接放入到列表中,供外面调用删除 - if (conn->isUnsaved()) { - unSaveDevices << conn; - continue; - } - - connIsEmpty = true; - } - - return connIsEmpty; -} - -void NetworkModule::addFirstConnection(NetworkManager::WiredDevice *nmDevice) -{ - // 先查找当前的设备下是否存在有线连接,如果不存在,则直接新建一个,因为按照要求是至少要有一个有线连接 - NetworkManager::Connection::List unSaveConnections; - bool findConnection = hasConnection(nmDevice, unSaveConnections); - // 按照需求,需要将未保存的连接删除 - bool isRemoved = !unSaveConnections.isEmpty(); - for (NetworkManager::Connection::Ptr conn : unSaveConnections) - conn->remove(); - - auto autoCreateConnection = [this, nmDevice]() { - // 如果发现当前的连接的数量为空,则自动创建以当前语言为基础的连接 - ConnectionSettings::Ptr conn(new ConnectionSettings); - conn->setId(connectionMatchName()); - conn->setInterfaceName(nmDevice->interfaceName()); - conn->setUuid(""); - NetworkManager::addConnection(conn->toMap()); - }; - - if (!findConnection) { - if (isRemoved) { - // 如果有删除的连接,则等待1秒后重新创建 - QTimer::singleShot(1000, this, [autoCreateConnection] { - autoCreateConnection(); - }); - } else { - autoCreateConnection(); - } - } -} - -bool NetworkModule::needPopupNetworkDialog() const -{ - // 如果上一次没有保存密码信息则不弹窗 - if (m_lastConnectionUuid.isEmpty()) - return false; - - NetworkManager::Connection::Ptr connection = NetworkManager::findConnectionByUuid(m_lastConnectionUuid); - if (connection.isNull()) - return false; - - // 如果当前连接的密码是按照用户保存的,就不弹出来 - WirelessSecuritySetting::Ptr securitySetting = connection->settings()->setting(Setting::SettingType::WirelessSecurity).staticCast(); - if (securitySetting.isNull()) - return true; - - NetworkManager::Setting::SecretFlags passwordFlags = securitySetting->pskFlags(); - return (passwordFlags.testFlag(Setting::None)); -} - -void NetworkModule::onDeviceStatusChanged(NetworkManager::Device::State newstate, NetworkManager::Device::State oldstate, NetworkManager::Device::StateChangeReason reason) -{ - if (m_isLockModel) { - return; - } - NetworkManager::Device *device = static_cast(sender()); - NetworkManager::ActiveConnection::Ptr conn = device->activeConnection(); - if (!conn.isNull()) { - m_lastConnection = conn->id(); - m_lastConnectionUuid = conn->uuid(); - m_lastState = newstate; - } else if (m_lastState != oldstate || m_lastConnection.isEmpty()) { - m_lastConnection.clear(); - m_lastConnectionUuid.clear(); - return; - } - switch (newstate) { - case Device::State::Preparing: { // 正在连接 - if (oldstate == Device::State::Disconnected) { - switch (device->type()) { - case Device::Type::Ethernet: - NotificationManager::NetworkNotify(NotificationManager::WiredConnecting, m_lastConnection); - break; - case Device::Type::Wifi: - NotificationManager::NetworkNotify(NotificationManager::WirelessConnecting, m_lastConnection); - break; - default: - break; - } - } - } break; - case Device::State::Activated: { // 连接成功 - switch (device->type()) { - case Device::Type::Ethernet: - NotificationManager::NetworkNotify(NotificationManager::WiredConnected, m_lastConnection); - break; - case Device::Type::Wifi: - NotificationManager::NetworkNotify(NotificationManager::WirelessConnected, m_lastConnection); - break; - default: - break; - } - } break; - case Device::State::Failed: - case Device::State::Disconnected: - case Device::State::NeedAuth: - case Device::State::Unmanaged: - case Device::State::Unavailable: { - if (reason == Device::StateChangeReason::DeviceRemovedReason) { - return; - } - - // ignore if device's old state is not available - if (oldstate <= Device::State::Unavailable) { - qDebug("no notify, old state is not available"); - return; - } - - // ignore invalid reasons - if (reason == Device::StateChangeReason::UnknownReason) { - qDebug("no notify, device state reason invalid"); - return; - } - - switch (reason) { - case Device::StateChangeReason::UserRequestedReason: - if (newstate == Device::State::Disconnected) { - switch (device->type()) { - case Device::Type::Ethernet: - NotificationManager::NetworkNotify(NotificationManager::WiredDisconnected, m_lastConnection); - break; - case Device::Type::Wifi: - NotificationManager::NetworkNotify(NotificationManager::WirelessDisconnected, m_lastConnection); - break; - default: - break; - } - } - break; - case Device::StateChangeReason::ConfigUnavailableReason: - case Device::StateChangeReason::AuthSupplicantTimeoutReason: // 超时 - switch (device->type()) { - case Device::Type::Ethernet: - NotificationManager::NetworkNotify(NotificationManager::WiredUnableConnect, m_lastConnection); - break; - case Device::Type::Wifi: - NotificationManager::NetworkNotify(NotificationManager::WirelessUnableConnect, m_lastConnection); - break; - default: - break; - } - break; - case Device::StateChangeReason::AuthSupplicantDisconnectReason: - if (oldstate == Device::State::ConfiguringHardware && newstate == Device::State::NeedAuth) { - switch (device->type()) { - case Device::Type::Ethernet: - NotificationManager::NetworkNotify(NotificationManager::WiredConnectionFailed, m_lastConnection); - break; - case Device::Type::Wifi: - NotificationManager::NetworkNotify(NotificationManager::WirelessConnectionFailed, m_lastConnection); - if (needPopupNetworkDialog()) { - m_networkDialog->setConnectWireless(device->uni(), m_lastConnection); - } - break; - default: - break; - } - } - break; - case Device::StateChangeReason::CarrierReason: - if (device->type() == Device::Ethernet) { - qDebug("unplugged device is ethernet"); - NotificationManager::NetworkNotify(NotificationManager::WiredDisconnected, m_lastConnection); - } - break; - case Device::StateChangeReason::NoSecretsReason: - NotificationManager::NetworkNotify(NotificationManager::NoSecrets, m_lastConnection); - if (needPopupNetworkDialog()) { - // 不是仅当前用户,就弹窗 - m_networkDialog->setConnectWireless(device->uni(), m_lastConnection); - } - break; - case Device::StateChangeReason::SsidNotFound: - NotificationManager::NetworkNotify(NotificationManager::SsidNotFound, m_lastConnection); - break; - default: - break; - } - } break; - default: - break; - } -} - -NetworkPlugin::NetworkPlugin(QObject *parent) - : QObject(parent) - , m_network(nullptr) -{ - setObjectName(QStringLiteral(NETWORK_KEY)); -} - -void NetworkPlugin::init() -{ -} - -QWidget *NetworkPlugin::content() -{ - ensureNetwork(); - return m_network->content(); -} - -QString NetworkPlugin::icon() const -{ - const_cast(this)->ensureNetwork(); - return m_network->networkHelper()->iconPath(DGuiApplicationHelper::instance()->themeType()); -} - -QWidget *NetworkPlugin::itemWidget() const -{ - DIconButton *iconButton = new DIconButton; - iconButton->setFocusPolicy(Qt::NoFocus); - iconButton->setFlat(true); - iconButton->setAttribute(Qt::WA_TransparentForMouseEvents); - iconButton->setIconSize({26, 26}); - QTimer::singleShot(1, iconButton, [this, iconButton]() { - const_cast(this)->ensureNetwork(); - auto helper = m_network->networkHelper(); - iconButton->setIcon(*helper->trayIcon()); - connect(helper, &NetworkPluginHelper::iconChanged, iconButton, [helper, iconButton] { - iconButton->setIcon(*helper->trayIcon()); - }); - }); - NotificationManager::InstallEventFilter(iconButton); - return iconButton; -} - -QWidget *NetworkPlugin::itemTipsWidget() const -{ - const_cast(this)->ensureNetwork(); - return m_network->itemTipsWidget(); -} - -const QString NetworkPlugin::itemContextMenu() const -{ - const_cast(this)->ensureNetwork(); - return m_network->itemContextMenu(); -} - -void NetworkPlugin::invokedMenuItem(const QString &menuId, const bool checked) const -{ - const_cast(this)->ensureNetwork(); - m_network->invokedMenuItem(menuId, checked); -} - -// Delay construct Network to avoid NetworkManager service hasn't ready, e.g: dde-session-daemon. -void NetworkPlugin::ensureNetwork() -{ - if (m_network) { - return; - } - - m_network = new NetworkModule(this); -} - -NetworkPanelContainer::NetworkPanelContainer(dde::networkplugin::NetworkDialog *dialog, QWidget *parent) - : QWidget(parent) - , m_warnLabel(new QLabel) - , m_dialog(dialog) - , m_savedParent(dialog->panel()->parentWidget()) - , m_contentWidget(nullptr) -{ - m_warnLabel->setFixedWidth(300); - m_warnLabel->setAlignment(Qt::AlignCenter); - m_warnLabel->setContentsMargins(10, 0, 10, 0); - m_warnLabel->setWordWrap(true); -} - -NetworkPanelContainer::~NetworkPanelContainer() -{ - // Warning label may have a null parent, delete it here. - delete m_warnLabel; - m_warnLabel = nullptr; -} - -void NetworkPanelContainer::sendWarnMessage(const QString &msg) -{ - m_warnLabel->setText(msg); - setContentWidget(m_warnLabel); -} - -void NetworkPanelContainer::clearWarnMessage() -{ - m_warnLabel->clear(); - setContentWidget(m_dialog->panel()); -} - -void NetworkPanelContainer::onPluginStateChanged(PluginState state) -{ - switch(state) { - case PluginState::Nocable: - case PluginState::Unknown: - case PluginState::Disabled: - sendWarnMessage(tr("Network cable unplugged")); - break; - default: - clearWarnMessage(); - break; - } -} - -void NetworkPanelContainer::showEvent(QShowEvent *event) { - if (m_contentWidget == m_dialog->panel()) { - m_contentWidget->setVisible(true); - } -} - -void NetworkPanelContainer::hideEvent(QHideEvent *event) { - if (m_contentWidget == m_dialog->panel()) { - m_contentWidget->setVisible(false); - } -} - -void NetworkPanelContainer::setContentWidget(QWidget *content) -{ - if (m_contentWidget) { - m_contentWidget->removeEventFilter(this); - m_contentWidget->setParent(m_savedParent); - } - m_contentWidget = content; - m_savedParent = content->parentWidget(); - // Note: for m_dialog->panel(), setting parent to container means controlling its life span. - // As container has the same life span as panel, this is not a problem at least now. - m_contentWidget->setParent(this); - resize(content->size()); - content->installEventFilter(this); - content->show(); -} - -bool NetworkPanelContainer::eventFilter(QObject *watched, QEvent *event) -{ - if (watched == m_contentWidget) { - if (event->type() == QEvent::Resize) { - QResizeEvent *rsEvent = dynamic_cast(event); - resize(rsEvent->size()); - } - } - return false; -} -} // namespace module -} // namespace dss diff --git a/dss-network-plugin/network_module.h b/dss-network-plugin/network_module.h deleted file mode 100644 index 68474d81..00000000 --- a/dss-network-plugin/network_module.h +++ /dev/null @@ -1,131 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: LGPL-3.0-or-later - -#ifndef LOGIN_MODULE_H -#define LOGIN_MODULE_H - -#include "tray_module_interface.h" -#include "../common-plugin/utils.h" -#include "item/devicestatushandler.h" - -#include -#include - -class QLabel; -NETWORKPLUGIN_BEGIN_NAMESPACE -class NetworkPluginHelper; -class NetworkDialog; -class SecretAgent; -NETWORKPLUGIN_END_NAMESPACE - -namespace dss { -namespace module { -class PopupAppletManager; -class NetworkPanelContainer : public QWidget -{ - Q_OBJECT -public: - explicit NetworkPanelContainer(NETWORKPLUGIN_NAMESPACE::NetworkDialog *dialog, QWidget *parent = nullptr); - ~NetworkPanelContainer() override; - void sendWarnMessage(const QString &msg); - void clearWarnMessage(); - void setContentWidget(QWidget *content); - bool eventFilter(QObject *watched, QEvent *event) override; - -public Q_SLOTS: - void onPluginStateChanged(PluginState state); - -protected: - void showEvent(QShowEvent *event) override; - void hideEvent(QHideEvent *event) override; - -private: - QLabel *m_warnLabel; - NETWORKPLUGIN_NAMESPACE::NetworkDialog *m_dialog; - QWidget *m_savedParent; - QWidget *m_contentWidget; -}; -/** - * @brief The NetworkModule class - * 用于处理插件差异 - * NetworkModule处理信号槽有问题,固增加该类 - */ -class NetworkModule : public QObject -{ - Q_OBJECT - -public: - explicit NetworkModule(QObject *parent = nullptr); - ~NetworkModule() override; - - QWidget *content(); - QWidget *itemTipsWidget() const; - const QString itemContextMenu() const; - void invokedMenuItem(const QString &menuId, const bool checked) const; - - NETWORKPLUGIN_NAMESPACE::NetworkPluginHelper *networkHelper() const { return m_networkHelper; } - -protected Q_SLOTS: - void updateLockScreenStatus(bool visible); - void onDeviceStatusChanged(NetworkManager::Device::State newstate, NetworkManager::Device::State oldstate, NetworkManager::Device::StateChangeReason reason); - void onAddDevice(const QString &path); - void onUserChanged(QString json); - -private: - void addFirstConnection(NetworkManager::WiredDevice *nmDevice); - bool hasConnection(NetworkManager::WiredDevice *nmDevice, NetworkManager::Connection::List &unSaveDevices); - const QString connectionMatchName() const; - void installTranslator(QString locale); - bool needPopupNetworkDialog() const; - -private: - NETWORKPLUGIN_NAMESPACE::NetworkPluginHelper *m_networkHelper; - NETWORKPLUGIN_NAMESPACE::NetworkDialog *m_networkDialog; - NETWORKPLUGIN_NAMESPACE::SecretAgent *m_secretAgent; - QPointer m_panelContainer; - - bool m_isLockModel; // 锁屏 or greeter - bool m_isLockScreen; // 锁屏显示 - bool m_initilized; - - QSet m_devicePaths; // 记录无线设备Path,防止信号重复连接 - QString m_lastActiveWirelessDevicePath; - QString m_lastConnection; - QString m_lastConnectionUuid; - NetworkManager::Device::State m_lastState; - int m_clickTime; -}; - -class NetworkPlugin : public QObject, public TrayModuleInterface -{ - Q_OBJECT - - Q_PLUGIN_METADATA(IID "com.deepin.dde.shell.Modules.Tray" FILE "network.json") - Q_INTERFACES(dss::module::TrayModuleInterface) - -public: - explicit NetworkPlugin(QObject *parent = nullptr); - ~NetworkPlugin() override { } - void init() override; - bool isNeedInitPlugin() const { return true; } - - inline QString key() const override { return objectName(); } - QWidget *content() override; - QString icon() const override; - - QWidget *itemWidget() const override; - QWidget *itemTipsWidget() const override; - const QString itemContextMenu() const override; - void invokedMenuItem(const QString &menuId, const bool checked) const override; - -private: - void ensureNetwork(); - -private: - NetworkModule *m_network; -}; - -} // namespace module -} // namespace dss -#endif // LOGIN_MODULE_H diff --git a/dss-network-plugin/networkmodule.cpp b/dss-network-plugin/networkmodule.cpp new file mode 100644 index 00000000..780533c7 --- /dev/null +++ b/dss-network-plugin/networkmodule.cpp @@ -0,0 +1,283 @@ +// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "networkmodule.h" + +#include "netmanager.h" +#include "netstatus.h" +#include "netview.h" +#include "notification/notificationmanager.h" + +// #include + +#include +#include +#include +#include +#include +#include + +#define NETWORK_KEY "network-item-key" + +const int CONTENT_SPACING = 10; + +static Q_LOGGING_CATEGORY(DNC, "org.deepin.dde.session-shell.network"); + +using namespace dde::network; + +namespace dde { +namespace network { + +NetworkModule::NetworkModule(QObject *parent) + : QObject(parent) + , m_replacesId(0) + , m_contentWidget(new QWidget) +{ + m_isLockModel = !QCoreApplication::applicationName().contains("greeter"); + + m_contentWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); + QVBoxLayout *mainLayout = new QVBoxLayout(m_contentWidget); + mainLayout->setContentsMargins(0, CONTENT_SPACING, 0, CONTENT_SPACING); + mainLayout->setSpacing(0); + NetType::NetManagerFlags flags = m_isLockModel ? NetType::Net_LockFlags : NetType::Net_GreeterFlags; + m_manager = new NetManager(flags, this); + if (m_isLockModel) { + m_manager->setServerKey("lock"); + // m_manager->setServiceLoadForNM(false); + // m_manager->setMonitorNetworkNotify(false); + QDBusConnection::sessionBus().connect("com.deepin.dde.lockFront", "/com/deepin/dde/lockFront", "com.deepin.dde.lockFront", "Visible", this, SLOT(updateLockScreenStatus(bool))); + connect(m_manager, + &NetManager::networkNotify, + this, + [this](const QString &inAppName, int replacesId, const QString &appIcon, const QString &summary, const QString &body, const QStringList &actions, const QVariantMap &hints, int expireTimeout) { + QDBusMessage notify = QDBusMessage::createMethodCall("org.freedesktop.Notifications", "/org/freedesktop/Notifications", "org.freedesktop.Notifications", "Notify"); + uint id = replacesId == -1 ? m_replacesId : static_cast(replacesId); + notify << inAppName << id << appIcon << summary << body << actions << hints << expireTimeout; + QDBusConnection::sessionBus().callWithCallback(notify, this, SLOT(onNotify(uint))); + }); + } else { + QDBusMessage lock = QDBusMessage::createMethodCall("com.deepin.dde.LockService", "/com/deepin/dde/LockService", "com.deepin.dde.LockService", "CurrentUser"); + QDBusConnection::systemBus().callWithCallback(lock, this, SLOT(onUserChanged(QString))); + QDBusConnection::systemBus().connect("com.deepin.dde.LockService", "/com/deepin/dde/LockService", "com.deepin.dde.LockService", "UserChanged", this, SLOT(onUserChanged(QString))); + + connect(m_manager, &NetManager::networkNotify, this, [](const QString &inAppName, int replacesId, const QString &appIcon, const QString &summary, const QString &body, const QStringList &actions, const QVariantMap &hints, int expireTimeout) { + NotificationManager::Notify(appIcon, body); + }); + } + installTranslator(QLocale().name()); + + m_netView = new NetView(m_manager); + QPalette pa = m_netView->palette(); + pa.setColor(QPalette::Normal, QPalette::Button, QColor("#BBBBBBBB")); + pa.setColor(QPalette::Disabled, QPalette::ButtonText, QColor("#B0B0B0")); + pa.setColor(QPalette::Disabled, QPalette::Button, QColor("#E0E0E0")); + pa.setColor(QPalette::Normal, QPalette::BrightText, Qt::white); + m_netView->setPalette(pa); + m_netStatus = new NetStatus(m_manager); + mainLayout->addWidget(m_netView); + connect(m_netView, &NetView::requestShow, this, &NetworkModule::requestShow); + connect(m_netView, &NetView::updateSize, this, [this] { + m_contentWidget->resize(m_netView->width(), m_netView->height() + CONTENT_SPACING * 2); + }); +} + +NetworkModule::~NetworkModule() +{ + if (m_contentWidget) + m_contentWidget->deleteLater(); + + if (m_netView) + m_netView->deleteLater(); + + if (m_netStatus) + delete m_netStatus; + + if (m_manager) + delete m_manager; +} + +QWidget *NetworkModule::content() +{ + return m_contentWidget; +} + +QWidget *NetworkModule::itemWidget() +{ + QWidget *iconWidget = m_netStatus->createIconWidget(); + QPalette p = iconWidget->palette(); + p.setColor(QPalette::BrightText, QColor(255, 255, 255, 178)); // 178 = 255*0.7; + iconWidget->setPalette(p); + iconWidget->setFixedSize(26, 26); + NotificationManager::InstallEventFilter(iconWidget); + return iconWidget; +} + +QWidget *NetworkModule::itemTipsWidget() const +{ + QWidget *itemTips = m_netStatus->createItemTips(); + QPalette p = itemTips->palette(); + p.setColor(QPalette::BrightText, Qt::black); + itemTips->setPalette(p); + return itemTips; +} + +const QString NetworkModule::itemContextMenu() const +{ + return m_netStatus->contextMenu(false); +} + +void NetworkModule::invokedMenuItem(const QString &menuId, const bool checked) const +{ + Q_UNUSED(checked); + m_netStatus->invokeMenuItem(menuId); +} + +void NetworkModule::updateLockScreenStatus(bool visible) +{ + m_isLockModel = true; + m_isLockScreen = visible; + m_manager->setEnabled(m_isLockScreen); +} + +void NetworkModule::onUserChanged(const QString &json) +{ + QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8()); + if (!doc.isObject()) + return; + int uid = doc.object().value("Uid").toInt(); + QDBusInterface user("org.deepin.dde.Accounts1", QString("/org/deepin/dde/Accounts1/User%1").arg(uid), "org.deepin.dde.Accounts1.User", QDBusConnection::systemBus()); + installTranslator(user.property("Locale").toString().split(".").first()); + Q_EMIT userChanged(); +} + +void NetworkModule::onNotify(uint replacesId) +{ + m_replacesId = replacesId; +} + +void NetworkModule::installTranslator(const QString &locale) +{ + static QTranslator translator; + static QString localTmp; + if (locale.isEmpty() || localTmp == locale) { + return; + } + localTmp = locale; + QApplication::removeTranslator(&translator); + translator.load(QString("/usr/share/dss-network-plugin/translations/dss-network-plugin_%1").arg(locale)); + QApplication::installTranslator(&translator); + // m_manager->updateLanguage(localTmp); +} + +NetworkPlugin::NetworkPlugin(QObject *parent) + : QObject(parent) + , m_network(nullptr) + , m_messageCallback(nullptr) + , m_appData(nullptr) +{ + setObjectName(QStringLiteral(NETWORK_KEY)); +} + +void NetworkPlugin::init() +{ + initUI(); + onDevicesChanged(); + qCInfo(DNC) << "Connect org.freedesktop.login1.Manager, prepare for sleep reply: " + << QDBusConnection::systemBus().connect("org.freedesktop.login1", "/org/freedesktop/login1", "org.freedesktop.login1.Manager", "PrepareForSleep", this, SLOT(onPrepareForSleep(bool))); + connect(m_network, &NetworkModule::requestShow, this, &NetworkPlugin::requestShowContent); + connect(m_network, &NetworkModule::userChanged, this, &NetworkPlugin::onDevicesChanged); + connect(m_network->netStatus(), &NetStatus::hasDeviceChanged, this, &NetworkPlugin::onDevicesChanged); +} + +QWidget *NetworkPlugin::content() +{ + return m_network->content(); +} + +QWidget *NetworkPlugin::itemWidget() const +{ + return m_network->itemWidget(); +} + +QWidget *NetworkPlugin::itemTipsWidget() const +{ + return m_network->itemTipsWidget(); +} + +const QString NetworkPlugin::itemContextMenu() const +{ + return m_network->itemContextMenu(); +} + +void NetworkPlugin::invokedMenuItem(const QString &menuId, const bool checked) const +{ + m_network->invokedMenuItem(menuId, checked); +} + +void NetworkPlugin::setMessageCallback(dss::module::MessageCallbackFunc messageCallback) +{ + m_messageCallback = messageCallback; + // init时greeter和dde-lock还未启动无法收到回调函数消息,需要在加载插件设置回调函数时再获取一次数据 + onDevicesChanged(); +} + +void NetworkPlugin::initUI() +{ + if (m_network) { + return; + } + + m_network = new NetworkModule(this); +} + +void NetworkPlugin::onDevicesChanged() +{ + bool visible = m_network->netStatus()->hasDevice(); + Q_EMIT notifyNetworkStateChanged(visible); + setMessage(visible); +} + +void NetworkPlugin::onPrepareForSleep(bool sleep) +{ + qCInfo(DNC) << "On prepare for sleep, whether sleep: " << sleep; + if (!sleep) { + onDevicesChanged(); + } +} + +void NetworkPlugin::requestShowContent() +{ + if (!m_messageCallback || !m_appData) { + qCWarning(DNC) << "Request show content, callback func or appdata is null, callback: " << m_messageCallback << ", app data: " << m_appData; + return; + } + + QJsonObject obj; + obj["Cmd"] = "ShowContent"; + obj["PluginKey"] = NETWORK_KEY; + QJsonDocument doc; + doc.setObject(obj); + m_messageCallback(doc.toJson(), m_appData); + qCInfo(DNC) << "Request show content, message: " << doc.toJson(); +} + +void NetworkPlugin::setMessage(bool visible) +{ + if (!m_messageCallback || !m_appData) { + qCWarning(DNC) << "Set message, callback func or appdata is null, callback: " << m_messageCallback << "app data: " << m_appData; + return; + } + + QJsonObject obj; + obj["Cmd"] = "PluginVisible"; + obj["PluginKey"] = NETWORK_KEY; + obj["Visible"] = visible; + QJsonDocument doc; + doc.setObject(obj); + m_messageCallback(doc.toJson(), m_appData); + qCInfo(DNC) << "Set message:" << doc.toJson(); +} + +} // namespace network +} // namespace dde diff --git a/dss-network-plugin/networkmodule.h b/dss-network-plugin/networkmodule.h new file mode 100644 index 00000000..141281d6 --- /dev/null +++ b/dss-network-plugin/networkmodule.h @@ -0,0 +1,115 @@ +// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#ifndef NETWORKMODULE_H +#define NETWORKMODULE_H + +#include "tray_module_interface.h" + +namespace dde { +namespace network { + +class NetManager; +class NetView; +class NetStatus; + +/** + * @brief The NetworkModule class + * 用于处理插件差异 + * NetworkModule处理信号槽有问题,固增加该类 + */ +class NetworkModule : public QObject +{ + Q_OBJECT + +public: + explicit NetworkModule(QObject *parent = nullptr); + ~NetworkModule() override; + + virtual QWidget *content(); + virtual QWidget *itemWidget(); + virtual QWidget *itemTipsWidget() const; + virtual const QString itemContextMenu() const; + virtual void invokedMenuItem(const QString &menuId, const bool checked) const; + + inline dde::network::NetStatus *netStatus() const { return m_netStatus; } + +Q_SIGNALS: + void requestShow(); + void userChanged(); + +protected Q_SLOTS: + virtual void updateLockScreenStatus(bool visible); + void onUserChanged(const QString &json); + void onNotify(uint replacesId); + +private: + void installTranslator(const QString &locale); + +protected: + QWidget *m_contentWidget; + dde::network::NetManager *m_manager; + dde::network::NetView *m_netView; + dde::network::NetStatus *m_netStatus; + + bool m_isLockModel; // 锁屏 or greeter + bool m_isLockScreen; // 锁屏显示 + uint m_replacesId; + + QSet m_devicePaths; // 记录无线设备Path,防止信号重复连接 + QString m_lastActiveWirelessDevicePath; + QString m_lastConnection; + QString m_lastConnectionUuid; +}; + +class NetworkPlugin : public QObject, public dss::module::TrayModuleInterface +{ + Q_OBJECT + + Q_PLUGIN_METADATA(IID "com.deepin.dde.shell.Modules.Tray" FILE "network.json") + Q_INTERFACES(dss::module::TrayModuleInterface) + +public: + explicit NetworkPlugin(QObject *parent = nullptr); + + ~NetworkPlugin() override { } + + void init() override; + + inline QString key() const override { return objectName(); } + + QWidget *content() override; + + inline QString icon() const override { return "network-online-symbolic"; } + + QWidget *itemWidget() const override; + QWidget *itemTipsWidget() const override; + const QString itemContextMenu() const override; + void invokedMenuItem(const QString &menuId, const bool checked) const override; + void setMessageCallback(dss::module::MessageCallbackFunc messageCallback) override; + + void setAppData(dss::module::AppDataPtr appData) override { m_appData = appData; } + + void requestShowContent(); + void setMessage(bool visible); + +Q_SIGNALS: + void notifyNetworkStateChanged(bool); + +private: + void initUI(); + +private Q_SLOTS: + void onDevicesChanged(); + void onPrepareForSleep(bool sleep); + +private: + NetworkModule *m_network; + dss::module::MessageCallbackFunc m_messageCallback; + dss::module::AppDataPtr m_appData; +}; + +} // namespace network +} // namespace dde +#endif // NETWORKMODULE_H diff --git a/dss-network-plugin/notification/actionbutton.cpp b/dss-network-plugin/notification/actionbutton.cpp index e22fa91a..70c4d999 100644 --- a/dss-network-plugin/notification/actionbutton.cpp +++ b/dss-network-plugin/notification/actionbutton.cpp @@ -1,6 +1,6 @@ // SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. // -// SPDX-License-Identifier: LGPL-3.0-or-later +// SPDX-License-Identifier: GPL-3.0-or-later #include #include @@ -138,7 +138,7 @@ QSize ActionButton::contentSize(const QString &text, bool is_menu) const const QFontMetrics fm(appNamefont); if (m_showStyle == OSD::BUBBLEWINDOW) { - int text_width = fm.horizontalAdvance(text) + 15; + int text_width = fm.boundingRect(text).width() + 15; int max_width = qMax(text_width, OSD::ButtonSize(m_showStyle).width()); if (is_menu) { max_width = qMax(MenuWidth + 2 * MenuPadding + text_width, OSD::ButtonSize(m_showStyle).width()); diff --git a/dss-network-plugin/notification/actionbutton.h b/dss-network-plugin/notification/actionbutton.h index da5a4382..b5ee9e83 100644 --- a/dss-network-plugin/notification/actionbutton.h +++ b/dss-network-plugin/notification/actionbutton.h @@ -1,6 +1,6 @@ // SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. // -// SPDX-License-Identifier: LGPL-3.0-or-later +// SPDX-License-Identifier: GPL-3.0-or-later #ifndef ACTIONBUTTON_H #define ACTIONBUTTON_H diff --git a/dss-network-plugin/notification/appbody.cpp b/dss-network-plugin/notification/appbody.cpp index 348a398d..6d141f37 100644 --- a/dss-network-plugin/notification/appbody.cpp +++ b/dss-network-plugin/notification/appbody.cpp @@ -1,6 +1,6 @@ // SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. // -// SPDX-License-Identifier: LGPL-3.0-or-later +// SPDX-License-Identifier: GPL-3.0-or-later #include "appbody.h" #include "appbodylabel.h" diff --git a/dss-network-plugin/notification/appbody.h b/dss-network-plugin/notification/appbody.h index f467f771..6cd49502 100644 --- a/dss-network-plugin/notification/appbody.h +++ b/dss-network-plugin/notification/appbody.h @@ -1,6 +1,6 @@ // SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. // -// SPDX-License-Identifier: LGPL-3.0-or-later +// SPDX-License-Identifier: GPL-3.0-or-later #ifndef APPBODY_H #define APPBODY_H diff --git a/dss-network-plugin/notification/appbodylabel.cpp b/dss-network-plugin/notification/appbodylabel.cpp index 9f589414..f9804765 100644 --- a/dss-network-plugin/notification/appbodylabel.cpp +++ b/dss-network-plugin/notification/appbodylabel.cpp @@ -1,6 +1,6 @@ // SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. // -// SPDX-License-Identifier: LGPL-3.0-or-later +// SPDX-License-Identifier: GPL-3.0-or-later #include "appbodylabel.h" diff --git a/dss-network-plugin/notification/appbodylabel.h b/dss-network-plugin/notification/appbodylabel.h index 0825af6c..6f0635c0 100644 --- a/dss-network-plugin/notification/appbodylabel.h +++ b/dss-network-plugin/notification/appbodylabel.h @@ -1,6 +1,6 @@ // SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. // -// SPDX-License-Identifier: LGPL-3.0-or-later +// SPDX-License-Identifier: GPL-3.0-or-later #ifndef APPBODYLABEL_H #define APPBODYLABEL_H diff --git a/dss-network-plugin/notification/appicon.cpp b/dss-network-plugin/notification/appicon.cpp index 126123ff..e493f162 100644 --- a/dss-network-plugin/notification/appicon.cpp +++ b/dss-network-plugin/notification/appicon.cpp @@ -1,10 +1,11 @@ // SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. // -// SPDX-License-Identifier: LGPL-3.0-or-later +// SPDX-License-Identifier: GPL-3.0-or-later #include #include #include +// #include #include #include #include diff --git a/dss-network-plugin/notification/appicon.h b/dss-network-plugin/notification/appicon.h index ba263155..92f28f9f 100644 --- a/dss-network-plugin/notification/appicon.h +++ b/dss-network-plugin/notification/appicon.h @@ -1,6 +1,6 @@ // SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. // -// SPDX-License-Identifier: LGPL-3.0-or-later +// SPDX-License-Identifier: GPL-3.0-or-later #ifndef APPICON_H #define APPICON_H diff --git a/dss-network-plugin/notification/bubble.cpp b/dss-network-plugin/notification/bubble.cpp index 2a0be9b3..f95d8b1f 100644 --- a/dss-network-plugin/notification/bubble.cpp +++ b/dss-network-plugin/notification/bubble.cpp @@ -1,6 +1,6 @@ // SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. // -// SPDX-License-Identifier: LGPL-3.0-or-later +// SPDX-License-Identifier: GPL-3.0-or-later #include "bubble.h" #include "notificationentity.h" @@ -17,7 +17,6 @@ #include #include #include -#include #include #include #include @@ -238,7 +237,7 @@ void Bubble::initConnections() Q_EMIT actionInvoked(this, action_id); }); - connect(m_closeButton, &DDialogCloseButton::clicked, this, [ = ]() { + connect(m_closeButton, &DDialogCloseButton::clicked, this, [ = ] { Q_EMIT dismissed(this); }); @@ -304,7 +303,7 @@ void Bubble::startMove(const QRect &startRect, const QRect &endRect, bool needDe // 当需要更新位置,停止动画,直接刷新最终位置 if (!needDelete) { - connect(this, &Bubble::resetGeometry, this, [group, this] { + connect(this, &Bubble::resetGeometry, this, [ group, this ] { if (!group.isNull()) group->stop(); // 当接收到该信号,则表示已经geometry已经更新,直接使用即可 diff --git a/dss-network-plugin/notification/bubble.h b/dss-network-plugin/notification/bubble.h index d32ae1c3..8f5ee515 100644 --- a/dss-network-plugin/notification/bubble.h +++ b/dss-network-plugin/notification/bubble.h @@ -1,6 +1,6 @@ // SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. // -// SPDX-License-Identifier: LGPL-3.0-or-later +// SPDX-License-Identifier: GPL-3.0-or-later #ifndef BUBBLE_H #define BUBBLE_H @@ -11,6 +11,9 @@ #include #include +// #include + +// using UserInter = com::deepin::SessionManager; DWIDGET_USE_NAMESPACE @@ -18,7 +21,6 @@ class AppIcon; class AppBody; class Button; class ActionButton; -class QEnterEvent; /*! * \~chinese \class Bubble * \~chinese \brief 自定义控件类,屏幕上方通知气泡的窗口类 @@ -48,7 +50,7 @@ class Bubble : public DBlurEffectWidget void dismissed(Bubble *); // 点击后发出,动画执行完成后自动删除 void notProcessedYet(EntityPtr ptr); // 触发'暂不处理'操作时发出,不会主动删除自身 - void actionInvoked(Bubble *, QString); // 不会主动删除自身 + void actionInvoked(Bubble *, const QString &); // 不会主动删除自身 void resetGeometry(); public Q_SLOTS: diff --git a/dss-network-plugin/notification/bubblemanager.cpp b/dss-network-plugin/notification/bubblemanager.cpp index fa7d7b14..76d0ccfa 100644 --- a/dss-network-plugin/notification/bubblemanager.cpp +++ b/dss-network-plugin/notification/bubblemanager.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "bubblemanager.h" @@ -370,7 +370,7 @@ bool BubbleManager::calcReplaceId(EntityPtr notify) for (int i = 0; i < m_bubbleList.size(); ++i) { Bubble *bubble = m_bubbleList.at(i); if (bubble->entity()->replacesId() == notify->replacesId() - && bubble->entity()->appName() == notify->appName()) { + && bubble->entity()->appName() == notify->appName()) { if (i != 0) { bubble->setEntity(m_bubbleList.at(i)->entity()); } @@ -381,7 +381,7 @@ bool BubbleManager::calcReplaceId(EntityPtr notify) for (int i = 0; i < m_oldEntities.size(); ++i) { if (m_oldEntities.at(i)->replacesId() == notify->replacesId() - && m_oldEntities.at(i)->appName() == notify->appName()) { + && m_oldEntities.at(i)->appName() == notify->appName()) { m_oldEntities.removeAt(i); } } diff --git a/dss-network-plugin/notification/bubbletool.cpp b/dss-network-plugin/notification/bubbletool.cpp index cd66577e..72f6d417 100644 --- a/dss-network-plugin/notification/bubbletool.cpp +++ b/dss-network-plugin/notification/bubbletool.cpp @@ -1,16 +1,18 @@ // SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. // -// SPDX-License-Identifier: LGPL-3.0-or-later +// SPDX-License-Identifier: GPL-3.0-or-later #include "bubbletool.h" #include "actionbutton.h" #include "appicon.h" #include "notificationentity.h" +#include "networkconst.h" #include #include #include #include +// #include #include #include @@ -51,11 +53,11 @@ QImage BubbleTool::decodeNotificationSpecImageHint(const QDBusArgument &arg) arg.beginStructure(); arg >> width >> height >> rowStride >> hasAlpha >> bitsPerSample >> channels >> pixels; arg.endStructure(); - //qDebug() << width << height << rowStride << hasAlpha << bitsPerSample << channels; + //qCDebug(DNC) << width << height << rowStride << hasAlpha << bitsPerSample << channels; #define SANITY_CHECK(condition) \ if (!(condition)) { \ - qWarning() << "Sanity check failed on" << #condition; \ + qCWarning(DNC) << "Sanity check failed on " << #condition; \ return QImage(); \ } @@ -79,7 +81,7 @@ QImage BubbleTool::decodeNotificationSpecImageHint(const QDBusArgument &arg) } } if (format == QImage::Format_Invalid) { - qWarning() << "Unsupported image format (hasAlpha:" << hasAlpha << "bitsPerSample:" << bitsPerSample << "channels:" << channels << ")"; + qCWarning(DNC) << "Unsupported image format: alpha:" << hasAlpha << ", bits per sample: " << bitsPerSample << ", channels: " << channels; return QImage(); } @@ -88,7 +90,7 @@ QImage BubbleTool::decodeNotificationSpecImageHint(const QDBusArgument &arg) end = ptr + pixels.length(); for (int y = 0; y < height; ++y, ptr += rowStride) { if (ptr + channels * width > end) { - qWarning() << "Image data is incomplete. y:" << y << "height:" << height; + qCWarning(DNC) << "Image data is incomplete: y: " << y << ", height: " << height; break; } fcn((QRgb *)image.scanLine(y), ptr, width); @@ -189,7 +191,7 @@ const QString BubbleTool::getDeepinAppName(const QString &name) void BubbleTool::actionInvoke(const QString &actionId, EntityPtr entity) { - qDebug() << "actionId:" << actionId; + qCDebug(DNC) << "Action invoke, action id: " << actionId; QMap hints = entity->hints(); QMap::const_iterator i = hints.constBegin(); while (i != hints.constEnd()) { diff --git a/dss-network-plugin/notification/bubbletool.h b/dss-network-plugin/notification/bubbletool.h index 63185d13..2778a94f 100644 --- a/dss-network-plugin/notification/bubbletool.h +++ b/dss-network-plugin/notification/bubbletool.h @@ -1,6 +1,6 @@ // SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. // -// SPDX-License-Identifier: LGPL-3.0-or-later +// SPDX-License-Identifier: GPL-3.0-or-later #ifndef BUBBLETOOL_H #define BUBBLETOOL_H diff --git a/dss-network-plugin/notification/button.cpp b/dss-network-plugin/notification/button.cpp index 03ed129e..1d24badf 100644 --- a/dss-network-plugin/notification/button.cpp +++ b/dss-network-plugin/notification/button.cpp @@ -1,6 +1,6 @@ // SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. // -// SPDX-License-Identifier: LGPL-3.0-or-later +// SPDX-License-Identifier: GPL-3.0-or-later #include "button.h" @@ -15,6 +15,7 @@ #include #include #include +// #include #include #include #include diff --git a/dss-network-plugin/notification/button.h b/dss-network-plugin/notification/button.h index 9c81045f..22516d9f 100644 --- a/dss-network-plugin/notification/button.h +++ b/dss-network-plugin/notification/button.h @@ -1,6 +1,6 @@ // SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. // -// SPDX-License-Identifier: LGPL-3.0-or-later +// SPDX-License-Identifier: GPL-3.0-or-later #ifndef BUTTON_H #define BUTTON_H diff --git a/dss-network-plugin/notification/constants.h b/dss-network-plugin/notification/constants.h index 7c434c89..175256cb 100644 --- a/dss-network-plugin/notification/constants.h +++ b/dss-network-plugin/notification/constants.h @@ -1,6 +1,6 @@ // SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. // -// SPDX-License-Identifier: LGPL-3.0-or-later +// SPDX-License-Identifier: GPL-3.0-or-later #ifndef CONSTANTS_H #define CONSTANTS_H diff --git a/dss-network-plugin/notification/notificationentity.cpp b/dss-network-plugin/notification/notificationentity.cpp index b7d7be50..83a05a36 100644 --- a/dss-network-plugin/notification/notificationentity.cpp +++ b/dss-network-plugin/notification/notificationentity.cpp @@ -1,6 +1,6 @@ // SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. // -// SPDX-License-Identifier: LGPL-3.0-or-later +// SPDX-License-Identifier: GPL-3.0-or-later #include "notificationentity.h" diff --git a/dss-network-plugin/notification/notificationentity.h b/dss-network-plugin/notification/notificationentity.h index a71a4023..89e1afea 100644 --- a/dss-network-plugin/notification/notificationentity.h +++ b/dss-network-plugin/notification/notificationentity.h @@ -1,6 +1,6 @@ // SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. // -// SPDX-License-Identifier: LGPL-3.0-or-later +// SPDX-License-Identifier: GPL-3.0-or-later #ifndef NOTIFICATIONENTITY_H #define NOTIFICATIONENTITY_H diff --git a/dss-network-plugin/notification/notificationmanager.cpp b/dss-network-plugin/notification/notificationmanager.cpp new file mode 100644 index 00000000..aac82179 --- /dev/null +++ b/dss-network-plugin/notification/notificationmanager.cpp @@ -0,0 +1,24 @@ +// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "notificationmanager.h" + +#include "bubblemanager.h" + +BubbleManager *NotificationManager::BubbleManagerInstance() +{ + static auto *s_bubbleManager = new BubbleManager(); + return s_bubbleManager; +} +uint NotificationManager::Notify(const QString &icon, const QString &body) +{ + static uint replacesId = 0; + replacesId = BubbleManagerInstance()->Notify("dde-control-center", replacesId, icon, "", body); + return replacesId; +} + +void NotificationManager::InstallEventFilter(QObject *obj) +{ + obj->installEventFilter(NotificationManager::BubbleManagerInstance()); +} diff --git a/dss-network-plugin/notification/notificationmanager.h b/dss-network-plugin/notification/notificationmanager.h new file mode 100644 index 00000000..331407a5 --- /dev/null +++ b/dss-network-plugin/notification/notificationmanager.h @@ -0,0 +1,22 @@ +// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#ifndef NOTIFICATIONMANAGER_H +#define NOTIFICATIONMANAGER_H + +#include + +class QObject; +class BubbleManager; +class NotificationManager +{ +public: + static uint Notify(const QString &icon, const QString &body); + static void InstallEventFilter(QObject *obj); + +protected: + static BubbleManager *BubbleManagerInstance(); +}; + +#endif // NOTIFICATIONMANAGER_H diff --git a/dss-network-plugin/notificationmanager.cpp b/dss-network-plugin/notificationmanager.cpp deleted file mode 100644 index c6dcb17a..00000000 --- a/dss-network-plugin/notificationmanager.cpp +++ /dev/null @@ -1,77 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: LGPL-3.0-or-later - -#include "notificationmanager.h" -#include "notification/bubblemanager.h" - -const QString notifyIconNetworkOffline = "notification-network-offline"; -const QString notifyIconWiredConnected = "notification-network-wired-connected"; -const QString notifyIconWiredDisconnected = "notification-network-wired-disconnected"; -const QString notifyIconWiredError = "notification-network-wired-disconnected"; -const QString notifyIconWirelessConnected = "notification-network-wireless-full"; -const QString notifyIconWirelessDisconnected = "notification-network-wireless-disconnected"; -const QString notifyIconWirelessDisabled = "notification-network-wireless-disabled"; -const QString notifyIconWirelessError = "notification-network-wireless-disconnected"; -const QString notifyIconVpnConnected = "notification-network-vpn-connected"; -const QString notifyIconVpnDisconnected = "notification-network-vpn-disconnected"; -const QString notifyIconProxyEnabled = "notification-network-proxy-enabled"; -const QString notifyIconProxyDisabled = "notification-network-proxy-disabled"; -const QString notifyIconNetworkConnected = "notification-network-wired-connected"; -const QString notifyIconNetworkDisconnected = "notification-network-wired-disconnected"; -const QString notifyIconMobile2gConnected = "notification-network-mobile-2g-connected"; -const QString notifyIconMobile2gDisconnected = "notification-network-mobile-2g-disconnected"; -const QString notifyIconMobile3gConnected = "notification-network-mobile-3g-connected"; -const QString notifyIconMobile3gDisconnected = "notification-network-mobile-3g-disconnected"; -const QString notifyIconMobile4gConnected = "notification-network-mobile-4g-connected"; -const QString notifyIconMobile4gDisconnected = "notification-network-mobile-4g-disconnected"; -const QString notifyIconMobileUnknownConnected = "notification-network-mobile-unknown-connected"; -const QString notifyIconMobileUnknownDisconnected = "notification-network-mobile-unknown-disconnected"; - -BubbleManager *NotificationManager::BubbleManagerinstance() -{ - static BubbleManager *s_bubbleManager = new BubbleManager(); - return s_bubbleManager; -} -uint NotificationManager::Notify(const QString &icon, const QString &body) -{ - static uint replacesId = 0; - replacesId = BubbleManagerinstance()->Notify("dde-control-center", replacesId, icon, "", body); - return replacesId; -} - -uint NotificationManager::NetworkNotify(NetworkNotifyType type, const QString &name) -{ - switch (type) { - case WiredConnecting: - return NotificationManager::Notify(notifyIconWiredConnected, QObject::tr("Connecting %1").arg(name)); - case WirelessConnecting: - return NotificationManager::Notify(notifyIconWirelessConnected, QObject::tr("Connecting %1").arg(name)); - case WiredConnected: - return NotificationManager::Notify(notifyIconWiredConnected, QObject::tr("%1 connected").arg(name)); - case WirelessConnected: - return NotificationManager::Notify(notifyIconWirelessConnected, QObject::tr("%1 connected").arg(name)); - case WiredDisconnected: - return NotificationManager::Notify(notifyIconWiredDisconnected, QObject::tr("%1 disconnected").arg(name)); - case WirelessDisconnected: - return NotificationManager::Notify(notifyIconWirelessDisconnected, QObject::tr("%1 disconnected").arg(name)); - case WiredUnableConnect: - return NotificationManager::Notify(notifyIconWiredDisconnected, QObject::tr("Unable to connect %1, please check your router or net cable.").arg(name)); - case WirelessUnableConnect: - return NotificationManager::Notify(notifyIconWirelessDisconnected, QObject::tr("Unable to connect %1, please keep closer to the wireless router").arg(name)); - case WiredConnectionFailed: - return NotificationManager::Notify(notifyIconWiredDisconnected, QObject::tr("Connection failed, unable to connect %1, wrong password").arg(name)); - case WirelessConnectionFailed: - return NotificationManager::Notify(notifyIconWirelessConnected, QObject::tr("Connection failed, unable to connect %1, wrong password").arg(name)); - case NoSecrets: - return NotificationManager::Notify(notifyIconWirelessDisconnected, QObject::tr("Password is required to connect %1").arg(name)); - case SsidNotFound: - return NotificationManager::Notify(notifyIconWirelessDisconnected, QObject::tr("The %1 802.11 WLAN network could not be found").arg(name)); - } - return 0; -} - -void NotificationManager::InstallEventFilter(QObject *obj) -{ - obj->installEventFilter(NotificationManager::BubbleManagerinstance()); -} diff --git a/dss-network-plugin/notificationmanager.h b/dss-network-plugin/notificationmanager.h deleted file mode 100644 index 579d778a..00000000 --- a/dss-network-plugin/notificationmanager.h +++ /dev/null @@ -1,37 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: LGPL-3.0-or-later - -#ifndef NOTIFICATIONMANAGER_H -#define NOTIFICATIONMANAGER_H - -#include - -class QObject; -class BubbleManager; -class NotificationManager -{ -public: - enum NetworkNotifyType { - WiredConnecting, // 有线连接中 - WirelessConnecting, // 无线连接中 - WiredConnected, // 有线已连接 - WirelessConnected, // 无线已连接 - WiredDisconnected, // 有线断开 - WirelessDisconnected, // 无线断开 - WiredUnableConnect, // 有线无法连接 - WirelessUnableConnect, // 无线无法连接 - WiredConnectionFailed, // 有线连接失败 - WirelessConnectionFailed, // 无线连接失败 - NoSecrets, // 密码错误 - SsidNotFound, // 没找到ssid - }; - static uint Notify(const QString &icon, const QString &body); - static uint NetworkNotify(NetworkNotifyType type, const QString &name); - static void InstallEventFilter(QObject *obj); - -protected: - static BubbleManager *BubbleManagerinstance(); -}; - -#endif // NOTIFICATIONMANAGER_H diff --git a/dss_example/dsstestwidget.cpp b/dss_example/dsstestwidget.cpp index 2d65fc18..e7648f06 100644 --- a/dss_example/dsstestwidget.cpp +++ b/dss_example/dsstestwidget.cpp @@ -3,7 +3,7 @@ // SPDX-License-Identifier: LGPL-3.0-or-later #include "dsstestwidget.h" -#include "network_module.h" +#include "networkmodule.h" #include #include diff --git a/net-view/operation/netitem.cpp b/net-view/operation/netitem.cpp index 8cc1ab3f..2397d723 100644 --- a/net-view/operation/netitem.cpp +++ b/net-view/operation/netitem.cpp @@ -11,6 +11,34 @@ namespace dde { namespace network { +bool NetItem::compare(NetItem *item1, NetItem *item2) +{ + if (item1->itemType() != item2->itemType()) + return item1->itemType() < item2->itemType(); + switch (item1->itemType()) { + case NetType::WirelessItem: { + NetWirelessItem *lItem = qobject_cast(item1); + NetWirelessItem *rItem = qobject_cast(item2); + if ((lItem->status() | rItem->status()) & NetType::CS_Connected) { // 存在已连接的 + return lItem->status() & NetType::CS_Connected; + } + if (lItem->strengthLevel() != rItem->strengthLevel()) + return lItem->strengthLevel() > rItem->strengthLevel(); + return item1->name().toLower() < item2->name().toLower(); + } + // case NetType::ConnectionItem: + // case NetType::WiredItem: { + // NetConnectionItem *lItem = qobject_cast(item1); + // NetConnectionItem *rItem = qobject_cast(item2); + // if (lItem->status() != rItem->status()) + // return lItem->status() > rItem->status(); + // return item1->name().toLower() < item2->name().toLower(); + // } + default: + return item1->name().toLower() < item2->name().toLower(); + } +} + /** * 单个列表项的基类 */ @@ -57,6 +85,8 @@ GETFUN(NetType::NetDeviceStatus, NetDeviceItem, status) GETFUN(QStringList, NetDeviceItem, ips) GETFUN(int, NetDeviceItem, pathIndex) +GETFUN(const QString &, NetTipsItem, linkActivatedText) +GETFUN(bool, NetTipsItem, tipsLinkEnabled) // 有线设备 // 无线设备 @@ -91,6 +121,16 @@ QString NetWirelessControlItem::name() const return tr("Wireless Network"); } +QString NetWirelessMineItem::name() const +{ + return tr("My Networks"); +} + +QString NetWirelessOtherItem::name() const +{ + return tr("Other Networks"); +} + QString NetWirelessHiddenItem::name() const { return tr("Connect to hidden network"); @@ -103,6 +143,7 @@ QString NetVPNTipsItem::name() const } // VPN +GETFUN(bool, NetVPNControlItem, isExpanded) // 系统代理 GETFUN(NetType::ProxyMethod, NetSystemProxyControlItem, lastMethod) @@ -120,5 +161,12 @@ GETFUN(const QStringList &, NetHotspotControlItem, shareDevice) // DetailsItem GETFUN(const QList &, NetDetailsInfoItem, details) GETFUN(const int &, NetDetailsInfoItem, index) + +QString NetAirplaneModeTipsItem::name() const +{ + return tr("Disable Airplane Mode first if you want to connect to a wireless network"); + // return tr("Disable Airplane Mode first if you want to connect to a wireless network"); +} + } // namespace network } // namespace dde diff --git a/net-view/operation/netitem.h b/net-view/operation/netitem.h index 1e81ec67..9bb3a5de 100644 --- a/net-view/operation/netitem.h +++ b/net-view/operation/netitem.h @@ -29,6 +29,7 @@ class NetItem : public QObject Q_PROPERTY(QVector children READ getChildren NOTIFY childrenChanged DESIGNABLE false) public: + static bool compare(NetItem *item1, NetItem *item2); QString id() const; virtual NetType::NetItemType itemType() const; virtual QString name() const; @@ -136,21 +137,15 @@ class NetTipsItem : public NetItem { Q_OBJECT public: - NetType::NetItemType itemType() const override { return NetType::NetItemType::Item; } + const QString &linkActivatedText() const; + bool tipsLinkEnabled() const; - const QString &linkActivatedText() const { return m_linkActivatedText; } - - const bool tipsLinkEnabled() const { return m_tipsLinkEnabled; } +Q_SIGNALS: + void linkActivatedTextChanged(const QString &text) const; + void tipsLinkEnabledChanged(bool enable) const; protected: - explicit NetTipsItem(const QString &id, const QString &linkActivatedText, const bool tipsLinkEnabled); - - friend class NetManagerPrivate; - friend class NetManagerThreadPrivate; - -private: - QString m_linkActivatedText; - bool m_tipsLinkEnabled; + using NetItem::NetItem; }; class NetWiredDeviceItem : public NetDeviceItem @@ -175,18 +170,18 @@ class NetWirelessDeviceItem : public NetDeviceItem using NetDeviceItem::NetDeviceItem; }; -// class NetAirplaneModeTipsItem : public NetTipsItem -// { -// Q_OBJECT -// public: -// NetType::NetItemType itemType() const override; +class NetAirplaneModeTipsItem : public NetTipsItem +{ + Q_OBJECT +public: + QString name() const override; -// protected: -// explicit NetAirplaneModeTipsItem(const QString &id, const QString &linkActivatedText, const bool tipsLinkEnabled); +protected: + using NetTipsItem::NetTipsItem; -// friend class NetManagerPrivate; -// friend class NetManagerThreadPrivate; -// }; + friend class NetManagerPrivate; + friend class NetManagerThreadPrivate; +}; /////////////////////////////////////////////// class NetConnectionItem : public NetItem @@ -259,6 +254,7 @@ class NetWirelessOtherItem : public NetItem { Q_OBJECT public: + QString name() const override; bool isExpanded() const; Q_SIGNALS: @@ -272,6 +268,7 @@ class NetWirelessMineItem : public NetItem { Q_OBJECT protected: + QString name() const override; using NetItem::NetItem; }; @@ -284,7 +281,7 @@ class NetWirelessDisabledItem : public NetItem /////////////////////////////////////////// -class NetVPNControlItem : public NetControlItem +class NetVPNControlItem : public NetDeviceItem { Q_OBJECT @@ -295,7 +292,7 @@ class NetVPNControlItem : public NetControlItem void expandedChanged(bool expanded); protected: - using NetControlItem::NetControlItem; + using NetDeviceItem::NetDeviceItem; }; class NetVPNTipsItem : public NetTipsItem diff --git a/net-view/operation/netmanager.cpp b/net-view/operation/netmanager.cpp index 55fdaea3..7678c347 100644 --- a/net-view/operation/netmanager.cpp +++ b/net-view/operation/netmanager.cpp @@ -73,6 +73,11 @@ NetItem *NetManager::root() const return d->m_root->item(); } +NetManager::ConnectionType NetManager::primaryConnectionType() const +{ + return Unknown; +} + /** * @brief NetManager::exec * @param cmd 执行命令 @see NetManager::CmdType @@ -230,11 +235,6 @@ void NetManagerPrivate::setUseSecretAgent(bool enabled) m_managerThread->setUseSecretAgent(enabled); } -void NetManagerPrivate::setNetwork8021XMode(NetManager::Network8021XMode mode) -{ - m_managerThread->setNetwork8021XMode(mode); -} - void NetManagerPrivate::setAutoScanInterval(int ms) { m_managerThread->setAutoScanInterval(ms); @@ -258,6 +258,12 @@ void NetManagerPrivate::setServerKey(const QString &serverKey) void NetManagerPrivate::init(NetType::NetManagerFlags flags) { m_managerThread->init(flags); + if (flags.testFlags(NetType::Net_AirplaneTips)) { + NetAirplaneModeTipsItemPrivate *airplaneTipsItem = NetItemNew(AirplaneModeTipsItem, "NetAirplaneModeTipsItem"); + airplaneTipsItem->updatelinkActivatedText("airplaneMode"); + airplaneTipsItem->updatetipsLinkEnabled(flags.testFlags(NetType::Net_tipsLinkEnabled)); + addItem(airplaneTipsItem, m_root); + } } bool NetManagerPrivate::netCheckAvailable() @@ -547,6 +553,9 @@ void NetManagerPrivate::onDataChanged(int dataType, const QString &id, const QVa if (item) { item->updateenabled(value.toBool()); updateControlEnabled(item->itemType()); + if (id == "Root") { + updateAirplaneMode(value.toBool()); + } } } break; case NetManagerThreadPrivate::DeviceAvailableChanged: { diff --git a/net-view/operation/netmanager.h b/net-view/operation/netmanager.h index 5059db66..77712d68 100644 --- a/net-view/operation/netmanager.h +++ b/net-view/operation/netmanager.h @@ -37,15 +37,6 @@ class NetManager : public QObject enum ConnectionType { Unknown = 0, Adsl, Bluetooth, Bond, Bridge, Cdma, Gsm, Infiniband, OLPCMesh, Pppoe, Vlan, Vpn, Wimax, Wired, Wireless, Team, Generic, Tun, IpTunnel }; - enum Network8021XMode { // 企业网处理方式 - ToControlCenter, // 跳转控制中心 - SendNotify, // 发通知 - ToConnect, // 连接 - ToControlCenterUnderConnect, // 如果设置了此项,则先于配置读取是否直接连接,如果配置中没有,就设置为跳转到控制中心 - SendNotifyUnderConnect // 如果设置了此项,则先于配置中读取是否直接连接,如果配置中没有,就设置为直接发送消息 - }; - - // void setNetwork8021XMode(Network8021XMode mode); // 8021X企业网络处理方式,跳转控制中心or发通知 void setAutoScanInterval(int ms); // 设置自动扫描无线网间隔,0为不扫描 void setAutoScanEnabled(bool enabled); // 设置自动扫描,网络面板关闭时禁用 void setEnabled(bool enabled); // 禁用时不发通知,不请求交互 @@ -54,7 +45,7 @@ class NetManager : public QObject NetItem *root() const; // bool isAirplaneMode() const; // 开启了飞行模式 - // NetManager::ConnectionType primaryConnectionType() const; + NetManager::ConnectionType primaryConnectionType() const; enum CmdType { EnabledDevice, // 启用 @@ -109,7 +100,7 @@ public Q_SLOTS: void languageChange(const QString &locale); void toControlCenter(); void netCheckAvailableChanged(const bool &netCheckAvailable); - // void primaryConnectionTypeChanged(ConnectionType type); + void primaryConnectionTypeChanged(ConnectionType type); // void vpnStatusChanged(); private: diff --git a/net-view/operation/nettype.h b/net-view/operation/nettype.h index c4f307a5..340d408e 100644 --- a/net-view/operation/nettype.h +++ b/net-view/operation/nettype.h @@ -83,9 +83,12 @@ class NetType Net_CheckPortal = 0x00000010, // 设置检查认证网页 Net_tipsLinkEnabled = 0x00000020, // 可跳转连接 - Net_8021xToConnect = 0x00000100, // 连接 - Net_8021xToControlCenter = 0x00000200, // 跳转控制中心 - Net_8021xSendNotify = 0x00000400, // 发通知 + Net_8021xToConnect = 0x00000100, // 连接 + Net_8021xToControlCenter = 0x00000200, // 跳转控制中心 + Net_8021xSendNotify = 0x00000400, // 发通知 + Net_8021xUnderConnect = 0x00000800, // 优先读配置 + Net_8021xToControlCenterUnderConnect = Net_8021xUnderConnect | Net_8021xToControlCenter, // 如果设置了此项,则先于配置读取是否直接连接,如果配置中没有,就设置为跳转到控制中心 + Net_8021xSendNotifyUnderConnect = Net_8021xUnderConnect | Net_8021xSendNotify, // 如果设置了此项,则先于配置中读取是否直接连接,如果配置中没有,就设置为直接发送消息 Net_Device = 0x00010000, Net_VPN = 0x00020000, @@ -96,11 +99,17 @@ class NetType Net_DSL = 0x00400000, Net_Details = 0x00800000, + Net_AirplaneTips = 0x01000000, + Net_VPNTips = 0x02000000, + Net_VPNChildren = 0x04000000, + + // + Net_DockFlags = Net_Device | Net_VPN | Net_SysProxy | Net_Airplane | Net_AirplaneTips | Net_VPNTips | Net_tipsLinkEnabled | Net_UseSecretAgent | Net_CheckPortal | Net_8021xToControlCenterUnderConnect, + Net_LockFlags = Net_Device | Net_VPN | Net_SysProxy | Net_Airplane | Net_AirplaneTips | Net_VPNTips | Net_UseSecretAgent | Net_CheckPortal | Net_8021xSendNotify, + Net_GreeterFlags = Net_Device | Net_Airplane | Net_AirplaneTips | Net_ServiceNM | Net_MonitorNotify | Net_AutoAddConnection | Net_UseSecretAgent | Net_CheckPortal | Net_8021xSendNotify, + Net_DccFlags = Net_Device | Net_VPN | Net_VPNChildren | Net_SysProxy | Net_AppProxy | Net_Hotspot | Net_Airplane | Net_DSL | Net_Details, // - Net_DockFlags = Net_Device | Net_VPN | Net_SysProxy | Net_UseSecretAgent | Net_CheckPortal | Net_8021xToControlCenter, - Net_LockFlags = Net_Device | Net_VPN | Net_SysProxy | Net_UseSecretAgent | Net_CheckPortal | Net_8021xSendNotify, - Net_GreeterFlags = Net_Device | Net_VPN | Net_SysProxy | Net_ServiceNM | Net_MonitorNotify | Net_AutoAddConnection | Net_UseSecretAgent | Net_CheckPortal | Net_8021xSendNotify, - Net_DccFlags = Net_Device | Net_VPN | Net_SysProxy | Net_AppProxy | Net_Hotspot | Net_Airplane | Net_DSL | Net_Details, + Net_8021xMask = 0x00000F00, }; Q_FLAG(NetManagerFlag); diff --git a/net-view/operation/private/netitemprivate.cpp b/net-view/operation/private/netitemprivate.cpp index 91843afe..a6a30bd4 100644 --- a/net-view/operation/private/netitemprivate.cpp +++ b/net-view/operation/private/netitemprivate.cpp @@ -73,10 +73,10 @@ NetItemPrivate *NetItemPrivate::New(NetType::NetItemType type, const QString &id CaseNewItem(DetailsInfoItem); CaseNewItem(SystemProxyControlItem); CaseNewItem(AppProxyControlItem); + CaseNewItem(AirplaneModeTipsItem); + CaseNewItem(VPNTipsItem); case NetType::WirelessDisabledItem: - case NetType::AirplaneModeTipsItem: case NetType::WiredDisabledItem: - case NetType::VPNTipsItem: break; } return netItemPrivate; @@ -208,7 +208,6 @@ GETFUN(NetType::NetItemType, NetWiredControlItem, itemType, NetType::NetItemType // 无线控制 GETFUN(NetType::NetItemType, NetWirelessControlItem, itemType, NetType::NetItemType::WirelessControlItem) - // 有线设备 GETFUN(NetType::NetItemType, NetWiredDeviceItem, itemType, NetType::NetItemType::WiredDeviceItem) // 无线设备 @@ -327,6 +326,14 @@ GETFUN(const QList &, NetDetailsInfoItem, details, m_details) GETFUN(const int &, NetDetailsInfoItem, index, m_index) UPDATEFUN(NetDetailsInfoItem, const QList &, details) UPDATEFUN(NetDetailsInfoItem, const int &, index) - +// NetTipsItem +GETFUN(NetType::NetItemType, NetTipsItem, itemType, NetType::NetItemType::VPNTipsItem) +GETFUN(const QString &, NetTipsItem, linkActivatedText, m_linkActivatedText) +GETFUN(bool, NetTipsItem, tipsLinkEnabled, m_tipsLinkEnabled) +UPDATEFUN(NetTipsItem, const QString &, linkActivatedText) +UPDATEFUN(NetTipsItem, bool, tipsLinkEnabled) +// +GETFUN(NetType::NetItemType, NetAirplaneModeTipsItem, itemType, NetType::NetItemType::AirplaneModeTipsItem) +GETFUN(NetType::NetItemType, NetVPNTipsItem, itemType, NetType::NetItemType::VPNTipsItem) } // namespace network } // namespace dde diff --git a/net-view/operation/private/netitemprivate.h b/net-view/operation/private/netitemprivate.h index 58a6967e..b66e5276 100644 --- a/net-view/operation/private/netitemprivate.h +++ b/net-view/operation/private/netitemprivate.h @@ -365,6 +365,45 @@ class NetDetailsInfoItemPrivate : public NetItemPrivate int m_index; friend class NetItemPrivate; }; + +class NetTipsItemPrivate : public NetItemPrivate +{ +public: + NetType::NetItemType itemType() const override; + const QString &linkActivatedText() const; + bool tipsLinkEnabled() const; + void updatelinkActivatedText(const QString &linkActivatedText); + void updatetipsLinkEnabled(bool tipsLinkEnabled); + +protected: + using NetItemPrivate::NetItemPrivate; + +private: + QString m_linkActivatedText; + bool m_tipsLinkEnabled; +}; + +class NetAirplaneModeTipsItemPrivate : public NetTipsItemPrivate +{ +public: + NetType::NetItemType itemType() const override; + +protected: + using NetTipsItemPrivate::NetTipsItemPrivate; + + friend class NetItemPrivate; +}; + +class NetVPNTipsItemPrivate : public NetTipsItemPrivate +{ +public: + NetType::NetItemType itemType() const override; + +protected: + using NetTipsItemPrivate::NetTipsItemPrivate; + + friend class NetItemPrivate; +}; } // namespace network } // namespace dde diff --git a/net-view/operation/private/netmanager_p.h b/net-view/operation/private/netmanager_p.h index 38ffbe3d..8d210783 100644 --- a/net-view/operation/private/netmanager_p.h +++ b/net-view/operation/private/netmanager_p.h @@ -35,7 +35,6 @@ class NetManagerPrivate : public QObject void setMonitorNetworkNotify(bool monitor); void setUseSecretAgent(bool enabled); - void setNetwork8021XMode(NetManager::Network8021XMode mode); void setAutoScanInterval(int ms); void setAutoScanEnabled(bool enabled); void setEnabled(bool enabled); diff --git a/net-view/operation/private/netmanagerthreadprivate.cpp b/net-view/operation/private/netmanagerthreadprivate.cpp index 7daef124..6498a20b 100644 --- a/net-view/operation/private/netmanagerthreadprivate.cpp +++ b/net-view/operation/private/netmanagerthreadprivate.cpp @@ -88,7 +88,6 @@ NetManagerThreadPrivate::NetManagerThreadPrivate() , m_parentThread(QThread::currentThread()) , m_monitorNetworkNotify(false) , m_useSecretAgent(true) - , m_network8021XMode(NetManager::ToControlCenter) , m_autoUpdateHiddenConfig(true) , m_isInitialized(false) , m_enabled(true) @@ -200,26 +199,6 @@ void NetManagerThreadPrivate::setEnabled(bool enabled) m_enabled = enabled; } -void NetManagerThreadPrivate::setNetwork8021XMode(NetManager::Network8021XMode mode) -{ - NetManager::Network8021XMode networkMode = mode; - switch (mode) { - case NetManager::Network8021XMode::ToControlCenterUnderConnect: { - // 如果开起该配置,那么在第一次连接企业网的时候,弹出用户名密码输入框,否则就跳转到控制中心(工行定制) - networkMode = ConfigSetting::instance()->enableEapInput() ? NetManager::Network8021XMode::ToConnect : NetManager::Network8021XMode::ToControlCenter; - break; - } - case NetManager::Network8021XMode::SendNotifyUnderConnect: { - // 如果开启该配置,那么在第一次连接企业网的时候,弹出用户名密码输入框,否则给出提示消息(工行定制) - networkMode = ConfigSetting::instance()->enableEapInput() ? NetManager::Network8021XMode::ToConnect : NetManager::Network8021XMode::SendNotify; - break; - } - default: - break; - } - m_network8021XMode = networkMode; -} - void NetManagerThreadPrivate::setAutoUpdateHiddenConfig(bool autoUpdate) { m_autoUpdateHiddenConfig = autoUpdate; @@ -435,14 +414,53 @@ void NetManagerThreadPrivate::doInit() vpnControlItem->updatename("VPN"); vpnControlItem->updateenabled(networkController->vpnController()->enabled()); vpnControlItem->item()->moveToThread(m_parentThread); + if (m_flags.testFlags(NetType::NetManagerFlag::Net_VPNTips)) { + NetVPNTipsItemPrivate *vpnTipsItem = NetItemNew(VPNTipsItem, "NetVPNTipsItem"); + vpnTipsItem->updatelinkActivatedText("networkVpn"); + vpnTipsItem->updatetipsLinkEnabled(m_flags.testFlags(NetType::NetManagerFlag::Net_tipsLinkEnabled)); + vpnControlItem->addChild(vpnTipsItem); + } Q_EMIT itemAdded("Root", vpnControlItem); + auto updateVPNConnectionState = [this]() { + auto itemList = NetworkController::instance()->vpnController()->items(); + NetType::NetDeviceStatus state = NetType::DS_Disconnected; + // 有一个连接或者正在连接中,则不显示提示项 + for (const auto item : itemList) { + if (item->status() == ConnectionStatus::Activated || item->status() == ConnectionStatus::Activating || item->status() == ConnectionStatus::Deactivating) { + state = toNetDeviceStatus(item->status()); + if (item->status() == ConnectionStatus::Activated) + Q_EMIT dataChanged(DataChanged::IPChanged, "NetVPNControlItem", QVariant::fromValue(item->connection()->id())); + break; + } + continue; + } + Q_EMIT dataChanged(DataChanged::VPNConnectionStateChanged, "NetVPNControlItem", QVariant::fromValue(state)); + }; + auto vpnConnectionStateChanged = [this, updateVPNConnectionState] { + QTimer::singleShot(50, this, updateVPNConnectionState); + }; + + auto vpnItemChanged = [this, vpnConnectionStateChanged] { + auto itemList = NetworkController::instance()->vpnController()->items(); + Q_EMIT dataChanged(DataChanged::DeviceAvailableChanged, "NetVPNControlItem", itemList.size() > 0); + vpnConnectionStateChanged(); + }; connect(networkController->vpnController(), &VPNController::enableChanged, this, &NetManagerThreadPrivate::onVPNEnableChanged); - // connect(networkController->vpnController(), &VPNController::itemChanged, this, vpnItemChanged); - connect(networkController->vpnController(), &VPNController::itemAdded, this, &NetManagerThreadPrivate::onVPNAdded); - connect(networkController->vpnController(), &VPNController::itemRemoved, this, &NetManagerThreadPrivate::onVPNRemoved); + if (m_flags.testFlags(NetType::NetManagerFlag::Net_VPNChildren)) { + connect(networkController->vpnController(), &VPNController::itemAdded, this, &NetManagerThreadPrivate::onVPNAdded); + connect(networkController->vpnController(), &VPNController::itemRemoved, this, &NetManagerThreadPrivate::onVPNRemoved); + onVPNAdded(networkController->vpnController()->items()); + } connect(networkController->vpnController(), &VPNController::activeConnectionChanged, this, &NetManagerThreadPrivate::onVpnActiveConnectionChanged); - onVPNAdded(networkController->vpnController()->items()); + if (m_flags.testFlags(NetType::NetManagerFlag::Net_VPNTips)) { + connect(networkController->vpnController(), &VPNController::itemChanged, this, vpnItemChanged); + connect(networkController->vpnController(), &VPNController::itemAdded, this, vpnItemChanged); + connect(networkController->vpnController(), &VPNController::itemRemoved, this, vpnItemChanged); + connect(networkController->vpnController(), &VPNController::enableChanged, this, vpnConnectionStateChanged); + connect(networkController->vpnController(), &VPNController::activeConnectionChanged, this, vpnConnectionStateChanged); + vpnItemChanged(); + } } // 系统代理 if (m_flags.testFlags(NetType::NetManagerFlag::Net_SysProxy)) { @@ -725,8 +743,7 @@ void NetManagerThreadPrivate::doConnectWireless(const QString &id, const QVarian else sendRequest(NetManager::InputError, id, err); } else if (wConnect.needInputIdentify()) { // 未配置,需要输入Identify - handle8021xAccessPoint(ap); - if (m_network8021XMode != NetManager::ToConnect) + if (handle8021xAccessPoint(ap)) sendRequest(NetManager::CloseInput, id); } else if (wConnect.needInputPassword()) { sendRequest(NetManager::RequestPassword, id, { { "secrets", { secret } } }); @@ -826,6 +843,7 @@ void NetManagerThreadPrivate::updateAirplaneModeEnabled(const QDBusVariant &enab { m_airplaneModeEnabled = enabled.variant().toBool() && supportAirplaneMode(); Q_EMIT dataChanged(DataChanged::EnabledChanged, "Root", QVariant(m_airplaneModeEnabled)); + Q_EMIT dataChanged(DataChanged::AirplaneModeEnabledChanged, "Root", QVariant(m_airplaneModeEnabled)); } void NetManagerThreadPrivate::updateAirplaneModeEnabledable(const QDBusVariant &enabledable) @@ -2666,28 +2684,42 @@ void NetManagerThreadPrivate::handleAccessPointSecure(AccessPoints *accessPoint) } } -void NetManagerThreadPrivate::handle8021xAccessPoint(AccessPoints *ap) +bool NetManagerThreadPrivate::handle8021xAccessPoint(AccessPoints *ap) { // 每次ap状态变化时都会做一次处理,频繁地向控制中心发送showPage指令,导致控制中心卡顿甚至卡死 // 故增加防抖措施 int msecs = QTime::currentTime().msecsSinceStartOfDay(); if (qFabs(msecs - m_lastThroughTime) < 500) { - return; + return true; } m_lastThroughTime = msecs; - - switch (m_network8021XMode) { - case NetManager::ToControlCenter: - gotoControlCenter(ap->devicePath() + "," + ap->ssid()); + int flag = m_flags.toInt() & NetType::Net_8021xMask; + switch (flag) { + case NetType::Net_8021xToControlCenterUnderConnect: + // 如果开起该配置,那么在第一次连接企业网的时候,弹出用户名密码输入框,否则就跳转到控制中心(工行定制) + flag = ConfigSetting::instance()->enableEapInput() ? NetType::Net_8021xToConnect : NetType::Net_8021xToControlCenter; + break; + case NetType::Net_8021xSendNotifyUnderConnect: + // 如果开启该配置,那么在第一次连接企业网的时候,弹出用户名密码输入框,否则给出提示消息(工行定制) + flag = ConfigSetting::instance()->enableEapInput() ? NetType::Net_8021xToConnect : NetType::Net_8021xSendNotify; + break; + } + switch (flag) { + case NetType::Net_8021xToControlCenter: + gotoControlCenter("?device=" + ap->devicePath() + "&ssid=" + ap->ssid()); + return true; break; - case NetManager::SendNotify: + case NetType::Net_8021xSendNotify: sendNetworkNotify(NetworkNotifyType::Wireless8021X, ap->ssid()); + return true; break; - case NetManager::ToConnect: { + case NetType::Net_8021xToConnect: { QStringList secrets = { "identity", "password" }; sendRequest(NetManager::RequestPassword, apID(ap), { { "secrets", secrets } }); + return false; } break; } + return true; } void NetManagerThreadPrivate::onPrepareForSleep(bool state) diff --git a/net-view/operation/private/netmanagerthreadprivate.h b/net-view/operation/private/netmanagerthreadprivate.h index 898f53f9..81a482e9 100644 --- a/net-view/operation/private/netmanagerthreadprivate.h +++ b/net-view/operation/private/netmanagerthreadprivate.h @@ -57,7 +57,6 @@ class NetManagerThreadPrivate : public QObject void setUseSecretAgent(bool enabled); void setEnabled(bool enabled); - void setNetwork8021XMode(NetManager::Network8021XMode mode); void setAutoUpdateHiddenConfig(bool autoUpdate); void setAutoScanInterval(int ms); void setAutoScanEnabled(bool enabled); @@ -244,7 +243,7 @@ protected Q_SLOTS: void updateHiddenNetworkConfig(WirelessDevice *wireless); bool needSetPassword(AccessPoints *accessPoint) const; void handleAccessPointSecure(AccessPoints *accessPoint); - void handle8021xAccessPoint(AccessPoints *ap); + bool handle8021xAccessPoint(AccessPoints *ap); void onPrepareForSleep(bool state); protected: @@ -272,7 +271,6 @@ protected Q_SLOTS: // bool m_loadForNM; bool m_monitorNetworkNotify; bool m_useSecretAgent; - NetManager::Network8021XMode m_network8021XMode; bool m_autoUpdateHiddenConfig; // 自动更新隐藏网络配置 bool m_isInitialized; bool m_enabled; diff --git a/net-view/window/netstatus.cpp b/net-view/window/netstatus.cpp index f5eaa99a..f57a0742 100644 --- a/net-view/window/netstatus.cpp +++ b/net-view/window/netstatus.cpp @@ -61,7 +61,7 @@ NetStatus::NetStatus(NetManager *manager, QObject *parent) , m_networkBut(nullptr) , m_vpnAndProxyBut(nullptr) , m_tipsLabel(nullptr) - , m_vpnAndProxyIconVisibel(false) + , m_vpnAndProxyIconVisibel(true) { NetItem *root = m_manager->root(); connect(root, &NetItem::childRemoved, this, &NetStatus::onChildRemoved); @@ -131,7 +131,7 @@ bool NetStatus::needShowControlCenter() const // 如果没有网络设备,则直接唤起控制中心 if (!(m_deviceFlag & HAS_DEVICE_MASK)) return true; - if ((m_deviceFlag & HAS_DEVICE_MASK) == HAS_WIRED_DEVICE && getDeviceConnections(NET_WIRED, static_cast(NetConnectionStatus::AllConnectionStatus)).isEmpty()) // 只有有线,且无配置 + if ((m_deviceFlag & HAS_DEVICE_MASK) == HAS_WIRED_DEVICE && getDeviceConnections(NET_WIRED, static_cast(NetType::CS_AllConnectionStatus)).isEmpty()) // 只有有线,且无配置 return true; return false; } @@ -175,7 +175,7 @@ const QString NetStatus::contextMenu(bool hasSetting) const enable["isActive"] = bool(m_deviceFlag & ENABLEDABLE_DEVICE_MASK); items.push_back(enable); } - if (!m_manager->isGreeterMode()) { + // if (!m_manager->isGreeterMode()) { if (m_vpnItem.Availabled) { QMap vpnEnable; if (m_vpnItem.Enabled) { @@ -202,7 +202,7 @@ const QString NetStatus::contextMenu(bool hasSetting) const proxyEnable["isActive"] = m_proxyItem.Availabled; items.push_back(proxyEnable); } - } + // } if (hasSetting) { QMap settings; settings["itemId"] = QString::number(MenuSettings); @@ -262,7 +262,7 @@ QWidget *NetStatus::createDockIconWidget() QWidget *contentWidget = new QWidget; contentWidget->setMouseTracking(true); m_dockIconWidgetlayout = new QBoxLayout(QBoxLayout::LeftToRight, contentWidget); - m_dockIconWidgetlayout->setMargin(0); + m_dockIconWidgetlayout->setContentsMargins(0, 0, 0, 0); m_dockIconWidgetlayout->setSpacing(10); m_networkBut = new NetIconButton(contentWidget); m_networkBut->setForegroundRole(QPalette::BrightText); @@ -284,8 +284,10 @@ QWidget *NetStatus::createDockIconWidget() void NetStatus::setDirection(QBoxLayout::Direction position) { - if (m_dockIconWidgetlayout) + if (m_dockIconWidgetlayout) { m_dockIconWidgetlayout->setDirection(position); + updateItemWidgetSize(); + } } void NetStatus::refreshIcon() @@ -395,24 +397,24 @@ void NetStatus::onChildAdded(const NetItem *child) const NetItem *obj = objs.takeFirst(); switch (obj->itemType()) { - case NetItemType::VPNControlItem: { + case NetType::VPNControlItem: { const NetVPNControlItem *deviceItem = qobject_cast(obj); connect(deviceItem, &NetDeviceItem::statusChanged, this, &NetStatus::updateVpnAndProxyStatus); connect(deviceItem, &NetDeviceItem::ipsChanged, this, &NetStatus::updateVpnAndProxyStatus); connect(deviceItem, &NetDeviceItem::nameChanged, this, &NetStatus::updateVpnAndProxyStatus); connect(deviceItem, &NetDeviceItem::enabledableChanged, this, &NetStatus::updateVpnAndProxyStatus); connect(deviceItem, &NetDeviceItem::enabledChanged, this, &NetStatus::updateVpnAndProxyStatus); - connect(m_manager, &NetManager::vpnStatusChanged, this, &NetStatus::updateVpnAndProxyStatus); + // connect(m_manager, &NetManager::vpnStatusChanged, this, &NetStatus::updateVpnAndProxyStatus); updateVpnAndProxyStatus(); } break; - case NetItemType::SystemProxyControlItem: { + case NetType::SystemProxyControlItem: { const NetSystemProxyControlItem *deviceItem = qobject_cast(obj); connect(deviceItem, &NetControlItem::enabledChanged, this, &NetStatus::updateVpnAndProxyStatus); connect(deviceItem, &NetControlItem::enabledableChanged, this, &NetStatus::updateVpnAndProxyStatus); updateVpnAndProxyStatus(); } break; - case NetItemType::WiredDeviceItem: - case NetItemType::WirelessDeviceItem: { + case NetType::WiredDeviceItem: + case NetType::WirelessDeviceItem: { const NetDeviceItem *deviceItem = qobject_cast(obj); connect(deviceItem, &NetDeviceItem::statusChanged, this, &NetStatus::updateStatus); // 有线网无网线连接时不再发出status变化信号,因此还需要处理enable @@ -421,11 +423,11 @@ void NetStatus::onChildAdded(const NetItem *child) connect(deviceItem, &NetDeviceItem::nameChanged, this, &NetStatus::updateStatus); updateStatus(); } break; - case NetItemType::WiredItem: { + case NetType::WiredItem: { const NetWiredItem *item = qobject_cast(obj); connect(item, &NetWiredItem::statusChanged, this, &NetStatus::updateStatus); } break; - case NetItemType::WirelessItem: { + case NetType::WirelessItem: { const NetWirelessItem *item = qobject_cast(obj); connect(item, &NetWirelessItem::statusChanged, this, &NetStatus::updateStatus); connect(item, &NetWirelessItem::strengthLevelChanged, this, &NetStatus::onStrengthLevelChanged); @@ -451,7 +453,7 @@ void NetStatus::onChildRemoved(const NetItem *child) void NetStatus::onStrengthLevelChanged() { const NetWirelessItem *item = qobject_cast(sender()); - if (item && item->status() != NetConnectionStatus::UnConnected) { + if (item && item->status() != NetType::CS_UnConnected) { updateStatus(); } } @@ -461,12 +463,12 @@ void NetStatus::updateVpnAndProxyStatus() NetItem *root = m_manager->root(); NetVPNControlItem *vpnControlItem = nullptr; NetSystemProxyControlItem *systemProxyControlItem = nullptr; - for (auto it = root->childBegin(); it != root->childEnd(); ++it) { - if (NetItemType::VPNControlItem == (*it)->itemType()) { - vpnControlItem = qobject_cast(*it); + for(const auto &it : root->getChildren()){ + if (NetType::VPNControlItem == it->itemType()) { + vpnControlItem = qobject_cast(it); } - if (NetItemType::SystemProxyControlItem == (*it)->itemType()) { - systemProxyControlItem = qobject_cast(*it); + if (NetType::SystemProxyControlItem == it->itemType()) { + systemProxyControlItem = qobject_cast(it); } if (vpnControlItem && systemProxyControlItem) break; @@ -474,7 +476,7 @@ void NetStatus::updateVpnAndProxyStatus() m_vpnItem.Availabled = vpnControlItem && vpnControlItem->enabledable(); m_vpnItem.Enabled = vpnControlItem && vpnControlItem->isEnabled(); - m_vpnItem.Connected = vpnControlItem && vpnControlItem->status() == NetDeviceStatus::Connected; + m_vpnItem.Connected = vpnControlItem && vpnControlItem->status() == NetType::DS_Connected; m_proxyItem.Availabled = systemProxyControlItem && systemProxyControlItem->enabledable(); m_proxyItem.Enabled = systemProxyControlItem && systemProxyControlItem->isEnabled(); QString tips; @@ -493,9 +495,10 @@ void NetStatus::updateVpnAndProxyStatus() const bool visible = m_vpnItem.Connected || m_proxyItem.Enabled; if (m_vpnAndProxyIconVisibel != visible) { m_vpnAndProxyIconVisibel = visible; + m_vpnAndProxyBut->setVisible(m_vpnAndProxyIconVisibel); + updateItemWidgetSize(); Q_EMIT vpnAndProxyIconVisibelChanged(m_vpnAndProxyIconVisibel); } - m_vpnAndProxyBut->setVisible(m_vpnAndProxyIconVisibel); m_vpnAndProxyBut->setIcon(m_vpnAndProxyIcon); } if (m_vpnAndProxyTips != tips) { @@ -520,28 +523,29 @@ void NetStatus::doUpdateStatus() { NetItem *root = m_manager->root(); QStringList iphtml[DEVICE_ITEM_COUNT]; - unsigned devStatus[DEVICE_ITEM_COUNT] = { NetDeviceStatus::Unknown, NetDeviceStatus::Unknown }; + unsigned devStatus[DEVICE_ITEM_COUNT] = { NetType::DS_Unknown, NetType::DS_Unknown }; m_deviceFlag = 0; // 获取各设备状态 - for (auto it = root->childBegin(); it != root->childEnd(); ++it) { + for(const auto &it : root->getChildren()){ + // for (auto it = root->childBegin(); it != root->childEnd(); ++it) { int index = WIRELESS_DEVICE_INDEX; - switch ((*it)->itemType()) { - case NetItemType::WiredDeviceItem: + switch (it->itemType()) { + case NetType::WiredDeviceItem: index = WIRED_DEVICE_INDEX; [[clang::fallthrough]]; // 去无break警告 - case NetItemType::WirelessDeviceItem: { - NetDeviceItem *devItem = qobject_cast(*it); + case NetType::WirelessDeviceItem: { + NetDeviceItem *devItem = qobject_cast(it); bool needShowIp = false; if (devItem && devItem->isEnabled() && !devItem->ips().isEmpty()) { - if (devItem->status() == NetDeviceStatus::Connected) { + if (devItem->status() == NetType::DS_Connected) { needShowIp = true; - } else if (devItem->status() == NetDeviceStatus::IpConflicted) { + } else if (devItem->status() == NetType::DS_IpConflicted) { // IP冲突的情况下,如果当前设备是有线连接,且主连接是无线连接,那么此时需显示可上网的图标 // 需要显示IP;相反如果当前设备是无线连接,且主连接是有线连接,那么此时需要显示可上网,需显示IP - if ((*it)->itemType() == NetItemType::WiredDeviceItem) { + if (it->itemType() == NetType::WiredDeviceItem) { // 获取当前的主连接 needShowIp = (m_manager->primaryConnectionType() == NetManager::Wireless); - } else if ((*it)->itemType() == NetItemType::WirelessDeviceItem) { + } else if (it->itemType() == NetType::WirelessDeviceItem) { // 如果当前主连接为有线连接,则需要显示IP needShowIp = (m_manager->primaryConnectionType() == NetManager::Wired); } @@ -577,9 +581,9 @@ void NetStatus::doUpdateStatus() // 汇总有线无线状态 // 优先级: 连接中 ip冲突 已连接但无网络 已连接 未连接 禁用 无网线 未知 switch (netStatus) { - case NetDeviceStatus::Authenticating: - case NetDeviceStatus::ObtainingIP: - case NetDeviceStatus::Connecting: + case NetType::DS_Authenticating: + case NetType::DS_ObtainingIP: + case NetType::DS_Connecting: if (devStatus[WIRELESS_DEVICE_INDEX] == devStatus[WIRED_DEVICE_INDEX]) { networkStatus = NetworkStatus::Connecting; } else if (isWirelessStatus) { @@ -588,27 +592,27 @@ void NetStatus::doUpdateStatus() networkStatus = NetworkStatus::WiredConnecting; } break; - case NetDeviceStatus::IpConflicted: + case NetType::DS_IpConflicted: if (devStatus[WIRELESS_DEVICE_INDEX] == devStatus[WIRED_DEVICE_INDEX]) { networkStatus = NetworkStatus::WirelessIpConflicted; } else if (isWirelessStatus) { if (m_manager->primaryConnectionType() == NetManager::Wired) { // 如果当前的主连接不是无线,那么就判断有线网是否可以上网 - networkStatus = (devStatus[WIRED_DEVICE_INDEX] == NetDeviceStatus::Connected) ? + networkStatus = (devStatus[WIRED_DEVICE_INDEX] == NetType::DS_Connected) ? NetworkStatus::WiredConnected : NetworkStatus::ConnectNoInternet; } else { networkStatus = NetworkStatus::WirelessIpConflicted; } } else { if (m_manager->primaryConnectionType() == NetManager::Wireless) { - networkStatus = devStatus[WIRELESS_DEVICE_INDEX] == NetDeviceStatus::Connected ? + networkStatus = devStatus[WIRELESS_DEVICE_INDEX] == NetType::DS_Connected ? NetworkStatus::WirelessConnected : NetworkStatus::ConnectNoInternet; } else { networkStatus = NetworkStatus::WiredIpConflicted; } } break; - case NetDeviceStatus::ConnectNoInternet: + case NetType::DS_ConnectNoInternet: if (devStatus[WIRELESS_DEVICE_INDEX] == devStatus[WIRED_DEVICE_INDEX]) { networkStatus = NetworkStatus::ConnectNoInternet; } else if (isWirelessStatus) { @@ -617,7 +621,7 @@ void NetStatus::doUpdateStatus() networkStatus = NetworkStatus::WiredConnectNoInternet; } break; - case NetDeviceStatus::Connected: + case NetType::DS_Connected: if (devStatus[WIRELESS_DEVICE_INDEX] == devStatus[WIRED_DEVICE_INDEX]) { networkStatus = NetworkStatus::Connected; } else if (isWirelessStatus) { @@ -626,7 +630,7 @@ void NetStatus::doUpdateStatus() networkStatus = NetworkStatus::WiredConnected; } break; - case NetDeviceStatus::Disconnected: + case NetType::DS_Disconnected: if (devStatus[WIRELESS_DEVICE_INDEX] == devStatus[WIRED_DEVICE_INDEX]) { networkStatus = NetworkStatus::Disconnected; } else if (isWirelessStatus) { @@ -635,7 +639,7 @@ void NetStatus::doUpdateStatus() networkStatus = NetworkStatus::WiredDisconnected; } break; - case NetDeviceStatus::ConnectFailed: + case NetType::DS_ConnectFailed: if (devStatus[WIRELESS_DEVICE_INDEX] == devStatus[WIRED_DEVICE_INDEX]) { networkStatus = NetworkStatus::Disconnected; } else if (isWirelessStatus) { @@ -644,7 +648,7 @@ void NetStatus::doUpdateStatus() networkStatus = NetworkStatus::WiredDisconnected; } break; - case NetDeviceStatus::ObtainIpFailed: + case NetType::DS_ObtainIpFailed: if (devStatus[WIRELESS_DEVICE_INDEX] == devStatus[WIRED_DEVICE_INDEX]) { networkStatus = NetworkStatus::Failed; } else if (isWirelessStatus) { @@ -653,7 +657,7 @@ void NetStatus::doUpdateStatus() networkStatus = NetworkStatus::WiredFailed; } break; - case NetDeviceStatus::Disabled: + case NetType::DS_Disabled: if (devStatus[WIRELESS_DEVICE_INDEX] == devStatus[WIRED_DEVICE_INDEX]) { networkStatus = NetworkStatus::Disabled; } else if (isWirelessStatus) { @@ -662,7 +666,7 @@ void NetStatus::doUpdateStatus() networkStatus = NetworkStatus::WiredDisabled; } break; - case NetDeviceStatus::Enabled: + case NetType::DS_Enabled: if (devStatus[WIRELESS_DEVICE_INDEX] == devStatus[WIRED_DEVICE_INDEX]) { networkStatus = NetworkStatus::Disconnected; } else if (isWirelessStatus) { @@ -671,10 +675,10 @@ void NetStatus::doUpdateStatus() networkStatus = NetworkStatus::WiredDisconnected; } break; - case NetDeviceStatus::NoCable: + case NetType::DS_NoCable: networkStatus = NetworkStatus::Nocable; break; - case NetDeviceStatus::Unknown: + case NetType::DS_Unknown: networkStatus = NetworkStatus::Unknown; break; } @@ -695,7 +699,7 @@ void NetStatus::doUpdateStatus() updateNetworkTips(); } updateQuick(devStatus[WIRELESS_DEVICE_INDEX], devStatus[WIRED_DEVICE_INDEX]); - qCInfo(DNC) << "Update status, wireless network: " << NetDeviceStatus(devStatus[WIRELESS_DEVICE_INDEX]) << ", wired network: " << NetDeviceStatus(devStatus[WIRED_DEVICE_INDEX]) + qCInfo(DNC) << "Update status, wireless network: " << NetType::NetDeviceStatus(devStatus[WIRELESS_DEVICE_INDEX]) << ", wired network: " << NetType::NetDeviceStatus(devStatus[WIRED_DEVICE_INDEX]) << ", status: " << networkStatus << ", device flag: " << QString::number(m_deviceFlag, 16) << ", ip: " << m_iphtml; } @@ -779,7 +783,7 @@ void NetStatus::updateNetworkIcon() break; } if (type == NetManager::ConnectionType::Wireless) { - QVector items = getDeviceConnections(NET_WIRELESS, static_cast(NetConnectionStatus::Connected)); + QVector items = getDeviceConnections(NET_WIRELESS, static_cast(NetType::CS_Connected)); if (items.isEmpty()) { iconString = QString("network-wireless-signal-full-symbolic"); } else { @@ -845,7 +849,7 @@ void NetStatus::updateNetworkIcon() case NetworkStatus::ConnectNoInternet: case NetworkStatus::WirelessConnectNoInternet: { // 无线已连接但无法访问互联网 offline - QVector items = getDeviceConnections(NET_WIRELESS, static_cast(NetConnectionStatus::Connected)); + QVector items = getDeviceConnections(NET_WIRELESS, static_cast(NetType::CS_Connected)); if (items.isEmpty()) { iconString = QString("network-wireless-offline-signal-full-symbolic"); } else { @@ -925,12 +929,12 @@ void NetStatus::updateQuick(unsigned wirelessStatus, unsigned wiredStatus) QString quickDescription; QString quickIconStr; m_quickAnimationIcon.clear(); - if (wirelessStatus != NetDeviceStatus::Unknown) { + if (wirelessStatus != NetType::DS_Unknown) { quickTitle = tr("Wireless Network"); switch (wirelessStatus) { - case NetDeviceStatus::Authenticating: - case NetDeviceStatus::ObtainingIP: - case NetDeviceStatus::Connecting: + case NetType::DS_Authenticating: + case NetType::DS_ObtainingIP: + case NetType::DS_Connecting: quickDescription = tr("Connecting"); m_quickAnimationIcon = QStringList({ "network-wireless-signal-no-symbolic", @@ -941,9 +945,9 @@ void NetStatus::updateQuick(unsigned wirelessStatus, unsigned wiredStatus) }); quickIconStr = m_quickAnimationIcon.first(); break; - case NetDeviceStatus::IpConflicted: + case NetType::DS_IpConflicted: if (m_manager->primaryConnectionType() == NetManager::Wired - && wiredStatus == NetDeviceStatus::Connected) { + && wiredStatus == NetType::DS_Connected) { // 如果主连接是有线连接,则判断主线连接是否可以上网 quickDescription = tr("Connected"); quickIconStr = "network-wireless-signal-full-symbolic"; @@ -952,12 +956,12 @@ void NetStatus::updateQuick(unsigned wirelessStatus, unsigned wiredStatus) quickIconStr = "network-wireless-offline-signal-full-symbolic"; } break; - case NetDeviceStatus::ConnectNoInternet: { + case NetType::DS_ConnectNoInternet: { quickDescription = tr("Connected but no Internet access"); quickIconStr = QString("network-wireless-offline-signal-full-symbolic"); } break; - case NetDeviceStatus::Connected: { - QVector items = getDeviceConnections(NET_WIRELESS, static_cast(NetConnectionStatus::Connected)); + case NetType::DS_Connected: { + QVector items = getDeviceConnections(NET_WIRELESS, static_cast(NetType::CS_Connected)); if (items.isEmpty()) { quickDescription = tr("Connected"); } else if (items.size() == 1) { @@ -968,14 +972,14 @@ void NetStatus::updateQuick(unsigned wirelessStatus, unsigned wiredStatus) } quickIconStr = "network-wireless-signal-full-symbolic"; } break; - case NetDeviceStatus::Disconnected: - case NetDeviceStatus::ConnectFailed: - case NetDeviceStatus::ObtainIpFailed: - case NetDeviceStatus::Enabled: + case NetType::DS_Disconnected: + case NetType::DS_ConnectFailed: + case NetType::DS_ObtainIpFailed: + case NetType::DS_Enabled: quickDescription = tr("Not connected"); quickIconStr = "network-wireless-disconnect"; break; - case NetDeviceStatus::Disabled: + case NetType::DS_Disabled: networkActive = false; quickDescription = tr("Off"); quickIconStr = "network-wireless-disabled-symbolic"; @@ -985,12 +989,12 @@ void NetStatus::updateQuick(unsigned wirelessStatus, unsigned wiredStatus) quickIconStr = "network-wireless-disconnect"; break; } - } else if (wiredStatus != NetDeviceStatus::Unknown) { + } else if (wiredStatus != NetType::DS_Unknown) { quickTitle = tr("Wired Network"); switch (wiredStatus) { - case NetDeviceStatus::Authenticating: - case NetDeviceStatus::ObtainingIP: - case NetDeviceStatus::Connecting: + case NetType::DS_Authenticating: + case NetType::DS_ObtainingIP: + case NetType::DS_Connecting: quickDescription = tr("Connecting"); m_quickAnimationIcon = QStringList({ "network-wired-symbolic-connecting1", @@ -1001,9 +1005,9 @@ void NetStatus::updateQuick(unsigned wirelessStatus, unsigned wiredStatus) }); quickIconStr = m_quickAnimationIcon.first(); break; - case NetDeviceStatus::IpConflicted: + case NetType::DS_IpConflicted: if (m_manager->primaryConnectionType() == NetManager::Wireless - && wirelessStatus == NetDeviceStatus::Connected) { + && wirelessStatus == NetType::DS_Connected) { quickDescription = tr("Connected"); quickIconStr = "network-online-symbolic"; } else { @@ -1011,12 +1015,12 @@ void NetStatus::updateQuick(unsigned wirelessStatus, unsigned wiredStatus) quickIconStr = "network-offline-symbolic"; } break; - case NetDeviceStatus::ConnectNoInternet: + case NetType::DS_ConnectNoInternet: quickDescription = tr("Connected but no Internet access"); quickIconStr = "network-offline-symbolic"; break; - case NetDeviceStatus::Connected: { - QVector items = getDeviceConnections(NET_WIRED, static_cast(NetConnectionStatus::Connected)); + case NetType::DS_Connected: { + QVector items = getDeviceConnections(NET_WIRED, static_cast(NetType::CS_Connected)); if (items.isEmpty()) { quickDescription = tr("Connected"); } else if (items.size() == 1) { @@ -1026,19 +1030,19 @@ void NetStatus::updateQuick(unsigned wirelessStatus, unsigned wiredStatus) } quickIconStr = "network-online-symbolic"; } break; - case NetDeviceStatus::Disconnected: - case NetDeviceStatus::ConnectFailed: - case NetDeviceStatus::ObtainIpFailed: - case NetDeviceStatus::Enabled: + case NetType::DS_Disconnected: + case NetType::DS_ConnectFailed: + case NetType::DS_ObtainIpFailed: + case NetType::DS_Enabled: quickDescription = tr("Not connected"); quickIconStr = "network-none-symbolic"; break; - case NetDeviceStatus::Disabled: + case NetType::DS_Disabled: networkActive = false; quickDescription = tr("Off"); quickIconStr = "network-disabled-symbolic"; break; - case NetDeviceStatus::NoCable: + case NetType::DS_NoCable: quickDescription = tr("Network cable unplugged"); quickIconStr = "network-error-symbolic"; break; @@ -1097,16 +1101,16 @@ QVector NetStatus::getDeviceConnections(unsigned type, unsigned conne while (!items.isEmpty()) { NetItem *item = items.takeFirst(); switch (item->itemType()) { - case NetItemType::WirelessItem: { - if (NetItemType::WirelessItem & type) { + case NetType::WirelessItem: { + if (NetType::WirelessItem & type) { NetWirelessItem *netItem = NetItem::toItem(item); unsigned status = static_cast(netItem->status()); if (status & connectType) activeItems[status].append(netItem); } } break; - case NetItemType::WiredItem: - if (NetItemType::WiredItem & type) { + case NetType::WiredItem: + if (NetType::WiredItem & type) { NetWiredItem *netItem = NetItem::toItem(item); unsigned status = static_cast(netItem->status()); if (status & connectType) @@ -1114,19 +1118,35 @@ QVector NetStatus::getDeviceConnections(unsigned type, unsigned conne } break; default: - items.append(item->getchildren()); + items.append(item->getChildren()); break; } } // 排序 - auto sortFun = [](const NetItem *item1, const NetItem *item2) { - return item1->sortValue() < item2->sortValue(); - }; for (int i = 0; i < 5; i++) { - qSort(activeItems[i].begin(), activeItems[i].end(), sortFun); + std::sort(activeItems[i].begin(), activeItems[i].end(), &NetItem::compare); } - return activeItems[static_cast(NetConnectionStatus::Connecting)] + activeItems[static_cast(NetConnectionStatus::Connected)] - + activeItems[static_cast(NetConnectionStatus::UnConnected)]; + return activeItems[static_cast(NetType::CS_Connecting)] + activeItems[static_cast(NetType::CS_Connected)] + + activeItems[static_cast(NetType::CS_UnConnected)]; +} + +void NetStatus::updateItemWidgetSize() +{ + if (!m_dockIconWidgetlayout) + return; + + if (auto itemWidget = m_dockIconWidgetlayout->parentWidget()) { + itemWidget->setFixedSize(itemWidget->sizeHint()); + } +} + +bool NetStatus::event(QEvent *event) +{ + if (event->type() == QEvent::ApplicationFontChange) { + m_tipsLabel->adjustSize(); + } + + return QObject::event(event); } } // namespace network diff --git a/net-view/window/netstatus.h b/net-view/window/netstatus.h index 7bc5b3f5..063f1587 100644 --- a/net-view/window/netstatus.h +++ b/net-view/window/netstatus.h @@ -102,6 +102,9 @@ class NetStatus : public QObject public Q_SLOTS: void toggleNetworkActive(); +protected: + bool event(QEvent *event) override; + protected Q_SLOTS: void onChildAdded(const NetItem *child); void onChildRemoved(const NetItem *child); @@ -137,6 +140,7 @@ protected Q_SLOTS: private: QVector getDeviceConnections(unsigned type, unsigned connectType) const; + void updateItemWidgetSize(); private: NetManager *m_manager; diff --git a/net-view/window/netview.cpp b/net-view/window/netview.cpp index f8b8d66b..1daa5641 100644 --- a/net-view/window/netview.cpp +++ b/net-view/window/netview.cpp @@ -7,6 +7,7 @@ #include "netmanager.h" #include "private/netdelegate.h" #include "private/netmodel.h" +#include "private/netsortproxymodel.h" #include #include @@ -42,8 +43,8 @@ NetView::NetView(NetManager *manager) m_model = new NetModel(this); m_model->setRoot(m_manager->root()); - m_proxyModel = new QSortFilterProxyModel(m_model); - m_proxyModel->setSortRole(SORTROLE); + m_proxyModel = new NetSortProxyModel(m_model); + m_proxyModel->setSortRole(NetModel::NetItemRole); m_proxyModel->setSourceModel(m_model); setModel(m_proxyModel); @@ -82,9 +83,9 @@ NetView::NetView(NetManager *manager) connect(this, &NetView::activated, this, &NetView::onActivated); // 支持在触摸屏上滚动 - QScroller::grabGesture(viewport(), QScroller::LeftMouseButtonGesture); - QScrollerProperties sp; - sp.setScrollMetric(QScrollerProperties::VerticalOvershootPolicy, QScrollerProperties::OvershootAlwaysOff); + //QScroller::grabGesture(viewport(), QScroller::LeftMouseButtonGesture); + //QScrollerProperties sp; + //sp.setScrollMetric(QScrollerProperties::VerticalOvershootPolicy, QScrollerProperties::OvershootAlwaysOff); } NetView::~NetView() = default; @@ -138,17 +139,17 @@ void NetView::rowsInserted(const QModelIndex &parent, int start, int end) return; switch (item->itemType()) { - case NetItemType::WirelessOtherItem: { + case NetType::WirelessOtherItem: { NetWirelessOtherItem *otherItem = NetItem::toItem(item); if (otherItem) { updateItemExpand(otherItem); connect(otherItem, &NetWirelessOtherItem::expandedChanged, this, &NetView::onExpandStatusChanged); } } break; - case NetItemType::WirelessMineItem: + case NetType::WirelessMineItem: updateItemExpand(item); break; - case NetItemType::VPNControlItem: { + case NetType::VPNControlItem: { NetVPNControlItem *vpnControlItem = NetItem::toItem(item); if (vpnControlItem) { connect(vpnControlItem, &NetVPNControlItem::expandedChanged, this, &NetView::onExpandStatusChanged); @@ -156,15 +157,15 @@ void NetView::rowsInserted(const QModelIndex &parent, int start, int end) updateItemExpand(vpnControlItem); } } break; - case NetItemType::WirelessControlItem: - case NetItemType::WiredControlItem: - case NetItemType::WirelessDeviceItem: - case NetItemType::WiredDeviceItem: { + case NetType::WirelessControlItem: + case NetType::WiredControlItem: + case NetType::WirelessDeviceItem: + case NetType::WiredDeviceItem: { NetDeviceItem *dev = NetItem::toItem(item); if (dev) { updateItemExpand(dev); connect(dev, &NetDeviceItem::enabledChanged, this, &NetView::onExpandStatusChanged); - if (dev->itemType() == NetItemType::WirelessDeviceItem) + if (dev->itemType() == NetType::WirelessDeviceItem) connect(NetItem::toItem(dev), &NetWirelessDeviceItem::apModeChanged, this, &NetView::onExpandStatusChanged); } } break; @@ -182,7 +183,7 @@ bool NetView::viewportEvent(QEvent *event) case QEvent::HoverEnter: case QEvent::HoverMove: { QHoverEvent *he = static_cast(event); - QModelIndex newIndex = indexAt(he->pos()); + QModelIndex newIndex = indexAt(QPoint(he->position().x(), he->position().y())); setCurrentIndex(newIndex); break; } @@ -229,12 +230,12 @@ void NetView::onExec(NetManager::CmdType cmd, const QString &id, const QVariantM void NetView::onActivated(const QModelIndex &index) { - switch (index.data(TYPEROLE).value()) { - case NetItemType::WirelessOtherItem: - m_manager->exec(NetManager::ToggleExpand, index.data(IDROLE).toString()); + switch (index.data(NetModel::NetItemTypeRole).value()) { + case NetType::WirelessOtherItem: + m_manager->exec(NetManager::ToggleExpand, index.data(NetModel::NetItemIdRole).toString()); break; default: - m_manager->exec(NetManager::Connect, index.data(IDROLE).toString()); + m_manager->exec(NetManager::Connect, index.data(NetModel::NetItemIdRole).toString()); break; } } @@ -257,22 +258,22 @@ void NetView::updateItemExpand(NetItem *item) { bool expandItem = false; switch (item->itemType()) { - case NetItemType::WiredDeviceItem: { + case NetType::WiredDeviceItem: { NetWiredDeviceItem *dev = NetItem::toItem(item); expandItem = dev->isEnabled(); } break; - case NetItemType::WirelessDeviceItem: { // 无线禁用或热点模式时折叠 + case NetType::WirelessDeviceItem: { // 无线禁用或热点模式时折叠 NetWirelessDeviceItem *dev = NetItem::toItem(item); - expandItem = dev->isEnabled() && !dev->isApMode(); + expandItem = dev->isEnabled() && !dev->apMode(); } break; - case NetItemType::WirelessMineItem: { + case NetType::WirelessMineItem: { expandItem = true; } break; - case NetItemType::WirelessOtherItem: { + case NetType::WirelessOtherItem: { NetWirelessOtherItem *dev = NetItem::toItem(item); expandItem = dev->isExpanded(); } break; - case NetItemType::VPNControlItem: { + case NetType::VPNControlItem: { NetVPNControlItem *dev = NetItem::toItem(item); expandItem = dev->isExpanded(); } break; @@ -295,7 +296,7 @@ void NetView::scrollToItem(const QString &id) indexes.append(QModelIndex()); while (!indexes.isEmpty()) { QModelIndex index = indexes.takeFirst(); - if (index.data(IDROLE).toString() == id) { + if (index.data(NetModel::NetItemIdRole).toString() == id) { scrollTo(index); return; } @@ -313,7 +314,7 @@ QModelIndex NetView::traverseAndSearch(const QModelIndex &parent, const QString int row = m_proxyModel->rowCount(parent); while (row--) { QModelIndex index = m_proxyModel->index(row, 0, parent); - if (index.isValid() && index.data(IDROLE).toString() == id) { + if (index.isValid() && index.data(NetModel::NetItemIdRole).toString() == id) { return index; } QModelIndex retIndex = traverseAndSearch(index, id); diff --git a/net-view/window/private/netdelegate.cpp b/net-view/window/private/netdelegate.cpp index e23950cd..8a14daa3 100644 --- a/net-view/window/private/netdelegate.cpp +++ b/net-view/window/private/netdelegate.cpp @@ -51,21 +51,21 @@ ItemSpacing NetDelegate::getItemSpacing(const QModelIndex &index) const spacing.height = -1; spacing.viewItemPosition = QStyleOptionViewItem::OnlyOne; // 显示样式 - switch (index.data(TYPEROLE).value()) { - case NetItemType::WirelessDeviceItem: - case NetItemType::WiredDeviceItem: - case NetItemType::VPNControlItem: - case NetItemType::SystemProxyControlItem: { + switch (index.data(NetModel::NetItemTypeRole).value()) { + case NetType::WirelessDeviceItem: + case NetType::WiredDeviceItem: + case NetType::VPNControlItem: + case NetType::SystemProxyControlItem: { spacing.height = 40; spacing.top = index.row() == 0 ? 0 : 6; spacing.right = 10; } break; - case NetItemType::WirelessMineItem: { + case NetType::WirelessMineItem: { spacing.height = 24; } break; - case NetItemType::WiredItem: - case NetItemType::WirelessHiddenItem: - case NetItemType::WirelessItem: { + case NetType::WiredItem: + case NetType::WirelessHiddenItem: + case NetType::WirelessItem: { spacing.height = 30; spacing.bottom = 1; // 计算ViewItemPosition,WirelessOtherItem的子项根据实际viewItemPosition显示 @@ -82,13 +82,13 @@ ItemSpacing NetDelegate::getItemSpacing(const QModelIndex &index) const viewItemPosition = QStyleOptionViewItem::Middle; } // 处理显示差异 - switch (parentIndex.data(TYPEROLE).value()) { - case NetItemType::WirelessMineItem: - case NetItemType::WiredDeviceItem: + switch (parentIndex.data(NetModel::NetItemTypeRole).value()) { + case NetType::WirelessMineItem: + case NetType::WiredDeviceItem: spacing.height = 36; spacing.bottom = 10; break; - case NetItemType::WirelessOtherItem: + case NetType::WirelessOtherItem: spacing.viewItemPosition = viewItemPosition; break; default: @@ -104,13 +104,13 @@ ItemSpacing NetDelegate::getItemSpacing(const QModelIndex &index) const break; } } break; - case NetItemType::WirelessOtherItem: { + case NetType::WirelessOtherItem: { spacing.top = 10; spacing.height = 24; spacing.bottom = 4; } break; - case NetItemType::WirelessDisabledItem: - case NetItemType::WiredDisabledItem: + case NetType::WirelessDisabledItem: + case NetType::WiredDisabledItem: spacing.height = 220; break; default: @@ -132,8 +132,8 @@ void NetDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, c } QColor bgColor, textColor; - switch (index.data(TYPEROLE).value()) { - case NetItemType::WirelessOtherItem: { + switch (index.data(NetModel::NetItemTypeRole).value()) { + case NetType::WirelessOtherItem: { if (m_view->currentIndex() == index) { textColor = boption.dpalette.highlightedText().color(); bgColor = boption.dpalette.highlight().color(); @@ -144,15 +144,15 @@ void NetDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, c bgColor.setAlphaF(0.05); } } break; - case NetItemType::WirelessDisabledItem: - case NetItemType::WiredDisabledItem: - case NetItemType::WirelessMineItem: { + case NetType::WirelessDisabledItem: + case NetType::WiredDisabledItem: + case NetType::WirelessMineItem: { textColor = boption.dpalette.brightText().color(); textColor.setAlphaF(0.6); } break; - case NetItemType::WirelessItem: - case NetItemType::WiredItem: - case NetItemType::WirelessHiddenItem: { + case NetType::WirelessItem: + case NetType::WiredItem: + case NetType::WirelessHiddenItem: { if (m_view->currentIndex() == index) { if (option.rect.height() > 100) { textColor = boption.dpalette.brightText().color(); @@ -174,9 +174,10 @@ void NetDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, c if (textColor.isValid()) { boption.palette.setBrush(QPalette::BrightText, textColor); boption.palette.setBrush(QPalette::Highlight, textColor); - QWidget *w = m_view->indexWidget(index); - if (w) { - w->setPalette(boption.palette); + if (auto widget = qobject_cast(m_view->indexWidget(index))) { + if (auto w = widget->centralWidget()) { + w->setPalette(boption.palette); + } } } if (bgColor.isValid()) { @@ -194,37 +195,37 @@ QWidget *NetDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem & NetWidget *netWidget = nullptr; if (item) { switch (item->itemType()) { - case NetItemType::WirelessControlItem: - case NetItemType::WiredControlItem: - case NetItemType::WirelessDeviceItem: - case NetItemType::WiredDeviceItem: - case NetItemType::VPNControlItem: - case NetItemType::SystemProxyControlItem: { + case NetType::WirelessControlItem: + case NetType::WiredControlItem: + case NetType::WirelessDeviceItem: + case NetType::WiredDeviceItem: + case NetType::VPNControlItem: + case NetType::SystemProxyControlItem: { netWidget = new NetDeviceWidget(static_cast(item), parent); } break; - case NetItemType::WirelessMineItem: { + case NetType::WirelessMineItem: { netWidget = new NetWirelessTypeControlWidget(static_cast(item), parent); } break; - case NetItemType::WirelessOtherItem: { + case NetType::WirelessOtherItem: { netWidget = new NetWirelessTypeControlWidget(static_cast(item), parent); } break; - case NetItemType::WirelessItem: { + case NetType::WirelessItem: { netWidget = new NetWirelessWidget(static_cast(item), parent); } break; - case NetItemType::WirelessHiddenItem: { + case NetType::WirelessHiddenItem: { netWidget = new NetWirelessHiddenWidget(static_cast(item), parent); } break; - case NetItemType::WiredItem: { + case NetType::WiredItem: { netWidget = new NetWiredWidget(static_cast(item), parent); } break; - case NetItemType::WirelessDisabledItem: - case NetItemType::WiredDisabledItem: { + case NetType::WirelessDisabledItem: + case NetType::WiredDisabledItem: { netWidget = new NetDisabledWidget(item, parent); } break; - case NetItemType::AirplaneModeTipsItem: { + case NetType::AirplaneModeTipsItem: { netWidget = new NetAirplaneModeTipsWidget(static_cast(item), parent); } break; - case NetItemType::VPNTipsItem: { + case NetType::VPNTipsItem: { netWidget = new NetVPNTipsWidget(static_cast(item), parent); } break; default: @@ -346,6 +347,13 @@ void NetWidget::setCentralWidget(QWidget *widget) m_mainLayout->addWidget(widget); } +QWidget *NetWidget::centralWidget() const +{ + if (m_mainLayout->count() <= 0) + return nullptr; + return m_mainLayout->itemAt(0)->widget(); +} + void NetWidget::addPasswordWidget(QWidget *widget) { m_mainLayout->addWidget(widget); @@ -441,23 +449,6 @@ void NetWidget::closeInput() Q_EMIT requestUpdateLayout(); } -bool NetWidget::event(QEvent *e) -{ - switch (e->type()) { - case QEvent::PaletteChange: { - QLayout *layout = this->layout(); - for (int i = 0; i < layout->count(); i++) { - QWidget *widget = layout->itemAt(i)->widget(); - if (widget && !qobject_cast(widget)) - widget->setPalette(palette()); - } - } break; - default: - break; - } - return QWidget::event(e); -} - void NetWidget::mousePressEvent(QMouseEvent *event) { if (!m_noMousePropagation) @@ -499,11 +490,11 @@ NetDeviceWidget::NetDeviceWidget(NetDeviceItem *item, QWidget *parent) layout->addWidget(label); layout->addStretch(); switch (item->itemType()) { - case NetItemType::WiredControlItem: - case NetItemType::WirelessControlItem: + case NetType::WiredControlItem: + case NetType::WirelessControlItem: DFontSizeManager::instance()->bind(label, DFontSizeManager::T4); break; - case NetItemType::WirelessDeviceItem: { + case NetType::WirelessDeviceItem: { NetIconButton *refreshBut = new NetIconButton(this); refreshBut->setFixedSize(16, 16); refreshBut->setIcon(QIcon::fromTheme("refresh")); @@ -558,7 +549,7 @@ NetWirelessTypeControlWidget::NetWirelessTypeControlWidget(NetItem *item, QWidge layout->addStretch(); switch (item->itemType()) { - case NetItemType::WirelessOtherItem: { + case NetType::WirelessOtherItem: { m_expandButton = new NetIconButton(this); m_expandButton->setBackgroundRole(DPalette::Base); m_expandButton->setIcon(QIcon::fromTheme("network-arrow-down")); @@ -645,15 +636,15 @@ void NetWirelessWidget::updateIcon() m_iconBut->setIcon(QIcon::fromTheme(QString("network-wireless%1-symbolic").arg((item->flags() ? "-6" : "") + NetManager::StrengthLevelString(item->strengthLevel()) + (item->isSecure() ? "-secure" : "")))); } -void NetWirelessWidget::onStatusChanged(NetConnectionStatus status) +void NetWirelessWidget::onStatusChanged(NetType::NetConnectionStatus status) { switch (status) { - case NetConnectionStatus::Connected: + case NetType::CS_Connected: m_connBut->setVisible(true); m_loading->stop(); m_loading->setVisible(false); break; - case NetConnectionStatus::Connecting: + case NetType::CS_Connecting: m_connBut->setVisible(false); m_loading->start(); m_loading->setVisible(true); @@ -712,7 +703,6 @@ NetTipsWidget::NetTipsWidget(NetTipsItem *item, QWidget *parent) label->setFixedHeight(line * fm.boundingRect(plainText).height()); label->setText(item->tipsLinkEnabled() ? name : plainText); }; - connect(item, &NetTipsItem::nameChanged, this, updateHeight); connect(qApp, &QGuiApplication::fontChanged, this, updateHeight); updateHeight(); @@ -772,15 +762,15 @@ NetWiredWidget::NetWiredWidget(NetWiredItem *item, QWidget *parent) NetWiredWidget::~NetWiredWidget() { } -void NetWiredWidget::onStatusChanged(NetConnectionStatus status) +void NetWiredWidget::onStatusChanged(NetType::NetConnectionStatus status) { switch (status) { - case NetConnectionStatus::Connected: + case NetType::CS_Connected: m_connBut->setVisible(true); m_loading->stop(); m_loading->setVisible(false); break; - case NetConnectionStatus::Connecting: + case NetType::CS_Connecting: m_connBut->setVisible(false); m_loading->start(); m_loading->setVisible(true); @@ -803,7 +793,6 @@ NetDisabledWidget::NetDisabledWidget(NetItem *item, QWidget *parent) { QWidget *widget = new QWidget(this); QVBoxLayout *layout = new QVBoxLayout(widget); - layout->setMargin(0); layout->setSpacing(0); layout->setContentsMargins(3, 0, 5, 10); @@ -812,7 +801,7 @@ NetDisabledWidget::NetDisabledWidget(NetItem *item, QWidget *parent) icon->setFixedSize(96, 96); icon->setAttribute(Qt::WA_TransparentForMouseEvents); icon->setFocusPolicy(Qt::NoFocus); - if (item->itemType() == NetItemType::WiredDisabledItem) { + if (item->itemType() == NetType::WiredDisabledItem) { icon->setIcon(QIcon::fromTheme("network-wired-disabled")); } else { icon->setIcon(QIcon::fromTheme("network-wireless-disabled")); diff --git a/net-view/window/private/netdelegate.h b/net-view/window/private/netdelegate.h index 4b6ba65d..d1c6a980 100644 --- a/net-view/window/private/netdelegate.h +++ b/net-view/window/private/netdelegate.h @@ -85,6 +85,7 @@ class NetWidget : public QWidget ~NetWidget() Q_DECL_OVERRIDE; void setCentralWidget(QWidget *widget); + QWidget *centralWidget() const; void addPasswordWidget(QWidget *widget); void setNoMousePropagation(bool noMousePropagation); void removePasswordWidget(); @@ -104,7 +105,6 @@ public Q_SLOTS: void closeInput(); protected: - bool event(QEvent *e) override; void mousePressEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; void sendRequest(NetManager::CmdType cmd, const QString &id, const QVariantMap ¶m = QVariantMap()); @@ -157,7 +157,7 @@ class NetWirelessWidget : public NetWidget public Q_SLOTS: void updateIcon(); - void onStatusChanged(dde::network::NetConnectionStatus status); + void onStatusChanged(NetType::NetConnectionStatus status); void onDisconnectClicked(); private: @@ -208,7 +208,7 @@ class NetWiredWidget : public NetWidget ~NetWiredWidget() Q_DECL_OVERRIDE; public Q_SLOTS: - void onStatusChanged(NetConnectionStatus status); + void onStatusChanged(NetType::NetConnectionStatus status); void onDisconnectClicked(); private: diff --git a/net-view/window/private/netmodel.cpp b/net-view/window/private/netmodel.cpp index 17d63c4b..16e6ba6f 100644 --- a/net-view/window/private/netmodel.cpp +++ b/net-view/window/private/netmodel.cpp @@ -46,11 +46,11 @@ QVariant NetModel::data(const QModelIndex &index, int role) const switch (role) { case Qt::DisplayRole: return item->name(); - case SORTROLE: - return item->sortValue(); - case IDROLE: + case NetItemRole: + return QVariant::fromValue(item); + case NetItemIdRole: return item->id(); - case TYPEROLE: + case NetItemTypeRole: return item->itemType(); default: break; @@ -170,7 +170,7 @@ void NetModel::updateObject() NetItem *obj = qobject_cast(sender()); if (obj) { QModelIndex i = index(obj); - emit dataChanged(i, i, { SORTROLE }); + emit dataChanged(i, i, { NetItemRole }); } } diff --git a/net-view/window/private/netmodel.h b/net-view/window/private/netmodel.h index 2a2549af..023905f3 100644 --- a/net-view/window/private/netmodel.h +++ b/net-view/window/private/netmodel.h @@ -7,10 +7,6 @@ #include #define CUSTOMROLE (Qt::UserRole + 100) -#define SORTROLE (CUSTOMROLE) -#define IDROLE (CUSTOMROLE + 1) -#define TYPEROLE (CUSTOMROLE + 2) - namespace dde { namespace network { @@ -23,6 +19,12 @@ class NetModel : public QAbstractItemModel explicit NetModel(QObject *parent = nullptr); ~NetModel() override; + enum NetModelRole { + NetItemRole = Qt::UserRole + 300, + NetItemIdRole, + NetItemTypeRole, + }; + void setRoot(NetItem *object); NetItem *toObject(const QModelIndex &index); diff --git a/net-view/window/private/netsecretwidget.cpp b/net-view/window/private/netsecretwidget.cpp index b5d33ea7..04922b22 100644 --- a/net-view/window/private/netsecretwidget.cpp +++ b/net-view/window/private/netsecretwidget.cpp @@ -7,6 +7,7 @@ #include #include +#include #include DWIDGET_USE_NAMESPACE @@ -100,8 +101,24 @@ void NetSecretWidget::initUI(const QVariantMap ¶m) connect(connectButton, &DPushButton::clicked, this, &NetSecretWidget::onConnect); m_connectButton = connectButton; onTextChanged(); + m_passwordWidget = focusWidget; if (focusWidget) - QMetaObject::invokeMethod(focusWidget, "setFocus", Qt::QueuedConnection); + QMetaObject::invokeMethod(this, "setFocusToEdit", Qt::QueuedConnection); +} + +void NetSecretWidget::setFocusToEdit() +{ + if (!m_passwordWidget) { + return; + } + + QWidget *tlw = m_passwordWidget->window(); + const QWindow *w = tlw ? tlw->windowHandle() : 0; + if (qApp->focusWindow() == w && qApp->activeWindow() != m_passwordWidget->window()) { + m_passwordWidget->activateWindow(); + } + + m_passwordWidget->setFocus(); } void NetSecretWidget::showError(const QVariantMap ¶m) diff --git a/net-view/window/private/netsecretwidget.h b/net-view/window/private/netsecretwidget.h index 3b19ec3e..42080df6 100644 --- a/net-view/window/private/netsecretwidget.h +++ b/net-view/window/private/netsecretwidget.h @@ -5,6 +5,7 @@ #define NETSECRETWIDGET_H #include +#include #include namespace dde { @@ -23,6 +24,7 @@ class NetSecretWidget : public QWidget public Q_SLOTS: void initUI(const QVariantMap ¶m); + void setFocusToEdit(); void showError(const QVariantMap ¶m); void updateInputValid(const QVariantMap ¶m); void onCancel(); @@ -35,6 +37,7 @@ public Q_SLOTS: QWidget *m_connectButton; const QMap m_secretKeyStrMap; const QMap m_propMap; + QPointer m_passwordWidget; }; } // namespace network diff --git a/net-view/window/private/netsortproxymodel.cpp b/net-view/window/private/netsortproxymodel.cpp new file mode 100644 index 00000000..edca4214 --- /dev/null +++ b/net-view/window/private/netsortproxymodel.cpp @@ -0,0 +1,83 @@ +// SPDX-FileCopyrightText: 2025 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later +#include "netsortproxymodel.h" + +#include "netitem.h" + +namespace dde { +namespace network { + +NetSortProxyModel::NetSortProxyModel(QObject *parent) + : QSortFilterProxyModel(parent) +{ +} + +void NetSortProxyModel::setSourceModel(QAbstractItemModel *sourceModel) +{ + QSortFilterProxyModel::setSourceModel(sourceModel); + connect(sourceModel, &QAbstractItemModel::rowsInserted, this, &NetSortProxyModel::onRowsInserted); +} + +bool NetSortProxyModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const +{ + NetItem *item1 = static_cast(source_left.internalPointer()); + NetItem *item2 = static_cast(source_right.internalPointer()); + return NetItem::compare(item1, item2); +} + +void NetSortProxyModel::onRowsInserted(const QModelIndex &parent, int first, int last) +{ + auto model = sourceModel(); + QList indexes; + for (int row = first; row <= last; ++row) { + indexes.append(model->index(row, 0, parent)); + } + while (!indexes.isEmpty()) { + QModelIndex index = indexes.takeFirst(); + if (index.isValid()) { + NetItem *item = static_cast(index.internalPointer()); + connect(item, &NetItem::nameChanged, this, &NetSortProxyModel::updateSort, Qt::ConnectionType(Qt::AutoConnection | Qt::UniqueConnection)); + switch (item->itemType()) { + case NetType::WirelessItem: { + const NetWirelessItem *obj = qobject_cast(item); + connect(obj, &NetWirelessItem::statusChanged, this, &NetSortProxyModel::updateSort, Qt::ConnectionType(Qt::AutoConnection | Qt::UniqueConnection)); + connect(obj, &NetWirelessItem::strengthLevelChanged, this, &NetSortProxyModel::updateSort, Qt::ConnectionType(Qt::AutoConnection | Qt::UniqueConnection)); + } break; + case NetType::WiredItem: { + const NetWiredItem *connItem = qobject_cast(item); + connect(connItem, &NetWiredItem::statusChanged, this, &NetSortProxyModel::updateSort, Qt::ConnectionType(Qt::AutoConnection | Qt::UniqueConnection)); + } break; + default: + break; + } + } + for (int j = 0; j < model->rowCount(index); j++) { + indexes.append(model->index(j, 0, index)); + } + } + updateSort(); +} + +void NetSortProxyModel::updateSort() +{ + void *send = sender(); + if (!send) + return; + auto model = sourceModel(); + QList indexes; + indexes.append(QModelIndex()); + while (!indexes.isEmpty()) { + QModelIndex i = indexes.takeFirst(); + if (i.internalPointer() == send) { + Q_EMIT model->dataChanged(i, i, { sortRole() }); + break; + } + for (int j = 0; j < model->rowCount(i); j++) { + indexes.append(model->index(j, 0, i)); + } + } +} + +} // namespace network +} // namespace dde diff --git a/net-view/window/private/netsortproxymodel.h b/net-view/window/private/netsortproxymodel.h new file mode 100644 index 00000000..38dd5321 --- /dev/null +++ b/net-view/window/private/netsortproxymodel.h @@ -0,0 +1,29 @@ +// SPDX-FileCopyrightText: 2025 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later +#ifndef NETSORTPROXYMODEL_H +#define NETSORTPROXYMODEL_H + +#include + +namespace dde { +namespace network { + +class NetSortProxyModel : public QSortFilterProxyModel +{ + Q_OBJECT +public: + explicit NetSortProxyModel(QObject *parent = nullptr); + void setSourceModel(QAbstractItemModel *sourceModel) override; + +protected: + bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const override; + +protected Q_SLOTS: + void onRowsInserted(const QModelIndex &parent, int first, int last); + void updateSort(); +}; +} // namespace network +} // namespace dde + +#endif // NETSORTPROXYMODEL_H diff --git a/net-view/window/qrc/icons/copy.dci b/net-view/window/qrc/built-in-icons/copy.dci similarity index 100% rename from net-view/window/qrc/icons/copy.dci rename to net-view/window/qrc/built-in-icons/copy.dci diff --git a/net-view/window/qrc/icons/list_add.dci b/net-view/window/qrc/built-in-icons/list_add.dci similarity index 100% rename from net-view/window/qrc/icons/list_add.dci rename to net-view/window/qrc/built-in-icons/list_add.dci diff --git a/net-view/window/qrc/icons/list_delete.dci b/net-view/window/qrc/built-in-icons/list_delete.dci similarity index 100% rename from net-view/window/qrc/icons/list_delete.dci rename to net-view/window/qrc/built-in-icons/list_delete.dci diff --git a/net-view/window/qrc/icons/network-none-symbolic.dci b/net-view/window/qrc/built-in-icons/network-none-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-none-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-none-symbolic.dci diff --git a/net-view/window/qrc/icons/network-offline-symbolic.dci b/net-view/window/qrc/built-in-icons/network-offline-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-offline-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-offline-symbolic.dci diff --git a/net-view/window/qrc/icons/network-online-symbolic.dci b/net-view/window/qrc/built-in-icons/network-online-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-online-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-online-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wired-symbolic-connecting1.dci b/net-view/window/qrc/built-in-icons/network-wired-symbolic-connecting1.dci similarity index 100% rename from net-view/window/qrc/icons/network-wired-symbolic-connecting1.dci rename to net-view/window/qrc/built-in-icons/network-wired-symbolic-connecting1.dci diff --git a/net-view/window/qrc/icons/network-wired-symbolic-connecting2.dci b/net-view/window/qrc/built-in-icons/network-wired-symbolic-connecting2.dci similarity index 100% rename from net-view/window/qrc/icons/network-wired-symbolic-connecting2.dci rename to net-view/window/qrc/built-in-icons/network-wired-symbolic-connecting2.dci diff --git a/net-view/window/qrc/icons/network-wired-symbolic-connecting3.dci b/net-view/window/qrc/built-in-icons/network-wired-symbolic-connecting3.dci similarity index 100% rename from net-view/window/qrc/icons/network-wired-symbolic-connecting3.dci rename to net-view/window/qrc/built-in-icons/network-wired-symbolic-connecting3.dci diff --git a/net-view/window/qrc/icons/network-wired-symbolic-connecting4.dci b/net-view/window/qrc/built-in-icons/network-wired-symbolic-connecting4.dci similarity index 100% rename from net-view/window/qrc/icons/network-wired-symbolic-connecting4.dci rename to net-view/window/qrc/built-in-icons/network-wired-symbolic-connecting4.dci diff --git a/net-view/window/qrc/icons/network-wired-symbolic-connecting5.dci b/net-view/window/qrc/built-in-icons/network-wired-symbolic-connecting5.dci similarity index 100% rename from net-view/window/qrc/icons/network-wired-symbolic-connecting5.dci rename to net-view/window/qrc/built-in-icons/network-wired-symbolic-connecting5.dci diff --git a/net-view/window/qrc/icons/network-wireless-6-high-secure-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-6-high-secure-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-6-high-secure-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-6-high-secure-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-6-high-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-6-high-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-6-high-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-6-high-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-6-low-secure-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-6-low-secure-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-6-low-secure-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-6-low-secure-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-6-low-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-6-low-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-6-low-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-6-low-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-6-medium-secure-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-6-medium-secure-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-6-medium-secure-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-6-medium-secure-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-6-medium-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-6-medium-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-6-medium-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-6-medium-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-6-no-secure-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-6-no-secure-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-6-no-secure-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-6-no-secure-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-6-no-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-6-no-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-6-no-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-6-no-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-6-offline-secure-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-6-offline-secure-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-6-offline-secure-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-6-offline-secure-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-6-offline-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-6-offline-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-6-offline-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-6-offline-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-6-signal-full-secure-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-6-signal-full-secure-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-6-signal-full-secure-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-6-signal-full-secure-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-6-signal-full-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-6-signal-full-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-6-signal-full-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-6-signal-full-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-6-signal-high-secure-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-6-signal-high-secure-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-6-signal-high-secure-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-6-signal-high-secure-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-6-signal-high-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-6-signal-high-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-6-signal-high-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-6-signal-high-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-6-signal-low-secure-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-6-signal-low-secure-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-6-signal-low-secure-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-6-signal-low-secure-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-6-signal-low-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-6-signal-low-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-6-signal-low-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-6-signal-low-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-6-signal-medium-secure-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-6-signal-medium-secure-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-6-signal-medium-secure-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-6-signal-medium-secure-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-6-signal-medium-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-6-signal-medium-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-6-signal-medium-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-6-signal-medium-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-6-signal-no-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-6-signal-no-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-6-signal-no-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-6-signal-no-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-6-signal-none-secure-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-6-signal-none-secure-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-6-signal-none-secure-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-6-signal-none-secure-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-6-signal-none-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-6-signal-none-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-6-signal-none-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-6-signal-none-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-6-warning-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-6-warning-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-6-warning-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-6-warning-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-high-secure-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-high-secure-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-high-secure-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-high-secure-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-high-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-high-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-high-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-high-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-low-secure-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-low-secure-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-low-secure-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-low-secure-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-medium-secure-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-medium-secure-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-medium-secure-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-medium-secure-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-medium-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-medium-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-medium-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-medium-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-no-secure-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-no-secure-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-no-secure-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-no-secure-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-no-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-no-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-no-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-no-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-offline-secure-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-offline-secure-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-offline-secure-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-offline-secure-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-offline-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-offline-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-offline-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-offline-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-signal-full-secure-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-signal-full-secure-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-signal-full-secure-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-signal-full-secure-symbolic.dci diff --git a/net-view/window/qrc/built-in-icons/network-wireless-signal-full-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-signal-full-symbolic.dci new file mode 100644 index 00000000..91ad45e4 Binary files /dev/null and b/net-view/window/qrc/built-in-icons/network-wireless-signal-full-symbolic.dci differ diff --git a/net-view/window/qrc/icons/network-wireless-signal-high-secure-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-signal-high-secure-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-signal-high-secure-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-signal-high-secure-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-signal-high-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-signal-high-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-signal-high-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-signal-high-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-signal-low-secure-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-signal-low-secure-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-signal-low-secure-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-signal-low-secure-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-signal-low-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-signal-low-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-signal-low-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-signal-low-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-signal-medium-secure-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-signal-medium-secure-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-signal-medium-secure-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-signal-medium-secure-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-signal-medium-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-signal-medium-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-signal-medium-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-signal-medium-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-signal-no-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-signal-no-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-signal-no-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-signal-no-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-signal-none-secure-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-signal-none-secure-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-signal-none-secure-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-signal-none-secure-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-signal-none-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-signal-none-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-signal-none-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-signal-none-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wireless-warning-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wireless-warning-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wireless-warning-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wireless-warning-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wirelss-6-no-route-secure-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wirelss-6-no-route-secure-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wirelss-6-no-route-secure-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wirelss-6-no-route-secure-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wirelss-6-no-route-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wirelss-6-no-route-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wirelss-6-no-route-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wirelss-6-no-route-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wirelss-no-route-secure-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wirelss-no-route-secure-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wirelss-no-route-secure-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wirelss-no-route-secure-symbolic.dci diff --git a/net-view/window/qrc/icons/network-wirelss-no-route-symbolic.dci b/net-view/window/qrc/built-in-icons/network-wirelss-no-route-symbolic.dci similarity index 100% rename from net-view/window/qrc/icons/network-wirelss-no-route-symbolic.dci rename to net-view/window/qrc/built-in-icons/network-wirelss-no-route-symbolic.dci diff --git a/net-view/window/qrc/network.qrc b/net-view/window/qrc/network.qrc index ed4a382a..1d2c28d7 100644 --- a/net-view/window/qrc/network.qrc +++ b/net-view/window/qrc/network.qrc @@ -99,63 +99,63 @@ texts/vpn_16px.svg - icons/list_add.dci - icons/list_delete.dci - icons/copy.dci - icons/network-wired-symbolic-connecting1.dci - icons/network-wired-symbolic-connecting2.dci - icons/network-wired-symbolic-connecting3.dci - icons/network-wired-symbolic-connecting4.dci - icons/network-wired-symbolic-connecting5.dci - icons/network-wireless-6-high-secure-symbolic.dci - icons/network-wireless-6-high-symbolic.dci - icons/network-wireless-6-low-secure-symbolic.dci - icons/network-wireless-6-low-symbolic.dci - icons/network-wireless-6-medium-secure-symbolic.dci - icons/network-wireless-6-medium-symbolic.dci - icons/network-wireless-6-no-secure-symbolic.dci - icons/network-wireless-6-no-symbolic.dci - icons/network-wireless-6-offline-secure-symbolic.dci - icons/network-wireless-6-offline-symbolic.dci - icons/network-wireless-6-signal-full-secure-symbolic.dci - icons/network-wireless-6-signal-full-symbolic.dci - icons/network-wireless-6-signal-high-secure-symbolic.dci - icons/network-wireless-6-signal-high-symbolic.dci - icons/network-wireless-6-signal-low-secure-symbolic.dci - icons/network-wireless-6-signal-low-symbolic.dci - icons/network-wireless-6-signal-medium-secure-symbolic.dci - icons/network-wireless-6-signal-medium-symbolic.dci - icons/network-wireless-6-signal-none-secure-symbolic.dci - icons/network-wireless-6-signal-none-symbolic.dci - icons/network-wireless-6-signal-no-symbolic.dci - icons/network-wireless-6-warning-symbolic.dci - icons/network-wireless-high-secure-symbolic.dci - icons/network-wireless-high-symbolic.dci - icons/network-wireless-low-secure-symbolic.dci - icons/network-wireless-medium-secure-symbolic.dci - icons/network-wireless-medium-symbolic.dci - icons/network-wireless-no-secure-symbolic.dci - icons/network-wireless-no-symbolic.dci - icons/network-wireless-offline-secure-symbolic.dci - icons/network-wireless-offline-symbolic.dci - icons/network-wireless-signal-full-secure-symbolic.dci - icons/network-wireless-signal-full-symbolic.dci - icons/network-wireless-signal-high-secure-symbolic.dci - icons/network-wireless-signal-high-symbolic.dci - icons/network-wireless-signal-low-secure-symbolic.dci - icons/network-wireless-signal-low-symbolic.dci - icons/network-wireless-signal-medium-secure-symbolic.dci - icons/network-wireless-signal-medium-symbolic.dci - icons/network-wireless-signal-none-secure-symbolic.dci - icons/network-wireless-signal-none-symbolic.dci - icons/network-wireless-signal-no-symbolic.dci - icons/network-wireless-warning-symbolic.dci - icons/network-wirelss-6-no-route-secure-symbolic.dci - icons/network-wirelss-6-no-route-symbolic.dci - icons/network-wirelss-no-route-secure-symbolic.dci - icons/network-wirelss-no-route-symbolic.dci - icons/network-none-symbolic.dci - icons/network-offline-symbolic.dci - icons/network-online-symbolic.dci + built-in-icons/copy.dci + built-in-icons/list_add.dci + built-in-icons/list_delete.dci + built-in-icons/network-none-symbolic.dci + built-in-icons/network-offline-symbolic.dci + built-in-icons/network-online-symbolic.dci + built-in-icons/network-wired-symbolic-connecting1.dci + built-in-icons/network-wired-symbolic-connecting2.dci + built-in-icons/network-wired-symbolic-connecting3.dci + built-in-icons/network-wired-symbolic-connecting4.dci + built-in-icons/network-wired-symbolic-connecting5.dci + built-in-icons/network-wireless-6-high-secure-symbolic.dci + built-in-icons/network-wireless-6-high-symbolic.dci + built-in-icons/network-wireless-6-low-secure-symbolic.dci + built-in-icons/network-wireless-6-low-symbolic.dci + built-in-icons/network-wireless-6-medium-secure-symbolic.dci + built-in-icons/network-wireless-6-medium-symbolic.dci + built-in-icons/network-wireless-6-no-secure-symbolic.dci + built-in-icons/network-wireless-6-no-symbolic.dci + built-in-icons/network-wireless-6-offline-secure-symbolic.dci + built-in-icons/network-wireless-6-offline-symbolic.dci + built-in-icons/network-wireless-6-signal-full-secure-symbolic.dci + built-in-icons/network-wireless-6-signal-full-symbolic.dci + built-in-icons/network-wireless-6-signal-high-secure-symbolic.dci + built-in-icons/network-wireless-6-signal-high-symbolic.dci + built-in-icons/network-wireless-6-signal-low-secure-symbolic.dci + built-in-icons/network-wireless-6-signal-low-symbolic.dci + built-in-icons/network-wireless-6-signal-medium-secure-symbolic.dci + built-in-icons/network-wireless-6-signal-medium-symbolic.dci + built-in-icons/network-wireless-6-signal-none-secure-symbolic.dci + built-in-icons/network-wireless-6-signal-none-symbolic.dci + built-in-icons/network-wireless-6-signal-no-symbolic.dci + built-in-icons/network-wireless-6-warning-symbolic.dci + built-in-icons/network-wireless-high-secure-symbolic.dci + built-in-icons/network-wireless-high-symbolic.dci + built-in-icons/network-wireless-low-secure-symbolic.dci + built-in-icons/network-wireless-medium-secure-symbolic.dci + built-in-icons/network-wireless-medium-symbolic.dci + built-in-icons/network-wireless-no-secure-symbolic.dci + built-in-icons/network-wireless-no-symbolic.dci + built-in-icons/network-wireless-offline-secure-symbolic.dci + built-in-icons/network-wireless-offline-symbolic.dci + built-in-icons/network-wireless-signal-full-secure-symbolic.dci + built-in-icons/network-wireless-signal-full-symbolic.dci + built-in-icons/network-wireless-signal-high-secure-symbolic.dci + built-in-icons/network-wireless-signal-high-symbolic.dci + built-in-icons/network-wireless-signal-low-secure-symbolic.dci + built-in-icons/network-wireless-signal-low-symbolic.dci + built-in-icons/network-wireless-signal-medium-secure-symbolic.dci + built-in-icons/network-wireless-signal-medium-symbolic.dci + built-in-icons/network-wireless-signal-none-secure-symbolic.dci + built-in-icons/network-wireless-signal-none-symbolic.dci + built-in-icons/network-wireless-signal-no-symbolic.dci + built-in-icons/network-wireless-warning-symbolic.dci + built-in-icons/network-wirelss-6-no-route-secure-symbolic.dci + built-in-icons/network-wirelss-6-no-route-symbolic.dci + built-in-icons/network-wirelss-no-route-secure-symbolic.dci + built-in-icons/network-wirelss-no-route-symbolic.dci