1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-06-10 05:03:28 -04:00

refactor(framemode): connected surfaces

This commit is contained in:
purian23
2026-06-09 13:40:53 -04:00
parent 8856d45887
commit f8b32cc298
14 changed files with 1523 additions and 454 deletions
+58 -72
View File
@@ -7,6 +7,7 @@ Item {
required property var modalHandle
required property string claimPrefix
property string surfaceKind: "modal"
property string screenName: ""
property bool enabled: false
property bool active: false
@@ -14,112 +15,97 @@ Item {
property bool dockBlocked: false
property string dockSide: ""
property string claimId: ""
property string claimedScreenName: ""
property alias claimId: lease.claimId
property alias claimedScreenName: lease.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();
ConnectedSurfaceLease {
id: lease
claimPrefix: root.claimPrefix
screenName: root.screenName
enabled: root.enabled
active: root.active
presented: root.presented
dockBlocked: root.dockBlocked
dockSide: root.dockSide
isCurrentOwner: function(name) {
return root._isCurrentModal(name);
}
hasOwner: function(name, ownerId) {
return ConnectedModeState.hasModalOwner(name, ownerId);
}
statePresent: function(name, ownerId) {
return ConnectedModeState.hasModalOwner(name, ownerId) && ConnectedModeState.hasSurfaceDescriptor(name, root.surfaceKind, ownerId);
}
claimState: function(name, state, ownerId) {
return ConnectedModeState.claimModalState(name, state, ownerId);
}
ensureState: function(name, state, ownerId) {
return ConnectedModeState.ensureModalState(name, state, ownerId);
}
releaseState: function(name, ownerId) {
return ConnectedModeState.clearModalState(name, ownerId);
}
updateAnimationState: function(name, ownerId, animX, animY) {
return ConnectedModeState.setModalAnim(name, animX, animY, ownerId);
}
updateBodyState: function(name, ownerId, bodyX, bodyY, bodyW, bodyH) {
return ConnectedModeState.setModalBody(name, bodyX, bodyY, bodyW, bodyH, ownerId);
}
requestDockRetract: function(ownerId, name, side) {
return ConnectedModeState.requestDockRetract(ownerId, name, side);
}
releaseDockRetract: function(ownerId) {
return ConnectedModeState.releaseDockRetract(ownerId);
}
onRecoveryRequested: root.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;
return lease.publish(Object.assign({}, state, {
"kind": root.surfaceKind,
"screenName": root.screenName,
"presented": root.presented,
"dockRetractSide": root.dockBlocked ? root.dockSide : ""
}), false);
}
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);
return lease.updateAnim(animX, animY);
}
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);
return lease.updateBody(bodyX, bodyY, bodyW, bodyH);
}
function release() {
if (!claimId)
return;
ConnectedModeState.releaseDockRetract(claimId);
const releasedClaimId = claimId;
const releasedScreenName = claimedScreenName;
claimId = "";
claimedScreenName = "";
if (releasedScreenName)
ConnectedModeState.clearModalState(releasedScreenName, releasedClaimId);
return lease.release();
}
Component.onDestruction: release()
Connections {
target: ModalManager
function onModalChanged() {
root._requestRecovery();
lease.requestRecovery();
}
}
Connections {
target: ConnectedModeState
function onModalOwnersChanged() {
if (!ConnectedModeState.hasModalOwner(root.screenName, root.claimId))
root._requestRecovery();
lease.checkOwnershipRecovery();
}
function onModalStatesChanged() {
if (!ConnectedModeState.modalStates[root.screenName])
root._requestRecovery();
lease.checkStateRecovery();
}
function onSurfaceDescriptorsChanged() {
lease.checkStateRecovery();
}
}
}