1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-06-08 04:09:15 -04:00
Files
DankMaterialShell/quickshell/Common/ConnectedModalChrome.qml
T
purian23 d08c7c5e55 refactor(frame): improve connected mode surface recovery
- share modal and launcher ownership handling
- recover missing background and blur layers
2026-06-07 17:47:24 -04:00

126 lines
3.7 KiB
QML

pragma ComponentBehavior: Bound
import QtQuick
Item {
id: root
required property var modalHandle
required property string claimPrefix
property string screenName: ""
property bool enabled: false
property bool active: false
property bool presented: false
property bool dockBlocked: false
property string dockSide: ""
property string claimId: ""
property string claimedScreenName: ""
signal recoveryRequested
visible: false
function _nextClaimId() {
return claimPrefix + ":" + (new Date()).getTime() + ":" + Math.floor(Math.random() * 1000);
}
function _isCurrentModal(name) {
return !!name && ModalManager.isCurrentModal(modalHandle, name);
}
function _shouldRecover() {
return active && enabled && _isCurrentModal(screenName);
}
function _requestRecovery() {
if (_shouldRecover())
recoveryRequested();
}
function publish(state) {
if (!enabled || !screenName || !state) {
release();
return false;
}
if (claimedScreenName && claimedScreenName !== screenName)
release();
const isCurrent = _isCurrentModal(screenName);
let isClaim = !claimId;
if (isClaim && !isCurrent)
return false;
if (isClaim)
claimId = _nextClaimId();
let published = isClaim ? ConnectedModeState.claimModalState(screenName, state, claimId) : ConnectedModeState.ensureModalState(screenName, state, claimId);
if (!published && !isClaim && isCurrent) {
ConnectedModeState.releaseDockRetract(claimId);
claimId = _nextClaimId();
published = ConnectedModeState.claimModalState(screenName, state, claimId);
}
if (!published)
return false;
claimedScreenName = screenName;
if (dockBlocked && presented)
ConnectedModeState.requestDockRetract(claimId, screenName, dockSide);
else
ConnectedModeState.releaseDockRetract(claimId);
return true;
}
function updateAnim(animX, animY) {
if (!enabled || !claimId || !claimedScreenName)
return false;
if (!ConnectedModeState.hasModalOwner(claimedScreenName, claimId)) {
_requestRecovery();
return false;
}
return ConnectedModeState.setModalAnim(claimedScreenName, animX, animY, claimId);
}
function updateBody(bodyX, bodyY, bodyW, bodyH) {
if (!enabled || !claimId || !claimedScreenName)
return false;
if (!ConnectedModeState.hasModalOwner(claimedScreenName, claimId)) {
_requestRecovery();
return false;
}
return ConnectedModeState.setModalBody(claimedScreenName, bodyX, bodyY, bodyW, bodyH, claimId);
}
function release() {
if (!claimId)
return;
ConnectedModeState.releaseDockRetract(claimId);
const releasedClaimId = claimId;
const releasedScreenName = claimedScreenName;
claimId = "";
claimedScreenName = "";
if (releasedScreenName)
ConnectedModeState.clearModalState(releasedScreenName, releasedClaimId);
}
Component.onDestruction: release()
Connections {
target: ModalManager
function onModalChanged() {
root._requestRecovery();
}
}
Connections {
target: ConnectedModeState
function onModalOwnersChanged() {
if (!ConnectedModeState.hasModalOwner(root.screenName, root.claimId))
root._requestRecovery();
}
function onModalStatesChanged() {
if (!ConnectedModeState.modalStates[root.screenName])
root._requestRecovery();
}
}
}