From c9c71c0e29b55fcacfaf4d64dac55b7f25558f28 Mon Sep 17 00:00:00 2001 From: Damocles Date: Wed, 22 Apr 2026 21:50:02 +0200 Subject: [PATCH] extract NetworkApplet, fold NetworkMenu into NetworkModule with pin support --- .../NetworkApplet.qml} | 50 ++---------- shell/applets/qmldir | 1 + shell/modules/Bar.qml | 1 - shell/modules/NetworkModule.qml | 80 +++++++++++++++++-- shell/modules/qmldir | 1 - 5 files changed, 81 insertions(+), 52 deletions(-) rename shell/{modules/NetworkMenu.qml => applets/NetworkApplet.qml} (67%) diff --git a/shell/modules/NetworkMenu.qml b/shell/applets/NetworkApplet.qml similarity index 67% rename from shell/modules/NetworkMenu.qml rename to shell/applets/NetworkApplet.qml index f9c656f..c2aa8e7 100644 --- a/shell/modules/NetworkMenu.qml +++ b/shell/applets/NetworkApplet.qml @@ -1,45 +1,10 @@ import QtQuick -import Quickshell -import "." as M import "../services" as S -M.HoverPanel { - id: menuWindow +Column { + id: root - contentWidth: 250 - panelNamespace: "nova-network" - panelTitle: "Wi-Fi" - titleActionsComponent: Component { - Item { - width: 20 - height: 20 - - Text { - anchors.centerIn: parent - text: "\uF011" - color: S.NetworkService.wifiEnabled ? menuWindow.accentColor : S.Theme.base04 - font.pixelSize: S.Theme.fontSize - font.family: S.Theme.iconFontFamily - - Behavior on color { - ColorAnimation { - duration: 100 - } - } - } - - HoverHandler { - cursorShape: Qt.PointingHandCursor - } - - TapHandler { - onTapped: S.NetworkService.setWifi(!S.NetworkService.wifiEnabled) - } - } - } - - onVisibleChanged: if (visible) - S.NetworkService.refresh() + required property color accentColor Repeater { model: S.NetworkService.networks @@ -49,7 +14,7 @@ M.HoverPanel { required property var modelData required property int index - width: menuWindow.contentWidth + width: root.width height: 32 Rectangle { @@ -66,7 +31,7 @@ M.HoverPanel { anchors.leftMargin: 12 anchors.verticalCenter: parent.verticalCenter text: entry.modelData.isWifi ? "\uF1EB" : "\uDB80\uDE00" - color: entry.modelData.active ? menuWindow.accentColor : S.Theme.base05 + color: entry.modelData.active ? root.accentColor : S.Theme.base05 font.pixelSize: S.Theme.fontSize + 1 font.family: S.Theme.iconFontFamily } @@ -78,7 +43,7 @@ M.HoverPanel { anchors.rightMargin: 4 anchors.verticalCenter: parent.verticalCenter text: entry.modelData.name - color: entry.modelData.active ? menuWindow.accentColor : S.Theme.base05 + color: entry.modelData.active ? root.accentColor : S.Theme.base05 font.pixelSize: S.Theme.fontSize font.family: S.Theme.fontFamily font.bold: entry.modelData.active @@ -107,7 +72,6 @@ M.HoverPanel { S.NetworkService.disconnectNetwork(entry.modelData.uuid); else S.NetworkService.connectNetwork(entry.modelData.uuid); - menuWindow.keepOpen(500); } } } @@ -115,7 +79,7 @@ M.HoverPanel { Text { visible: S.NetworkService.networks.length === 0 - width: menuWindow.contentWidth + width: root.width height: 32 horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter diff --git a/shell/applets/qmldir b/shell/applets/qmldir index dc17e29..1cfc65a 100644 --- a/shell/applets/qmldir +++ b/shell/applets/qmldir @@ -8,6 +8,7 @@ GpuApplet 1.0 GpuApplet.qml HexWaveBackground 1.0 HexWaveBackground.qml MemoryApplet 1.0 MemoryApplet.qml MprisApplet 1.0 MprisApplet.qml +NetworkApplet 1.0 NetworkApplet.qml TemperatureApplet 1.0 TemperatureApplet.qml VolumeApplet 1.0 VolumeApplet.qml # keep-sorted end diff --git a/shell/modules/Bar.qml b/shell/modules/Bar.qml index 343b682..944e22b 100644 --- a/shell/modules/Bar.qml +++ b/shell/modules/Bar.qml @@ -181,7 +181,6 @@ PanelWindow { // Connectivity M.BarGroup { M.NetworkModule { - bar: bar visible: S.Modules.network.enable } M.BluetoothModule { diff --git a/shell/modules/NetworkModule.qml b/shell/modules/NetworkModule.qml index d37eff8..67194e0 100644 --- a/shell/modules/NetworkModule.qml +++ b/shell/modules/NetworkModule.qml @@ -2,6 +2,7 @@ import QtQuick import Quickshell import "." as M import "../services" as S +import "../applets" as C M.BarSection { id: root @@ -10,6 +11,23 @@ M.BarSection { readonly property string state: S.NetworkService.state + property bool _pinned: false + readonly property bool _anyHover: root._hovered || hoverPanel.panelHovered + readonly property bool _showPanel: _anyHover || _pinned + + on_AnyHoverChanged: { + if (_anyHover) + _unpinTimer.stop(); + else if (_pinned) + _unpinTimer.start(); + } + + Timer { + id: _unpinTimer + interval: 500 + onTriggered: root._pinned = false + } + M.BarIcon { icon: { if (root.state === "wifi") @@ -22,23 +40,71 @@ M.BarSection { } color: root.state === "disconnected" ? S.Theme.base08 : root.accentColor anchors.verticalCenter: parent.verticalCenter + TapHandler { + onTapped: root._pinned = !root._pinned + } } M.BarLabel { visible: root.state === "wifi" label: S.NetworkService.essid color: root.state === "disconnected" ? S.Theme.base08 : root.accentColor anchors.verticalCenter: parent.verticalCenter + TapHandler { + onTapped: root._pinned = !root._pinned + } } - required property var bar - - readonly property bool _anyHover: root._hovered || networkMenu.panelHovered - - M.NetworkMenu { - id: networkMenu - showPanel: root._anyHover + M.HoverPanel { + id: hoverPanel + showPanel: root._showPanel screen: QsWindow.window?.screen ?? null anchorItem: root accentColor: root.accentColor + panelNamespace: "nova-network" + panelTitle: "Wi-Fi" + contentWidth: 250 + titleActionsComponent: Component { + Item { + width: 20 + height: 20 + + Text { + anchors.centerIn: parent + text: "\uF011" + color: S.NetworkService.wifiEnabled ? hoverPanel.accentColor : S.Theme.base04 + font.pixelSize: S.Theme.fontSize + font.family: S.Theme.iconFontFamily + + Behavior on color { + ColorAnimation { + duration: 100 + } + } + } + + HoverHandler { + cursorShape: Qt.PointingHandCursor + } + + TapHandler { + onTapped: S.NetworkService.setWifi(!S.NetworkService.wifiEnabled) + } + } + } + + onVisibleChanged: if (visible) + S.NetworkService.refresh() + + Connections { + target: S.NetworkService + function onNetworksChanged() { + hoverPanel.keepOpen(500); + } + } + + C.NetworkApplet { + width: hoverPanel.contentWidth + accentColor: root.accentColor + } } } diff --git a/shell/modules/qmldir b/shell/modules/qmldir index c7e2c9f..a0d5f63 100644 --- a/shell/modules/qmldir +++ b/shell/modules/qmldir @@ -19,7 +19,6 @@ HoverPanel 1.0 HoverPanel.qml IdleInhibitorModule 1.0 IdleInhibitorModule.qml MemoryModule 1.0 MemoryModule.qml MprisModule 1.0 MprisModule.qml -NetworkMenu 1.0 NetworkMenu.qml NetworkModule 1.0 NetworkModule.qml NotifCard 1.0 NotifCard.qml NotifCenter 1.0 NotifCenter.qml