Compare commits

...

15 Commits

Author SHA1 Message Date
LemmyCook
9168eba07b autoformatting 2025-09-04 15:37:12 -04:00
Lemmy
5d11e37687 Merge pull request #210 from ThatOneCalculator/feat/caffeine-widget
feat: keep awake bar widget
2025-09-04 15:33:06 -04:00
Lemmy
4ea903b333 Merge pull request #208 from ThatOneCalculator/feat/power-toggle-widget
feat: power toggle bar widget
2025-09-04 15:30:56 -04:00
Lemmy
8fd805815d Merge pull request #205 from ThatOneCalculator/sidebar-toggle-settings
toggle settings panel on right-clicking side panel toggle
2025-09-04 15:29:43 -04:00
LemmyCook
c055690a9b Cleaned up init sequence 2025-09-04 15:27:17 -04:00
Kainoa Kanter
dcf146a097 feat: keep awake bar widget 2025-09-04 12:15:19 -07:00
LemmyCook
e3f50c0ce2 Hotfix: wallpaper was not set on startup. 2025-09-04 15:11:45 -04:00
Kainoa Kanter
c394368dc5 fix sizing 2025-09-04 12:03:41 -07:00
Kainoa Kanter
1f9c54438a feat: power toggle bar widget 2025-09-04 12:00:17 -07:00
Kainoa Kanter
f303f305af Merge branch 'noctalia-dev:main' into sidebar-toggle-settings 2025-09-04 11:54:32 -07:00
LemmyCook
5f1f3dce4a CustomButton: fix size to match other bars button 2025-09-04 14:52:45 -04:00
LemmyCook
f84889ca13 UpdateService: inverted logic 2025-09-04 14:46:29 -04:00
LemmyCook
b778a80c79 Settings: better icons for Hooks tab 2025-09-04 14:46:19 -04:00
Kainoa Kanter
0bf632a4b1 toggle settings panel on right-clicking side panel toggle 2025-09-04 11:20:01 -07:00
Ly-sec
321c513682 UpdateService: set release to false 2025-09-04 19:49:57 +02:00
12 changed files with 130 additions and 64 deletions

View File

@@ -35,6 +35,7 @@ Singleton {
// Signal emitted when settings are loaded after startupcale changes
signal settingsLoaded
// -----------------------------------------------------
// Function to validate monitor configurations
function validateMonitorConfigurations() {
var availableScreenNames = []
@@ -55,17 +56,67 @@ Singleton {
}
}
if (!hasValidBarMonitor) {
Logger.log("Settings",
"No configured bar monitors found on system, clearing bar monitor list to show on all screens")
Logger.warn("Settings",
"No configured bar monitors found on system, clearing bar monitor list to show on all screens")
adapter.bar.monitors = []
} else {
Logger.log("Settings", "Found valid bar monitors, keeping configuration")
//Logger.log("Settings", "Found valid bar monitors, keeping configuration")
}
} else {
Logger.log("Settings", "Bar monitor list is empty, will show on all available screens")
//Logger.log("Settings", "Bar monitor list is empty, will show on all available screens")
}
}
// -----------------------------------------------------
// If the settings structure has changed, ensure
// backward compatibility
function upgradeSettingsData() {
for (var i = 0; i < adapter.bar.widgets.left.length; i++) {
var obj = adapter.bar.widgets.left[i]
if (typeof obj === "string") {
adapter.bar.widgets.left[i] = {
"id": obj
}
}
}
for (var i = 0; i < adapter.bar.widgets.center.length; i++) {
var obj = adapter.bar.widgets.center[i]
if (typeof obj === "string") {
adapter.bar.widgets.center[i] = {
"id": obj
}
}
}
for (var i = 0; i < adapter.bar.widgets.right.length; i++) {
var obj = adapter.bar.widgets.right[i]
if (typeof obj === "string") {
adapter.bar.widgets.right[i] = {
"id": obj
}
}
}
}
// -----------------------------------------------------
// Kickoff essential services
function kickOffServices() {
// Ensure our location singleton is created as soon as possible so we start fetching weather asap
LocationService.init()
NightLightService.apply()
ColorSchemeService.init()
MatugenService.init()
FontService.init()
HooksService.init()
}
// -----------------------------------------------------
Item {
Component.onCompleted: {
@@ -100,46 +151,14 @@ Singleton {
Logger.log("Settings", "Settings loaded successfully")
isLoaded = true
for (var i = 0; i < adapter.bar.widgets.left.length; i++) {
var obj = adapter.bar.widgets.left[i]
if (typeof obj === "string") {
adapter.bar.widgets.left[i] = {
"id": obj
}
}
}
for (var i = 0; i < adapter.bar.widgets.center.length; i++) {
var obj = adapter.bar.widgets.center[i]
if (typeof obj === "string") {
adapter.bar.widgets.center[i] = {
"id": obj
}
}
}
for (var i = 0; i < adapter.bar.widgets.right.length; i++) {
var obj = adapter.bar.widgets.right[i]
if (typeof obj === "string") {
adapter.bar.widgets.right[i] = {
"id": obj
}
}
}
upgradeSettingsData()
validateMonitorConfigurations()
kickOffServices()
// Emit the signal
root.settingsLoaded()
// Kickoff ColorScheme service
ColorSchemeService.init()
// Kickoff Matugen service
MatugenService.init()
// Kickoff Font service
FontService.init()
Qt.callLater(function () {
validateMonitorConfigurations()
})
}
}
onLoadFailed: function (error) {

View File

@@ -39,6 +39,7 @@ NIconButton {
|| BarWidgetRegistry.widgetMetadata["CustomButton"].middleClickExec
readonly property bool hasExec: (userLeftClickExec || userRightClickExec || userMiddleClickExec)
sizeRatio: 0.8
icon: userIcon
tooltipText: {
if (!hasExec) {

View File

@@ -0,0 +1,24 @@
import QtQuick
import QtQuick.Layouts
import Quickshell
import qs.Commons
import qs.Services
import qs.Widgets
NIconButton {
id: root
property ShellScreen screen
property real scaling: 1.0
sizeRatio: 0.8
icon: "coffee"
tooltipText: IdleInhibitorService.isInhibited ? "Disable keep awake" : "Enable keep awake"
colorBg: Color.mSurfaceVariant
colorFg: IdleInhibitorService.isInhibited ? Color.mPrimary : Color.mOnSurface
colorBorder: Color.transparent
onClicked: {
IdleInhibitorService.manualToggle()
}
}

View File

@@ -0,0 +1,23 @@
import QtQuick
import QtQuick.Layouts
import Quickshell
import qs.Commons
import qs.Services
import qs.Widgets
NIconButton {
id: root
property ShellScreen screen
property real scaling: 1.0
sizeRatio: 0.8
icon: "power_settings_new"
tooltipText: "Power Settings"
colorBg: Color.mSurfaceVariant
colorFg: Color.mError
colorBorder: Color.transparent
colorBorderHover: Color.transparent
onClicked: PanelService.getPanel("powerPanel")?.toggle(screen)
}

View File

@@ -22,6 +22,7 @@ NIconButton {
anchors.verticalCenter: parent.verticalCenter
onClicked: PanelService.getPanel("sidePanel")?.toggle(screen)
onRightClicked: PanelService.getPanel("settingsPanel")?.toggle(screen)
// When enabled, draw the distro logo instead of the icon glyph
IconImage {

View File

@@ -141,9 +141,9 @@ NPanel {
const clipboardPlugin = Qt.createComponent("Plugins/ClipboardPlugin.qml").createObject(this)
if (clipboardPlugin) {
registerPlugin(clipboardPlugin)
Logger.log("Launcher", "Registered: clipboardPlugin")
Logger.log("Launcher", "Registered: ClipboardPlugin")
} else {
Logger.error("Launcher", "Failed to load clipboardPlugin")
Logger.error("Launcher", "Failed to load ClipboardPlugin")
}
}

View File

@@ -189,7 +189,7 @@ NPanel {
}, {
"id": SettingsPanel.Tab.Hooks,
"label": "Hooks",
"icon": "link",
"icon": "cable",
"source": hooksTab
}, {
"id": SettingsPanel.Tab.About,

View File

@@ -18,12 +18,14 @@ Singleton {
"Clock": clockComponent,
"CustomButton": customButtonComponent,
"DarkModeToggle": darkModeToggle,
"KeepAwake": keepAwakeComponent,
"KeyboardLayout": keyboardLayoutComponent,
"MediaMini": mediaMiniComponent,
"Microphone": microphoneComponent,
"NightLight": nightLightComponent,
"NotificationHistory": notificationHistoryComponent,
"PowerProfile": powerProfileComponent,
"PowerToggle": powerToggleComponent,
"ScreenRecorderIndicator": screenRecorderIndicatorComponent,
"SidePanelToggle": sidePanelToggleComponent,
"SystemMonitor": systemMonitorComponent,
@@ -72,6 +74,9 @@ Singleton {
property Component keyboardLayoutComponent: Component {
KeyboardLayout {}
}
property Component keepAwakeComponent: Component {
KeepAwake {}
}
property Component mediaMiniComponent: Component {
MediaMini {}
}
@@ -87,6 +92,9 @@ Singleton {
property Component powerProfileComponent: Component {
PowerProfile {}
}
property Component powerToggleComponent: Component {
PowerToggle {}
}
property Component screenRecorderIndicatorComponent: Component {
ScreenRecorderIndicator {}
}

View File

@@ -16,6 +16,13 @@ Singleton {
}
}
Connections {
target: WallpaperService
function onWallpaperChanged(screenName, path) {
executeWallpaperHook(path, screenName)
}
}
// Execute wallpaper change hook
function executeWallpaperHook(wallpaperPath, screenName) {
if (!Settings.data.hooks?.enabled) {

View File

@@ -8,10 +8,10 @@ Singleton {
id: root
// Public properties
property string baseVersion: "v2.5.0"
property bool isRelease: true
property string baseVersion: "2.5.0"
property bool isDevelopment: true
property string currentVersion: isRelease ? baseVersion : baseVersion + "-dev"
property string currentVersion: `v${!isDevelopment ? baseVersion : baseVersion + "-dev"}`
// Internal helpers
function getVersion() {

View File

@@ -286,11 +286,6 @@ Singleton {
// Emit signal for this specific wallpaper change
root.wallpaperChanged(screenName, path)
// Execute wallpaper change hook after the change is complete
if (HooksService) {
HooksService.executeWallpaperHook(path, screenName)
}
// Restart the random wallpaper timer
if (randomWallpaperTimer.running) {
randomWallpaperTimer.restart()

View File

@@ -103,17 +103,5 @@ ShellRoot {
Component.onCompleted: {
// Save a ref. to our lockScreen so we can access it easily
PanelService.lockScreen = lockScreen
// Ensure our location singleton is created as soon as possible so we start fetching weather asap
LocationService.init()
// Initialize UpdateService
UpdateService.init()
// Initialize HooksService
HooksService.init()
// Kickoff NightLight service
NightLightService.apply()
}
}