mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-06-08 04:09:15 -04:00
d08c7c5e55
- share modal and launcher ownership handling - recover missing background and blur layers
126 lines
3.7 KiB
QML
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();
|
|
}
|
|
}
|
|
}
|