feat: init quickshell
This commit is contained in:
315
modules/desktop/quickshell/qml/Data/Settings.qml
Normal file
315
modules/desktop/quickshell/qml/Data/Settings.qml
Normal file
@@ -0,0 +1,315 @@
|
||||
pragma Singleton
|
||||
import Quickshell
|
||||
import QtQuick
|
||||
import Quickshell.Io
|
||||
|
||||
Singleton {
|
||||
id: settings
|
||||
|
||||
// Prevent auto-saving during initial load
|
||||
property bool isLoading: true
|
||||
|
||||
// Settings persistence with atomic writes
|
||||
FileView {
|
||||
id: settingsFile
|
||||
path: "settings.json"
|
||||
blockWrites: true
|
||||
atomicWrites: true
|
||||
watchChanges: false
|
||||
|
||||
onLoaded: {
|
||||
settings.isLoading = true; // Disable auto-save during loading
|
||||
try {
|
||||
var content = JSON.parse(text());
|
||||
if (content) {
|
||||
// Load with fallback defaults
|
||||
settings.isDarkTheme = content.isDarkTheme ?? true;
|
||||
settings.currentTheme = content.currentTheme ?? (content.isDarkTheme !== false ? "oxocarbon_dark" : "oxocarbon_light");
|
||||
settings.useCustomAccent = content.useCustomAccent ?? false;
|
||||
settings.avatarSource = content.avatarSource ?? "/home/imxyy/Pictures/icon.jpg";
|
||||
settings.weatherLocation = content.weatherLocation ?? "Dinslaken";
|
||||
settings.useFahrenheit = content.useFahrenheit ?? false;
|
||||
settings.displayTime = content.displayTime ?? 6000;
|
||||
settings.videoPath = content.videoPath ?? "~/Videos/";
|
||||
settings.customDarkAccent = content.customDarkAccent ?? "#be95ff";
|
||||
settings.customLightAccent = content.customLightAccent ?? "#8a3ffc";
|
||||
settings.autoSwitchPlayer = content.autoSwitchPlayer ?? true;
|
||||
settings.alwaysShowPlayerDropdown = content.alwaysShowPlayerDropdown ?? true;
|
||||
settings.historyLimit = content.historyLimit ?? 25;
|
||||
settings.nightLightEnabled = content.nightLightEnabled ?? false;
|
||||
settings.nightLightWarmth = content.nightLightWarmth ?? 0.4;
|
||||
settings.nightLightAuto = content.nightLightAuto ?? false;
|
||||
settings.nightLightStartHour = content.nightLightStartHour ?? 20;
|
||||
settings.nightLightEndHour = content.nightLightEndHour ?? 6;
|
||||
settings.nightLightManualOverride = content.nightLightManualOverride ?? false;
|
||||
settings.nightLightManuallyEnabled = content.nightLightManuallyEnabled ?? false;
|
||||
settings.ignoredApps = content.ignoredApps ?? [];
|
||||
settings.workspaceBurstEnabled = content.workspaceBurstEnabled ?? true;
|
||||
settings.workspaceGlowEnabled = content.workspaceGlowEnabled ?? true;
|
||||
}
|
||||
} catch (e) {
|
||||
console.log("Error parsing user settings:", e);
|
||||
}
|
||||
// Re-enable auto-save after loading is complete
|
||||
settings.isLoading = false;
|
||||
}
|
||||
}
|
||||
|
||||
// User-configurable settings
|
||||
property string avatarSource: "/home/imxyy/Pictures/icon.jpg"
|
||||
property bool isDarkTheme: true // Keep for backwards compatibility
|
||||
property string currentTheme: "oxocarbon_dark" // New theme system
|
||||
property bool useCustomAccent: false // Whether to use custom accent colors
|
||||
property string weatherLocation: "Dinslaken"
|
||||
property bool useFahrenheit: false // Temperature unit setting
|
||||
property int displayTime: 6000 // Notification display time in ms
|
||||
property var ignoredApps: [] // Apps to ignore notifications from (case-insensitive)
|
||||
property int historyLimit: 25 // Notification history limit
|
||||
property string videoPath: "~/Videos/"
|
||||
property string customDarkAccent: "#be95ff"
|
||||
property string customLightAccent: "#8a3ffc"
|
||||
|
||||
// Music Player settings
|
||||
property bool autoSwitchPlayer: true
|
||||
property bool alwaysShowPlayerDropdown: true
|
||||
|
||||
// Night Light settings
|
||||
property bool nightLightEnabled: false
|
||||
property real nightLightWarmth: 0.4
|
||||
property bool nightLightAuto: false
|
||||
property int nightLightStartHour: 20 // 8 PM
|
||||
property int nightLightEndHour: 6 // 6 AM
|
||||
property bool nightLightManualOverride: false // Track manual user actions
|
||||
property bool nightLightManuallyEnabled: false // Track if user manually enabled it
|
||||
|
||||
// Animation settings
|
||||
property bool workspaceBurstEnabled: true
|
||||
property bool workspaceGlowEnabled: true
|
||||
|
||||
// UI constants
|
||||
readonly property real borderWidth: 9
|
||||
readonly property real cornerRadius: 20
|
||||
|
||||
signal settingsChanged
|
||||
|
||||
// Helper functions for managing ignored apps
|
||||
function addIgnoredApp(appName) {
|
||||
if (appName && appName.trim() !== "") {
|
||||
var trimmedName = appName.trim();
|
||||
// Case-insensitive check for existing apps
|
||||
var exists = false;
|
||||
for (var i = 0; i < ignoredApps.length; i++) {
|
||||
if (ignoredApps[i].toLowerCase() === trimmedName.toLowerCase()) {
|
||||
exists = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!exists) {
|
||||
var newApps = ignoredApps.slice(); // Create a copy
|
||||
newApps.push(trimmedName);
|
||||
ignoredApps = newApps;
|
||||
console.log("Added ignored app:", trimmedName, "Current list:", ignoredApps);
|
||||
// Force save immediately (only if not loading)
|
||||
if (!isLoading) {
|
||||
saveSettings();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function removeIgnoredApp(appName) {
|
||||
var index = ignoredApps.indexOf(appName);
|
||||
if (index > -1) {
|
||||
var newApps = ignoredApps.slice(); // Create a copy
|
||||
newApps.splice(index, 1);
|
||||
ignoredApps = newApps;
|
||||
console.log("Removed ignored app:", appName, "Current list:", ignoredApps);
|
||||
// Force save immediately (only if not loading)
|
||||
if (!isLoading) {
|
||||
saveSettings();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function saveSettings() {
|
||||
try {
|
||||
var content = {
|
||||
isDarkTheme: settings.isDarkTheme,
|
||||
currentTheme: settings.currentTheme,
|
||||
useCustomAccent: settings.useCustomAccent,
|
||||
avatarSource: settings.avatarSource,
|
||||
weatherLocation: settings.weatherLocation,
|
||||
useFahrenheit: settings.useFahrenheit,
|
||||
displayTime: settings.displayTime,
|
||||
videoPath: settings.videoPath,
|
||||
customDarkAccent: settings.customDarkAccent,
|
||||
customLightAccent: settings.customLightAccent,
|
||||
autoSwitchPlayer: settings.autoSwitchPlayer,
|
||||
alwaysShowPlayerDropdown: settings.alwaysShowPlayerDropdown,
|
||||
historyLimit: settings.historyLimit,
|
||||
nightLightEnabled: settings.nightLightEnabled,
|
||||
nightLightWarmth: settings.nightLightWarmth,
|
||||
nightLightAuto: settings.nightLightAuto,
|
||||
nightLightStartHour: settings.nightLightStartHour,
|
||||
nightLightEndHour: settings.nightLightEndHour,
|
||||
nightLightManualOverride: settings.nightLightManualOverride,
|
||||
nightLightManuallyEnabled: settings.nightLightManuallyEnabled,
|
||||
ignoredApps: settings.ignoredApps,
|
||||
workspaceBurstEnabled: settings.workspaceBurstEnabled,
|
||||
workspaceGlowEnabled: settings.workspaceGlowEnabled
|
||||
};
|
||||
var jsonContent = JSON.stringify(content, null, 4);
|
||||
settingsFile.setText(jsonContent);
|
||||
} catch (e) {
|
||||
console.log("Error saving user settings:", e);
|
||||
}
|
||||
}
|
||||
|
||||
// Auto-save watchers (only save when not loading)
|
||||
onIsDarkThemeChanged: {
|
||||
if (!isLoading) {
|
||||
settingsChanged();
|
||||
saveSettings();
|
||||
}
|
||||
}
|
||||
onCurrentThemeChanged: {
|
||||
if (!isLoading) {
|
||||
settingsChanged();
|
||||
saveSettings();
|
||||
}
|
||||
}
|
||||
onUseCustomAccentChanged: {
|
||||
if (!isLoading) {
|
||||
settingsChanged();
|
||||
saveSettings();
|
||||
}
|
||||
}
|
||||
onAvatarSourceChanged: {
|
||||
if (!isLoading) {
|
||||
settingsChanged();
|
||||
saveSettings();
|
||||
}
|
||||
}
|
||||
onWeatherLocationChanged: {
|
||||
if (!isLoading) {
|
||||
settingsChanged();
|
||||
saveSettings();
|
||||
}
|
||||
}
|
||||
onUseFahrenheitChanged: {
|
||||
if (!isLoading) {
|
||||
settingsChanged();
|
||||
saveSettings();
|
||||
}
|
||||
}
|
||||
onDisplayTimeChanged: {
|
||||
if (!isLoading) {
|
||||
settingsChanged();
|
||||
saveSettings();
|
||||
}
|
||||
}
|
||||
onHistoryLimitChanged: {
|
||||
if (!isLoading) {
|
||||
settingsChanged();
|
||||
saveSettings();
|
||||
}
|
||||
}
|
||||
onVideoPathChanged: {
|
||||
if (!isLoading) {
|
||||
settingsChanged();
|
||||
saveSettings();
|
||||
}
|
||||
}
|
||||
onCustomDarkAccentChanged: {
|
||||
if (!isLoading) {
|
||||
settingsChanged();
|
||||
saveSettings();
|
||||
}
|
||||
}
|
||||
onCustomLightAccentChanged: {
|
||||
if (!isLoading) {
|
||||
settingsChanged();
|
||||
saveSettings();
|
||||
}
|
||||
}
|
||||
onAutoSwitchPlayerChanged: {
|
||||
if (!isLoading) {
|
||||
settingsChanged();
|
||||
saveSettings();
|
||||
}
|
||||
}
|
||||
onAlwaysShowPlayerDropdownChanged: {
|
||||
if (!isLoading) {
|
||||
settingsChanged();
|
||||
saveSettings();
|
||||
}
|
||||
}
|
||||
onNightLightEnabledChanged: {
|
||||
if (!isLoading) {
|
||||
settingsChanged();
|
||||
saveSettings();
|
||||
}
|
||||
}
|
||||
onNightLightWarmthChanged: {
|
||||
if (!isLoading) {
|
||||
settingsChanged();
|
||||
saveSettings();
|
||||
}
|
||||
}
|
||||
onNightLightAutoChanged: {
|
||||
if (!isLoading) {
|
||||
settingsChanged();
|
||||
saveSettings();
|
||||
}
|
||||
}
|
||||
onNightLightStartHourChanged: {
|
||||
if (!isLoading) {
|
||||
settingsChanged();
|
||||
saveSettings();
|
||||
}
|
||||
}
|
||||
onNightLightEndHourChanged: {
|
||||
if (!isLoading) {
|
||||
settingsChanged();
|
||||
saveSettings();
|
||||
}
|
||||
}
|
||||
onNightLightManualOverrideChanged: {
|
||||
if (!isLoading) {
|
||||
settingsChanged();
|
||||
saveSettings();
|
||||
}
|
||||
}
|
||||
onNightLightManuallyEnabledChanged: {
|
||||
if (!isLoading) {
|
||||
settingsChanged();
|
||||
saveSettings();
|
||||
}
|
||||
}
|
||||
onIgnoredAppsChanged: {
|
||||
if (!isLoading) {
|
||||
settingsChanged();
|
||||
saveSettings();
|
||||
}
|
||||
}
|
||||
onWorkspaceBurstEnabledChanged: {
|
||||
if (!isLoading) {
|
||||
settingsChanged();
|
||||
saveSettings();
|
||||
}
|
||||
}
|
||||
onWorkspaceGlowEnabledChanged: {
|
||||
if (!isLoading) {
|
||||
settingsChanged();
|
||||
saveSettings();
|
||||
}
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
settingsFile.reload();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user