diff options
Diffstat (limited to 'raveos-hyprland-theme/theme-data/dms/Services/DesktopWidgetRegistry.qml')
| -rw-r--r-- | raveos-hyprland-theme/theme-data/dms/Services/DesktopWidgetRegistry.qml | 232 |
1 files changed, 232 insertions, 0 deletions
diff --git a/raveos-hyprland-theme/theme-data/dms/Services/DesktopWidgetRegistry.qml b/raveos-hyprland-theme/theme-data/dms/Services/DesktopWidgetRegistry.qml new file mode 100644 index 0000000..0e2ea6f --- /dev/null +++ b/raveos-hyprland-theme/theme-data/dms/Services/DesktopWidgetRegistry.qml @@ -0,0 +1,232 @@ +pragma Singleton +pragma ComponentBehavior: Bound + +import QtQuick +import Quickshell +import qs.Common + +Singleton { + id: root + + property var registeredWidgets: ({}) + property var registeredWidgetsList: [] + + signal registryChanged + + Component.onCompleted: { + registerBuiltins(); + Qt.callLater(syncPluginWidgets); + } + + Connections { + target: PluginService + function onPluginLoaded(pluginId) { + const plugin = PluginService.availablePlugins[pluginId]; + if (plugin?.type === "desktop") + syncPluginWidgets(); + } + function onPluginUnloaded(pluginId) { + syncPluginWidgets(); + } + function onPluginListUpdated() { + syncPluginWidgets(); + } + } + + function registerBuiltins() { + registerWidget({ + id: "desktopClock", + name: I18n.tr("Desktop Clock", "Desktop clock widget name"), + icon: "schedule", + description: I18n.tr("Analog, digital, or stacked clock display", "Desktop clock widget description"), + type: "builtin", + component: "qs.Modules.BuiltinDesktopPlugins.DesktopClockWidget", + settingsComponent: "qs.Modules.Settings.DesktopWidgetSettings.ClockSettings", + defaultConfig: getDefaultClockConfig(), + defaultSize: { + width: 280, + height: 180 + } + }); + + registerWidget({ + id: "systemMonitor", + name: I18n.tr("System Monitor", "System monitor widget name"), + icon: "monitoring", + description: I18n.tr("CPU, memory, network, and disk monitoring", "System monitor widget description"), + type: "builtin", + component: "qs.Modules.BuiltinDesktopPlugins.SystemMonitorWidget", + settingsComponent: "qs.Modules.Settings.DesktopWidgetSettings.SystemMonitorSettings", + defaultConfig: getDefaultSystemMonitorConfig(), + defaultSize: { + width: 320, + height: 480 + } + }); + } + + function getDefaultClockConfig() { + return { + style: "analog", + transparency: 0.8, + colorMode: "primary", + customColor: "#ffffff", + showDate: true, + showAnalogNumbers: false, + showAnalogSeconds: true, + displayPreferences: ["all"] + }; + } + + function getDefaultSystemMonitorConfig() { + return { + showHeader: true, + transparency: 0.8, + colorMode: "primary", + customColor: "#ffffff", + showCpu: true, + showCpuGraph: true, + showCpuTemp: true, + showGpuTemp: false, + gpuPciId: "", + showMemory: true, + showMemoryGraph: true, + showNetwork: true, + showNetworkGraph: true, + showDisk: true, + showTopProcesses: false, + topProcessCount: 3, + topProcessSortBy: "cpu", + layoutMode: "auto", + graphInterval: 60, + displayPreferences: ["all"] + }; + } + + function registerWidget(widgetDef) { + if (!widgetDef?.id) + return; + + const newMap = Object.assign({}, registeredWidgets); + newMap[widgetDef.id] = widgetDef; + registeredWidgets = newMap; + _updateWidgetsList(); + registryChanged(); + } + + function unregisterWidget(widgetId) { + if (!registeredWidgets[widgetId]) + return; + + const newMap = Object.assign({}, registeredWidgets); + delete newMap[widgetId]; + registeredWidgets = newMap; + _updateWidgetsList(); + registryChanged(); + } + + function getWidget(widgetType) { + return registeredWidgets[widgetType] ?? null; + } + + function getDefaultConfig(widgetType) { + const widget = getWidget(widgetType); + if (!widget) + return {}; + + if (widget.type === "builtin") { + switch (widgetType) { + case "desktopClock": + return getDefaultClockConfig(); + case "systemMonitor": + return getDefaultSystemMonitorConfig(); + default: + return widget.defaultConfig ?? {}; + } + } + + return widget.defaultConfig ?? {}; + } + + function getDefaultSize(widgetType) { + const widget = getWidget(widgetType); + return widget?.defaultSize ?? { + width: 200, + height: 200 + }; + } + + function syncPluginWidgets() { + const desktopPlugins = PluginService.pluginDesktopComponents; + const availablePlugins = PluginService.availablePlugins; + const currentPluginIds = []; + + for (const pluginId in desktopPlugins) { + currentPluginIds.push(pluginId); + const plugin = availablePlugins[pluginId]; + if (!plugin) + continue; + + if (registeredWidgets[pluginId]?.type === "plugin") + continue; + + registerWidget({ + id: pluginId, + name: plugin.name || pluginId, + icon: plugin.icon || "extension", + description: plugin.description || "", + type: "plugin", + component: null, + settingsComponent: plugin.settingsPath || null, + defaultConfig: { + displayPreferences: ["all"] + }, + defaultSize: { + width: 200, + height: 200 + }, + pluginInfo: plugin + }); + } + + const toRemove = []; + for (const widgetId in registeredWidgets) { + const widget = registeredWidgets[widgetId]; + if (widget.type !== "plugin") + continue; + if (!currentPluginIds.includes(widgetId)) + toRemove.push(widgetId); + } + + for (const widgetId of toRemove) { + unregisterWidget(widgetId); + } + } + + function _updateWidgetsList() { + const result = []; + for (const key in registeredWidgets) { + result.push(registeredWidgets[key]); + } + result.sort((a, b) => { + if (a.type === "builtin" && b.type !== "builtin") + return -1; + if (a.type !== "builtin" && b.type === "builtin") + return 1; + return (a.name || "").localeCompare(b.name || ""); + }); + registeredWidgetsList = result; + } + + function getBuiltinWidgets() { + return registeredWidgetsList.filter(w => w.type === "builtin"); + } + + function getPluginWidgets() { + return registeredWidgetsList.filter(w => w.type === "plugin"); + } + + function getAllWidgets() { + return registeredWidgetsList; + } +} |