diff --git a/quickshell/Common/SettingsData.qml b/quickshell/Common/SettingsData.qml index d39a2198..cece823a 100644 --- a/quickshell/Common/SettingsData.qml +++ b/quickshell/Common/SettingsData.qml @@ -14,7 +14,7 @@ import "settings/SettingsStore.js" as Store Singleton { id: root - readonly property int settingsConfigVersion: 9 + readonly property int settingsConfigVersion: 10 readonly property bool isGreeterMode: Quickshell.env("DMS_RUN_GREETER") === "1" || Quickshell.env("DMS_RUN_GREETER") === "true" @@ -201,9 +201,9 @@ Singleton { property bool frameEnabled: false onFrameEnabledChanged: saveSettings() - property real frameThickness: 15 + property real frameThickness: 16 onFrameThicknessChanged: saveSettings() - property real frameRounding: 24 + property real frameRounding: 23 onFrameRoundingChanged: saveSettings() property string frameColor: "" onFrameColorChanged: saveSettings() @@ -213,7 +213,7 @@ Singleton { onFrameSyncBarColorChanged: saveSettings() property var frameScreenPreferences: ["all"] onFrameScreenPreferencesChanged: saveSettings() - property real frameBarThickness: 48 + property real frameBarThickness: 42 onFrameBarThicknessChanged: saveSettings() property bool frameShowOnOverview: false onFrameShowOnOverviewChanged: saveSettings() @@ -1974,6 +1974,14 @@ Singleton { return Quickshell.screens.filter(screen => isScreenInPreferences(screen, prefs)); } + function getFrameScreensAlways() { + const prefs = frameScreenPreferences; + if (!prefs || prefs.length === 0 || prefs.includes("all")) { + return Quickshell.screens; + } + return Quickshell.screens.filter(s => prefs.includes(s.name)); + } + function getActiveBarEdgeForScreen(screen) { if (!screen) return ""; for (var i = 0; i < barConfigs.length; i++) { diff --git a/quickshell/Common/settings/SettingsSpec.js b/quickshell/Common/settings/SettingsSpec.js index 90445f91..c0089600 100644 --- a/quickshell/Common/settings/SettingsSpec.js +++ b/quickshell/Common/settings/SettingsSpec.js @@ -550,8 +550,8 @@ var SPEC = { launcherPluginOrder: { def: [] }, frameEnabled: { def: false }, - frameThickness: { def: 15 }, - frameRounding: { def: 24 }, + frameThickness: { def: 16 }, + frameRounding: { def: 23 }, frameColor: { def: "" }, frameOpacity: { def: 1.0 }, frameSyncBarColor: { def: true }, diff --git a/quickshell/Common/settings/SettingsStore.js b/quickshell/Common/settings/SettingsStore.js index ebedae83..d04e89fa 100644 --- a/quickshell/Common/settings/SettingsStore.js +++ b/quickshell/Common/settings/SettingsStore.js @@ -252,8 +252,8 @@ function migrateToVersion(obj, targetVersion) { console.info("Migrating settings from version", currentVersion, "to version 7"); if (settings.frameEnabled === undefined) settings.frameEnabled = false; - if (settings.frameThickness === undefined) settings.frameThickness = 15; - if (settings.frameRounding === undefined) settings.frameRounding = 24; + if (settings.frameThickness === undefined) settings.frameThickness = 16; + if (settings.frameRounding === undefined) settings.frameRounding = 23; if (settings.frameColor === undefined) settings.frameColor = "#2a2a2a"; if (settings.frameOpacity === undefined) settings.frameOpacity = 1.0; if (settings.frameSyncBarColor === undefined) settings.frameSyncBarColor = true; @@ -265,7 +265,7 @@ function migrateToVersion(obj, targetVersion) { if (currentVersion < 8) { console.info("Migrating settings from version", currentVersion, "to version 8"); - if (settings.frameBarThickness === undefined) settings.frameBarThickness = 48; + if (settings.frameBarThickness === undefined) settings.frameBarThickness = 42; settings.configVersion = 8; } @@ -278,6 +278,11 @@ function migrateToVersion(obj, targetVersion) { settings.configVersion = 9; } + // v10 migration — Session 5 + if (currentVersion < 10) { + settings.configVersion = 10; + } + return settings; } diff --git a/quickshell/Modules/DankBar/BarCanvas.qml b/quickshell/Modules/DankBar/BarCanvas.qml index 08f2ac09..19539c4d 100644 --- a/quickshell/Modules/DankBar/BarCanvas.qml +++ b/quickshell/Modules/DankBar/BarCanvas.qml @@ -10,6 +10,8 @@ Item { required property var axis required property var barConfig + visible: !SettingsData.frameEnabled + anchors.fill: parent anchors.left: parent.left @@ -38,7 +40,7 @@ Item { property real rt: { if (SettingsData.frameEnabled) - return 0; + return SettingsData.frameRounding; if (barConfig?.squareCorners ?? false) return 0; if (barWindow.hasMaximizedToplevel) diff --git a/quickshell/Modules/DankBar/DankBarContent.qml b/quickshell/Modules/DankBar/DankBarContent.qml index a826e7bd..be782e3b 100644 --- a/quickshell/Modules/DankBar/DankBarContent.qml +++ b/quickshell/Modules/DankBar/DankBarContent.qml @@ -23,6 +23,31 @@ Item { readonly property real innerPadding: barConfig?.innerPadding ?? 4 readonly property real outlineThickness: (barConfig?.widgetOutlineEnabled ?? false) ? (barConfig?.widgetOutlineThickness ?? 1) : 0 + readonly property real _frameLeftInset: { + if (!SettingsData.frameEnabled || barWindow.isVertical) return 0 + return barWindow.hasAdjacentLeftBar + ? SettingsData.frameBarThickness + : 0 + } + readonly property real _frameRightInset: { + if (!SettingsData.frameEnabled || barWindow.isVertical) return 0 + return barWindow.hasAdjacentRightBar + ? SettingsData.frameBarThickness + : 0 + } + readonly property real _frameTopInset: { + if (!SettingsData.frameEnabled || !barWindow.isVertical) return 0 + return barWindow.hasAdjacentTopBar + ? SettingsData.frameThickness + : 0 + } + readonly property real _frameBottomInset: { + if (!SettingsData.frameEnabled || !barWindow.isVertical) return 0 + return barWindow.hasAdjacentBottomBar + ? SettingsData.frameThickness + : 0 + } + property alias hLeftSection: hLeftSection property alias hCenterSection: hCenterSection property alias hRightSection: hRightSection @@ -31,10 +56,14 @@ Item { property alias vRightSection: vRightSection anchors.fill: parent - anchors.leftMargin: Math.max(Theme.spacingXS, innerPadding * 0.8) - anchors.rightMargin: Math.max(Theme.spacingXS, innerPadding * 0.8) - anchors.topMargin: barWindow.isVertical ? (barWindow.hasAdjacentTopBar ? outlineThickness : Theme.spacingXS) : 0 - anchors.bottomMargin: barWindow.isVertical ? (barWindow.hasAdjacentBottomBar ? outlineThickness : Theme.spacingXS) : 0 + anchors.leftMargin: Math.max(Theme.spacingXS, innerPadding * 0.8) + _frameLeftInset + anchors.rightMargin: Math.max(Theme.spacingXS, innerPadding * 0.8) + _frameRightInset + anchors.topMargin: (barWindow.isVertical + ? (barWindow.hasAdjacentTopBar ? outlineThickness : Theme.spacingXS) + : 0) + _frameTopInset + anchors.bottomMargin: (barWindow.isVertical + ? (barWindow.hasAdjacentBottomBar ? outlineThickness : Theme.spacingXS) + : 0) + _frameBottomInset clip: false property int componentMapRevision: 0 diff --git a/quickshell/Modules/Frame/Frame.qml b/quickshell/Modules/Frame/Frame.qml index ab3febbc..2d82e3c1 100644 --- a/quickshell/Modules/Frame/Frame.qml +++ b/quickshell/Modules/Frame/Frame.qml @@ -7,7 +7,7 @@ import qs.Common Variants { id: root - model: SettingsData.frameEnabled ? SettingsData.getFrameFilteredScreens() : [] + model: SettingsData.getFrameScreensAlways() FrameInstance { required property ShellScreen modelData diff --git a/quickshell/Modules/Frame/FrameBorder.qml b/quickshell/Modules/Frame/FrameBorder.qml index 837b8008..0e88b9b4 100644 --- a/quickshell/Modules/Frame/FrameBorder.qml +++ b/quickshell/Modules/Frame/FrameBorder.qml @@ -7,10 +7,10 @@ import qs.Common Item { id: root - required property var barEdges // array of "top" | "bottom" | "left" | "right" - anchors.fill: parent + required property var barEdges + readonly property real _thickness: SettingsData.frameThickness readonly property real _barThickness: SettingsData.frameBarThickness readonly property real _rounding: SettingsData.frameRounding diff --git a/quickshell/Modules/Frame/FrameExclusions.qml b/quickshell/Modules/Frame/FrameExclusions.qml index 3051452c..326acfa0 100644 --- a/quickshell/Modules/Frame/FrameExclusions.qml +++ b/quickshell/Modules/Frame/FrameExclusions.qml @@ -19,7 +19,7 @@ Scope { // Skips any edge where a bar already provides its own exclusiveZone. Loader { - active: !root.barEdges.includes("top") + active: SettingsData.frameEnabled && !root.barEdges.includes("top") sourceComponent: EdgeExclusion { screen: root.screen anchorTop: true @@ -29,7 +29,7 @@ Scope { } Loader { - active: !root.barEdges.includes("bottom") + active: SettingsData.frameEnabled && !root.barEdges.includes("bottom") sourceComponent: EdgeExclusion { screen: root.screen anchorBottom: true @@ -39,7 +39,7 @@ Scope { } Loader { - active: !root.barEdges.includes("left") + active: SettingsData.frameEnabled && !root.barEdges.includes("left") sourceComponent: EdgeExclusion { screen: root.screen anchorLeft: true @@ -49,7 +49,7 @@ Scope { } Loader { - active: !root.barEdges.includes("right") + active: SettingsData.frameEnabled && !root.barEdges.includes("right") sourceComponent: EdgeExclusion { screen: root.screen anchorRight: true diff --git a/quickshell/Modules/Frame/FrameWindow.qml b/quickshell/Modules/Frame/FrameWindow.qml index a6e15c2f..ff231371 100644 --- a/quickshell/Modules/Frame/FrameWindow.qml +++ b/quickshell/Modules/Frame/FrameWindow.qml @@ -28,9 +28,7 @@ PanelWindow { FrameBorder { anchors.fill: parent - barEdges: { - SettingsData.barConfigs; // force re-eval when bar configs change - return SettingsData.getActiveBarEdgesForScreen(win.screen); - } + visible: SettingsData.frameEnabled + barEdges: { SettingsData.barConfigs; return SettingsData.getActiveBarEdgesForScreen(win.screen); } } } diff --git a/quickshell/Modules/Settings/DankBarTab.qml b/quickshell/Modules/Settings/DankBarTab.qml index bba6dd83..df0e1e4c 100644 --- a/quickshell/Modules/Settings/DankBarTab.qml +++ b/quickshell/Modules/Settings/DankBarTab.qml @@ -1036,6 +1036,8 @@ Item { SettingsSliderRow { id: barTransparencySlider + enabled: !SettingsData.frameEnabled + opacity: SettingsData.frameEnabled ? 0.5 : 1.0 text: I18n.tr("Bar Transparency") value: (selectedBarConfig?.transparency ?? 1.0) * 100 minimum: 0 @@ -1077,6 +1079,35 @@ Item { restoreMode: Binding.RestoreBinding } } + + Item { + visible: SettingsData.frameEnabled + width: parent.width + implicitHeight: transparencyFrameNote.implicitHeight + Theme.spacingS * 2 + + Row { + id: transparencyFrameNote + x: Theme.spacingM + width: parent.width - Theme.spacingM * 2 + anchors.verticalCenter: parent.verticalCenter + spacing: Theme.spacingS + + DankIcon { + name: "frame_source" + size: Theme.fontSizeMedium + color: Theme.primary + anchors.verticalCenter: parent.verticalCenter + } + + StyledText { + text: I18n.tr("Opacity is controlled by Frame Border Opacity in Frame settings") + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText + wrapMode: Text.WordWrap + width: parent.width - Theme.fontSizeMedium - Theme.spacingS + } + } + } } SettingsCard { @@ -1330,8 +1361,6 @@ Item { SettingsToggleRow { text: I18n.tr("No Background") - enabled: !SettingsData.frameEnabled - opacity: SettingsData.frameEnabled ? 0.5 : 1.0 checked: selectedBarConfig?.noBackground ?? false onToggled: checked => SettingsData.updateBarConfig(selectedBarId, { noBackground: checked diff --git a/quickshell/Modules/Settings/FrameTab.qml b/quickshell/Modules/Settings/FrameTab.qml index 212cf182..58396c15 100644 --- a/quickshell/Modules/Settings/FrameTab.qml +++ b/quickshell/Modules/Settings/FrameTab.qml @@ -60,7 +60,7 @@ Item { minimum: 0 maximum: 100 step: 1 - defaultValue: 24 + defaultValue: 23 value: SettingsData.frameRounding onSliderDragFinished: v => SettingsData.set("frameRounding", v) @@ -80,7 +80,7 @@ Item { minimum: 2 maximum: 100 step: 1 - defaultValue: 15 + defaultValue: 16 value: SettingsData.frameThickness onSliderDragFinished: v => SettingsData.set("frameThickness", v) @@ -101,7 +101,7 @@ Item { minimum: 24 maximum: 100 step: 1 - defaultValue: 48 + defaultValue: 42 value: SettingsData.frameBarThickness onSliderDragFinished: v => SettingsData.set("frameBarThickness", v) @@ -116,7 +116,7 @@ Item { id: opacitySlider settingKey: "frameOpacity" tags: ["frame", "border", "opacity", "transparency"] - text: I18n.tr("Border opacity") + text: I18n.tr("Frame Opacity") unit: "%" minimum: 0 maximum: 100