Files
noctalia-shell/Services/UI/SettingsPanelService.qml

144 lines
3.7 KiB
QML

pragma Singleton
import QtQuick
import Quickshell
import qs.Commons
import qs.Services.UI
Singleton {
id: root
// Track if the settings window is open
property bool isWindowOpen: false
// Reference to the window (set by SettingsPanelWindow)
property var settingsWindow: null
// Requested tab when opening
property int requestedTab: 0
// Requested subtab when opening (-1 means no specific subtab)
property int requestedSubTab: -1
// Requested entry for search navigation
property var requestedEntry: null
signal windowOpened
signal windowClosed
function openToEntry(entry, screen) {
if (Settings.data.ui.settingsPanelMode === "window") {
requestedEntry = entry;
if (settingsWindow) {
settingsWindow.visible = true;
isWindowOpen = true;
windowOpened();
settingsWindow.navigateToEntry(entry);
}
} else {
if (!screen) {
Logger.w("SettingsPanelService", "Screen parameter required for panel mode");
return;
}
var settingsPanel = PanelService.getPanel("settingsPanel", screen);
if (settingsPanel) {
settingsPanel.requestedEntry = entry;
settingsPanel.open();
}
}
}
// Unified function to open settings to a specific tab and subtab
// Respects user's settingsPanelMode setting (window vs panel)
// For panel mode, screen parameter is required
function openToTab(tab, subTab, screen) {
const tabId = tab !== undefined ? tab : 0;
const subTabId = subTab !== undefined ? subTab : -1;
if (Settings.data.ui.settingsPanelMode === "window") {
requestedTab = tabId;
requestedSubTab = subTabId;
if (settingsWindow) {
settingsWindow.visible = true;
isWindowOpen = true;
windowOpened();
settingsWindow.navigateTo(tabId, subTabId);
}
} else {
if (!screen) {
Logger.w("SettingsPanelService", "Screen parameter required for panel mode");
return;
}
var settingsPanel = PanelService.getPanel("settingsPanel", screen);
if (settingsPanel) {
settingsPanel.openToTab(tabId, subTabId);
}
}
}
function openWindow(tab) {
requestedTab = tab !== undefined ? tab : 0;
requestedSubTab = -1;
if (settingsWindow) {
settingsWindow.visible = true;
isWindowOpen = true;
windowOpened();
settingsWindow.navigateTo(requestedTab, -1);
}
}
function closeWindow() {
if (settingsWindow) {
settingsWindow.visible = false;
isWindowOpen = false;
windowClosed();
}
}
function toggleWindow(tab) {
if (isWindowOpen) {
closeWindow();
} else {
openWindow(tab);
}
}
// Unified toggle: opens to tab/subtab if closed, closes if open
// Respects settingsPanelMode setting
function toggle(tab, subTab, screen) {
const tabId = tab !== undefined ? tab : 0;
const subTabId = subTab !== undefined ? subTab : -1;
if (Settings.data.ui.settingsPanelMode === "window") {
if (isWindowOpen) {
closeWindow();
} else {
openToTab(tabId, subTabId);
}
} else {
if (!screen) {
Logger.w("SettingsPanelService", "Screen parameter required for panel mode");
return;
}
var settingsPanel = PanelService.getPanel("settingsPanel", screen);
if (settingsPanel?.isPanelOpen) {
settingsPanel.close();
} else {
settingsPanel?.openToTab(tabId, subTabId);
}
}
}
// Unified close for both modes
function close(screen) {
if (Settings.data.ui.settingsPanelMode === "window") {
closeWindow();
} else {
if (!screen)
return;
var settingsPanel = PanelService.getPanel("settingsPanel", screen);
settingsPanel?.close();
}
}
}