Files
noctalia-shell/Services/UI/PanelService.qml
T
ItsLemmy 7a68030f69 Notifications: ensure they are not sandwitched between panels
+ Always access lockScreen via panel service and removed deprecation
notice.
2025-11-21 15:18:38 -05:00

94 lines
2.3 KiB
QML

pragma Singleton
import Quickshell
import qs.Commons
Singleton {
id: root
// A ref. to the lockScreen, so it's accessible from anywhere.
property var lockScreen: null
// Panels
property var registeredPanels: ({})
property var openedPanel: null
signal willOpen
signal didClose
// Popup menu windows (one per screen) - used for both tray menus and context menus
property var popupMenuWindows: ({})
signal popupMenuWindowRegistered(var screen)
// Register this panel (called after panel is loaded)
function registerPanel(panel) {
registeredPanels[panel.objectName] = panel;
Logger.d("PanelService", "Registered panel:", panel.objectName);
}
// Register popup menu window for a screen
function registerPopupMenuWindow(screen, window) {
if (!screen || !window)
return;
var key = screen.name;
popupMenuWindows[key] = window;
Logger.d("PanelService", "Registered popup menu window for screen:", key);
popupMenuWindowRegistered(screen);
}
// Get popup menu window for a screen
function getPopupMenuWindow(screen) {
if (!screen)
return null;
return popupMenuWindows[screen.name] || null;
}
// Returns a panel (loads it on-demand if not yet loaded)
function getPanel(name, screen) {
if (!screen) {
Logger.d("PanelService", "missing screen for getPanel:", name);
// If no screen specified, return the first matching panel
for (var key in registeredPanels) {
if (key.startsWith(name + "-")) {
return registeredPanels[key];
}
}
return null;
}
var panelKey = `${name}-${screen.name}`;
// Check if panel is already loaded
if (registeredPanels[panelKey]) {
return registeredPanels[panelKey];
}
Logger.w("PanelService", "Panel not found:", panelKey);
return null;
}
// Check if a panel exists
function hasPanel(name) {
return name in registeredPanels;
}
// Helper to keep only one panel open at any time
function willOpenPanel(panel) {
if (openedPanel && openedPanel !== panel) {
openedPanel.close();
}
openedPanel = panel;
// emit signal
willOpen();
}
function closedPanel(panel) {
if (openedPanel && openedPanel === panel) {
openedPanel = null;
}
// emit signal
didClose();
}
}