mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-04-08 23:02:05 -04:00
154 lines
4.5 KiB
QML
154 lines
4.5 KiB
QML
pragma Singleton
|
|
pragma ComponentBehavior: Bound
|
|
|
|
import QtQuick
|
|
import Quickshell
|
|
|
|
Singleton {
|
|
id: root
|
|
|
|
readonly property var emptyDockState: ({
|
|
"reveal": false,
|
|
"barSide": "bottom",
|
|
"bodyX": 0,
|
|
"bodyY": 0,
|
|
"bodyW": 0,
|
|
"bodyH": 0,
|
|
"slideX": 0,
|
|
"slideY": 0
|
|
})
|
|
|
|
// Popout state (updated by DankPopout when connectedFrameModeActive)
|
|
property string popoutOwnerToken: ""
|
|
property bool popoutVisible: false
|
|
property string popoutBarSide: "top"
|
|
property real popoutBodyX: 0
|
|
property real popoutBodyY: 0
|
|
property real popoutBodyW: 0
|
|
property real popoutBodyH: 0
|
|
property real popoutAnimX: 0
|
|
property real popoutAnimY: 0
|
|
property string popoutScreen: ""
|
|
|
|
// Dock state (updated by Dock when connectedFrameModeActive), keyed by screen.name
|
|
property var dockStates: ({})
|
|
|
|
// Dock slide offsets — hot-path updates separated from full geometry state
|
|
property var dockSlides: ({})
|
|
|
|
function hasPopoutOwner(token) {
|
|
return !!token && popoutOwnerToken === token;
|
|
}
|
|
|
|
function claimPopout(token, state) {
|
|
if (!token)
|
|
return false;
|
|
|
|
popoutOwnerToken = token;
|
|
return updatePopout(token, state);
|
|
}
|
|
|
|
function updatePopout(token, state) {
|
|
if (!hasPopoutOwner(token) || !state)
|
|
return false;
|
|
|
|
if (state.visible !== undefined)
|
|
popoutVisible = !!state.visible;
|
|
if (state.barSide !== undefined)
|
|
popoutBarSide = state.barSide || "top";
|
|
if (state.bodyX !== undefined)
|
|
popoutBodyX = Number(state.bodyX);
|
|
if (state.bodyY !== undefined)
|
|
popoutBodyY = Number(state.bodyY);
|
|
if (state.bodyW !== undefined)
|
|
popoutBodyW = Number(state.bodyW);
|
|
if (state.bodyH !== undefined)
|
|
popoutBodyH = Number(state.bodyH);
|
|
if (state.animX !== undefined)
|
|
popoutAnimX = Number(state.animX);
|
|
if (state.animY !== undefined)
|
|
popoutAnimY = Number(state.animY);
|
|
if (state.screen !== undefined)
|
|
popoutScreen = state.screen || "";
|
|
|
|
return true;
|
|
}
|
|
|
|
function releasePopout(token) {
|
|
if (!hasPopoutOwner(token))
|
|
return false;
|
|
|
|
popoutOwnerToken = "";
|
|
popoutVisible = false;
|
|
popoutBarSide = "top";
|
|
popoutBodyX = 0;
|
|
popoutBodyY = 0;
|
|
popoutBodyW = 0;
|
|
popoutBodyH = 0;
|
|
popoutAnimX = 0;
|
|
popoutAnimY = 0;
|
|
popoutScreen = "";
|
|
return true;
|
|
}
|
|
|
|
function _cloneDockStates() {
|
|
const next = {};
|
|
for (const screenName in dockStates)
|
|
next[screenName] = dockStates[screenName];
|
|
return next;
|
|
}
|
|
|
|
function _normalizeDockState(state) {
|
|
return {
|
|
"reveal": !!(state && state.reveal),
|
|
"barSide": state && state.barSide ? state.barSide : "bottom",
|
|
"bodyX": Number(state && state.bodyX !== undefined ? state.bodyX : 0),
|
|
"bodyY": Number(state && state.bodyY !== undefined ? state.bodyY : 0),
|
|
"bodyW": Number(state && state.bodyW !== undefined ? state.bodyW : 0),
|
|
"bodyH": Number(state && state.bodyH !== undefined ? state.bodyH : 0),
|
|
"slideX": Number(state && state.slideX !== undefined ? state.slideX : 0),
|
|
"slideY": Number(state && state.slideY !== undefined ? state.slideY : 0)
|
|
};
|
|
}
|
|
|
|
function setDockState(screenName, state) {
|
|
if (!screenName || !state)
|
|
return false;
|
|
|
|
const next = _cloneDockStates();
|
|
next[screenName] = _normalizeDockState(state);
|
|
dockStates = next;
|
|
return true;
|
|
}
|
|
|
|
function clearDockState(screenName) {
|
|
if (!screenName || !dockStates[screenName])
|
|
return false;
|
|
|
|
const next = _cloneDockStates();
|
|
delete next[screenName];
|
|
dockStates = next;
|
|
|
|
// Also clear corresponding slide
|
|
if (dockSlides[screenName]) {
|
|
const nextSlides = {};
|
|
for (const k in dockSlides)
|
|
nextSlides[k] = dockSlides[k];
|
|
delete nextSlides[screenName];
|
|
dockSlides = nextSlides;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
function setDockSlide(screenName, x, y) {
|
|
if (!screenName)
|
|
return false;
|
|
const next = {};
|
|
for (const k in dockSlides)
|
|
next[k] = dockSlides[k];
|
|
next[screenName] = { "x": Number(x), "y": Number(y) };
|
|
dockSlides = next;
|
|
return true;
|
|
}
|
|
}
|