bar: added override for display mode for other monitors

This commit is contained in:
Lemmy
2026-02-16 13:22:02 -05:00
parent 16d260a0b1
commit 1ecbf4d771
8 changed files with 108 additions and 37 deletions
+11
View File
@@ -870,6 +870,17 @@ Singleton {
return data.bar.density || "default";
}
// -----------------------------------------------------
// Get effective bar display mode for a screen (with inheritance)
// If the screen has a displayMode override and overrides are enabled, use it; otherwise use global default
function getBarDisplayModeForScreen(screenName) {
var override = _findScreenOverride(screenName);
if (override && override.enabled !== false && override.displayMode !== undefined) {
return override.displayMode;
}
return data.bar.displayMode || "always_visible";
}
// -----------------------------------------------------
// Check if a screen has any overrides, optionally for a specific property
function hasScreenOverride(screenName, property) {
+1 -1
View File
@@ -85,7 +85,7 @@ Variants {
return false;
if (!BarService.effectivelyVisible)
return false;
if (Settings.data.bar.displayMode !== "auto_hide")
if (Settings.getBarDisplayModeForScreen(modelData?.name) !== "auto_hide")
return false;
// Check if bar is configured for this screen
+1 -1
View File
@@ -43,7 +43,7 @@ PanelWindow {
readonly property real barHeight: Style.getBarHeightForScreen(barWindow.screen?.name)
// Auto-hide properties
readonly property bool autoHide: Settings.data.bar.displayMode === "auto_hide"
readonly property bool autoHide: Settings.getBarDisplayModeForScreen(barWindow.screen?.name) === "auto_hide"
readonly property int hideDelay: Settings.data.bar.autoHideDelay || 500
readonly property int showDelay: Settings.data.bar.autoShowDelay || 100
property bool isHidden: autoHide
+2 -2
View File
@@ -18,8 +18,8 @@ PanelWindow {
property string edge: Settings.getBarPositionForScreen(screen?.name)
property real thickness: (edge === Settings.getBarPositionForScreen(screen?.name)) ? Style.getBarHeightForScreen(screen?.name) : (Settings.data.bar.frameThickness ?? 12)
readonly property bool autoHide: Settings.data.bar.displayMode === "auto_hide"
readonly property bool nonExclusive: Settings.data.bar.displayMode === "non_exclusive"
readonly property bool autoHide: Settings.getBarDisplayModeForScreen(screen?.name) === "auto_hide"
readonly property bool nonExclusive: Settings.getBarDisplayModeForScreen(screen?.name) === "non_exclusive"
readonly property bool barFloating: Settings.data.bar.floating || false
readonly property real barMarginH: (barFloating && edge === Settings.getBarPositionForScreen(screen?.name)) ? Math.ceil(Settings.data.bar.marginHorizontal) : 0
readonly property real barMarginV: (barFloating && edge === Settings.getBarPositionForScreen(screen?.name)) ? Math.ceil(Settings.data.bar.marginVertical) : 0
+1 -1
View File
@@ -383,7 +383,7 @@ PanelWindow {
readonly property real barHeight: Style.getBarHeightForScreen(screen?.name)
// Auto-hide properties (read by AllBackgrounds for background fade)
readonly property bool autoHide: Settings.data.bar.displayMode === "auto_hide"
readonly property bool autoHide: Settings.getBarDisplayModeForScreen(screen?.name) === "auto_hide"
property bool isHidden: autoHide
Connections {
@@ -191,6 +191,34 @@ ColumnLayout {
}
}
// DisplayMode override
RowLayout {
Layout.fillWidth: true
spacing: Style.marginS
NComboBox {
Layout.fillWidth: true
label: I18n.tr("common.display-mode")
description: I18n.tr("panels.bar.appearance-display-mode-description")
model: [
{
"key": "always_visible",
"name": I18n.tr("hide-modes.visible")
},
{
"key": "non_exclusive",
"name": I18n.tr("hide-modes.non-exclusive")
},
{
"key": "auto_hide",
"name": I18n.tr("hide-modes.auto-hide")
}
]
currentKey: Settings.getBarDisplayModeForScreen(monitorCard.screenName)
onSelected: key => Settings.setScreenOverride(monitorCard.screenName, "displayMode", key)
}
}
// Widgets configuration button and Reset all
RowLayout {
Layout.fillWidth: true
+6 -2
View File
@@ -40,9 +40,13 @@ Singleton {
function showBar() {
BarService.show();
}
function setDisplayMode(mode: string) {
function setDisplayMode(mode: string, screen: string) {
if (mode === "always_visible" || mode === "non_exclusive" || mode === "auto_hide") {
Settings.data.bar.displayMode = mode;
if (!screen || screen === "all") {
Settings.data.bar.displayMode = mode;
} else {
Settings.setScreenOverride(screen, "displayMode", mode);
}
}
}
function setPosition(position: string, screen: string) {
+58 -30
View File
@@ -48,7 +48,7 @@ Singleton {
if (!screenAutoHideState[screenName]) {
screenAutoHideState[screenName] = {
"hovered": false,
"hidden": Settings.data.bar.displayMode === "auto_hide"
"hidden": Settings.getBarDisplayModeForScreen(screenName) === "auto_hide"
};
}
return screenAutoHideState[screenName];
@@ -87,46 +87,56 @@ Singleton {
}
// Toggle bar visibility. In auto-hide mode, toggles the auto-hide state
// on all screens instead of setting the global isVisible flag.
// on screens with auto-hide enabled. For other screens, toggles global isVisible flag.
function toggleVisibility() {
if (Settings.data.bar.displayMode === "auto_hide") {
// Check if any screen is currently visible (not hidden)
var anyVisible = false;
for (var screenName in screenAutoHideState) {
// Check if any auto-hide screen is currently visible
var anyAutoHideVisible = false;
var hasAutoHideScreens = false;
for (var screenName in screenAutoHideState) {
if (Settings.getBarDisplayModeForScreen(screenName) === "auto_hide") {
hasAutoHideScreens = true;
if (!screenAutoHideState[screenName].hidden) {
anyVisible = true;
anyAutoHideVisible = true;
break;
}
}
// Toggle all screens
for (var screenName in screenAutoHideState) {
setScreenHidden(screenName, anyVisible);
}
} else {
isVisible = !isVisible;
}
// Toggle auto-hide screens
if (hasAutoHideScreens) {
for (var screenName in screenAutoHideState) {
if (Settings.getBarDisplayModeForScreen(screenName) === "auto_hide") {
setScreenHidden(screenName, anyAutoHideVisible);
}
}
}
// Toggle global visibility (affects non-auto-hide screens)
isVisible = !isVisible;
}
// Show bar. In auto-hide mode, un-hides on all screens.
// Show bar. In auto-hide mode, un-hides on screens with auto-hide enabled.
function show() {
if (Settings.data.bar.displayMode === "auto_hide") {
for (var screenName in screenAutoHideState) {
// Show auto-hide screens
for (var screenName in screenAutoHideState) {
if (Settings.getBarDisplayModeForScreen(screenName) === "auto_hide") {
setScreenHidden(screenName, false);
}
} else {
isVisible = true;
}
// Set global visibility (affects non-auto-hide screens)
isVisible = true;
}
// Hide bar. In auto-hide mode, hides on all screens.
// Hide bar. In auto-hide mode, hides on screens with auto-hide enabled.
function hide() {
if (Settings.data.bar.displayMode === "auto_hide") {
for (var screenName in screenAutoHideState) {
// Hide auto-hide screens
for (var screenName in screenAutoHideState) {
if (Settings.getBarDisplayModeForScreen(screenName) === "auto_hide") {
setScreenHidden(screenName, true);
}
} else {
isVisible = false;
}
// Set global visibility (affects non-auto-hide screens)
isVisible = false;
}
Component.onCompleted: {
@@ -139,14 +149,32 @@ Singleton {
function onDisplayModeChanged() {
Logger.d("BarService", "Display mode changed to:", Settings.data.bar.displayMode);
if (Settings.data.bar.displayMode === "auto_hide") {
// When switching to auto_hide mode, hide the bar on all screens
for (let screenName in screenAutoHideState) {
setScreenHidden(screenName, true);
// Only affect screens without displayMode overrides
for (let screenName in screenAutoHideState) {
if (!Settings.hasScreenOverride(screenName, "displayMode")) {
var displayMode = Settings.getBarDisplayModeForScreen(screenName);
if (displayMode === "auto_hide") {
setScreenHidden(screenName, true);
} else {
if (screenAutoHideState[screenName].hidden) {
setScreenHidden(screenName, false);
}
}
}
} else {
// When switching out of auto_hide mode, show the bar on all screens
for (let screenName in screenAutoHideState) {
}
}
function onScreenOverridesChanged() {
Logger.d("BarService", "Screen overrides changed, re-evaluating auto-hide states");
// Re-evaluate auto-hide state for all screens
for (let screenName in screenAutoHideState) {
var displayMode = Settings.getBarDisplayModeForScreen(screenName);
if (displayMode === "auto_hide") {
if (!screenAutoHideState[screenName].hidden) {
setScreenHidden(screenName, true);
}
} else {
if (screenAutoHideState[screenName].hidden) {
setScreenHidden(screenName, false);
}