1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-05-12 07:19:41 -04:00

fix(ConnectedMode): Update modal state management w/ownership Id

This commit is contained in:
purian23
2026-05-07 23:03:31 -04:00
parent 0d3eb774e2
commit 1c01774fde
5 changed files with 79 additions and 26 deletions

View File

@@ -292,6 +292,7 @@ Singleton {
}) })
property var modalStates: ({}) property var modalStates: ({})
property var modalOwners: ({})
function _normalizeModalState(state) { function _normalizeModalState(state) {
return { return {
@@ -320,31 +321,62 @@ Singleton {
return a.visible === b.visible && a.barSide === b.barSide && a.omitStartConnector === b.omitStartConnector && a.omitEndConnector === b.omitEndConnector && _sameModalGeometry(a, b); return a.visible === b.visible && a.barSide === b.barSide && a.omitStartConnector === b.omitStartConnector && a.omitEndConnector === b.omitEndConnector && _sameModalGeometry(a, b);
} }
function setModalState(screenName, state) { function claimModalState(screenName, state, ownerId) {
if (!screenName || !state) if (!screenName || !state)
return false; return false;
if (ownerId) {
const nextOwners = _cloneDict(modalOwners);
nextOwners[screenName] = ownerId;
modalOwners = nextOwners;
}
const normalized = _normalizeModalState(state); const normalized = _normalizeModalState(state);
if (_sameModalState(modalStates[screenName], normalized)) if (_sameModalState(modalStates[screenName], normalized))
return true; return true;
const next = _cloneDict(modalStates); const next = _cloneDict(modalStates);
next[screenName] = normalized; next[screenName] = normalized;
modalStates = next; modalStates = next;
return true; return true;
} }
function clearModalState(screenName) { function updateModalState(screenName, state, ownerId) {
if (!screenName || !state)
return false;
if (ownerId && modalOwners[screenName] && modalOwners[screenName] !== ownerId)
return false;
const normalized = _normalizeModalState(state);
if (_sameModalState(modalStates[screenName], normalized))
return true;
const next = _cloneDict(modalStates);
next[screenName] = normalized;
modalStates = next;
return true;
}
function setModalState(screenName, state) {
return updateModalState(screenName, state, null);
}
function clearModalState(screenName, ownerId) {
if (!screenName || !modalStates[screenName]) if (!screenName || !modalStates[screenName])
return false; return false;
if (ownerId && modalOwners[screenName] && modalOwners[screenName] !== ownerId)
return false;
const next = _cloneDict(modalStates); const next = _cloneDict(modalStates);
delete next[screenName]; delete next[screenName];
modalStates = next; modalStates = next;
if (modalOwners[screenName]) {
const nextOwners = _cloneDict(modalOwners);
delete nextOwners[screenName];
modalOwners = nextOwners;
}
return true; return true;
} }
function setModalAnim(screenName, animX, animY) { function setModalAnim(screenName, animX, animY, ownerId) {
if (ownerId && modalOwners[screenName] && modalOwners[screenName] !== ownerId)
return false;
const cur = screenName ? modalStates[screenName] : null; const cur = screenName ? modalStates[screenName] : null;
if (!cur) if (!cur)
return false; return false;
@@ -361,7 +393,9 @@ Singleton {
return true; return true;
} }
function setModalBody(screenName, bodyX, bodyY, bodyW, bodyH) { function setModalBody(screenName, bodyX, bodyY, bodyW, bodyH, ownerId) {
if (ownerId && modalOwners[screenName] && modalOwners[screenName] !== ownerId)
return false;
const cur = screenName ? modalStates[screenName] : null; const cur = screenName ? modalStates[screenName] : null;
if (!cur) if (!cur)
return false; return false;
@@ -455,6 +489,9 @@ Singleton {
const nextModal = pruneKeyed(modalStates); const nextModal = pruneKeyed(modalStates);
if (nextModal !== null) if (nextModal !== null)
modalStates = nextModal; modalStates = nextModal;
const nextModalOwners = pruneKeyed(modalOwners);
if (nextModalOwners !== null)
modalOwners = nextModalOwners;
let retractChanged = false; let retractChanged = false;
const nextRetract = {}; const nextRetract = {};

View File

@@ -116,11 +116,11 @@ Item {
return effectiveScreen ? effectiveScreen.name : ""; return effectiveScreen ? effectiveScreen.name : "";
} }
function _publishModalChromeState() { function _publishModalChromeState(isClaim) {
const screenName = _currentScreenName(); const screenName = _currentScreenName();
if (!screenName) if (!screenName)
return; return;
ConnectedModeState.setModalState(screenName, { const state = {
"visible": shouldBeVisible || contentWindow.visible, "visible": shouldBeVisible || contentWindow.visible,
"barSide": resolvedConnectedBarSide, "barSide": resolvedConnectedBarSide,
"bodyX": alignedX, "bodyX": alignedX,
@@ -131,7 +131,11 @@ Item {
"animY": modalContainer ? modalContainer.animY : 0, "animY": modalContainer ? modalContainer.animY : 0,
"omitStartConnector": false, "omitStartConnector": false,
"omitEndConnector": false "omitEndConnector": false
}); };
if (isClaim)
ConnectedModeState.claimModalState(screenName, state, _chromeClaimId);
else
ConnectedModeState.updateModalState(screenName, state, _chromeClaimId);
} }
function _syncModalChromeState() { function _syncModalChromeState() {
@@ -139,9 +143,10 @@ Item {
_releaseModalChrome(); _releaseModalChrome();
return; return;
} }
const isClaim = !_chromeClaimId;
if (!_chromeClaimId) if (!_chromeClaimId)
_chromeClaimId = _nextChromeClaimId(); _chromeClaimId = _nextChromeClaimId();
_publishModalChromeState(); _publishModalChromeState(isClaim);
if (_dockBlocksEmergence && (shouldBeVisible || contentWindow.visible)) if (_dockBlocksEmergence && (shouldBeVisible || contentWindow.visible))
ConnectedModeState.requestDockRetract(_chromeClaimId, _currentScreenName(), resolvedConnectedBarSide); ConnectedModeState.requestDockRetract(_chromeClaimId, _currentScreenName(), resolvedConnectedBarSide);
else else
@@ -187,7 +192,7 @@ Item {
const screenName = _currentScreenName(); const screenName = _currentScreenName();
if (!screenName || !modalContainer) if (!screenName || !modalContainer)
return; return;
ConnectedModeState.setModalAnim(screenName, modalContainer.animX, modalContainer.animY); ConnectedModeState.setModalAnim(screenName, modalContainer.animX, modalContainer.animY, _chromeClaimId);
} }
function _syncModalBody() { function _syncModalBody() {
@@ -196,17 +201,18 @@ Item {
const screenName = _currentScreenName(); const screenName = _currentScreenName();
if (!screenName) if (!screenName)
return; return;
ConnectedModeState.setModalBody(screenName, alignedX, alignedY, alignedWidth, alignedHeight); ConnectedModeState.setModalBody(screenName, alignedX, alignedY, alignedWidth, alignedHeight, _chromeClaimId);
} }
function _releaseModalChrome() { function _releaseModalChrome() {
if (!_chromeClaimId) if (!_chromeClaimId)
return; return;
ConnectedModeState.releaseDockRetract(_chromeClaimId); ConnectedModeState.releaseDockRetract(_chromeClaimId);
const claimId = _chromeClaimId;
_chromeClaimId = ""; _chromeClaimId = "";
const screenName = _currentScreenName(); const screenName = _currentScreenName();
if (screenName) if (screenName)
ConnectedModeState.clearModalState(screenName); ConnectedModeState.clearModalState(screenName, claimId);
} }
onFrameOwnsConnectedChromeChanged: _syncModalChromeState() onFrameOwnsConnectedChromeChanged: _syncModalChromeState()
@@ -262,6 +268,10 @@ Item {
} }
function close() { function close() {
if (modalContainer) {
frozenMotionOffsetX = modalContainer.offsetX;
frozenMotionOffsetY = modalContainer.offsetY;
}
shouldBeVisible = false; shouldBeVisible = false;
shouldHaveFocus = false; shouldHaveFocus = false;
ModalManager.closeModal(modalHandle); ModalManager.closeModal(modalHandle);

View File

@@ -88,7 +88,7 @@ Rectangle {
width: parent?.width ?? 200 width: parent?.width ?? 200
height: expanded && hasActions ? 52 : 0 height: expanded && hasActions ? 52 : 0
color: Theme.surfaceContainerHigh color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency)
radius: Theme.cornerRadius radius: Theme.cornerRadius
clip: true clip: true

View File

@@ -235,11 +235,11 @@ Item {
return effectiveScreen ? effectiveScreen.name : ""; return effectiveScreen ? effectiveScreen.name : "";
} }
function _publishModalChromeState() { function _publishModalChromeState(isClaim) {
const screenName = _currentScreenName(); const screenName = _currentScreenName();
if (!screenName) if (!screenName)
return; return;
ConnectedModeState.setModalState(screenName, { const state = {
"visible": spotlightOpen || contentWindow.visible, "visible": spotlightOpen || contentWindow.visible,
"barSide": resolvedConnectedBarSide, "barSide": resolvedConnectedBarSide,
"bodyX": _connectedChromeX, "bodyX": _connectedChromeX,
@@ -250,7 +250,11 @@ Item {
"animY": contentContainer ? contentContainer.animY : 0, "animY": contentContainer ? contentContainer.animY : 0,
"omitStartConnector": false, "omitStartConnector": false,
"omitEndConnector": false "omitEndConnector": false
}); };
if (isClaim)
ConnectedModeState.claimModalState(screenName, state, _chromeClaimId);
else
ConnectedModeState.updateModalState(screenName, state, _chromeClaimId);
} }
function _syncModalChromeState() { function _syncModalChromeState() {
@@ -258,9 +262,10 @@ Item {
_releaseModalChrome(); _releaseModalChrome();
return; return;
} }
const isClaim = !_chromeClaimId;
if (!_chromeClaimId) if (!_chromeClaimId)
_chromeClaimId = _nextChromeClaimId(); _chromeClaimId = _nextChromeClaimId();
_publishModalChromeState(); _publishModalChromeState(isClaim);
if (_dockBlocksEmergence && (spotlightOpen || contentWindow.visible)) if (_dockBlocksEmergence && (spotlightOpen || contentWindow.visible))
ConnectedModeState.requestDockRetract(_chromeClaimId, _currentScreenName(), resolvedConnectedBarSide); ConnectedModeState.requestDockRetract(_chromeClaimId, _currentScreenName(), resolvedConnectedBarSide);
else else
@@ -306,7 +311,7 @@ Item {
const screenName = _currentScreenName(); const screenName = _currentScreenName();
if (!screenName || !contentContainer) if (!screenName || !contentContainer)
return; return;
ConnectedModeState.setModalAnim(screenName, contentContainer.animX, contentContainer.animY); ConnectedModeState.setModalAnim(screenName, contentContainer.animX, contentContainer.animY, _chromeClaimId);
} }
function _syncModalBody() { function _syncModalBody() {
@@ -315,17 +320,18 @@ Item {
const screenName = _currentScreenName(); const screenName = _currentScreenName();
if (!screenName) if (!screenName)
return; return;
ConnectedModeState.setModalBody(screenName, _connectedChromeX, _connectedChromeY, _connectedChromeWidth, _connectedChromeHeight); ConnectedModeState.setModalBody(screenName, _connectedChromeX, _connectedChromeY, _connectedChromeWidth, _connectedChromeHeight, _chromeClaimId);
} }
function _releaseModalChrome() { function _releaseModalChrome() {
if (_chromeClaimId) { if (!_chromeClaimId)
ConnectedModeState.releaseDockRetract(_chromeClaimId); return;
_chromeClaimId = ""; ConnectedModeState.releaseDockRetract(_chromeClaimId);
} const claimId = _chromeClaimId;
_chromeClaimId = "";
const screenName = _currentScreenName(); const screenName = _currentScreenName();
if (screenName) if (screenName)
ConnectedModeState.clearModalState(screenName); ConnectedModeState.clearModalState(screenName, claimId);
} }
onFrameOwnsConnectedChromeChanged: _syncModalChromeState() onFrameOwnsConnectedChromeChanged: _syncModalChromeState()

View File

@@ -284,7 +284,7 @@ FocusScope {
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.leftMargin: root.parentModal?.borderWidth ?? 1 anchors.leftMargin: root.parentModal?.borderWidth ?? 1
anchors.rightMargin: root.parentModal?.borderWidth ?? 1 anchors.rightMargin: root.parentModal?.borderWidth ?? 1
anchors.bottomMargin: _connectedBottomEmerge ? Theme.spacingM : (root.parentModal?.borderWidth ?? 1) anchors.bottomMargin: _connectedBottomEmerge ? Theme.spacingS : (root.parentModal?.borderWidth ?? 1)
height: showFooter ? (_connectedArcAtFooter ? 76 : 36) : 0 height: showFooter ? (_connectedArcAtFooter ? 76 : 36) : 0
visible: showFooter visible: showFooter
clip: true clip: true