diff --git a/Shell/ShellStateManager.qml b/Shell/ShellStateManager.qml new file mode 100644 index 0000000..506323b --- /dev/null +++ b/Shell/ShellStateManager.qml @@ -0,0 +1,52 @@ +pragma Singleton +import QtQuick + +QtObject { + id: manager + + property bool shellOpen: false + property var windowRequests: ({}) + property var globals: ({}) + + signal shellOpened + signal shellClosed + signal windowRequested(string name, var payload) + + function openShell() { + if (!shellOpen) { + console.log("ShellStateManager: openShell"); + shellOpen = true; + shellOpened(); + } + } + + function closeShell() { + if (shellOpen) { + console.log("ShellStateManager: closeShell"); + shellOpen = false; + shellClosed(); + } + } + + function toggleShell() { + console.log("ShellStateManager: toggleShell (isOpen " + shellOpen + ")"); + shellOpen ? closeShell() : openShell(); + } + + function requestWindow(name, payload) { + console.log("ShellStateManager: requestWindow", name, payload); + windowRequests[name] = { + payload: payload, + timestamp: Date.now() + }; + windowRequested(name, payload); + } + + function setGlobal(key, value) { + globals[key] = value; + } + + function global(key, defaultValue) { + return globals.hasOwnProperty(key) ? globals[key] : defaultValue; + } +} diff --git a/shell.qml b/shell.qml index 1d72b29..b7947f1 100644 --- a/shell.qml +++ b/shell.qml @@ -5,7 +5,9 @@ import "Shell" ShellRoot { id: baseShell - property bool isOpen: false + + // Use the singleton directly; it controls the shell state globally. + property bool isOpen: ShellStateManager.shellOpen WLRLayerTopbar { visible: baseShell.isOpen @@ -20,7 +22,7 @@ ShellRoot { triggerDescription: "Toggle the menu" name: "shell_toggle" onReleased: { - baseShell.isOpen = !baseShell.isOpen; + ShellStateManager.toggleShell() } } @@ -28,10 +30,10 @@ ShellRoot { target: "deltarune.shell" enabled: true function open(): void { - baseShell.isOpen = true; + ShellStateManager.openShell() } function close(): void { - baseShell.isOpen = false; + ShellStateManager.closeShell() } } }