From f65e5ef2f23fc8654910af3b6fd12cd7ba7fcbc6 Mon Sep 17 00:00:00 2001 From: bbedward Date: Wed, 2 Sep 2026 16:19:43 -0400 Subject: [PATCH] settings: quick simplification and cleanup prior to 1.6 the full overhaul/redesign will come later --- .pre-commit-config.yaml | 2 +- quickshell/Common/SettingsTabs.qml | 382 +++++++++ quickshell/DMSShellIPC.qml | 5 +- .../Modals/Greeter/GreeterCompletePage.qml | 151 +--- .../Modals/Settings/SettingsSidebar.qml | 395 +-------- quickshell/Modules/Settings/DankBarTab.qml | 64 +- quickshell/Modules/Settings/DankIslandTab.qml | 35 +- quickshell/Modules/Settings/DockTab.qml | 1 + quickshell/Modules/Settings/FrameTab.qml | 14 +- .../Settings/IslandHomeLayoutEditor.qml | 9 +- quickshell/Modules/Settings/LauncherTab.qml | 2 + .../Modules/Settings/ThemeColorsTab.qml | 1 + .../Settings/Widgets/SettingsControlledBy.qml | 13 +- .../Settings/Widgets/SettingsLayoutPicker.qml | 170 ++++ quickshell/Modules/Settings/WidgetsTab.qml | 30 +- .../Modules/Settings/WidgetsTabSection.qml | 4 - quickshell/Services/SettingsSearchService.qml | 5 +- .../translations/extract_settings_index.py | 69 +- .../translations/settings_search_index.json | 757 ++++++++---------- 19 files changed, 1059 insertions(+), 1050 deletions(-) create mode 100644 quickshell/Common/SettingsTabs.qml create mode 100644 quickshell/Modules/Settings/Widgets/SettingsLayoutPicker.qml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 2df707866..23f0438aa 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -26,7 +26,7 @@ repos: name: settings search index is up to date entry: bash -c 'python3 quickshell/translations/extract_settings_index.py >/dev/null || exit 1; if ! git diff --exit-code -- quickshell/translations/settings_search_index.json; then echo "settings_search_index.json is out of date; run quickshell/translations/extract_settings_index.py and stage the result" >&2; exit 1; fi' language: system - files: ^quickshell/(Modules/Settings/.*\.qml|Modals/Settings/SettingsSidebar\.qml|translations/extract_settings_index\.py)$ + files: ^quickshell/(Modules/Settings/.*\.qml|Common/SettingsTabs\.qml|Services/SettingsSearchService\.qml|translations/(extract_settings_index\.py|en\.json))$ pass_filenames: false - repo: local hooks: diff --git a/quickshell/Common/SettingsTabs.qml b/quickshell/Common/SettingsTabs.qml new file mode 100644 index 000000000..680e5c0c4 --- /dev/null +++ b/quickshell/Common/SettingsTabs.qml @@ -0,0 +1,382 @@ +pragma Singleton + +import QtQuick +import Quickshell +import qs.Common +import qs.Services + +Singleton { + readonly property var structure: [ + { + "id": "personalization", + "text": I18n.tr("Personalization"), + "icon": "palette", + "children": [ + { + "id": "wallpaper", + "text": I18n.tr("Wallpaper"), + "icon": "wallpaper", + "tabIndex": 0 + }, + { + "id": "theme", + "text": I18n.tr("Theme & Colors"), + "icon": "format_paint", + "tabIndex": 10 + }, + { + "id": "typography", + "text": I18n.tr("Typography & Motion"), + "icon": "text_fields", + "tabIndex": 14 + }, + { + "id": "time_weather", + "text": I18n.tr("Time & Weather"), + "icon": "schedule", + "tabIndex": 1 + }, + { + "id": "sounds", + "text": I18n.tr("Sounds"), + "icon": "volume_up", + "tabIndex": 15, + "soundsOnly": true + }, + { + "id": "compositor_layout", + "text": CompositorService.isNiri ? "Niri" : (CompositorService.isHyprland ? "Hyprland" : "MangoWC"), + "icon": "layers", + "tabIndex": 37, + "layoutCapable": true + } + ] + }, + { + "id": "dankbar", + "text": I18n.tr("Bar"), + "icon": "toolbar", + "children": [ + { + "id": "dankbar_appearance", + "text": I18n.tr("Appearance"), + "icon": "palette", + "tabIndex": 6 + }, + { + "id": "dankbar_settings", + "text": I18n.tr("General"), + "icon": "tune", + "tabIndex": 3 + }, + { + "id": "dankbar_widgets", + "text": I18n.tr("Widgets"), + "icon": "widgets", + "tabIndex": 22 + }, + { + "id": "workspaces", + "text": I18n.tr("Workspaces"), + "icon": "view_module", + "tabIndex": 4 + }, + { + "id": "frame", + "text": I18n.tr("Frame"), + "icon": "frame_source", + "tabIndex": 33, + "frameOnly": true + }, + { + "id": "dank_island", + "text": I18n.tr("Island"), + "icon": "view_in_ar", + "tabIndex": 46, + "islandOnly": true + } + ] + }, + { + "id": "workspaces_widgets", + "text": I18n.tr("Widgets & Notifications"), + "icon": "dashboard", + "collapsedByDefault": true, + "children": [ + { + "id": "dank_dash", + "text": I18n.tr("Dashboard"), + "icon": "space_dashboard", + "tabIndex": 43 + }, + { + "id": "media_player", + "text": I18n.tr("Media Player"), + "icon": "music_note", + "tabIndex": 16 + }, + { + "id": "notifications", + "text": I18n.tr("Notifications"), + "icon": "notifications", + "tabIndex": 17 + }, + { + "id": "osd", + "text": I18n.tr("On-screen Displays"), + "icon": "tune", + "tabIndex": 18 + }, + { + "id": "desktop_widgets", + "text": I18n.tr("Desktop Widgets"), + "icon": "widgets", + "tabIndex": 27 + } + ] + }, + { + "id": "dock_launcher", + "text": I18n.tr("Dock & Launcher"), + "icon": "shelf_auto_hide", + "collapsedByDefault": true, + "children": [ + { + "id": "dock", + "text": I18n.tr("Dock"), + "icon": "dock_to_bottom", + "tabIndex": 5 + }, + { + "id": "launcher", + "text": I18n.tr("Launcher"), + "icon": "grid_view", + "tabIndex": 9 + } + ] + }, + { + "id": "keybinds", + "text": I18n.tr("Keyboard Shortcuts"), + "icon": "keyboard", + "tabIndex": 2, + "shortcutsOnly": true + }, + { + "id": "displays", + "text": I18n.tr("Displays"), + "icon": "monitor", + "collapsedByDefault": true, + "children": [ + { + "id": "display_config", + "text": I18n.tr("Configuration"), + "icon": "display_settings", + "tabIndex": 24 + }, + { + "id": "display_gamma", + "text": I18n.tr("Gamma Control"), + "icon": "brightness_6", + "tabIndex": 25 + }, + { + "id": "display_widgets", + "text": I18n.tr("Widgets", "settings_displays"), + "icon": "widgets", + "tabIndex": 26 + } + ] + }, + { + "id": "network", + "text": I18n.tr("Network"), + "icon": "wifi", + "dmsOnly": true, + "children": [ + { + "id": "network_status", + "text": I18n.tr("Status"), + "icon": "lan", + "tabIndex": 7 + }, + { + "id": "network_ethernet", + "text": I18n.tr("Ethernet"), + "icon": "settings_ethernet", + "tabIndex": 39 + }, + { + "id": "network_wifi", + "text": I18n.tr("WiFi"), + "icon": "wifi", + "tabIndex": 40 + }, + { + "id": "network_cellular", + "text": I18n.tr("Cellular"), + "icon": "network_cell", + "tabIndex": 47, + "cellularOnly": true + }, + { + "id": "network_vpn", + "text": I18n.tr("VPN"), + "icon": "vpn_key", + "tabIndex": 41 + } + ] + }, + { + "id": "applications", + "text": I18n.tr("Applications"), + "icon": "apps", + "collapsedByDefault": true, + "children": [ + { + "id": "default_apps", + "text": I18n.tr("Default Apps"), + "icon": "star", + "tabIndex": 34 + }, + { + "id": "running_apps", + "text": I18n.tr("Running Apps"), + "icon": "app_registration", + "tabIndex": 19, + "hyprlandNiriOnly": true + }, + { + "id": "autostart", + "text": I18n.tr("Autostart Apps"), + "icon": "line_start", + "tabIndex": 36, + "autostartOnly": true + }, + { + "id": "window_rules", + "text": I18n.tr("Window Rules"), + "icon": "select_window", + "tabIndex": 38, + "windowRulesCapable": true + } + ] + }, + { + "id": "system", + "text": I18n.tr("System"), + "icon": "memory", + "collapsedByDefault": true, + "children": [ + { + "id": "audio", + "text": I18n.tr("Audio"), + "icon": "headphones", + "tabIndex": 29 + }, + { + "id": "mouse_touchpad", + "text": I18n.tr("Mouse & Touchpad"), + "icon": "mouse", + "tabIndex": 44, + "niriOnly": true + }, + { + "id": "keyboard", + "text": I18n.tr("Keyboard"), + "icon": "keyboard", + "tabIndex": 45, + "niriOnly": true + }, + { + "id": "locale", + "text": I18n.tr("Locale"), + "icon": "language", + "tabIndex": 30 + }, + { + "id": "clipboard", + "text": I18n.tr("Clipboard"), + "icon": "content_paste", + "tabIndex": 23, + "clipboardOnly": true + }, + { + "id": "printers", + "text": I18n.tr("Printers"), + "icon": "print", + "tabIndex": 8, + "cupsOnly": true + }, + { + "id": "multiplexers", + "text": I18n.tr("Multiplexers"), + "icon": "terminal", + "tabIndex": 32 + }, + { + "id": "updater", + "text": I18n.tr("System Updater"), + "icon": "refresh", + "tabIndex": 20, + "updaterOnly": true + }, + { + "id": "users", + "text": I18n.tr("Users"), + "icon": "manage_accounts", + "tabIndex": 35 + } + ] + }, + { + "id": "power_security", + "text": I18n.tr("Power & Security"), + "icon": "security", + "collapsedByDefault": true, + "children": [ + { + "id": "battery", + "text": I18n.tr("Battery"), + "icon": "battery_charging_full", + "tabIndex": 42 + }, + { + "id": "lock_screen", + "text": I18n.tr("Lock Screen"), + "icon": "lock", + "tabIndex": 11 + }, + { + "id": "greeter", + "text": I18n.tr("Greeter"), + "icon": "login", + "tabIndex": 31, + "greeterOnly": true + }, + { + "id": "power_sleep", + "text": I18n.tr("Power & Sleep"), + "icon": "power_settings_new", + "tabIndex": 21 + } + ] + }, + { + "id": "plugins", + "text": I18n.tr("Plugins"), + "icon": "extension", + "tabIndex": 12 + }, + { + "id": "separator", + "separator": true + }, + { + "id": "about", + "text": I18n.tr("About"), + "icon": "info", + "tabIndex": 13 + } + ] +} diff --git a/quickshell/DMSShellIPC.qml b/quickshell/DMSShellIPC.qml index 6d1898fee..48cb35e05 100644 --- a/quickshell/DMSShellIPC.qml +++ b/quickshell/DMSShellIPC.qml @@ -1061,11 +1061,8 @@ Item { } function tabs(): string { - if (!PopoutService.settingsModal) - return "wallpaper\ntheme\ntypography\ntime_weather\nsounds\ndankbar\ndankbar_settings\ndankbar_appearance\ndankbar_widgets\nframe\nworkspaces\ncompositor\nmedia_player\nnotifications\nosd\nrunning_apps\nupdater\ndock\nlauncher\nkeybinds\ndisplays\nnetwork\nnetwork_status\nnetwork_ethernet\nnetwork_wifi\nnetwork_cellular\nnetwork_vpn\nprinters\nlock_screen\npower_sleep\nplugins\nabout"; - var modal = PopoutService.settingsModal; var ids = []; - var structure = modal.sidebar?.categoryStructure ?? []; + var structure = SettingsTabs.structure; for (var i = 0; i < structure.length; i++) { var cat = structure[i]; if (cat.separator) diff --git a/quickshell/Modals/Greeter/GreeterCompletePage.qml b/quickshell/Modals/Greeter/GreeterCompletePage.qml index f6f8c0210..ec05b511a 100644 --- a/quickshell/Modals/Greeter/GreeterCompletePage.qml +++ b/quickshell/Modals/Greeter/GreeterCompletePage.qml @@ -1,5 +1,6 @@ import QtQuick import qs.Common +import qs.Modules.Settings.Widgets import qs.Services import qs.Widgets @@ -64,50 +65,6 @@ Item { readonly property bool hasKeybinds: dmsKeybinds.length > 0 - readonly property var barModes: [ - { - "key": "standard", - "label": I18n.tr("Standard") - }, - { - "key": "frame", - "label": I18n.tr("Frame") - }, - { - "key": "island", - "label": I18n.tr("Island") - } - ] - readonly property string activeBarMode: SettingsData.dankIslandBarId ? "island" : SettingsData.frameEnabled ? "frame" : "standard" - - function applyBarMode(mode) { - switch (mode) { - case "frame": - if (SettingsData.frameMode !== "connected") - SettingsData.set("frameMode", "connected"); - if (!SettingsData.frameEnabled) - SettingsData.set("frameEnabled", true); - return; - case "island": - { - if (SettingsData.dankIslandBarId) - return; - const configs = SettingsData.barConfigs || []; - const target = configs.find(cfg => cfg.enabled) ?? configs[0]; - if (!target) - return; - SettingsData.set("dankIslandBarId", target.id); - return; - } - default: - if (SettingsData.frameEnabled) - SettingsData.set("frameEnabled", false); - if (SettingsData.dankIslandBarId) - SettingsData.set("dankIslandBarId", ""); - return; - } - } - DankFlickable { anchors.fill: parent clip: true @@ -173,112 +130,8 @@ Item { } } - Row { - id: barModeRow + SettingsLayoutPicker { width: parent.width - spacing: Theme.spacingS - - Repeater { - model: root.barModes - - Rectangle { - id: modeCard - required property var modelData - readonly property bool isActive: root.activeBarMode === modelData.key - - width: (barModeRow.width - Theme.spacingS * 2) / 3 - height: Math.round(Theme.fontSizeMedium * 7.5) - radius: Theme.cornerRadius - color: Theme.floatingWindowNestedSurface - border.width: isActive ? 2 : 1 - border.color: isActive ? Theme.primary : Theme.outlineMedium - - Rectangle { - anchors.fill: parent - radius: parent.radius - color: Theme.primary - opacity: modeMouse.containsMouse ? 0.12 : 0 - } - - Column { - anchors.centerIn: parent - spacing: Theme.spacingS - - Rectangle { - id: screenPreview - readonly property real edgePad: Math.max(2, Math.round(width * 0.045)) - readonly property real stripSize: Math.round(width * 0.11) - - width: Math.round(Theme.iconSize * 2.9) - height: Math.round(width * 0.62) - radius: Theme.spacingXS - color: Theme.surfaceContainerHighest - border.width: 1 - border.color: Theme.outline - anchors.horizontalCenter: parent.horizontalCenter - - Rectangle { - visible: modeCard.modelData.key === "standard" - anchors.top: parent.top - anchors.left: parent.left - anchors.right: parent.right - anchors.margins: screenPreview.edgePad - height: screenPreview.stripSize - radius: height / 2 - color: Theme.primary - } - - Rectangle { - visible: modeCard.modelData.key === "frame" - anchors.fill: parent - anchors.margins: screenPreview.edgePad - radius: screenPreview.radius - color: "transparent" - border.width: Math.max(2, Math.round(screenPreview.stripSize * 0.55)) - border.color: Theme.primary - } - - Rectangle { - visible: modeCard.modelData.key === "frame" - anchors.top: parent.top - anchors.left: parent.left - anchors.right: parent.right - anchors.margins: screenPreview.edgePad - height: screenPreview.stripSize - radius: screenPreview.radius - color: Theme.primary - } - - Rectangle { - visible: modeCard.modelData.key === "island" - anchors.top: parent.top - anchors.topMargin: screenPreview.edgePad - anchors.horizontalCenter: parent.horizontalCenter - width: Math.round(parent.width * 0.42) - height: screenPreview.stripSize - radius: height / 2 - color: Theme.primary - } - } - - StyledText { - text: modeCard.modelData.label - font.pixelSize: Theme.fontSizeSmall - font.weight: Font.Medium - color: modeCard.isActive ? Theme.primary : Theme.surfaceText - anchors.horizontalCenter: parent.horizontalCenter - } - } - - MouseArea { - id: modeMouse - anchors.fill: parent - hoverEnabled: true - cursorShape: Qt.PointingHandCursor - onClicked: root.applyBarMode(modeCard.modelData.key) - } - } - } } } diff --git a/quickshell/Modals/Settings/SettingsSidebar.qml b/quickshell/Modals/Settings/SettingsSidebar.qml index 0515042b7..1b558ca76 100644 --- a/quickshell/Modals/Settings/SettingsSidebar.qml +++ b/quickshell/Modals/Settings/SettingsSidebar.qml @@ -76,376 +76,27 @@ Rectangle { Qt.callLater(searchField.forceActiveFocus); } - readonly property var categoryStructure: [ - { - "id": "personalization", - "text": I18n.tr("Personalization"), - "icon": "palette", - "children": [ - { - "id": "wallpaper", - "text": I18n.tr("Wallpaper"), - "icon": "wallpaper", - "tabIndex": 0 - }, - { - "id": "theme", - "text": I18n.tr("Theme & Colors"), - "icon": "format_paint", - "tabIndex": 10 - }, - { - "id": "typography", - "text": I18n.tr("Typography & Motion"), - "icon": "text_fields", - "tabIndex": 14 - }, - { - "id": "time_weather", - "text": I18n.tr("Time & Weather"), - "icon": "schedule", - "tabIndex": 1 - }, - { - "id": "sounds", - "text": I18n.tr("Sounds"), - "icon": "volume_up", - "tabIndex": 15, - "soundsOnly": true - }, - { - "id": "compositor_layout", - "text": CompositorService.isNiri ? "Niri" : (CompositorService.isHyprland ? "Hyprland" : "MangoWC"), - "icon": "layers", - "tabIndex": 37, - "layoutCapable": true - } - ] - }, - { - "id": "dankbar", - "text": I18n.tr("Primary Bar"), - "icon": "toolbar", - "children": [ - { - "id": "dankbar_appearance", - "text": I18n.tr("Appearance"), - "icon": "palette", - "tabIndex": 6 - }, - { - "id": "dankbar_settings", - "text": I18n.tr("Settings"), - "icon": "tune", - "tabIndex": 3 - }, - { - "id": "dankbar_widgets", - "text": I18n.tr("Widgets"), - "icon": "widgets", - "tabIndex": 22 - }, - { - "id": "workspaces", - "text": I18n.tr("Workspaces"), - "icon": "view_module", - "tabIndex": 4 - }, - { - "id": "frame", - "text": I18n.tr("Frame"), - "icon": "frame_source", - "tabIndex": 33 - }, - { - "id": "dank_island", - "text": I18n.tr("Island"), - "icon": "view_in_ar", - "tabIndex": 46 - } - ] - }, - { - "id": "workspaces_widgets", - "text": I18n.tr("Widgets & Notifications"), - "icon": "dashboard", - "collapsedByDefault": true, - "children": [ - { - "id": "dank_dash", - "text": I18n.tr("Dashboard"), - "icon": "space_dashboard", - "tabIndex": 43 - }, - { - "id": "media_player", - "text": I18n.tr("Media Player"), - "icon": "music_note", - "tabIndex": 16 - }, - { - "id": "notifications", - "text": I18n.tr("Notifications"), - "icon": "notifications", - "tabIndex": 17 - }, - { - "id": "osd", - "text": I18n.tr("On-screen Displays"), - "icon": "tune", - "tabIndex": 18 - }, - { - "id": "desktop_widgets", - "text": I18n.tr("Desktop Widgets"), - "icon": "widgets", - "tabIndex": 27 - } - ] - }, - { - "id": "dock_launcher", - "text": I18n.tr("Dock & Launcher"), - "icon": "shelf_auto_hide", - "collapsedByDefault": true, - "children": [ - { - "id": "dock", - "text": I18n.tr("Dock"), - "icon": "dock_to_bottom", - "tabIndex": 5 - }, - { - "id": "launcher", - "text": I18n.tr("Launcher"), - "icon": "grid_view", - "tabIndex": 9 - } - ] - }, - { - "id": "keybinds", - "text": I18n.tr("Keyboard Shortcuts"), - "icon": "keyboard", - "tabIndex": 2, - "shortcutsOnly": true - }, - { - "id": "displays", - "text": I18n.tr("Displays"), - "icon": "monitor", - "collapsedByDefault": true, - "children": [ - { - "id": "display_config", - "text": I18n.tr("Configuration"), - "icon": "display_settings", - "tabIndex": 24 - }, - { - "id": "display_gamma", - "text": I18n.tr("Gamma Control"), - "icon": "brightness_6", - "tabIndex": 25 - }, - { - "id": "display_widgets", - "text": I18n.tr("Widgets", "settings_displays"), - "icon": "widgets", - "tabIndex": 26 - } - ] - }, - { - "id": "network", - "text": I18n.tr("Network"), - "icon": "wifi", - "dmsOnly": true, - "children": [ - { - "id": "network_status", - "text": I18n.tr("Status"), - "icon": "lan", - "tabIndex": 7 - }, - { - "id": "network_ethernet", - "text": I18n.tr("Ethernet"), - "icon": "settings_ethernet", - "tabIndex": 39 - }, - { - "id": "network_wifi", - "text": I18n.tr("WiFi"), - "icon": "wifi", - "tabIndex": 40 - }, - { - "id": "network_cellular", - "text": I18n.tr("Cellular"), - "icon": "network_cell", - "tabIndex": 47 - }, - { - "id": "network_vpn", - "text": I18n.tr("VPN"), - "icon": "vpn_key", - "tabIndex": 41 - } - ] - }, - { - "id": "applications", - "text": I18n.tr("Applications"), - "icon": "apps", - "collapsedByDefault": true, - "children": [ - { - "id": "default_apps", - "text": I18n.tr("Default Apps"), - "icon": "star", - "tabIndex": 34 - }, - { - "id": "running_apps", - "text": I18n.tr("Running Apps"), - "icon": "app_registration", - "tabIndex": 19, - "hyprlandNiriOnly": true - }, - { - "id": "autostart", - "text": I18n.tr("Autostart Apps"), - "icon": "line_start", - "tabIndex": 36, - "autostartOnly": true - }, - { - "id": "window_rules", - "text": I18n.tr("Window Rules"), - "icon": "select_window", - "tabIndex": 38, - "windowRulesCapable": true - } - ] - }, - { - "id": "system", - "text": I18n.tr("System"), - "icon": "memory", - "collapsedByDefault": true, - "children": [ - { - "id": "audio", - "text": I18n.tr("Audio"), - "icon": "headphones", - "tabIndex": 29 - }, - { - "id": "mouse_touchpad", - "text": I18n.tr("Mouse & Touchpad"), - "icon": "mouse", - "tabIndex": 44, - "niriOnly": true - }, - { - "id": "keyboard", - "text": I18n.tr("Keyboard"), - "icon": "keyboard", - "tabIndex": 45, - "niriOnly": true - }, - { - "id": "locale", - "text": I18n.tr("Locale"), - "icon": "language", - "tabIndex": 30 - }, - { - "id": "clipboard", - "text": I18n.tr("Clipboard"), - "icon": "content_paste", - "tabIndex": 23, - "clipboardOnly": true - }, - { - "id": "printers", - "text": I18n.tr("Printers"), - "icon": "print", - "tabIndex": 8, - "cupsOnly": true - }, - { - "id": "multiplexers", - "text": I18n.tr("Multiplexers"), - "icon": "terminal", - "tabIndex": 32 - }, - { - "id": "updater", - "text": I18n.tr("System Updater"), - "icon": "refresh", - "tabIndex": 20, - "updaterOnly": true - }, - { - "id": "users", - "text": I18n.tr("Users"), - "icon": "manage_accounts", - "tabIndex": 35 - } - ] - }, - { - "id": "power_security", - "text": I18n.tr("Power & Security"), - "icon": "security", - "collapsedByDefault": true, - "children": [ - { - "id": "battery", - "text": I18n.tr("Battery"), - "icon": "battery_charging_full", - "tabIndex": 42 - }, - { - "id": "lock_screen", - "text": I18n.tr("Lock Screen"), - "icon": "lock", - "tabIndex": 11 - }, - { - "id": "greeter", - "text": I18n.tr("Greeter"), - "icon": "login", - "tabIndex": 31, - "greeterOnly": true - }, - { - "id": "power_sleep", - "text": I18n.tr("Power & Sleep"), - "icon": "power_settings_new", - "tabIndex": 21 - } - ] - }, - { - "id": "plugins", - "text": I18n.tr("Plugins"), - "icon": "extension", - "tabIndex": 12 - }, - { - "id": "separator", - "separator": true - }, - { - "id": "about", - "text": I18n.tr("About"), - "icon": "info", - "tabIndex": 13 + readonly property var categoryStructure: SettingsTabs.structure + + function leaveHiddenTab(tabIndex) { + if (currentIndex !== tabIndex) + return; + tabChangeRequested(resolveTabIndex("dankbar_settings")); + } + + Connections { + target: SettingsData + + function onFrameEnabledChanged() { + if (!SettingsData.frameEnabled) + root.leaveHiddenTab(33); } - ] + + function onDankIslandBarIdChanged() { + if (!SettingsData.dankIslandBarId) + root.leaveHiddenTab(46); + } + } function isItemVisible(item) { if (item.dmsOnly && !NetworkService.networkAvailable) @@ -472,6 +123,12 @@ Rectangle { return false; if (item.autostartOnly && !DesktopService.autostartAvailable) return false; + if (item.frameOnly && !SettingsData.frameEnabled) + return false; + if (item.islandOnly && !SettingsData.dankIslandBarId) + return false; + if (item.cellularOnly && (NetworkService.cellularDevices?.length ?? 0) === 0) + return false; return true; } diff --git a/quickshell/Modules/Settings/DankBarTab.qml b/quickshell/Modules/Settings/DankBarTab.qml index f01a6e635..fffbec909 100644 --- a/quickshell/Modules/Settings/DankBarTab.qml +++ b/quickshell/Modules/Settings/DankBarTab.qml @@ -291,6 +291,15 @@ Item { anchors.horizontalCenter: parent.horizontalCenter spacing: Theme.spacingXL + SettingsCard { + iconName: "toolbar" + title: I18n.tr("Layout") + settingKey: "barLayout" + tags: ["layout", "standard", "frame", "island", "mode", "bar"] + + SettingsLayoutPicker {} + } + SettingsCard { tab: "appearance" iconName: "toolbar" @@ -554,6 +563,7 @@ Item { target: "island" visible: dankBarTab.selectedBarIsIsland parentModal: dankBarTab.parentModal + section: "dankIslandPlacement" settingLabel: I18n.tr("Island placement") reason: I18n.tr("The Island anchors to the top or bottom edge") } @@ -562,6 +572,7 @@ Item { target: "island" visible: dankBarTab.islandShadowsSelectedBar parentModal: dankBarTab.parentModal + section: "dankIslandPlacement" settingLabel: I18n.tr("%1 position").arg(dankBarTab.positionLabel(selectedBarConfig?.position ?? SettingsData.Position.Top)) reason: I18n.tr("The Island holds this edge on a display this bar covers, so the bar stays hidden there") } @@ -710,6 +721,7 @@ Item { target: "island" visible: dankBarTab.islandOwnsSelectedBarTop parentModal: dankBarTab.parentModal + section: "dankIslandPlacement" settingLabel: I18n.tr("Bar visibility") reason: I18n.tr("Additional settings are managed by the Island") } @@ -943,18 +955,11 @@ Item { } SettingsControlledBy { - visible: SettingsData.frameEnabled + visible: SettingsData.frameEnabled || dankBarTab.islandOwnsSelectedBarTop parentModal: dankBarTab.parentModal + section: SettingsData.frameEnabled ? "frameOpacity" : "dankIslandAppearance" settingLabel: I18n.tr("Bar Opacity") - reason: I18n.tr("Managed by Frame") - } - - SettingsControlledBy { - target: "island" - visible: !SettingsData.frameEnabled && dankBarTab.islandOwnsSelectedBarTop - parentModal: dankBarTab.parentModal - settingLabel: I18n.tr("Bar Opacity") - reason: I18n.tr("The island draws its own surface") + reason: SettingsData.frameEnabled ? I18n.tr("Managed by Frame") : I18n.tr("The island draws its own surface") } } @@ -966,10 +971,11 @@ Item { visible: dankBarTab.appearanceOnly && (selectedBarConfig?.enabled ?? false) SettingsControlledBy { - visible: SettingsData.frameEnabled + visible: SettingsData.frameEnabled || dankBarTab.islandOwnsSelectedBarTop parentModal: dankBarTab.parentModal + section: SettingsData.frameEnabled ? "frameBorder" : "dankIslandPlacement" settingLabel: I18n.tr("Bar Spacing") - reason: I18n.tr("Edge spacing, exclusive zone, and popup gaps are managed by Frame") + reason: SettingsData.frameEnabled ? I18n.tr("Edge spacing, exclusive zone, and popup gaps are managed by Frame") : I18n.tr("Some settings are managed by the island") } SettingsSliderRow { @@ -1199,14 +1205,6 @@ Item { } } } - - SettingsControlledBy { - target: "island" - visible: !SettingsData.frameEnabled && dankBarTab.islandOwnsSelectedBarTop - parentModal: dankBarTab.parentModal - settingLabel: I18n.tr("Bar Spacing") - reason: I18n.tr("Some settings are managed by the island") - } } SettingsSliderCard { @@ -1273,18 +1271,11 @@ Item { visible: dankBarTab.appearanceOnly && selectedBarConfig?.enabled SettingsControlledBy { - visible: SettingsData.frameEnabled + visible: SettingsData.frameEnabled || dankBarTab.islandOwnsSelectedBarTop parentModal: dankBarTab.parentModal + section: SettingsData.frameEnabled ? "frameBorder" : "dankIslandAppearance" settingLabel: I18n.tr("Bar corners and background") - reason: I18n.tr("Managed by Frame") - } - - SettingsControlledBy { - target: "island" - visible: !SettingsData.frameEnabled && dankBarTab.islandOwnsSelectedBarTop - parentModal: dankBarTab.parentModal - settingLabel: I18n.tr("Bar corners") - reason: I18n.tr("Corner style applies to the bar surface") + reason: SettingsData.frameEnabled ? I18n.tr("Managed by Frame") : I18n.tr("Corner style applies to the bar surface") } SettingsToggleRow { @@ -1763,18 +1754,11 @@ Item { } SettingsControlledBy { - visible: dankBarTab.appearanceOnly && dankBarTab.connectedFrameModeActive + visible: dankBarTab.appearanceOnly && (dankBarTab.connectedFrameModeActive || dankBarTab.islandOwnsSelectedBarTop) parentModal: dankBarTab.parentModal + section: dankBarTab.connectedFrameModeActive ? "frameBorder" : "dankIslandAppearance" settingLabel: I18n.tr("Bar shadow, border, and corners") - reason: I18n.tr("Managed by Frame in Connected Mode") - } - - SettingsControlledBy { - target: "island" - visible: dankBarTab.appearanceOnly && !dankBarTab.connectedFrameModeActive && dankBarTab.islandOwnsSelectedBarTop - parentModal: dankBarTab.parentModal - settingLabel: I18n.tr("Bar border and shadow") - reason: I18n.tr("These style the bar surface, which the Island replaces") + reason: dankBarTab.connectedFrameModeActive ? I18n.tr("Managed by Frame in Connected Mode") : I18n.tr("These style the bar surface, which the Island replaces") } SettingsCard { diff --git a/quickshell/Modules/Settings/DankIslandTab.qml b/quickshell/Modules/Settings/DankIslandTab.qml index c31ea0e75..90b41580c 100644 --- a/quickshell/Modules/Settings/DankIslandTab.qml +++ b/quickshell/Modules/Settings/DankIslandTab.qml @@ -16,10 +16,7 @@ Item { readonly property var instanceChoices: { SettingsData.barConfigs; SettingsData.dankIslandBarId; - const rows = [({ - "id": "", - "name": I18n.tr("Off", "island instance choice: island disabled") - })]; + const rows = []; const configs = SettingsData.barConfigs || []; for (let i = 0; i < configs.length; i++) rows.push({ @@ -59,10 +56,14 @@ Item { iconName: "view_in_ar" title: I18n.tr("Dank Island - Beta", "island settings: page title") settingKey: "dankIslandInstance" + tags: ["island", "layout", "standard", "frame", "mode", "bar"] + + SettingsLayoutPicker {} SettingsButtonGroupRow { settingKey: "dankIslandBarId" tags: ["island", "activities", "media", "notifications", "osd", "bar"] + visible: !!SettingsData.dankIslandBarId && SettingsData.barConfigs.length > 1 text: I18n.tr("Island Instance", "island settings: which bar config the island replaces") model: root.instanceChoices.map(row => row.name) currentIndex: root.instanceIndex @@ -71,6 +72,18 @@ Item { SettingsData.set("dankIslandBarId", root.instanceChoices[index]?.id ?? ""); } } + + SettingsToggleRow { + settingKey: "dankIslandEnable" + tags: ["island", "enable", "show", "hide"] + visible: !!SettingsData.dankIslandBarId + text: I18n.tr("Enable Island") + description: I18n.tr("Toggle the Island on this instance's displays") + checked: SettingsData.dankIslandEnabled + onToggled: checked => SettingsData.updateBarConfig(SettingsData.dankIslandBarId, { + enabled: checked + }) + } } SettingsCard { @@ -78,7 +91,7 @@ Item { iconName: "open_with" title: I18n.tr("Position", "island settings: position card title") settingKey: "dankIslandPlacement" - enabled: SettingsData.dankIslandEnabled + visible: SettingsData.dankIslandEnabled SettingsToggleRow { settingKey: "dankIslandFloating" @@ -161,7 +174,7 @@ Item { iconName: "home" title: I18n.tr("Home Compact", "island settings: home face card title") settingKey: "dankIslandActivities" - enabled: SettingsData.dankIslandEnabled + visible: SettingsData.dankIslandEnabled StyledText { width: parent.width @@ -243,7 +256,7 @@ Item { iconName: "palette" title: I18n.tr("Appearance", "island settings: appearance card title") settingKey: "dankIslandAppearance" - enabled: SettingsData.dankIslandEnabled + visible: SettingsData.dankIslandEnabled SettingsButtonGroupRow { settingKey: "dankIslandPalette" @@ -308,7 +321,7 @@ Item { iconName: "notifications" title: I18n.tr("Notifications", "island settings: notifications card title") settingKey: "dankIslandNotifications" - enabled: SettingsData.dankIslandEnabled + visible: SettingsData.dankIslandEnabled SettingsToggleRow { settingKey: "dankIslandNotificationExpand" @@ -337,7 +350,7 @@ Item { settingKey: "dankIslandSatellites" collapsible: true expanded: true - enabled: SettingsData.dankIslandEnabled + visible: SettingsData.dankIslandEnabled SettingsToggleRow { settingKey: "dankIslandSatellitesEnabled" @@ -439,7 +452,7 @@ Item { iconName: "touch_app" title: I18n.tr("Behavior", "island settings: behavior card title") settingKey: "dankIslandInteraction" - enabled: SettingsData.dankIslandEnabled + visible: SettingsData.dankIslandEnabled SettingsButtonGroupRow { settingKey: "dankIslandInteractionMode" @@ -498,7 +511,7 @@ Item { title: I18n.tr("Motion & Accessibility", "island settings: motion card title") settingKey: "dankIslandMotion" collapsible: true - enabled: SettingsData.dankIslandEnabled + visible: SettingsData.dankIslandEnabled SettingsToggleRow { settingKey: "dankIslandReducedMotion" diff --git a/quickshell/Modules/Settings/DockTab.qml b/quickshell/Modules/Settings/DockTab.qml index 61034090c..bbd097298 100644 --- a/quickshell/Modules/Settings/DockTab.qml +++ b/quickshell/Modules/Settings/DockTab.qml @@ -663,6 +663,7 @@ Item { SettingsControlledBy { visible: root.connectedFrameModeActive parentModal: root.parentModal + section: "frameBorder" settingLabel: I18n.tr("Dock margin, opacity, and border") reason: I18n.tr("Managed by Frame in Connected Mode") } diff --git a/quickshell/Modules/Settings/FrameTab.qml b/quickshell/Modules/Settings/FrameTab.qml index 8c97d0fc7..8b407c36c 100644 --- a/quickshell/Modules/Settings/FrameTab.qml +++ b/quickshell/Modules/Settings/FrameTab.qml @@ -30,18 +30,12 @@ Item { SettingsCard { width: parent.width - iconName: "frame_source" - title: I18n.tr("General") + iconName: "toolbar" + title: I18n.tr("Layout") settingKey: "frameEnabled" + tags: ["frame", "layout", "standard", "island", "mode", "bar"] - SettingsToggleRow { - settingKey: "frameEnable" - tags: ["frame", "border", "outline", "display"] - text: I18n.tr("Enable Frame") - description: I18n.tr("Draw a connected picture-frame border around the entire display") - checked: SettingsData.frameEnabled - onToggled: checked => SettingsData.set("frameEnabled", checked) - } + SettingsLayoutPicker {} } SettingsCard { diff --git a/quickshell/Modules/Settings/IslandHomeLayoutEditor.qml b/quickshell/Modules/Settings/IslandHomeLayoutEditor.qml index 89f576686..9163f753b 100644 --- a/quickshell/Modules/Settings/IslandHomeLayoutEditor.qml +++ b/quickshell/Modules/Settings/IslandHomeLayoutEditor.qml @@ -9,7 +9,7 @@ import "../../Common/QmlUtils.js" as QmlUtils Item { id: root - readonly property string settingKey: "dankIslandHomeLayout" + property string settingKey: "dankIslandHomeLayout" readonly property var groupIds: SettingsData._islandHomeGroupIds readonly property var layout: SettingsData.getIslandHomeLayout() readonly property bool isHighlighted: SettingsSearchService.highlightSection === settingKey @@ -141,14 +141,17 @@ Item { Component.onCompleted: { rebuild(); Qt.callLater(() => { - if (!root.parent) + if (!root.parent || !root.settingKey) return; const flickable = QmlUtils.findParentFlickable(root.parent); if (flickable) SettingsSearchService.registerCard(root.settingKey, root, flickable); }); } - Component.onDestruction: SettingsSearchService.unregisterCard(settingKey) + Component.onDestruction: { + if (settingKey) + SettingsSearchService.unregisterCard(settingKey); + } function stepHighlight(dir, move) { const order = enabledOrder.concat(disabledOrder); diff --git a/quickshell/Modules/Settings/LauncherTab.qml b/quickshell/Modules/Settings/LauncherTab.qml index ed3f6d657..f21270f1e 100644 --- a/quickshell/Modules/Settings/LauncherTab.qml +++ b/quickshell/Modules/Settings/LauncherTab.qml @@ -72,6 +72,7 @@ Item { SettingsControlledBy { visible: SettingsData.connectedFrameModeActive parentModal: root.parentModal + section: "frameConnectedOptions" settingLabel: I18n.tr("Default Launcher") reason: I18n.tr("Connected Frame Mode uses the connected launcher for default launcher shortcuts.") } @@ -756,6 +757,7 @@ Item { SettingsControlledBy { visible: SettingsData.frameEnabled parentModal: root.parentModal + section: "frameBorder" settingLabel: I18n.tr("Darken Modal Background") reason: I18n.tr("Disabled by Frame Mode") } diff --git a/quickshell/Modules/Settings/ThemeColorsTab.qml b/quickshell/Modules/Settings/ThemeColorsTab.qml index 773c577d1..45ec231d1 100644 --- a/quickshell/Modules/Settings/ThemeColorsTab.qml +++ b/quickshell/Modules/Settings/ThemeColorsTab.qml @@ -1956,6 +1956,7 @@ Item { SettingsControlledBy { visible: themeColorsTab.connectedFrameModeActive parentModal: themeColorsTab.parentModal + section: "frameOpacity" settingLabel: I18n.tr("Surface Opacity") reason: I18n.tr("Managed by Frame in Connected Mode") } diff --git a/quickshell/Modules/Settings/Widgets/SettingsControlledBy.qml b/quickshell/Modules/Settings/Widgets/SettingsControlledBy.qml index d5b500307..e9eb5823c 100644 --- a/quickshell/Modules/Settings/Widgets/SettingsControlledBy.qml +++ b/quickshell/Modules/Settings/Widgets/SettingsControlledBy.qml @@ -2,6 +2,7 @@ pragma ComponentBehavior: Bound import QtQuick import qs.Common +import qs.Services import qs.Widgets StyledRect { @@ -10,13 +11,15 @@ StyledRect { LayoutMirroring.enabled: I18n.isRtl LayoutMirroring.childrenInherit: true - property string target: "frame" + property string target: "" + property string section: "" property string settingLabel: "" property string reason: "" property var parentModal: null + readonly property string resolvedTarget: target || (SettingsData.frameEnabled ? "frame" : "island") readonly property string iconName: { - switch (target) { + switch (resolvedTarget) { case "island": return "view_in_ar"; default: @@ -24,7 +27,7 @@ StyledRect { } } readonly property string buttonText: { - switch (target) { + switch (resolvedTarget) { case "island": return I18n.tr("Open Island", "settings: button that opens the Dank Island tab"); default: @@ -32,7 +35,7 @@ StyledRect { } } readonly property string tabName: { - switch (target) { + switch (resolvedTarget) { case "island": return "dank_island"; default: @@ -98,6 +101,8 @@ StyledRect { onClicked: { if (!root.parentModal) return; + if (root.section) + SettingsSearchService.navigateToSection(root.section); root.parentModal.showWithTabName(root.tabName); } } diff --git a/quickshell/Modules/Settings/Widgets/SettingsLayoutPicker.qml b/quickshell/Modules/Settings/Widgets/SettingsLayoutPicker.qml new file mode 100644 index 000000000..2cb8f8fd1 --- /dev/null +++ b/quickshell/Modules/Settings/Widgets/SettingsLayoutPicker.qml @@ -0,0 +1,170 @@ +pragma ComponentBehavior: Bound + +import QtQuick +import qs.Common +import qs.Widgets + +Row { + id: root + + readonly property var barModes: [ + { + "key": "standard", + "label": I18n.tr("Standard") + }, + { + "key": "frame", + "label": I18n.tr("Frame") + }, + { + "key": "island", + "label": I18n.tr("Island") + } + ] + readonly property string activeBarMode: SettingsData.frameEnabled ? "frame" : SettingsData.dankIslandBarId ? "island" : "standard" + + function leaveIsland() { + const config = SettingsData.islandBarConfig; + if (SettingsData.dankIslandBarId) + SettingsData.set("dankIslandBarId", ""); + if (config && !config.enabled) + SettingsData.updateBarConfig(config.id, { + enabled: true + }); + } + + function applyBarMode(mode) { + switch (mode) { + case "frame": + if (SettingsData.frameEnabled) + return; + leaveIsland(); + SettingsData.set("frameEnabled", true); + return; + case "island": + { + const configs = SettingsData.barConfigs || []; + const target = SettingsData.islandBarConfig ?? configs.find(cfg => cfg.enabled) ?? configs[0]; + if (!target) + return; + if (!SettingsData.dankIslandBarId) + SettingsData.set("dankIslandBarId", target.id); + if (!target.enabled) + SettingsData.updateBarConfig(target.id, { + enabled: true + }); + return; + } + default: + if (SettingsData.frameEnabled) + SettingsData.set("frameEnabled", false); + leaveIsland(); + return; + } + } + + width: parent?.width ?? 0 + spacing: Theme.spacingS + + Repeater { + model: root.barModes + + Rectangle { + id: modeCard + required property var modelData + readonly property bool isActive: root.activeBarMode === modelData.key + + width: (root.width - Theme.spacingS * 2) / 3 + height: Math.round(Theme.fontSizeMedium * 7.5) + radius: Theme.cornerRadius + color: Theme.floatingWindowNestedSurface + border.width: isActive ? 2 : 1 + border.color: isActive ? Theme.primary : Theme.outlineMedium + + Rectangle { + anchors.fill: parent + radius: parent.radius + color: Theme.primary + opacity: modeMouse.containsMouse ? 0.12 : 0 + } + + Column { + anchors.centerIn: parent + spacing: Theme.spacingS + + Rectangle { + id: screenPreview + readonly property real edgePad: Math.max(2, Math.round(width * 0.045)) + readonly property real stripSize: Math.round(width * 0.11) + + width: Math.round(Theme.iconSize * 2.9) + height: Math.round(width * 0.62) + radius: Theme.spacingXS + color: Theme.surfaceContainerHighest + border.width: 1 + border.color: Theme.outline + anchors.horizontalCenter: parent.horizontalCenter + + Rectangle { + visible: modeCard.modelData.key === "standard" + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + anchors.margins: screenPreview.edgePad + height: screenPreview.stripSize + radius: height / 2 + color: Theme.primary + } + + Rectangle { + visible: modeCard.modelData.key === "frame" + anchors.fill: parent + anchors.margins: screenPreview.edgePad + radius: screenPreview.radius + color: "transparent" + border.width: Math.max(2, Math.round(screenPreview.stripSize * 0.55)) + border.color: Theme.primary + } + + Rectangle { + visible: modeCard.modelData.key === "frame" + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + anchors.margins: screenPreview.edgePad + height: screenPreview.stripSize + radius: screenPreview.radius + color: Theme.primary + } + + Rectangle { + visible: modeCard.modelData.key === "island" + anchors.top: parent.top + anchors.topMargin: screenPreview.edgePad + anchors.horizontalCenter: parent.horizontalCenter + width: Math.round(parent.width * 0.42) + height: screenPreview.stripSize + radius: height / 2 + color: Theme.primary + } + } + + StyledText { + text: modeCard.modelData.label + font.pixelSize: Theme.fontSizeSmall + font.weight: Font.Medium + color: modeCard.isActive ? Theme.primary : Theme.surfaceText + anchors.horizontalCenter: parent.horizontalCenter + } + } + + MouseArea { + id: modeMouse + anchors.fill: parent + hoverEnabled: true + cursorShape: Qt.PointingHandCursor + onClicked: root.applyBarMode(modeCard.modelData.key) + } + } + } +} diff --git a/quickshell/Modules/Settings/WidgetsTab.qml b/quickshell/Modules/Settings/WidgetsTab.qml index 6e97fd307..ec56fb344 100644 --- a/quickshell/Modules/Settings/WidgetsTab.qml +++ b/quickshell/Modules/Settings/WidgetsTab.qml @@ -4,6 +4,7 @@ import Quickshell import qs.Common import qs.Services import qs.Widgets +import qs.Modules.Settings.Widgets Item { id: widgetsTab @@ -1413,6 +1414,29 @@ Item { } } + SettingsCard { + iconName: "view_in_ar" + title: I18n.tr("Home Compact", "island settings: home face card title") + visible: widgetsTab.dankIslandOwnsSelectedBarCenter + + StyledText { + width: parent.width + text: I18n.tr("Drag groups above the clock to sit left of it, below to sit right. Click the eye to hide a group.", "island settings: home layout editor hint") + color: Theme.surfaceVariantText + font.pixelSize: Theme.fontSizeSmall + wrapMode: Text.WordWrap + } + + Loader { + width: parent.width + height: item?.height ?? 0 + active: widgetsTab.dankIslandOwnsSelectedBarCenter + sourceComponent: IslandHomeLayoutEditor { + settingKey: "" + } + } + } + StyledRect { width: parent.width height: centerSection.implicitHeight + Theme.spacingL * 2 @@ -1420,15 +1444,15 @@ Item { color: Theme.floatingWindowNestedSurface border.color: Theme.outlineMedium border.width: Theme.layerOutlineWidth + visible: !widgetsTab.dankIslandOwnsSelectedBarCenter WidgetsTabSection { id: centerSection anchors.fill: parent anchors.margins: Theme.spacingL - title: widgetsTab.dankIslandOwnsSelectedBarCenter ? I18n.tr("Center Section - Reserved by Dank Island") : (selectedBarIsVertical ? I18n.tr("Middle Section") : I18n.tr("Center Section")) - titleIcon: widgetsTab.dankIslandOwnsSelectedBarCenter ? "lock" : "format_align_center" + title: selectedBarIsVertical ? I18n.tr("Middle Section") : I18n.tr("Center Section") + titleIcon: "format_align_center" sectionId: "center" - readOnly: widgetsTab.dankIslandOwnsSelectedBarCenter allWidgets: widgetsTab.baseWidgetDefinitions items: widgetsTab.getItemsForSection("center") onItemEnabledChanged: (sectionId, itemId, enabled) => { diff --git a/quickshell/Modules/Settings/WidgetsTabSection.qml b/quickshell/Modules/Settings/WidgetsTabSection.qml index b710fa609..0dff78412 100644 --- a/quickshell/Modules/Settings/WidgetsTabSection.qml +++ b/quickshell/Modules/Settings/WidgetsTabSection.qml @@ -14,10 +14,6 @@ Column { property string title: "" property string titleIcon: "widgets" property string sectionId: "" - property bool readOnly: false - - enabled: !readOnly - opacity: readOnly ? 0.55 : 1.0 DankTooltipV2 { id: sharedTooltip diff --git a/quickshell/Services/SettingsSearchService.qml b/quickshell/Services/SettingsSearchService.qml index 7b3970854..0a3f80a87 100644 --- a/quickshell/Services/SettingsSearchService.qml +++ b/quickshell/Services/SettingsSearchService.qml @@ -53,7 +53,10 @@ Singleton { "networkAvailable": () => NetworkService.networkAvailable, "dmsConnected": () => DMSService.isConnected && DMSService.apiVersion >= 23, "matugenAvailable": () => Theme.matugenAvailable, - "greeterAvailable": () => GreeterService.available + "greeterAvailable": () => GreeterService.available, + "frameEnabled": () => SettingsData.frameEnabled, + "islandEnabled": () => !!SettingsData.dankIslandBarId, + "cellularAvailable": () => (NetworkService.cellularDevices?.length ?? 0) > 0 }) Component.onCompleted: indexFile.reload() diff --git a/quickshell/translations/extract_settings_index.py b/quickshell/translations/extract_settings_index.py index d94acc99a..6496ac4f2 100755 --- a/quickshell/translations/extract_settings_index.py +++ b/quickshell/translations/extract_settings_index.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 import json import re +import sys from collections import Counter from pathlib import Path @@ -61,7 +62,7 @@ CATEGORY_KEYWORDS = { "Personalization": ["customize", "custom", "personal", "appearance"], "Time & Weather": ["clock", "forecast", "date"], "Keyboard Shortcuts": ["keys", "bindings", "hotkey"], - "Dank Bar": ["panel", "topbar", "statusbar"], + "Bar": ["panel", "topbar", "statusbar"], "Applications": ["apps", "programs", "window", "rules", "matching", "floating"], "Dock": ["taskbar", "launcher bar"], "Network": ["connectivity", "online"], @@ -97,6 +98,7 @@ TAB_INDEX_MAP = { "TimeWeatherTab.qml": 1, "KeybindsTab.qml": 2, "DankBarTab.qml": 3, + "DankDashTab.qml": 43, "DankIslandTab.qml": 46, "WorkspacesTab.qml": 4, "CompositorLayoutTab.qml": 37, @@ -146,16 +148,19 @@ FILE_CONDITION_MAP = { "GreeterTab.qml": "greeterAvailable", "MouseTouchpadTab.qml": "isNiri", "KeyboardTab.qml": "isNiri", + "FrameTab.qml": "frameEnabled", + "DankIslandTab.qml": "islandEnabled", + "NetworkCellularTab.qml": "cellularAvailable", } TAB_CATEGORY_MAP = { 0: "Personalization", 1: "Time & Weather", 2: "Keyboard Shortcuts", - 3: "Dank Bar", - 4: "Dank Bar", + 3: "Bar", + 4: "Bar", 5: "Dock", - 6: "Dank Bar", + 6: "Bar", 7: "Network", 8: "System", 9: "Launcher", @@ -171,7 +176,7 @@ TAB_CATEGORY_MAP = { 19: "Running Apps", 20: "System Updater", 21: "Power & Sleep", - 22: "Dank Bar", + 22: "Bar", 23: "System", 24: "Displays", 25: "Displays", @@ -184,17 +189,17 @@ TAB_CATEGORY_MAP = { 33: "Frame", 34: "Default Apps", 35: "Users", - 36: "Autostart", + 36: "Autostart Apps", 37: "Personalization", 38: "Applications", 39: "Network", 40: "Network", 41: "Network", 42: "Power & Security", - 43: "Dank Dash", + 43: "Dashboard", 44: "System", 45: "System", - 46: "Dank Island", + 46: "Island", 47: "Network", } @@ -466,8 +471,8 @@ def parse_tabs_from_sidebar(sidebar_file): parent = parent_match.group(1) if parent_match else None cond = None - after_pos = match.end() - snippet = content[match.start() : min(after_pos + 200, len(content))] + snippet_end = content.find("}", match.end()) + snippet = content[match.start() : snippet_end if snippet_end != -1 else len(content)] for qml_cond, key in [ ("shortcutsOnly", "keybindsAvailable"), ("soundsOnly", "soundsAvailable"), @@ -479,6 +484,9 @@ def parse_tabs_from_sidebar(sidebar_file): ("niriOnly", "isNiri"), ("windowRulesCapable", "windowRulesCapable"), ("layoutCapable", "layoutCapable"), + ("frameOnly", "frameEnabled"), + ("islandOnly", "islandEnabled"), + ("cellularOnly", "cellularAvailable"), ]: if f'"{qml_cond}": true' in snippet: cond = key @@ -594,25 +602,59 @@ def extract_settings_index(root_dir): "section": "dankIslandHomeLayout", "label": "Home Layout", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": enrich_keywords( "Home Layout", "Order and hide the groups around the island clock", - "Dank Island", + "Island", ["media", "launcher", "weather", "battery", "volume", "brightness", "notifications", "badge", "left", "right", "hidden", "reorder"], ), "icon": "home", "description": "Order and hide the groups around the island clock", + "conditionKey": "islandEnabled", } ) return all_entries +def validate(all_entries, sidebar_file, root_dir): + errors = [] + settings_dir = root_dir / "Modules" / "Settings" + for tab_file in sorted(settings_dir.glob("*Tab.qml")): + if tab_file.name not in TAB_INDEX_MAP: + errors.append(f"{tab_file.name} missing from TAB_INDEX_MAP") + + with open(sidebar_file, "r", encoding="utf-8") as f: + sidebar_content = f.read() + sidebar_tabs = {int(n) for n in re.findall(r'"tabIndex"\s*:\s*(\d+)', sidebar_content)} + with open(Path(__file__).parent / "en.json", "r", encoding="utf-8") as f: + catalog_terms = {entry["term"] for entry in json.load(f)} + known_labels = catalog_terms | set(re.findall(r'I18n\.tr\("([^"]+)"', sidebar_content)) + service_file = root_dir / "Services" / "SettingsSearchService.qml" + with open(service_file, "r", encoding="utf-8") as f: + condition_keys = set(re.findall(r'"(\w+)":\s*\(\)\s*=>', f.read())) + + for entry in all_entries: + if entry["tabIndex"] not in sidebar_tabs: + errors.append(f"{entry['section']}: tabIndex {entry['tabIndex']} not in sidebar") + if entry["category"] not in known_labels: + errors.append(f"{entry['section']}: category '{entry['category']}' is not a catalog term") + cond = entry.get("conditionKey") + if cond and cond not in condition_keys: + errors.append(f"{entry['section']}: unknown conditionKey '{cond}'") + + if not errors: + return + for error in sorted(set(errors)): + print(f"error: {error}", file=sys.stderr) + sys.exit(1) + + def main(): script_dir = Path(__file__).parent root_dir = script_dir.parent - sidebar_file = root_dir / "Modals" / "Settings" / "SettingsSidebar.qml" + sidebar_file = root_dir / "Common" / "SettingsTabs.qml" print("Extracting settings search index...") settings_entries = extract_settings_index(root_dir) @@ -621,6 +663,7 @@ def main(): all_entries = tab_entries + settings_entries all_entries.sort(key=lambda x: (x["tabIndex"], x["label"], x["section"])) + validate(all_entries, sidebar_file, root_dir) output_path = script_dir / "settings_search_index.json" with open(output_path, "w", encoding="utf-8") as f: diff --git a/quickshell/translations/settings_search_index.json b/quickshell/translations/settings_search_index.json index 2b9e42967..78ebfb15f 100644 --- a/quickshell/translations/settings_search_index.json +++ b/quickshell/translations/settings_search_index.json @@ -792,7 +792,7 @@ "section": "barAutoHide", "label": "Auto-hide", "tabIndex": 3, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "auto", "auto-hide", @@ -800,7 +800,6 @@ "automatically", "away", "bar", - "dank", "hide", "intellihide", "moves", @@ -817,11 +816,10 @@ "section": "barLengthPadding", "label": "Bar Length Padding", "tabIndex": 3, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "bar", "both", - "dank", "ends", "length", "padding", @@ -840,14 +838,13 @@ "section": "barClickThrough", "label": "Click Through", "tabIndex": 3, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "bar", "behind", "click", "clicks", "clickthrough", - "dank", "input", "mask", "mouse", @@ -866,13 +863,12 @@ "section": "barConfigurations", "label": "Configurations", "tabIndex": 3, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "bar", "config", "configurations", "configure", - "dank", "panel", "setup", "statusbar", @@ -884,14 +880,13 @@ "section": "barCornerStyle", "label": "Corner Style", "tabIndex": 3, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "attached", "bar", "choose", "corner", "corners", - "dank", "edge", "flush", "meets", @@ -912,11 +907,10 @@ "section": "barDisplay", "label": "Display Assignment", "tabIndex": 3, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "assignment", "bar", - "dank", "display", "monitor", "output", @@ -931,10 +925,9 @@ "section": "barEnable", "label": "Enable Island", "tabIndex": 3, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "bar", - "dank", "enable", "island", "panel", @@ -946,10 +939,9 @@ "section": "barExclusiveZone", "label": "Exclusive Zone Offset", "tabIndex": 3, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "bar", - "dank", "edge", "exclusive", "fine", @@ -966,11 +958,25 @@ ], "description": "Fine-tune the space reserved for the bar from the screen edge" }, + { + "section": "_tab_3", + "label": "General", + "tabIndex": 3, + "category": "Bar", + "keywords": [ + "bar", + "general", + "panel", + "statusbar", + "topbar" + ], + "icon": "tune" + }, { "section": "barGothCorners", "label": "Goth Corners", "tabIndex": 3, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "apply", "bar", @@ -979,7 +985,6 @@ "corners", "cutout", "cutouts", - "dank", "goth", "inverse", "panel", @@ -996,10 +1001,9 @@ "section": "barHideWhenWindowsOpen", "label": "Hide When Windows Open", "tabIndex": 3, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "bar", - "dank", "empty", "hide", "open", @@ -1018,11 +1022,10 @@ "section": "hoverPopouts", "label": "Hover Popouts", "tabIndex": 3, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "another", "bar", - "dank", "delay", "hover", "hovering", @@ -1042,16 +1045,33 @@ "icon": "touch_app", "description": "Open widget popouts by hovering over the bar. Moving to another widget switches the popout." }, + { + "section": "barLayout", + "label": "Layout", + "tabIndex": 3, + "category": "Bar", + "keywords": [ + "bar", + "frame", + "island", + "layout", + "mode", + "panel", + "standard", + "statusbar", + "topbar" + ], + "icon": "toolbar" + }, { "section": "barManualVisibility", "label": "Manual Show/Hide", "tabIndex": 3, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "auto-hide", "autohide", "bar", - "dank", "hidden", "hide", "ipc", @@ -1072,11 +1092,10 @@ "section": "barMaximizeDetection", "label": "Maximize Detection", "tabIndex": 3, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "bar", "border", - "dank", "detection", "fullscreen", "gaps", @@ -1096,11 +1115,10 @@ "section": "barMaximizeWidgetIcons", "label": "Maximize Widget Icons", "tabIndex": 3, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "available", "bar", - "dank", "fill", "height", "icons", @@ -1118,11 +1136,10 @@ "section": "barMaximizeWidgetText", "label": "Maximize Widget Text", "tabIndex": 3, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "available", "bar", - "dank", "fill", "height", "maximize", @@ -1140,11 +1157,10 @@ "section": "barNoBackground", "label": "No Background", "tabIndex": 3, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "background", "bar", - "dank", "fully", "invisible", "make", @@ -1160,10 +1176,9 @@ "section": "barPosition", "label": "Position", "tabIndex": 3, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "bar", - "dank", "panel", "position", "statusbar", @@ -1175,12 +1190,11 @@ "section": "barRemoveWidgetPadding", "label": "Remove Widget Padding", "tabIndex": 3, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "bar", "compact", "components", - "dank", "inner", "modules", "padding", @@ -1197,13 +1211,12 @@ "section": "barScrollWheel", "label": "Scroll Wheel", "tabIndex": 3, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "axis", "bar", "columns", "control", - "dank", "desktop", "desktops", "panel", @@ -1220,29 +1233,13 @@ "icon": "mouse", "description": "Control workspaces and columns by scrolling on the bar" }, - { - "section": "_tab_3", - "label": "Settings", - "tabIndex": 3, - "category": "Dank Bar", - "keywords": [ - "bar", - "dank", - "panel", - "settings", - "statusbar", - "topbar" - ], - "icon": "tune" - }, { "section": "barOpenOnOverview", "label": "Show on Overview", "tabIndex": 3, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "bar", - "dank", "during", "frame", "niri", @@ -1259,11 +1256,10 @@ "section": "barSize", "label": "Size", "tabIndex": 3, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "adjust", "bar", - "dank", "height", "inner", "padding", @@ -1280,12 +1276,11 @@ "section": "barAutoHideStrict", "label": "Strict auto-hide", "tabIndex": 3, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "auto", "autohide", "bar", - "dank", "even", "hide", "leaves", @@ -1305,10 +1300,9 @@ "section": "barUseOverlayLayer", "label": "Use Overlay Layer", "tabIndex": 3, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "bar", - "dank", "fullscreen", "layer", "overlay", @@ -1325,14 +1319,13 @@ "section": "barVisibility", "label": "Visibility", "tabIndex": 3, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "auto-hide", "autohide", "automatically", "away", "bar", - "dank", "hidden", "hide", "intellihide", @@ -1354,14 +1347,13 @@ "section": "workspaceAppearance", "label": "Appearance", "tabIndex": 4, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "appearance", "around", "bar", "color", "custom", - "dank", "desktop", "focused", "indicator", @@ -1381,10 +1373,9 @@ "section": "workspaceDragReorder", "label": "Drag to Reorder", "tabIndex": 4, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "bar", - "dank", "desktop", "drag", "indicators", @@ -1404,12 +1395,11 @@ "section": "workspaceFocusedBorderEnabled", "label": "Focused Border", "tabIndex": 4, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "around", "bar", "border", - "dank", "desktop", "focused", "indicator", @@ -1428,12 +1418,11 @@ "section": "workspaceUnfocusedMonitorBorderEnabled", "label": "Focused Border", "tabIndex": 4, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "around", "bar", "border", - "dank", "desktop", "display", "focused", @@ -1455,11 +1444,10 @@ "section": "workspaceFollowFocus", "label": "Follow Monitor Focus", "tabIndex": 4, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "bar", "currently", - "dank", "desktop", "desktops", "focus", @@ -1481,10 +1469,9 @@ "section": "workspaceSettings", "label": "General", "tabIndex": 4, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "bar", - "dank", "desktop", "general", "index", @@ -1507,14 +1494,13 @@ "section": "groupActiveWorkspaceApps", "label": "Group Active Workspace", "tabIndex": 4, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "active", "app", "application", "apps", "bar", - "dank", "desktop", "focused", "group", @@ -1534,14 +1520,13 @@ "section": "groupWorkspaceApps", "label": "Group Workspace Apps", "tabIndex": 4, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "app", "application", "apps", "bar", "collapse", - "dank", "desktop", "desktops", "group", @@ -1563,14 +1548,13 @@ "section": "workspaceActiveAppHighlightEnabled", "label": "Highlight Active Workspace App", "tabIndex": 4, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "active", "app", "apps", "bar", "currently", - "dank", "day", "desktop", "focused", @@ -1591,10 +1575,9 @@ "section": "workspaceIcons", "label": "Named Workspace Icons", "tabIndex": 4, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "bar", - "dank", "desktop", "icons", "named", @@ -1610,10 +1593,9 @@ "section": "reverseScrolling", "label": "Reverse Scrolling Direction", "tabIndex": 4, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "bar", - "dank", "desktop", "direction", "over", @@ -1635,7 +1617,7 @@ "section": "workspaceUnfocusedMonitorSeparateAppearance", "label": "Separate Appearance for Unfocused Display(s)", "tabIndex": 4, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "appearance", "bar", @@ -1643,7 +1625,6 @@ "colors", "colour", "colours", - "dank", "desktop", "different", "display", @@ -1673,11 +1654,10 @@ "section": "dwlShowAllTags", "label": "Show All Tags", "tabIndex": 4, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "all", "bar", - "dank", "dwl", "occupied", "panel", @@ -1694,12 +1674,11 @@ "section": "showOccupiedWorkspacesOnly", "label": "Show Occupied Workspaces Only", "tabIndex": 4, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "active", "bar", "contain", - "dank", "desktop", "desktops", "display", @@ -1723,14 +1702,13 @@ "section": "showWorkspaceApps", "label": "Show Workspace Apps", "tabIndex": 4, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "app", "application", "applications", "apps", "bar", - "dank", "desktop", "display", "icons", @@ -1753,10 +1731,9 @@ "section": "showWorkspaceIndex", "label": "Workspace Index Numbers", "tabIndex": 4, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "bar", - "dank", "desktop", "index", "labels", @@ -1776,11 +1753,10 @@ "section": "showWorkspaceName", "label": "Workspace Names", "tabIndex": 4, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "bar", "bars", - "dank", "desktop", "first", "horizontal", @@ -1803,12 +1779,11 @@ "section": "showWorkspacePadding", "label": "Workspace Padding", "tabIndex": 4, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "always", "available", "bar", - "dank", "desktop", "desktops", "even", @@ -1829,10 +1804,9 @@ "section": "_tab_4", "label": "Workspaces", "tabIndex": 4, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "bar", - "dank", "desktop", "desktops", "panel", @@ -2472,11 +2446,25 @@ "icon": "dock_to_bottom", "description": "Display a dock with pinned and running applications" }, + { + "section": "_tab_6", + "label": "Bar", + "tabIndex": 6, + "category": "Bar", + "keywords": [ + "bar", + "panel", + "statusbar", + "taskbar", + "topbar" + ], + "icon": "toolbar" + }, { "section": "barBorder", "label": "Border", "tabIndex": 6, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "appearance", "bar", @@ -2484,7 +2472,6 @@ "color", "colors", "colour", - "dank", "hue", "look", "panel", @@ -2501,12 +2488,11 @@ "section": "barCorners", "label": "Corners & Background", "tabIndex": 6, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "background", "bar", "corners", - "dank", "fully", "invisible", "make", @@ -2526,7 +2512,7 @@ "section": "barAppearance", "label": "Dank Bar", "tabIndex": 6, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "bar", "dank", @@ -2541,11 +2527,10 @@ "section": "barShadowDirectionSource", "label": "Direction Source", "tabIndex": 6, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "bar", "choose", - "dank", "direction", "panel", "resolves", @@ -2561,10 +2546,9 @@ "section": "barFontScale", "label": "Font Scale", "tabIndex": 6, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "bar", - "dank", "dankbar", "font", "independently", @@ -2582,10 +2566,9 @@ "section": "barIconScale", "label": "Icon Scale", "tabIndex": 6, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "bar", - "dank", "dankbar", "icon", "independently", @@ -2603,10 +2586,9 @@ "section": "barShadowDirectionManual", "label": "Manual Direction", "tabIndex": 6, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "bar", - "dank", "direction", "fixed", "manual", @@ -2622,10 +2604,9 @@ "section": "barTransparency", "label": "Opacity", "tabIndex": 6, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "bar", - "dank", "opacity", "panel", "statusbar", @@ -2633,30 +2614,13 @@ ], "icon": "opacity" }, - { - "section": "_tab_6", - "label": "Primary Bar", - "tabIndex": 6, - "category": "Dank Bar", - "keywords": [ - "bar", - "dank", - "panel", - "primary", - "statusbar", - "taskbar", - "topbar" - ], - "icon": "toolbar" - }, { "section": "barShadow", "label": "Shadow Override", "tabIndex": 6, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "bar", - "dank", "global", "override", "panel", @@ -2673,11 +2637,10 @@ "section": "barSpacing", "label": "Spacing", "tabIndex": 6, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "bar", "between", - "dank", "edges", "exclusive", "gap", @@ -2703,7 +2666,7 @@ "section": "trayIconTint", "label": "System Tray Icon Tint", "tabIndex": 6, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "applying", "bar", @@ -2711,7 +2674,6 @@ "color", "colour", "controls", - "dank", "hue", "icon", "much", @@ -2731,14 +2693,13 @@ "section": "barWidgetOutline", "label": "Widget Outline", "tabIndex": 6, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "appearance", "bar", "color", "colors", "colour", - "dank", "hue", "look", "outline", @@ -8661,11 +8622,10 @@ "section": "_tab_22", "label": "Widgets", "tabIndex": 22, - "category": "Dank Bar", + "category": "Bar", "keywords": [ "bar", "components", - "dank", "modules", "panel", "statusbar", @@ -9085,8 +9045,7 @@ "screen", "widgets" ], - "icon": "widgets", - "conditionKey": "dmsConnected" + "icon": "widgets" }, { "section": "desktopWidgetsManage", @@ -9647,7 +9606,8 @@ "surface", "window" ], - "description": "Use the extended surface for launcher content" + "description": "Use the extended surface for launcher content", + "conditionKey": "frameEnabled" }, { "section": "frameBarInsetPadding", @@ -9675,7 +9635,8 @@ "widgets", "window" ], - "description": "Gap between the end widgets and the bar ends (0 = edge-to-edge)" + "description": "Gap between the end widgets and the bar ends (0 = edge-to-edge)", + "conditionKey": "frameEnabled" }, { "section": "frameBorder", @@ -9699,7 +9660,8 @@ "window" ], "icon": "border_outer", - "description": "Horizontal and vertical bar thickness" + "description": "Horizontal and vertical bar thickness", + "conditionKey": "frameEnabled" }, { "section": "frameColor", @@ -9719,7 +9681,8 @@ "theme", "tint", "window" - ] + ], + "conditionKey": "frameEnabled" }, { "section": "frameRounding", @@ -9734,7 +9697,8 @@ "radius", "rounding", "window" - ] + ], + "conditionKey": "frameEnabled" }, { "section": "frameThickness", @@ -9749,7 +9713,8 @@ "thickness", "width", "window" - ] + ], + "conditionKey": "frameEnabled" }, { "section": "frameConnectedOptions", @@ -9776,7 +9741,8 @@ "window" ], "icon": "blur_linear", - "description": "Reveal the arcs where surfaces meet the frame" + "description": "Reveal the arcs where surfaces meet the frame", + "conditionKey": "frameEnabled" }, { "section": "frameDisplays", @@ -9794,7 +9760,8 @@ "screen", "window" ], - "icon": "monitor" + "icon": "monitor", + "conditionKey": "frameEnabled" }, { "section": "frameLauncherEdgeHover", @@ -9824,31 +9791,8 @@ "topbar", "window" ], - "description": "Open the launcher by hovering the emerge edge (when free of bar and dock)" - }, - { - "section": "frameEnable", - "label": "Enable Frame", - "tabIndex": 33, - "category": "Frame", - "keywords": [ - "around", - "border", - "connected", - "decoration", - "display", - "draw", - "enable", - "entire", - "frame", - "monitor", - "outline", - "output", - "picture", - "screen", - "window" - ], - "description": "Draw a connected picture-frame border around the entire display" + "description": "Open the launcher by hovering the emerge edge (when free of bar and dock)", + "conditionKey": "frameEnabled" }, { "section": "frameCloseGaps", @@ -9873,7 +9817,8 @@ "where", "window" ], - "description": "Reveal the arcs where surfaces meet the frame" + "description": "Reveal the arcs where surfaces meet the frame", + "conditionKey": "frameEnabled" }, { "section": "_tab_33", @@ -9886,7 +9831,8 @@ "frame", "window" ], - "icon": "frame_source" + "icon": "frame_source", + "conditionKey": "frameEnabled" }, { "section": "frameBlurEnabled", @@ -9908,32 +9854,8 @@ "version", "window" ], - "description": "Requires a newer version of Quickshell" - }, - { - "section": "frameEnabled", - "label": "General", - "tabIndex": 33, - "category": "Frame", - "keywords": [ - "around", - "border", - "connected", - "decoration", - "display", - "draw", - "entire", - "frame", - "general", - "monitor", - "outline", - "output", - "picture", - "screen", - "window" - ], - "icon": "frame_source", - "description": "Draw a connected picture-frame border around the entire display" + "description": "Requires a newer version of Quickshell", + "conditionKey": "frameEnabled" }, { "section": "frameBarIntegration", @@ -9981,7 +9903,27 @@ "top", "window" ], - "description": "Edge the launcher slides from" + "description": "Edge the launcher slides from", + "conditionKey": "frameEnabled" + }, + { + "section": "frameEnabled", + "label": "Layout", + "tabIndex": 33, + "category": "Frame", + "keywords": [ + "bar", + "border", + "decoration", + "frame", + "island", + "layout", + "mode", + "standard", + "window" + ], + "icon": "toolbar", + "conditionKey": "frameEnabled" }, { "section": "frameMode", @@ -10006,7 +9948,8 @@ "window" ], "icon": "tune", - "description": "Surfaces emerge flush from the bar" + "description": "Surfaces emerge flush from the bar", + "conditionKey": "frameEnabled" }, { "section": "frameShowOnOverview", @@ -10024,7 +9967,8 @@ "show", "window" ], - "description": "Show during Niri overview" + "description": "Show during Niri overview", + "conditionKey": "frameEnabled" }, { "section": "frameBarSize", @@ -10048,7 +9992,8 @@ "width", "window" ], - "description": "Horizontal and vertical bar thickness" + "description": "Horizontal and vertical bar thickness", + "conditionKey": "frameEnabled" }, { "section": "frameModeSelector", @@ -10074,7 +10019,8 @@ "topbar", "window" ], - "description": "Surfaces emerge flush from the bar" + "description": "Surfaces emerge flush from the bar", + "conditionKey": "frameEnabled" }, { "section": "frameOpacity", @@ -10090,7 +10036,8 @@ "surface", "transparency", "window" - ] + ], + "conditionKey": "frameEnabled" }, { "section": "_tab_34", @@ -10300,11 +10247,11 @@ "section": "autostartAddEntry", "label": "Add Entry", "tabIndex": 36, - "category": "Autostart", + "category": "Autostart Apps", "keywords": [ "add", + "apps", "autostart", - "boot", "choose", "command", "desktop", @@ -10320,13 +10267,10 @@ "section": "_tab_36", "label": "Autostart Apps", "tabIndex": 36, - "category": "Autostart", + "category": "Autostart Apps", "keywords": [ "apps", - "autostart", - "boot", - "launch", - "startup" + "autostart" ], "icon": "line_start" }, @@ -10334,13 +10278,11 @@ "section": "autostartEntries", "label": "Autostart Entries", "tabIndex": 36, - "category": "Autostart", + "category": "Autostart Apps", "keywords": [ + "apps", "autostart", - "boot", - "entries", - "launch", - "startup" + "entries" ], "icon": "line_start" }, @@ -10348,15 +10290,13 @@ "section": "autostartTrayIconFix", "label": "Tray Icon Fix", "tabIndex": 36, - "category": "Autostart", + "category": "Autostart Apps", "keywords": [ + "apps", "autostart", - "boot", "fix", "icon", "icons", - "launch", - "startup", "systemd", "tray" ], @@ -11663,13 +11603,12 @@ "section": "_tab_43", "label": "Widgets & Notifications", "tabIndex": 43, - "category": "Dank Dash", + "category": "Dashboard", "keywords": [ "alert", "alerts", "components", - "dank", - "dash", + "dashboard", "modules", "notif", "notifications", @@ -12287,16 +12226,13 @@ "section": "dankIslandAppearance", "label": "Appearance", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ - "activities", "appearance", "bright", "contrast", - "dank", "dim", "draw", - "dynamic island", "highest", "island", "outline", @@ -12305,43 +12241,39 @@ "tone" ], "icon": "palette", - "description": "Draw an outline and use the highest-contrast surface tone" + "description": "Draw an outline and use the highest-contrast surface tone", + "conditionKey": "islandEnabled" }, { "section": "dankIslandSatelliteBackground", "label": "Background", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ - "activities", "background", "behind", "chrome", "components", - "dank", "draw", - "dynamic island", "island", "modules", "satellite", "styled", "widgets" ], - "description": "Draw an island-styled background behind satellite widgets" + "description": "Draw an island-styled background behind satellite widgets", + "conditionKey": "islandEnabled" }, { "section": "dankIslandInteraction", "label": "Behavior", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ - "activities", "behavior", "click", "compact", "current", - "dank", - "dynamic island", "expand", "expands", "face", @@ -12354,45 +12286,41 @@ "press" ], "icon": "touch_app", - "description": "Click expands only on an intentional press. Hybrid peeks the current compact face on hover" + "description": "Click expands only on an intentional press. Hybrid peeks the current compact face on hover", + "conditionKey": "islandEnabled" }, { "section": "dankIslandHomeBrightnessDisplay", "label": "Brightness Style", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ - "activities", "backlight", "bright", "brightness", "compact", - "dank", "dim", - "dynamic island", "home", "icon", "island", "percentage", "style" - ] + ], + "conditionKey": "islandEnabled" }, { "section": "dankIslandNotificationBadgeClearOnOpen", "label": "Clear Badge on Open", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ "active", - "activities", "alert", "alerts", "badge", "clear", "clears", - "dank", "dismiss", - "dynamic island", "home", "island", "keeps", @@ -12402,20 +12330,18 @@ "open", "unread" ], - "description": "Clears the badge on open but keeps notifications active" + "description": "Clears the badge on open but keeps notifications active", + "conditionKey": "islandEnabled" }, { "section": "dankIslandHomeCompactTight", "label": "Compact Clock Pill", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ - "activities", "both", "clock", "compact", - "dank", - "dynamic island", "height", "home", "island", @@ -12425,20 +12351,18 @@ "watch", "width" ], - "description": "Compact home clock pill in both width and height" + "description": "Compact home clock pill in both width and height", + "conditionKey": "islandEnabled" }, { "section": "dankIslandCompactHeight", "label": "Compact Island Height", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ - "activities", "align", "compact", "components", - "dank", - "dynamic island", "height", "island", "modules", @@ -12450,19 +12374,17 @@ "size", "widgets" ], - "description": "Resize the resting island to align with nearby widgets" + "description": "Resize the resting island to align with nearby widgets", + "conditionKey": "islandEnabled" }, { "section": "dankIslandSatelliteSwoopRadius", "label": "Corner Radius", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ - "activities", "corner", "corners", - "dank", - "dynamic island", "goth", "island", "radius", @@ -12471,40 +12393,57 @@ "satellite", "size", "sweep" - ] + ], + "conditionKey": "islandEnabled" }, { "section": "dankIslandInstance", "label": "Dank Island - Beta", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ - "activities", "bar", "beta", "dank", - "dynamic island", + "frame", + "instance", "island", - "media", - "notifications", - "osd" + "layout", + "mode", + "standard", + "toggle" ], - "icon": "view_in_ar" + "icon": "view_in_ar", + "description": "Toggle the Island on this instance", + "conditionKey": "islandEnabled" + }, + { + "section": "dankIslandEnable", + "label": "Enable Island", + "tabIndex": 46, + "category": "Island", + "keywords": [ + "enable", + "hide", + "instance", + "island", + "show", + "toggle" + ], + "description": "Toggle the Island on this instance", + "conditionKey": "islandEnabled" }, { "section": "dankIslandNotificationExpand", "label": "Expand Notifications", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ - "activities", "alert", "alerts", "arrival", "click", - "dank", "default", - "dynamic island", "expand", "hover", "island", @@ -12513,20 +12452,18 @@ "notifs", "size" ], - "description": "Expand notifications by default instead of click or hover" + "description": "Expand notifications by default instead of click or hover", + "conditionKey": "islandEnabled" }, { "section": "dankIslandInteractionMode", "label": "Expansion Mode", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ - "activities", "click", "compact", "current", - "dank", - "dynamic island", "expand", "expands", "expansion", @@ -12540,19 +12477,17 @@ "peeks", "press" ], - "description": "Click expands only on an intentional press. Hybrid peeks the current compact face on hover" + "description": "Click expands only on an intentional press. Hybrid peeks the current compact face on hover", + "conditionKey": "islandEnabled" }, { "section": "dankIslandFloating", "label": "Float", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ "above", - "activities", "content", - "dank", - "dynamic island", "exclusive", "float", "floats", @@ -12562,19 +12497,17 @@ "reserve", "windows" ], - "description": "Floats above windows and other content" + "description": "Floats above windows and other content", + "conditionKey": "islandEnabled" }, { "section": "dankIslandSatelliteGothCorners", "label": "Goth Corners", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ - "activities", "background", "corners", - "dank", - "dynamic island", "edges", "goth", "island", @@ -12586,38 +12519,34 @@ "sweep", "wing" ], - "description": "Sweep the background into the screen edges" + "description": "Sweep the background into the screen edges", + "conditionKey": "islandEnabled" }, { "section": "dankIslandHoverCloseDelay", "label": "Hide Delay", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ - "activities", "close", - "dank", "delay", - "dynamic island", "hide", "hover", "interaction", "island" - ] + ], + "conditionKey": "islandEnabled" }, { "section": "dankIslandHighContrast", "label": "High Contrast", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ "accessibility", - "activities", "appearance", "contrast", - "dank", "draw", - "dynamic island", "high", "highest", "island", @@ -12625,20 +12554,18 @@ "surface", "tone" ], - "description": "Draw an outline and use the highest-contrast surface tone" + "description": "Draw an outline and use the highest-contrast surface tone", + "conditionKey": "islandEnabled" }, { "section": "dankIslandActivities", "label": "Home Compact", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ - "activities", "both", "clock", "compact", - "dank", - "dynamic island", "height", "home", "icon", @@ -12651,22 +12578,20 @@ "width" ], "icon": "home", - "description": "Compact home clock pill in both width and height" + "description": "Compact home clock pill in both width and height", + "conditionKey": "islandEnabled" }, { "section": "dankIslandHomeLayout", "label": "Home Layout", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ - "activities", "around", "badge", "battery", "brightness", "clock", - "dank", - "dynamic island", "groups", "hidden", "hide", @@ -12686,19 +12611,17 @@ "weather" ], "icon": "home", - "description": "Order and hide the groups around the island clock" + "description": "Order and hide the groups around the island clock", + "conditionKey": "islandEnabled" }, { "section": "dankIslandHorizontalOffset", "label": "Horizontal Offset", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ - "activities", "center", - "dank", "display", - "dynamic island", "horizontal", "island", "left", @@ -12711,68 +12634,61 @@ "satellites", "screen" ], - "description": "Move island and satellites left or right from display center" + "description": "Move island and satellites left or right from display center", + "conditionKey": "islandEnabled" }, { "section": "_tab_46", "label": "Island", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ - "activities", - "dank", - "dynamic island", "island" ], - "icon": "view_in_ar" + "icon": "view_in_ar", + "conditionKey": "islandEnabled" }, { "section": "dankIslandSatelliteGap", "label": "Island Gap", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ - "activities", - "dank", - "dynamic island", "gap", "island", "satellite", "spacing", "widgets" - ] + ], + "conditionKey": "islandEnabled" }, { "section": "dankIslandBarId", "label": "Island Instance", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ "activities", "bar", - "dank", - "dynamic island", "instance", "island", "media", "notifications", "osd" - ] + ], + "conditionKey": "islandEnabled" }, { "section": "dankIslandMediaClockVisible", "label": "Keep Clock with Media", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ - "activities", "beside", "clickable", "clock", "compact", - "dank", "details", - "dynamic island", "island", "keep", "media", @@ -12780,21 +12696,19 @@ "time", "watch" ], - "description": "Show a clickable clock beside compact media details" + "description": "Show a clickable clock beside compact media details", + "conditionKey": "islandEnabled" }, { "section": "dankIslandBatteryStyle", "label": "Material Battery Style", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ - "activities", "appearance", "battery", "charge", "charging", - "dank", - "dynamic island", "gauge", "island", "material", @@ -12804,21 +12718,19 @@ "style", "type" ], - "description": "Solid material type or Outline" + "description": "Solid material type or Outline", + "conditionKey": "islandEnabled" }, { "section": "dankIslandMotion", "label": "Motion & Accessibility", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ "accessibility", - "activities", "animation", "apply", "changes", - "dank", - "dynamic island", "geometry", "immediately", "island", @@ -12829,22 +12741,20 @@ "without" ], "icon": "animation", - "description": "Apply island geometry changes immediately without spring overshoot" + "description": "Apply island geometry changes immediately without spring overshoot", + "conditionKey": "islandEnabled" }, { "section": "dankIslandNotifications", "label": "Notifications", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ - "activities", "alert", "alerts", "arrival", "click", - "dank", "default", - "dynamic island", "expand", "hover", "island", @@ -12854,70 +12764,62 @@ "size" ], "icon": "notifications", - "description": "Expand notifications by default instead of click or hover" + "description": "Expand notifications by default instead of click or hover", + "conditionKey": "islandEnabled" }, { "section": "dankIslandSatelliteTransparency", "label": "Opacity", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ - "activities", "background", "blur", - "dank", - "dynamic island", "island", "opacity", "satellite", "transparency" - ] + ], + "conditionKey": "islandEnabled" }, { "section": "dankIslandTransparency", "label": "Opacity", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ - "activities", "appearance", "blur", - "dank", - "dynamic island", "island", "opacity", "surface", "transparency" - ] + ], + "conditionKey": "islandEnabled" }, { "section": "dankIslandHoverOpenDelay", "label": "Open Delay", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ - "activities", - "dank", "delay", - "dynamic island", "hover", "interaction", "island", "open" - ] + ], + "conditionKey": "islandEnabled" }, { "section": "dankIslandOuterGap", "label": "Outer Gaps", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ - "activities", "between", - "dank", "display", "distance", - "dynamic island", "edge", "gap", "gaps", @@ -12930,36 +12832,32 @@ "screen", "top" ], - "description": "Distance between display edge and island" + "description": "Distance between display edge and island", + "conditionKey": "islandEnabled" }, { "section": "dankIslandPalette", "label": "Palette", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ - "activities", "appearance", "bright", - "dank", "dim", - "dynamic island", "island", "palette", "surface" - ] + ], + "conditionKey": "islandEnabled" }, { "section": "dankIslandPlacement", "label": "Position", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ "above", - "activities", "content", - "dank", - "dynamic island", "exclusive", "float", "floats", @@ -12971,21 +12869,19 @@ "windows" ], "icon": "open_with", - "description": "Floats above windows and other content" + "description": "Floats above windows and other content", + "conditionKey": "islandEnabled" }, { "section": "dankIslandSatellitePosition", "label": "Position", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ - "activities", "align", "beside", "center", "components", - "dank", - "dynamic island", "edges", "island", "keep", @@ -12999,21 +12895,19 @@ "topbar", "widgets" ], - "description": "Keep widgets beside the island or align them like a standalone bar" + "description": "Keep widgets beside the island or align them like a standalone bar", + "conditionKey": "islandEnabled" }, { "section": "dankIslandReducedMotion", "label": "Reduce Motion", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ "accessibility", - "activities", "animation", "apply", "changes", - "dank", - "dynamic island", "geometry", "immediately", "island", @@ -13023,19 +12917,17 @@ "spring", "without" ], - "description": "Apply island geometry changes immediately without spring overshoot" + "description": "Apply island geometry changes immediately without spring overshoot", + "conditionKey": "islandEnabled" }, { "section": "dankIslandReserveHeight", "label": "Reserved Height", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ - "activities", "clear", "compact", - "dank", - "dynamic island", "exclusive", "height", "island", @@ -13046,18 +12938,16 @@ "satellites", "space" ], - "description": "Space kept clear for compact island and satellites" + "description": "Space kept clear for compact island and satellites", + "conditionKey": "islandEnabled" }, { "section": "dankIslandSatellites", "label": "Satellite Widgets", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ - "activities", "components", - "dank", - "dynamic island", "independent", "island", "left", @@ -13068,18 +12958,16 @@ "widgets" ], "icon": "widgets", - "description": "Place independent widgets to left and right of island" + "description": "Place independent widgets to left and right of island", + "conditionKey": "islandEnabled" }, { "section": "dankIslandSatellitesEnabled", "label": "Show Satellite Widgets", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ - "activities", "components", - "dank", - "dynamic island", "independent", "island", "left", @@ -13090,20 +12978,18 @@ "show", "widgets" ], - "description": "Place independent widgets to left and right of island" + "description": "Place independent widgets to left and right of island", + "conditionKey": "islandEnabled" }, { "section": "dankIslandSpringDamping", "label": "Spring Damping", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ - "activities", "animation", "bounce", "damping", - "dank", - "dynamic island", "higher", "island", "less", @@ -13112,18 +12998,16 @@ "spring", "values" ], - "description": "Higher values settle island with less bounce" + "description": "Higher values settle island with less bounce", + "conditionKey": "islandEnabled" }, { "section": "dankIslandSpringMass", "label": "Spring Mass", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ - "activities", "animation", - "dank", - "dynamic island", "give", "higher", "inertia", @@ -13134,18 +13018,16 @@ "percentages", "spring" ], - "description": "Higher percentages give island more inertia" + "description": "Higher percentages give island more inertia", + "conditionKey": "islandEnabled" }, { "section": "dankIslandSpringStiffness", "label": "Spring Stiffness", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ - "activities", "animation", - "dank", - "dynamic island", "higher", "island", "more", @@ -13158,18 +13040,16 @@ "toward", "values" ], - "description": "Higher values pull island toward its target more strongly" + "description": "Higher values pull island toward its target more strongly", + "conditionKey": "islandEnabled" }, { "section": "dankIslandUseOverlayLayer", "label": "Use Overlay Layer", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ - "activities", "apps", - "dank", - "dynamic island", "fullscreen", "island", "layer", @@ -13180,19 +13060,17 @@ "visible", "wayland" ], - "description": "Stage the Wayland overlay layer to remain visible over fullscreen apps" + "description": "Stage the Wayland overlay layer to remain visible over fullscreen apps", + "conditionKey": "islandEnabled" }, { "section": "dankIslandHomeVolumeDisplay", "label": "Volume Style", "tabIndex": 46, - "category": "Dank Island", + "category": "Island", "keywords": [ - "activities", "audio", "compact", - "dank", - "dynamic island", "home", "icon", "island", @@ -13202,7 +13080,8 @@ "speaker", "style", "volume" - ] + ], + "conditionKey": "islandEnabled" }, { "section": "networkCellular", @@ -13221,7 +13100,8 @@ "online", "wwan" ], - "icon": "network_cell" + "icon": "network_cell", + "conditionKey": "cellularAvailable" }, { "section": "networkCellularProfiles", @@ -13243,6 +13123,7 @@ "setup", "sim" ], - "icon": "sim_card" + "icon": "sim_card", + "conditionKey": "cellularAvailable" } ]