pragma Singleton import QtQuick import Quickshell import Quickshell.Io QtObject { id: root property var workspaces: ({ enable: true }) property var tray: ({ enable: true }) property var windowTitle: ({ enable: true }) property var clock: ({ enable: true }) property var notifications: ({ enable: true, timeout: 3000, maxPopups: 4, maxVisible: 10, maxHistory: -1 }) property var mpris: ({ enable: true }) property var volume: ({ enable: true }) property var bluetooth: ({ enable: true }) property var backlight: ({ enable: true, step: 5 }) property var network: ({ enable: true }) property var powerProfile: ({ enable: true }) property var idleInhibitor: ({ enable: true }) property var weather: ({ enable: true, args: ["--nerd"], interval: 3600000 }) property var temperature: ({ enable: true, warm: 80, hot: 90, device: "" }) property var gpu: ({ enable: true }) property var cpu: ({ enable: true }) property var memory: ({ enable: true }) property var disk: ({ enable: true, interval: 30000 }) property var battery: ({ enable: true, warning: 25, critical: 15 }) property var privacy: ({ enable: true }) property var screenCorners: ({ enable: true }) property var power: ({ enable: true }) property var backgroundOverlay: ({ enable: true }) property var overviewBackdrop: ({ enable: true }) property var lock: ({ enable: true }) property var statsDaemon: ({ interval: -1 }) // All module keys that have an enable flag — used to default-enable anything // not explicitly mentioned in modules.json readonly property var _moduleKeys: ["workspaces", "tray", "windowTitle", "clock", "notifications", "mpris", "volume", "bluetooth", "backlight", "network", "powerProfile", "idleInhibitor", "weather", "temperature", "gpu", "cpu", "memory", "disk", "battery", "privacy", "screenCorners", "power", "backgroundOverlay", "overviewBackdrop", "lock"] // Fallback: if modules.json doesn't exist, enable everything Component.onCompleted: _apply("{}") property FileView _file: FileView { path: (Quickshell.env("XDG_CONFIG_HOME") || (Quickshell.env("HOME") + "/.config")) + "/nova-shell/modules.json" watchChanges: true onFileChanged: reload() onLoaded: root._apply(text()) } function _apply(raw) { let data = {}; try { data = JSON.parse(raw); } catch (e) {} // Enable all modules that aren't explicitly mentioned in the JSON for (const k of _moduleKeys) { if (!(k in data)) root[k] = Object.assign({}, root[k], { enable: true }); } // Apply JSON overrides for (const k of Object.keys(data)) { if (!(k in root)) continue; const v = data[k]; if (typeof v === "object" && v !== null) root[k] = Object.assign({}, root[k], v); else if (typeof v === "boolean") root[k] = Object.assign({}, root[k], { enable: v }); } } }