mirror of
https://github.com/noctalia-dev/noctalia-shell.git
synced 2026-05-11 17:08:27 +08:00
144 lines
3.7 KiB
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();
|
|
}
|
|
}
|
|
}
|