From c038878152c210f8db55449a11c1b4c4f8434c22 Mon Sep 17 00:00:00 2001 From: Lemmy Date: Sat, 14 Feb 2026 09:42:13 -0500 Subject: [PATCH] settings+connections: unified the way to open the settings on a particular tab/subtab + QoL settings access for bt and wifi --- Modules/DesktopWidgets/DesktopWidgets.qml | 10 +---- Modules/Panels/Bluetooth/BluetoothPanel.qml | 13 +++++-- Modules/Panels/Network/NetworkPanel.qml | 25 +++++++----- Modules/Panels/Network/WiFiNetworksList.qml | 3 +- Modules/Panels/Settings/SettingsContent.qml | 6 +++ .../Tabs/Connections/BluetoothSubTab.qml | 4 +- Services/Control/IPCService.qml | 30 +++------------ Services/UI/SettingsPanelService.qml | 38 +++++++++++++++++++ 8 files changed, 79 insertions(+), 50 deletions(-) diff --git a/Modules/DesktopWidgets/DesktopWidgets.qml b/Modules/DesktopWidgets/DesktopWidgets.qml index 40756ea2b..dd4d4c011 100644 --- a/Modules/DesktopWidgets/DesktopWidgets.qml +++ b/Modules/DesktopWidgets/DesktopWidgets.qml @@ -452,15 +452,7 @@ Variants { icon: "settings" tooltipText: I18n.tr("actions.open-settings") onClicked: { - if (Settings.data.ui.settingsPanelMode === "window") { - SettingsPanelService.toggleWindow(SettingsPanel.Tab.DesktopWidgets); - } else { - var settingsPanel = PanelService.getPanel("settingsPanel", screenLoader.modelData); - if (settingsPanel) { - settingsPanel.requestedTab = SettingsPanel.Tab.DesktopWidgets; - settingsPanel.toggle(); - } - } + SettingsPanelService.toggle(SettingsPanel.Tab.DesktopWidgets, -1, screenLoader.modelData); } } diff --git a/Modules/Panels/Bluetooth/BluetoothPanel.qml b/Modules/Panels/Bluetooth/BluetoothPanel.qml index e8b515e72..40f37f364 100644 --- a/Modules/Panels/Bluetooth/BluetoothPanel.qml +++ b/Modules/Panels/Bluetooth/BluetoothPanel.qml @@ -63,6 +63,13 @@ SmartPanel { baseSize: Style.baseWidgetSize * 0.65 } + NIconButton { + icon: "settings" + tooltipText: I18n.tr("commont.settings") + baseSize: Style.baseWidgetSize * 0.8 + onClicked: SettingsPanelService.openToTab(SettingsPanel.Tab.Connections, 1, screen) + } + NIconButton { icon: "close" tooltipText: I18n.tr("common.close") @@ -174,11 +181,9 @@ SmartPanel { text: I18n.tr("common.settings") icon: "settings" Layout.alignment: Qt.AlignHCenter - onClicked: { - SettingsPanelService.openToTab(SettingsPanel.Tab.Connections, 1, screen); - root.close(); - } + onClicked: SettingsPanelService.openToTab(SettingsPanel.Tab.Connections, 1, screen) } + Item { Layout.fillHeight: true } diff --git a/Modules/Panels/Network/NetworkPanel.qml b/Modules/Panels/Network/NetworkPanel.qml index ecf37bb16..8ebd650ff 100644 --- a/Modules/Panels/Network/NetworkPanel.qml +++ b/Modules/Panels/Network/NetworkPanel.qml @@ -153,15 +153,6 @@ SmartPanel { Layout.fillWidth: true } - NToggle { - id: wifiSwitch - visible: panelViewMode === "wifi" - checked: Settings.data.network.wifiEnabled - enabled: !Settings.data.network.airplaneModeEnabled && NetworkService.wifiAvailable - onToggled: checked => NetworkService.setWifiEnabled(checked) - baseSize: Style.baseWidgetSize * 0.7 // Slightly smaller - } - NIconButton { icon: "refresh" tooltipText: I18n.tr("common.refresh") @@ -175,6 +166,22 @@ SmartPanel { } } + NToggle { + id: wifiSwitch + visible: panelViewMode === "wifi" + checked: Settings.data.network.wifiEnabled + enabled: !Settings.data.network.airplaneModeEnabled && NetworkService.wifiAvailable + onToggled: checked => NetworkService.setWifiEnabled(checked) + baseSize: Style.baseWidgetSize * 0.7 // Slightly smaller + } + + NIconButton { + icon: "settings" + tooltipText: I18n.tr("commont.settings") + baseSize: Style.baseWidgetSize * 0.8 + onClicked: SettingsPanelService.openToTab(SettingsPanel.Tab.Connections, 0, screen) + } + NIconButton { icon: "close" tooltipText: I18n.tr("common.close") diff --git a/Modules/Panels/Network/WiFiNetworksList.qml b/Modules/Panels/Network/WiFiNetworksList.qml index 998d4ed70..7e6469933 100644 --- a/Modules/Panels/Network/WiFiNetworksList.qml +++ b/Modules/Panels/Network/WiFiNetworksList.qml @@ -65,8 +65,7 @@ NBox { NText { text: root.label - pointSize: Style.fontSizeS - color: Color.mSecondary + pointSize: Style.fontSizeM font.weight: Style.fontWeightBold Layout.fillWidth: true } diff --git a/Modules/Panels/Settings/SettingsContent.qml b/Modules/Panels/Settings/SettingsContent.qml index b7d1440b7..2ca6a1cf5 100644 --- a/Modules/Panels/Settings/SettingsContent.qml +++ b/Modules/Panels/Settings/SettingsContent.qml @@ -628,7 +628,13 @@ Item { function initialize() { ProgramCheckerService.checkAllPrograms(); + // Guard _pendingSubTab during model rebuild: updateTabsModel() triggers + // a ListView model reset which can set currentTabIndex=0 via the sidebar + // sync handler, causing the wrong tab to load and consume _pendingSubTab. + const savedPendingSubTab = _pendingSubTab; + _pendingSubTab = -1; updateTabsModel(); + _pendingSubTab = savedPendingSubTab; selectTabById(requestedTab); // Skip auto-focus on Nvidia GPUs - cursor blink causes UI choppiness const isNvidia = SystemStatService.gpuType === "nvidia"; diff --git a/Modules/Panels/Settings/Tabs/Connections/BluetoothSubTab.qml b/Modules/Panels/Settings/Tabs/Connections/BluetoothSubTab.qml index a625b12f4..68eabf838 100644 --- a/Modules/Panels/Settings/Tabs/Connections/BluetoothSubTab.qml +++ b/Modules/Panels/Settings/Tabs/Connections/BluetoothSubTab.qml @@ -310,13 +310,13 @@ Item { id: miscSettingsBox visible: !root.showOnlyLists && BluetoothService.enabled Layout.fillWidth: true - Layout.preferredHeight: miscSettingsCol.implicitHeight + (Style.marginL * 2) + Layout.preferredHeight: miscSettingsCol.implicitHeight + (Style.marginXL * 2) color: Color.mSurface ColumnLayout { id: miscSettingsCol anchors.fill: parent - anchors.margins: Style.marginL + anchors.margins: Style.marginXL spacing: Style.marginM NToggle { diff --git a/Services/Control/IPCService.qml b/Services/Control/IPCService.qml index 8c13a3342..e8429ac86 100644 --- a/Services/Control/IPCService.qml +++ b/Services/Control/IPCService.qml @@ -105,33 +105,15 @@ Singleton { } function _settingsToggle(tabId, subTabId) { - if (Settings.data.ui.settingsPanelMode === "window") { - if (SettingsPanelService.isWindowOpen) { - SettingsPanelService.closeWindow(); - } else { - SettingsPanelService.openToTab(tabId, subTabId); - } - } else { - root.screenDetector.withCurrentScreen(screen => { - var settingsPanel = PanelService.getPanel("settingsPanel", screen); - if (settingsPanel?.isPanelOpen) { - settingsPanel.close(); - } else { - settingsPanel?.openToTab(tabId, subTabId); - } - }); - } + root.screenDetector.withCurrentScreen(screen => { + SettingsPanelService.toggle(tabId, subTabId, screen); + }); } function _settingsOpen(tabId, subTabId) { - if (Settings.data.ui.settingsPanelMode === "window") { - SettingsPanelService.openToTab(tabId, subTabId); - } else { - root.screenDetector.withCurrentScreen(screen => { - var settingsPanel = PanelService.getPanel("settingsPanel", screen); - settingsPanel?.openToTab(tabId, subTabId); - }); - } + root.screenDetector.withCurrentScreen(screen => { + SettingsPanelService.openToTab(tabId, subTabId, screen); + }); } IpcHandler { diff --git a/Services/UI/SettingsPanelService.qml b/Services/UI/SettingsPanelService.qml index 941e71318..7bb3fa64f 100644 --- a/Services/UI/SettingsPanelService.qml +++ b/Services/UI/SettingsPanelService.qml @@ -99,4 +99,42 @@ Singleton { openWindow(tab); } } + + // Unified toggle: opens to tab/subtab if closed, closes if open + // Respects settingsPanelMode setting + function toggle(tab, subTab, screen) { + const tabId = tab !== undefined ? tab : 0; + const subTabId = subTab !== undefined ? subTab : -1; + + if (Settings.data.ui.settingsPanelMode === "window") { + if (isWindowOpen) { + closeWindow(); + } else { + openToTab(tabId, subTabId); + } + } else { + if (!screen) { + Logger.w("SettingsPanelService", "Screen parameter required for panel mode"); + return; + } + var settingsPanel = PanelService.getPanel("settingsPanel", screen); + if (settingsPanel?.isPanelOpen) { + settingsPanel.close(); + } else { + settingsPanel?.openToTab(tabId, subTabId); + } + } + } + + // Unified close for both modes + function close(screen) { + if (Settings.data.ui.settingsPanelMode === "window") { + closeWindow(); + } else { + if (!screen) + return; + var settingsPanel = PanelService.getPanel("settingsPanel", screen); + settingsPanel?.close(); + } + } }