From 63a545736c5fe224d859ba56bf31ada66fcd7250 Mon Sep 17 00:00:00 2001 From: LemmyCook Date: Tue, 2 Sep 2025 08:48:24 -0400 Subject: [PATCH 1/6] WeatherCard: minor UI improvements (colors and size) --- Modules/SidePanel/Cards/WeatherCard.qml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Modules/SidePanel/Cards/WeatherCard.qml b/Modules/SidePanel/Cards/WeatherCard.qml index e9c7a17..3751478 100644 --- a/Modules/SidePanel/Cards/WeatherCard.qml +++ b/Modules/SidePanel/Cards/WeatherCard.qml @@ -29,19 +29,19 @@ NBox { NIcon { text: weatherReady ? LocationService.weatherSymbolFromCode( LocationService.data.weather.current_weather.weathercode) : "" - font.pointSize: Style.fontSizeXXXL * 1.5 * scaling + font.pointSize: Style.fontSizeXXXL * 1.75 * scaling color: Color.mPrimary } ColumnLayout { - spacing: -Style.marginXS * scaling + spacing: Style.marginXXS * scaling NText { text: { // Ensure the name is not too long if one had to specify the country const chunks = Settings.data.location.name.split(",") return chunks[0] } - font.pointSize: Style.fontSizeXL * scaling + font.pointSize: Style.fontSizeL * scaling font.weight: Style.fontWeightBold } @@ -61,13 +61,14 @@ NBox { temp = Math.round(temp) return `${temp}°${suffix}` } - font.pointSize: Style.fontSizeXXL * scaling + font.pointSize: Style.fontSizeXL * scaling font.weight: Style.fontWeightBold } NText { text: weatherReady ? `(${LocationService.data.weather.timezone_abbreviation})` : "" font.pointSize: Style.fontSizeXS * scaling + color: Color.mOnSurfaceVariant visible: LocationService.data.weather } } From 6c041fb27f6fb8630e88d7ae87a2b1ef21c3ab98 Mon Sep 17 00:00:00 2001 From: LemmyCook Date: Tue, 2 Sep 2025 08:51:08 -0400 Subject: [PATCH 2/6] Settings: minor UI improvements --- Modules/SettingsPanel/Tabs/AudioTab.qml | 20 +++-------- Modules/SettingsPanel/Tabs/BarTab.qml | 22 ++++-------- Modules/SettingsPanel/Tabs/BrightnessTab.qml | 10 +++--- Modules/SettingsPanel/Tabs/GeneralTab.qml | 19 +++++----- Modules/SettingsPanel/Tabs/LauncherTab.qml | 4 +-- .../SettingsPanel/Tabs/ScreenRecorderTab.qml | 36 ++++++------------- Modules/SettingsPanel/Tabs/TimeWeatherTab.qml | 18 +++------- Modules/SidePanel/Cards/ProfileCard.qml | 3 +- Widgets/NLabel.qml | 1 + Widgets/NSectionEditor.qml | 5 ++- 10 files changed, 47 insertions(+), 91 deletions(-) diff --git a/Modules/SettingsPanel/Tabs/AudioTab.qml b/Modules/SettingsPanel/Tabs/AudioTab.qml index fa0c0c0..fe7782c 100644 --- a/Modules/SettingsPanel/Tabs/AudioTab.qml +++ b/Modules/SettingsPanel/Tabs/AudioTab.qml @@ -123,9 +123,7 @@ ColumnLayout { label: "Mute Audio Input" description: "Mute or unmute the default audio input (microphone)." checked: AudioService.inputMuted - onToggled: checked => { - AudioService.setInputMuted(checked) - } + onToggled: checked => AudioService.setInputMuted(checked) } } @@ -249,18 +247,14 @@ ColumnLayout { label: "Show Album Art In Bar Media Player" description: "Show the album art of the currently playing song next to the title." checked: Settings.data.audio.showMiniplayerAlbumArt - onToggled: checked => { - Settings.data.audio.showMiniplayerAlbumArt = checked - } + onToggled: checked => Settings.data.audio.showMiniplayerAlbumArt = checked } NToggle { label: "Show Audio Visualizer In Bar Media Player" description: "Shows an audio visualizer in the background of the miniplayer." checked: Settings.data.audio.showMiniplayerCava - onToggled: checked => { - Settings.data.audio.showMiniplayerCava = checked - } + onToggled: checked => Settings.data.audio.showMiniplayerCava = checked } // Preferred player (persistent) NTextInput { @@ -412,9 +406,7 @@ ColumnLayout { } } currentKey: Settings.data.audio.visualizerType - onSelected: key => { - Settings.data.audio.visualizerType = key - } + onSelected: key => Settings.data.audio.visualizerType = key } NComboBox { @@ -451,9 +443,7 @@ ColumnLayout { } } currentKey: Settings.data.audio.cavaFrameRate - onSelected: key => { - Settings.data.audio.cavaFrameRate = key - } + onSelected: key => Settings.data.audio.cavaFrameRate = key } } // Divider diff --git a/Modules/SettingsPanel/Tabs/BarTab.qml b/Modules/SettingsPanel/Tabs/BarTab.qml index b1d064d..88bdb4d 100644 --- a/Modules/SettingsPanel/Tabs/BarTab.qml +++ b/Modules/SettingsPanel/Tabs/BarTab.qml @@ -43,7 +43,7 @@ ColumnLayout { } NText { - text: "Adjust the background opacity of the bar" + text: "Adjust the background opacity of the bar." font.pointSize: Style.fontSizeXS * scaling color: Color.mOnSurfaceVariant wrapMode: Text.WordWrap @@ -74,32 +74,26 @@ ColumnLayout { label: "Show Active Window's Icon" description: "Display the app icon next to the title of the currently focused window." checked: Settings.data.bar.showActiveWindowIcon - onToggled: checked => { - Settings.data.bar.showActiveWindowIcon = checked - } + onToggled: checked => Settings.data.bar.showActiveWindowIcon = checked } NToggle { label: "Show Battery Percentage" description: "Display battery percentage at all times." checked: Settings.data.bar.alwaysShowBatteryPercentage - onToggled: checked => { - Settings.data.bar.alwaysShowBatteryPercentage = checked - } + onToggled: checked => Settings.data.bar.alwaysShowBatteryPercentage = checked } NToggle { label: "Show Network Statistics" description: "Display network upload and download speeds in the system monitor." checked: Settings.data.bar.showNetworkStats - onToggled: checked => { - Settings.data.bar.showNetworkStats = checked - } + onToggled: checked => Settings.data.bar.showNetworkStats = checked } NComboBox { label: "Show Workspaces Labels" - description: "Display the workspace name or index in the workspace indicator" + description: "Show the workspace name or index within the workspace indicator." model: ListModel { ListElement { key: "none" @@ -115,9 +109,7 @@ ColumnLayout { } } currentKey: Settings.data.bar.showWorkspaceLabel - onSelected: key => { - Settings.data.bar.showWorkspaceLabel = key - } + onSelected: key => Settings.data.bar.showWorkspaceLabel = key } } @@ -142,7 +134,7 @@ ColumnLayout { NText { text: "Drag and drop widgets to reorder them within each section, or use the add/remove buttons to manage widgets." - font.pointSize: Style.fontSizeXS * scaling + font.pointSize: Style.fontSizeM * scaling color: Color.mOnSurfaceVariant wrapMode: Text.WordWrap Layout.fillWidth: true diff --git a/Modules/SettingsPanel/Tabs/BrightnessTab.qml b/Modules/SettingsPanel/Tabs/BrightnessTab.qml index 7751350..4bbcace 100644 --- a/Modules/SettingsPanel/Tabs/BrightnessTab.qml +++ b/Modules/SettingsPanel/Tabs/BrightnessTab.qml @@ -298,9 +298,8 @@ ColumnLayout { model: timeOptions currentKey: Settings.data.nightLight.manualSunrise placeholder: "Select start time" - onSelected: key => { - Settings.data.nightLight.manualSunrise = key - } + onSelected: key => Settings.data.nightLight.manualSunrise = key + preferredWidth: 120 * scaling } @@ -316,9 +315,8 @@ ColumnLayout { model: timeOptions currentKey: Settings.data.nightLight.manualSunset placeholder: "Select stop time" - onSelected: key => { - Settings.data.nightLight.manualSunset = key - } + onSelected: key => Settings.data.nightLight.manualSunset = key + preferredWidth: 120 * scaling } } diff --git a/Modules/SettingsPanel/Tabs/GeneralTab.qml b/Modules/SettingsPanel/Tabs/GeneralTab.qml index 7fb4f5f..4d38d23 100644 --- a/Modules/SettingsPanel/Tabs/GeneralTab.qml +++ b/Modules/SettingsPanel/Tabs/GeneralTab.qml @@ -1,6 +1,7 @@ import QtQuick import QtQuick.Controls import QtQuick.Layouts +import Quickshell import qs.Commons import qs.Services import qs.Widgets @@ -15,8 +16,8 @@ ColumnLayout { // Avatar preview NImageCircled { - width: 128 * scaling - height: 128 * scaling + width: 108 * scaling + height: 108 * scaling imagePath: Settings.data.general.avatarImage fallbackIcon: "person" borderColor: Color.mPrimary @@ -24,7 +25,7 @@ ColumnLayout { } NTextInput { - label: "Profile Picture" + label: `${Quickshell.env("USER") || "user"}'s profile picture` description: "Your profile picture that appears throughout the interface." text: Settings.data.general.avatarImage placeholderText: "/home/user/.face" @@ -57,27 +58,27 @@ ColumnLayout { label: "Show Corners" description: "Display rounded corners on the edge of the screen." checked: Settings.data.general.showScreenCorners - onToggled: checked => { + onToggled: checked => Settings.data.general.showScreenCorners = checked - } + } NToggle { label: "Dim Desktop" description: "Dim the desktop when panels or menus are open." checked: Settings.data.general.dimDesktop - onToggled: checked => { + onToggled: checked => Settings.data.general.dimDesktop = checked - } + } NToggle { label: "Auto-hide Dock" description: "Automatically hide the dock when not in use." checked: Settings.data.dock.autoHide - onToggled: checked => { + onToggled: checked => Settings.data.dock.autoHide = checked - } + } ColumnLayout { diff --git a/Modules/SettingsPanel/Tabs/LauncherTab.qml b/Modules/SettingsPanel/Tabs/LauncherTab.qml index 49db62e..f303273 100644 --- a/Modules/SettingsPanel/Tabs/LauncherTab.qml +++ b/Modules/SettingsPanel/Tabs/LauncherTab.qml @@ -56,9 +56,7 @@ ColumnLayout { label: "Enable Clipboard History" description: "Show clipboard history in the launcher." checked: Settings.data.appLauncher.enableClipboardHistory - onToggled: checked => { - Settings.data.appLauncher.enableClipboardHistory = checked - } + onToggled: checked => Settings.data.appLauncher.enableClipboardHistory = checked } ColumnLayout { diff --git a/Modules/SettingsPanel/Tabs/ScreenRecorderTab.qml b/Modules/SettingsPanel/Tabs/ScreenRecorderTab.qml index 900b971..58f1e8d 100644 --- a/Modules/SettingsPanel/Tabs/ScreenRecorderTab.qml +++ b/Modules/SettingsPanel/Tabs/ScreenRecorderTab.qml @@ -37,9 +37,7 @@ ColumnLayout { label: "Show Cursor" description: "Record mouse cursor in the video." checked: Settings.data.screenRecorder.showCursor - onToggled: checked => { - Settings.data.screenRecorder.showCursor = checked - } + onToggled: checked => Settings.data.screenRecorder.showCursor = checked } } } @@ -66,7 +64,7 @@ ColumnLayout { // Source NComboBox { label: "Video Source" - description: "We recommend using portal, if you get artifacts try screen." + description: "Portal is recommend, if you get artifacts try Screen." model: ListModel { ListElement { key: "portal" @@ -78,9 +76,7 @@ ColumnLayout { } } currentKey: Settings.data.screenRecorder.videoSource - onSelected: key => { - Settings.data.screenRecorder.videoSource = key - } + onSelected: key => Settings.data.screenRecorder.videoSource = key } // Frame Rate @@ -118,9 +114,7 @@ ColumnLayout { } } currentKey: Settings.data.screenRecorder.frameRate - onSelected: key => { - Settings.data.screenRecorder.frameRate = key - } + onSelected: key => Settings.data.screenRecorder.frameRate = key } // Video Quality @@ -146,15 +140,13 @@ ColumnLayout { } } currentKey: Settings.data.screenRecorder.quality - onSelected: key => { - Settings.data.screenRecorder.quality = key - } + onSelected: key => Settings.data.screenRecorder.quality = key } // Video Codec NComboBox { label: "Video Codec" - description: "Different codecs offer different compression and compatibility." + description: "h264 is the most common codec." model: ListModel { ListElement { key: "h264" @@ -178,9 +170,7 @@ ColumnLayout { } } currentKey: Settings.data.screenRecorder.videoCodec - onSelected: key => { - Settings.data.screenRecorder.videoCodec = key - } + onSelected: key => Settings.data.screenRecorder.videoCodec = key } // Color Range @@ -198,9 +188,7 @@ ColumnLayout { } } currentKey: Settings.data.screenRecorder.colorRange - onSelected: key => { - Settings.data.screenRecorder.colorRange = key - } + onSelected: key => Settings.data.screenRecorder.colorRange = key } } @@ -242,9 +230,7 @@ ColumnLayout { } } currentKey: Settings.data.screenRecorder.audioSource - onSelected: key => { - Settings.data.screenRecorder.audioSource = key - } + onSelected: key => Settings.data.screenRecorder.audioSource = key } // Audio Codec @@ -262,9 +248,7 @@ ColumnLayout { } } currentKey: Settings.data.screenRecorder.audioCodec - onSelected: key => { - Settings.data.screenRecorder.audioCodec = key - } + onSelected: key => Settings.data.screenRecorder.audioCodec = key } } diff --git a/Modules/SettingsPanel/Tabs/TimeWeatherTab.qml b/Modules/SettingsPanel/Tabs/TimeWeatherTab.qml index 6e63738..4bf1b2c 100644 --- a/Modules/SettingsPanel/Tabs/TimeWeatherTab.qml +++ b/Modules/SettingsPanel/Tabs/TimeWeatherTab.qml @@ -63,27 +63,21 @@ ColumnLayout { label: "Use 12-Hour Clock" description: "Display time in 12-hour format (AM/PM) instead of 24-hour." checked: Settings.data.location.use12HourClock - onToggled: checked => { - Settings.data.location.use12HourClock = checked - } + onToggled: checked => Settings.data.location.use12HourClock = checked } NToggle { label: "Reverse Day/Month" - description: "Display date as DD/MM instead of MM/DD." + description: "Display date as dd/mm instead of mm/dd." checked: Settings.data.location.reverseDayMonth - onToggled: checked => { - Settings.data.location.reverseDayMonth = checked - } + onToggled: checked => Settings.data.location.reverseDayMonth = checked } NToggle { label: "Show Date with Clock" description: "Display date alongside time (e.g., 18:12 - Sat, 23 Aug)." checked: Settings.data.location.showDateWithClock - onToggled: checked => { - Settings.data.location.showDateWithClock = checked - } + onToggled: checked => Settings.data.location.showDateWithClock = checked } } @@ -109,9 +103,7 @@ ColumnLayout { label: "Use Fahrenheit" description: "Display temperature in Fahrenheit instead of Celsius." checked: Settings.data.location.useFahrenheit - onToggled: checked => { - Settings.data.location.useFahrenheit = checked - } + onToggled: checked => Settings.data.location.useFahrenheit = checked } } diff --git a/Modules/SidePanel/Cards/ProfileCard.qml b/Modules/SidePanel/Cards/ProfileCard.qml index d58abe8..951beba 100644 --- a/Modules/SidePanel/Cards/ProfileCard.qml +++ b/Modules/SidePanel/Cards/ProfileCard.qml @@ -43,9 +43,10 @@ NBox { NText { text: Quickshell.env("USER") || "user" font.weight: Style.fontWeightBold + font.capitalization: Font.Capitalize } NText { - text: `System Uptime: ${uptimeText}` + text: `System uptime: ${uptimeText}` color: Color.mOnSurface } } diff --git a/Widgets/NLabel.qml b/Widgets/NLabel.qml index e05604c..b9dc96e 100644 --- a/Widgets/NLabel.qml +++ b/Widgets/NLabel.qml @@ -17,6 +17,7 @@ ColumnLayout { text: label font.pointSize: Style.fontSizeL * scaling font.weight: Style.fontWeightBold + font.capitalization: Font.Capitalize color: labelColor visible: label !== "" } diff --git a/Widgets/NSectionEditor.qml b/Widgets/NSectionEditor.qml index c878eeb..91ce657 100644 --- a/Widgets/NSectionEditor.qml +++ b/Widgets/NSectionEditor.qml @@ -75,9 +75,8 @@ NBox { label: "" description: "" placeholder: "Select a widget to add..." - onSelected: key => { - comboBox.currentKey = key - } + onSelected: key => comboBox.currentKey = key + Layout.alignment: Qt.AlignVCenter } From 508c1407be683e3ecc537874ffeebdc9de6f73e2 Mon Sep 17 00:00:00 2001 From: LemmyCook Date: Tue, 2 Sep 2025 10:34:05 -0400 Subject: [PATCH 3/6] DarkModeToggle: new bar widget --- Commons/Settings.qml | 8 +++++- Modules/Bar/Widgets/DarkModeToggle.qml | 23 +++++++++++++++ Modules/SettingsPanel/Tabs/ColorSchemeTab.qml | 28 ++++++++----------- Modules/SettingsPanel/Tabs/GeneralTab.qml | 12 ++------ Services/BarWidgetRegistry.qml | 4 +++ Services/ColorSchemeService.qml | 24 ++++++++++++---- Services/MatugenService.qml | 26 ++++++++++++++--- 7 files changed, 89 insertions(+), 36 deletions(-) create mode 100644 Modules/Bar/Widgets/DarkModeToggle.qml diff --git a/Commons/Settings.qml b/Commons/Settings.qml index afac08c..442341f 100644 --- a/Commons/Settings.qml +++ b/Commons/Settings.qml @@ -63,6 +63,7 @@ Singleton { Logger.log("Settings", "Bar monitor list is empty, will show on all available screens") } } + Item { Component.onCompleted: { @@ -100,8 +101,13 @@ Singleton { // Emit the signal root.settingsLoaded() + // Kickoff ColorScheme service + ColorSchemeService.init() + + // Kickoff Matugen service + MatugenService.init() + Qt.callLater(function () { - // Some stuff like settings validation should just be executed once on startup and not on every reload validateMonitorConfigurations() }) } diff --git a/Modules/Bar/Widgets/DarkModeToggle.qml b/Modules/Bar/Widgets/DarkModeToggle.qml new file mode 100644 index 0000000..ae7d933 --- /dev/null +++ b/Modules/Bar/Widgets/DarkModeToggle.qml @@ -0,0 +1,23 @@ +import Quickshell +import qs.Commons +import qs.Widgets +import qs.Services + +NIconButton { + id: root + + property ShellScreen screen + property real scaling: 1.0 + + icon: "contrast" + tooltipText: "Toggle light/dark mode" + sizeRatio: 0.8 + + colorBg: Color.mSurfaceVariant + colorFg: Color.mOnSurface + colorBorder: Color.transparent + colorBorderHover: Color.transparent + + anchors.verticalCenter: parent.verticalCenter + onClicked: Settings.data.colorSchemes.darkMode = !Settings.data.colorSchemes.darkMode +} diff --git a/Modules/SettingsPanel/Tabs/ColorSchemeTab.qml b/Modules/SettingsPanel/Tabs/ColorSchemeTab.qml index e3e9aac..5196387 100644 --- a/Modules/SettingsPanel/Tabs/ColorSchemeTab.qml +++ b/Modules/SettingsPanel/Tabs/ColorSchemeTab.qml @@ -63,7 +63,6 @@ ColumnLayout { if (exitCode === 0) { // Matugen exists, enable it Settings.data.colorSchemes.useWallpaperColors = true - Settings.data.colorSchemes.predefinedScheme = "" MatugenService.generateFromWallpaper() ToastService.showNotice("Matugen", "Enabled") } else { @@ -122,19 +121,7 @@ ColumnLayout { description: Settings.data.colorSchemes.useWallpaperColors ? "Generate dark theme colors when using Matugen." : "Use a dark variant if available." checked: Settings.data.colorSchemes.darkMode enabled: true - onToggled: checked => { - Settings.data.colorSchemes.darkMode = checked - if (Settings.data.colorSchemes.useWallpaperColors) { - MatugenService.generateFromWallpaper() - } else if (Settings.data.colorSchemes.predefinedScheme) { - // Re-apply current scheme to pick the right variant - ColorSchemeService.applyScheme(Settings.data.colorSchemes.predefinedScheme) - // Force refresh of previews - var tmp = schemeColorsCache - schemeColorsCache = {} - schemeColorsCache = tmp - } - } + onToggled: checked => Settings.data.colorSchemes.darkMode = checked } // Use Matugen @@ -149,6 +136,11 @@ ColumnLayout { } else { Settings.data.colorSchemes.useWallpaperColors = false ToastService.showNotice("Matugen", "Disabled") + + if (Settings.data.colorSchemes.predefinedScheme) { + + ColorSchemeService.applyScheme(Settings.data.colorSchemes.predefinedScheme) + } } } } @@ -199,7 +191,8 @@ ColumnLayout { radius: Style.radiusM * scaling color: getSchemeColor(modelData, "mSurface") border.width: Math.max(1, Style.borderL * scaling) - border.color: Settings.data.colorSchemes.predefinedScheme === modelData ? Color.mPrimary : Color.mOutline + border.color: (!Settings.data.colorSchemes.useWallpaperColors + && (Settings.data.colorSchemes.predefinedScheme === modelData)) ? Color.mPrimary : Color.mOutline scale: root.cardScaleLow // Mouse area for selection @@ -290,9 +283,10 @@ ColumnLayout { } } - // Selection indicator + // Selection indicator (Checkmark) Rectangle { - visible: Settings.data.colorSchemes.predefinedScheme === schemePath + visible: !Settings.data.colorSchemes.useWallpaperColors + && (Settings.data.colorSchemes.predefinedScheme === schemePath) anchors.right: parent.right anchors.top: parent.top anchors.margins: Style.marginS * scaling diff --git a/Modules/SettingsPanel/Tabs/GeneralTab.qml b/Modules/SettingsPanel/Tabs/GeneralTab.qml index 4d38d23..e7ed212 100644 --- a/Modules/SettingsPanel/Tabs/GeneralTab.qml +++ b/Modules/SettingsPanel/Tabs/GeneralTab.qml @@ -58,27 +58,21 @@ ColumnLayout { label: "Show Corners" description: "Display rounded corners on the edge of the screen." checked: Settings.data.general.showScreenCorners - onToggled: checked => - Settings.data.general.showScreenCorners = checked - + onToggled: checked => Settings.data.general.showScreenCorners = checked } NToggle { label: "Dim Desktop" description: "Dim the desktop when panels or menus are open." checked: Settings.data.general.dimDesktop - onToggled: checked => - Settings.data.general.dimDesktop = checked - + onToggled: checked => Settings.data.general.dimDesktop = checked } NToggle { label: "Auto-hide Dock" description: "Automatically hide the dock when not in use." checked: Settings.data.dock.autoHide - onToggled: checked => - Settings.data.dock.autoHide = checked - + onToggled: checked => Settings.data.dock.autoHide = checked } ColumnLayout { diff --git a/Services/BarWidgetRegistry.qml b/Services/BarWidgetRegistry.qml index e27aaec..fc7016a 100644 --- a/Services/BarWidgetRegistry.qml +++ b/Services/BarWidgetRegistry.qml @@ -16,6 +16,7 @@ Singleton { "Bluetooth": bluetoothComponent, "Brightness": brightnessComponent, "Clock": clockComponent, + "DarkModeToggle": darkModeToggle, "KeyboardLayout": keyboardLayoutComponent, "MediaMini": mediaMiniComponent, "Microphone": microphoneComponent, @@ -51,6 +52,9 @@ Singleton { property Component clockComponent: Component { Clock {} } + property Component darkModeToggle: Component { + DarkModeToggle {} + } property Component keyboardLayoutComponent: Component { KeyboardLayout {} } diff --git a/Services/ColorSchemeService.qml b/Services/ColorSchemeService.qml index 624c05e..096f8f9 100644 --- a/Services/ColorSchemeService.qml +++ b/Services/ColorSchemeService.qml @@ -10,16 +10,30 @@ import qs.Services Singleton { id: root - Component.onCompleted: { - Logger.log("ColorScheme", "Service started") - loadColorSchemes() - } - property var schemes: [] property bool scanning: false property string schemesDirectory: Quickshell.shellDir + "/Assets/ColorScheme" property string colorsJsonFilePath: Settings.configDir + "colors.json" + Connections { + target: Settings.data.colorSchemes + function onDarkModeChanged() { + Logger.log("ColorScheme", "Detected dark mode change") + if (!Settings.data.colorSchemes.useWallpaperColors && Settings.data.colorSchemes.predefinedScheme) { + // Re-apply current scheme to pick the right variant + applyScheme(Settings.data.colorSchemes.predefinedScheme) + } + } + } + + // -------------------------------- + function init() { + // does nothing but ensure the singleton is created + // do not remove + Logger.log("ColorScheme", "Service started") + loadColorSchemes() + } + function loadColorSchemes() { Logger.log("ColorScheme", "Load ColorScheme") scanning = true diff --git a/Services/MatugenService.qml b/Services/MatugenService.qml index b41a532..ef80b7d 100644 --- a/Services/MatugenService.qml +++ b/Services/MatugenService.qml @@ -10,7 +10,7 @@ import qs.Services Singleton { id: root - property string dynamicConfigPath: Settings.cacheDir + "matugen.dynamic.toml" + property string dynamicConfigPath: Settings.isLoaded ? Settings.cacheDir + "matugen.dynamic.toml" : "" // External state management Connections { @@ -23,6 +23,23 @@ Singleton { } } + Connections { + target: Settings.data.colorSchemes + function onDarkModeChanged() { + Logger.log("Matugen", "Detected dark mode change") + if (Settings.data.colorSchemes.useWallpaperColors) { + MatugenService.generateFromWallpaper() + } + } + } + + // -------------------------------- + function init() { + // does nothing but ensure the singleton is created + // do not remove + Logger.log("Matugen", "Service started") + } + // Build TOML content based on settings function buildConfigToml() { return Matugen.buildConfigToml() @@ -30,11 +47,12 @@ Singleton { // Generate colors using current wallpaper and settings function generateFromWallpaper() { - // Ensure cache dir exists - Quickshell.execDetached(["mkdir", "-p", Settings.cacheDir]) - Logger.log("Matugen", "Generating from wallpaper on screen:", Screen.name) var wp = WallpaperService.getWallpaper(Screen.name).replace(/'/g, "'\\''") + if (wp === "") { + Logger.error("Matugen", "No wallpaper was found") + return + } var content = buildConfigToml() var mode = Settings.data.colorSchemes.darkMode ? "dark" : "light" From f385b24e8c9feac3357a68f6be81d56b5483fc8e Mon Sep 17 00:00:00 2001 From: LemmyCook Date: Tue, 2 Sep 2025 10:40:47 -0400 Subject: [PATCH 4/6] IPC: added darkMode control "call darkMode toggle" "call darkMode setDark" "call darkMode setLight" --- Modules/IPC/IPCManager.qml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Modules/IPC/IPCManager.qml b/Modules/IPC/IPCManager.qml index ba7efca..e8d1e12 100644 --- a/Modules/IPC/IPCManager.qml +++ b/Modules/IPC/IPCManager.qml @@ -100,6 +100,19 @@ Item { } } + IpcHandler { + target: "darkMode" + function toggle() { + Settings.data.colorSchemes.darkMode = !Settings.data.colorSchemes.darkMode + } + function setDark() { + Settings.data.colorSchemes.darkMode = true + } + function setLight() { + Settings.data.colorSchemes.darkMode = false + } + } + IpcHandler { target: "volume" function increase() { From f9c1fa78aa8fd6bf36582b523c9d00bea29ac082 Mon Sep 17 00:00:00 2001 From: Lemmy Date: Tue, 2 Sep 2025 10:42:39 -0400 Subject: [PATCH 5/6] Update README.md - added DarkMode IPC calls --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ed7160a..731d827 100644 --- a/README.md +++ b/README.md @@ -213,8 +213,10 @@ The following commands apply to the Nix flake installation. | Toggle Settings Window | `noctalia-shell ipc call settings toggle` | | Toggle Lock Screen | `noctalia-shell ipc call lockScreen toggle` | | Toggle Notification History | `noctalia-shell ipc call notifications toggleHistory` | -| Select new random wallpaper | `noctalia-shell ipc call wallpaper random` | - +| Set New Random Wallpaper | `noctalia-shell ipc call wallpaper random` | +| Toggle Dark Mode | `noctalia-shell ipc call darkMode toggle` | +| Set Dark Mode | `noctalia-shell ipc call darkMode setDark` | +| Set Light Mode | `noctalia-shell ipc call darkMode setLight` | From 6740959866797b1545c1bcdab3dd4067665fd40f Mon Sep 17 00:00:00 2001 From: Lemmy Date: Tue, 2 Sep 2025 10:50:57 -0400 Subject: [PATCH 6/6] Update README.md - Cleaned IPC calls area. --- README.md | 42 ++++++------------------------------------ 1 file changed, 6 insertions(+), 36 deletions(-) diff --git a/README.md b/README.md index 731d827..008a47d 100644 --- a/README.md +++ b/README.md @@ -191,41 +191,9 @@ Alternatively, you can add it to your NixOS configuration or flake: ### Usage -
- Nix -The following commands apply to the Nix flake installation. +Noctalia-shell offers many IPC calls for you convenience, so you can add them to your favorite keybinds or scripts. -| Action | Command | -| --------------------------- | ----------------------------------------------------- | -| Start the Shell | `noctalia-shell` | -| Toggle Application Launcher | `noctalia-shell ipc call launcher toggle` | -| Toggle Side Panel | `noctalia-shell ipc call sidePanel toggle` | -| Open Clipboard History | `noctalia-shell ipc call launcher clipboard` | -| Open Calculator | `noctalia-shell ipc call launcher calculator` | -| Increase Brightness | `noctalia-shell ipc call brightness increase` | -| Decrease Brightness | `noctalia-shell ipc call brightness decrease` | -| Increase Output Volume | `noctalia-shell ipc call volume increase` | -| Decrease Output Volume | `noctalia-shell ipc call volume decrease` | -| Toggle Mute Audio Output | `noctalia-shell ipc call volume muteOutput` | -| Toggle Mute Audio Input | `noctalia-shell ipc call volume muteInput` | -| Toggle Power Panel | `noctalia-shell ipc call powerPanel toggle` | -| Toggle Idle Inhibitor | `noctalia-shell ipc call idleInhibitor toggle` | -| Toggle Settings Window | `noctalia-shell ipc call settings toggle` | -| Toggle Lock Screen | `noctalia-shell ipc call lockScreen toggle` | -| Toggle Notification History | `noctalia-shell ipc call notifications toggleHistory` | -| Set New Random Wallpaper | `noctalia-shell ipc call wallpaper random` | -| Toggle Dark Mode | `noctalia-shell ipc call darkMode toggle` | -| Set Dark Mode | `noctalia-shell ipc call darkMode setDark` | -| Set Light Mode | `noctalia-shell ipc call darkMode setLight` | -
- - -
- AUR/Manual install - -The following commands apply to both AUR package and manual installation. - -| Action | Command | +| Action | Command* | | --------------------------- | ----------------------------------------------------------- | | Start the Shell | `qs -c noctalia-shell` | | Toggle Application Launcher | `qs -c noctalia-shell ipc call launcher toggle` | @@ -244,9 +212,11 @@ The following commands apply to both AUR package and manual installation. | Toggle Lock Screen | `qs -c noctalia-shell ipc call lockScreen toggle` | | Toggle Notification History | `qs -c noctalia-shell ipc call notifications toggleHistory` | | Select new random wallpaper | `qs -c noctalia-shell ipc call wallpaper random` | +| Toggle Dark Mode | `qs -c noctalia-shell ipc call darkMode toggle` | +| Set Dark Mode | `qs -c noctalia-shell ipc call darkMode setDark` | +| Set Light Mode | `qs -c noctalia-shell ipc call darkMode setLight` | -
- +*If using the Flake installation on NixOS, replace `qs -c noctalia-shell` by `noctalia-shell`* ### Configuration