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:
@@ -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 = {};
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user