mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-10-16 00:04:01 -04:00
60 lines
2.0 KiB
QML
60 lines
2.0 KiB
QML
pragma Singleton
|
|
pragma ComponentBehavior: Bound
|
|
|
|
import Quickshell
|
|
import QtQuick
|
|
|
|
Singleton {
|
|
id: modalManager
|
|
|
|
signal closeAllModalsExcept(var excludedModal)
|
|
signal modalChanged
|
|
|
|
property var currentModalsByScreen: ({})
|
|
property var _stackedModals: []
|
|
|
|
// Frame-painted chrome sits under every Top-layer window, so a surface opened over one must paint its own.
|
|
function hasStackedModal(screenName) {
|
|
return _stackedModals.some(modal => modal.shouldBeVisible && !modal.useOverlayLayer && modal.effectiveScreen?.name === screenName);
|
|
}
|
|
|
|
function openModal(modal) {
|
|
PopoutManager.screenshotActive = false;
|
|
if (modal.allowStacking)
|
|
_stackedModals = _stackedModals.filter(other => other !== modal && other.shouldBeVisible).concat([modal]);
|
|
const screenName = modal.effectiveScreen?.name ?? "unknown";
|
|
var next = {};
|
|
for (var k in currentModalsByScreen)
|
|
next[k] = currentModalsByScreen[k];
|
|
next[screenName] = modal;
|
|
currentModalsByScreen = next;
|
|
modalChanged();
|
|
Qt.callLater(() => {
|
|
if (!modal.allowStacking)
|
|
closeAllModalsExcept(modal);
|
|
if (!modal.keepPopoutsOpen)
|
|
PopoutManager.closeAllPopouts();
|
|
TrayMenuManager.closeAllMenus();
|
|
});
|
|
}
|
|
|
|
function isCurrentModal(modal, screenName) {
|
|
const name = screenName || modal?.effectiveScreen?.name || "unknown";
|
|
return currentModalsByScreen[name] === modal;
|
|
}
|
|
|
|
function closeModal(modal) {
|
|
_stackedModals = _stackedModals.filter(other => other !== modal);
|
|
const screenName = modal.effectiveScreen?.name ?? "unknown";
|
|
if (currentModalsByScreen[screenName] === modal) {
|
|
var next = {};
|
|
for (var k in currentModalsByScreen) {
|
|
if (k !== screenName)
|
|
next[k] = currentModalsByScreen[k];
|
|
}
|
|
currentModalsByScreen = next;
|
|
modalChanged();
|
|
}
|
|
}
|
|
}
|