Files
noctalia-shell/Services/UI/PanelService.qml
T

95 lines
2.2 KiB
QML

pragma Singleton
import Quickshell
import qs.Commons
Singleton {
id: root
// A ref. to the lockScreen, so it's accessible from anywhere
// This is not a panel...
property var lockScreen: null
// Panels
property var registeredPanels: ({})
property var openedPanel: null
signal willOpen
signal didClose
// Tray menu windows (one per screen)
property var trayMenuWindows: ({})
signal trayMenuWindowRegistered(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 tray menu window for a screen
function registerTrayMenuWindow(screen, window) {
if (!screen || !window)
return
var key = screen.name
trayMenuWindows[key] = window
Logger.d("PanelService", "Registered tray menu window for screen:", key)
trayMenuWindowRegistered(screen)
}
// Get tray menu window for a screen
function getTrayMenuWindow(screen) {
if (!screen)
return null
return trayMenuWindows[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()
}
}