diff --git a/Commons/Color.qml b/Commons/Color.qml index f31f1ac..dc1d554 100644 --- a/Commons/Color.qml +++ b/Commons/Color.qml @@ -47,7 +47,8 @@ Singleton { // ----------- function applyOpacity(color, opacity) { // Convert color to string and apply opacity - if (!color) return "transparent" + if (!color) + return "transparent" return color.toString().replace("#", "#" + opacity) } diff --git a/Commons/Settings.qml b/Commons/Settings.qml index 0ffe01c..77aaaaf 100644 --- a/Commons/Settings.qml +++ b/Commons/Settings.qml @@ -133,7 +133,7 @@ Singleton { // Widget configuration for modular bar system property JsonObject widgets - + widgets: JsonObject { property list left: ["SystemMonitor", "ActiveWindow", "MediaMini"] property list center: ["Workspace"] diff --git a/Commons/WidgetLoader.qml b/Commons/WidgetLoader.qml index 635fe04..ce44431 100644 --- a/Commons/WidgetLoader.qml +++ b/Commons/WidgetLoader.qml @@ -19,16 +19,17 @@ QtObject { if (!widgetName || widgetName.trim() === "") { return null } - + const widgetPath = `../Modules/Bar/Widgets/${widgetName}.qml` - + // Try to load the widget directly from file const component = Qt.createComponent(widgetPath) if (component.status === Component.Ready) { return component } - - const errorMsg = `Failed to load ${widgetName}.qml widget, status: ${component.status}, error: ${component.errorString()}` + + const errorMsg = `Failed to load ${widgetName}.qml widget, status: ${component.status}, error: ${component.errorString( + )}` Logger.error("WidgetLoader", errorMsg) return null } @@ -44,7 +45,7 @@ QtObject { function onWidgetLoaded(widgetName) { loadedWidgets++ widgetLoaded(widgetName) - + if (loadedWidgets + failedWidgets === totalWidgets) { Logger.log("WidgetLoader", `Loaded ${loadedWidgets} widgets`) loadingComplete(totalWidgets, loadedWidgets, failedWidgets) @@ -55,7 +56,7 @@ QtObject { function onWidgetFailed(widgetName, error) { failedWidgets++ widgetFailed(widgetName, error) - + if (loadedWidgets + failedWidgets === totalWidgets) { loadingComplete(totalWidgets, loadedWidgets, failedWidgets) } @@ -64,28 +65,24 @@ QtObject { // This is where you should add your Modules/Bar/Widgets/ // so it gets registered in the BarTab function discoverAvailableWidgets() { - const widgetFiles = [ - "ActiveWindow", "Battery", "Bluetooth", "Brightness", "Clock", - "MediaMini", "NotificationHistory", "ScreenRecorderIndicator", - "SidePanelToggle", "SystemMonitor", "Tray", "Volume", "WiFi", "Workspace" - ] - + const widgetFiles = ["ActiveWindow", "Battery", "Bluetooth", "Brightness", "Clock", "MediaMini", "NotificationHistory", "ScreenRecorderIndicator", "SidePanelToggle", "SystemMonitor", "Tray", "Volume", "WiFi", "Workspace"] + const availableWidgets = [] - + widgetFiles.forEach(widgetName => { - // Test if the widget can be loaded - const component = getWidgetComponent(widgetName) - if (component) { - availableWidgets.push({ - key: widgetName, - name: widgetName - }) - } - }) - + // Test if the widget can be loaded + const component = getWidgetComponent(widgetName) + if (component) { + availableWidgets.push({ + "key": widgetName, + "name": widgetName + }) + } + }) + // Sort alphabetically availableWidgets.sort((a, b) => a.name.localeCompare(b.name)) - + return availableWidgets } } diff --git a/Modules/Bar/Bar.qml b/Modules/Bar/Bar.qml index 7e23d0e..ae0ad9f 100644 --- a/Modules/Bar/Bar.qml +++ b/Modules/Bar/Bar.qml @@ -23,8 +23,6 @@ Variants { implicitHeight: Style.barHeight * scaling color: Color.transparent - - // If no bar activated in settings, then show them all visible: modelData ? (Settings.data.bar.monitors.includes(modelData.name) || (Settings.data.bar.monitors.length === 0)) : false @@ -136,24 +134,16 @@ Variants { // Widget loader instance WidgetLoader { id: widgetLoader - - onWidgetFailed: function(widgetName, error) { + + onWidgetFailed: function (widgetName, error) { Logger.error("Bar", `Widget failed: ${widgetName} - ${error}`) } } // Initialize widget loading tracking Component.onCompleted: { - const allWidgets = [ - ...Settings.data.bar.widgets.left, - ...Settings.data.bar.widgets.center, - ...Settings.data.bar.widgets.right - ] + const allWidgets = [...Settings.data.bar.widgets.left, ...Settings.data.bar.widgets.center, ...Settings.data.bar.widgets.right] widgetLoader.initializeLoading(allWidgets) } - - - - } } diff --git a/Modules/Bar/Widgets/Bluetooth.qml b/Modules/Bar/Widgets/Bluetooth.qml index 35ff4d5..bbe35f1 100644 --- a/Modules/Bar/Widgets/Bluetooth.qml +++ b/Modules/Bar/Widgets/Bluetooth.qml @@ -7,7 +7,6 @@ import qs.Commons import qs.Services import qs.Widgets - NIconButton { id: root diff --git a/Modules/Bar/Widgets/Tray.qml b/Modules/Bar/Widgets/Tray.qml index 9998fe6..d85a174 100644 --- a/Modules/Bar/Widgets/Tray.qml +++ b/Modules/Bar/Widgets/Tray.qml @@ -9,13 +9,10 @@ import qs.Commons import qs.Services import qs.Widgets - - Rectangle { readonly property real itemSize: 24 * scaling visible: Settings.data.bar.showTray && (SystemTray.items.values.length > 0) - width: tray.width + Style.marginM * scaling * 2 diff --git a/Modules/SettingsPanel/Tabs/BarTab.qml b/Modules/SettingsPanel/Tabs/BarTab.qml index ebb9f2f..c751dcb 100644 --- a/Modules/SettingsPanel/Tabs/BarTab.qml +++ b/Modules/SettingsPanel/Tabs/BarTab.qml @@ -166,13 +166,14 @@ ColumnLayout { Layout.fillWidth: true Layout.minimumHeight: { var widgetCount = Settings.data.bar.widgets.left.length - if (widgetCount === 0) return 140 * scaling - + if (widgetCount === 0) + return 140 * scaling + var availableWidth = scrollView.availableWidth - (Style.marginM * scaling * 2) // Card margins var avgWidgetWidth = 150 * scaling // Estimated widget width including spacing var widgetsPerRow = Math.max(1, Math.floor(availableWidth / avgWidgetWidth)) var rows = Math.ceil(widgetCount / widgetsPerRow) - + // Header (50) + spacing (20) + (rows * widget height) + (rows-1 * spacing) + bottom margin (20) return (50 + 20 + (rows * 48) + ((rows - 1) * Style.marginS) + 20) * scaling } @@ -192,7 +193,9 @@ ColumnLayout { color: Color.mOnSurface } - Item { Layout.fillWidth: true } + Item { + Layout.fillWidth: true + } NComboBox { id: leftComboBox @@ -202,8 +205,8 @@ ColumnLayout { description: "" placeholder: "Add widget to left section" onSelected: key => { - addWidgetToSection(key, "left") - } + addWidgetToSection(key, "left") + } } } @@ -290,13 +293,14 @@ ColumnLayout { Layout.fillWidth: true Layout.minimumHeight: { var widgetCount = Settings.data.bar.widgets.center.length - if (widgetCount === 0) return 140 * scaling - + if (widgetCount === 0) + return 140 * scaling + var availableWidth = scrollView.availableWidth - (Style.marginM * scaling * 2) // Card margins var avgWidgetWidth = 150 * scaling // Estimated widget width including spacing var widgetsPerRow = Math.max(1, Math.floor(availableWidth / avgWidgetWidth)) var rows = Math.ceil(widgetCount / widgetsPerRow) - + // Header (50) + spacing (20) + (rows * widget height) + (rows-1 * spacing) + bottom margin (20) return (50 + 20 + (rows * 48) + ((rows - 1) * Style.marginS) + 20) * scaling } @@ -316,7 +320,9 @@ ColumnLayout { color: Color.mOnSurface } - Item { Layout.fillWidth: true } + Item { + Layout.fillWidth: true + } NComboBox { id: centerComboBox @@ -326,9 +332,9 @@ ColumnLayout { description: "" placeholder: "Add widget to center section" onSelected: key => { - addWidgetToSection(key, "center") - reset() // Reset selection - } + addWidgetToSection(key, "center") + reset() // Reset selection + } } } @@ -415,13 +421,14 @@ ColumnLayout { Layout.fillWidth: true Layout.minimumHeight: { var widgetCount = Settings.data.bar.widgets.right.length - if (widgetCount === 0) return 140 * scaling - + if (widgetCount === 0) + return 140 * scaling + var availableWidth = scrollView.availableWidth - (Style.marginM * scaling * 2) // Card margins var avgWidgetWidth = 150 * scaling // Estimated widget width including spacing var widgetsPerRow = Math.max(1, Math.floor(availableWidth / avgWidgetWidth)) var rows = Math.ceil(widgetCount / widgetsPerRow) - + // Header (50) + spacing (20) + (rows * widget height) + (rows-1 * spacing) + bottom margin (20) return (50 + 20 + (rows * 48) + ((rows - 1) * Style.marginS) + 20) * scaling } @@ -441,7 +448,9 @@ ColumnLayout { color: Color.mOnSurface } - Item { Layout.fillWidth: true } + Item { + Layout.fillWidth: true + } NComboBox { id: rightComboBox @@ -451,9 +460,9 @@ ColumnLayout { description: "" placeholder: "Add widget to right section" onSelected: key => { - addWidgetToSection(key, "right") - reset() // Reset selection - } + addWidgetToSection(key, "right") + reset() // Reset selection + } } } @@ -540,8 +549,6 @@ ColumnLayout { } } - - // Helper functions function addWidgetToSection(widgetName, section) { console.log("Adding widget", widgetName, "to section", section) @@ -551,7 +558,7 @@ ColumnLayout { var newArray = sectionArray.slice() newArray.push(widgetName) console.log("Widget added. New array:", JSON.stringify(newArray)) - + // Assign the new array Settings.data.bar.widgets[section] = newArray } @@ -565,7 +572,7 @@ ColumnLayout { var newArray = sectionArray.slice() newArray.splice(index, 1) console.log("Widget removed. New array:", JSON.stringify(newArray)) - + // Assign the new array Settings.data.bar.widgets[section] = newArray } @@ -574,16 +581,16 @@ ColumnLayout { function reorderWidgetInSection(section, fromIndex, toIndex) { console.log("Reordering widget in section", section, "from", fromIndex, "to", toIndex) var sectionArray = Settings.data.bar.widgets[section] - if (sectionArray && fromIndex >= 0 && fromIndex < sectionArray.length && - toIndex >= 0 && toIndex < sectionArray.length) { - + if (sectionArray && fromIndex >= 0 && fromIndex < sectionArray.length && toIndex >= 0 + && toIndex < sectionArray.length) { + // Create a new array to avoid modifying the original var newArray = sectionArray.slice() var item = newArray[fromIndex] newArray.splice(fromIndex, 1) newArray.splice(toIndex, 0, item) console.log("Widget reordered. New array:", JSON.stringify(newArray)) - + // Assign the new array Settings.data.bar.widgets[section] = newArray } @@ -593,28 +600,25 @@ ColumnLayout { WidgetLoader { id: widgetLoader } - + ListModel { id: availableWidgets } - + Component.onCompleted: { discoverWidgets() } - + // Automatically discover available widgets using WidgetLoader function discoverWidgets() { availableWidgets.clear() - + // Use WidgetLoader to discover available widgets const discoveredWidgets = widgetLoader.discoverAvailableWidgets() - + // Add discovered widgets to the ListModel discoveredWidgets.forEach(widget => { - availableWidgets.append(widget) - }) - - + availableWidgets.append(widget) + }) } - } diff --git a/Widgets/NComboBox.qml b/Widgets/NComboBox.qml index 21dc986..1cb33bb 100644 --- a/Widgets/NComboBox.qml +++ b/Widgets/NComboBox.qml @@ -37,8 +37,6 @@ ColumnLayout { return -1 } - - ComboBox { id: combo Layout.fillWidth: true @@ -64,9 +62,10 @@ ColumnLayout { font.pointSize: Style.fontSizeM * scaling verticalAlignment: Text.AlignVCenter elide: Text.ElideRight - color: (combo.currentIndex >= 0 && combo.currentIndex < root.model.count) ? Color.mOnSurface : Color.mOnSurfaceVariant - text: (combo.currentIndex >= 0 && combo.currentIndex < root.model.count) ? root.model.get( - combo.currentIndex).name : root.placeholder + color: (combo.currentIndex >= 0 + && combo.currentIndex < root.model.count) ? Color.mOnSurface : Color.mOnSurfaceVariant + text: (combo.currentIndex >= 0 + && combo.currentIndex < root.model.count) ? root.model.get(combo.currentIndex).name : root.placeholder } indicator: NIcon {