diff options
| -rw-r--r-- | config/Config.qml | 3 | ||||
| -rw-r--r-- | config/DashboardConfig.qml | 4 | ||||
| -rw-r--r-- | modules/controlcenter/dashboard/DashboardPane.qml | 20 | ||||
| -rw-r--r-- | modules/controlcenter/dashboard/GeneralSection.qml | 105 | ||||
| -rw-r--r-- | modules/controlcenter/dashboard/PerformanceSection.qml | 45 | ||||
| -rw-r--r-- | modules/dashboard/Content.qml | 108 | ||||
| -rw-r--r-- | modules/dashboard/Tabs.qml | 36 | ||||
| -rw-r--r-- | modules/dashboard/Wrapper.qml | 1 |
8 files changed, 219 insertions, 103 deletions
diff --git a/config/Config.qml b/config/Config.qml index 8c01014..fe07286 100644 --- a/config/Config.qml +++ b/config/Config.qml @@ -258,7 +258,8 @@ Singleton { return { enabled: dashboard.enabled, showOnHover: dashboard.showOnHover, - updateInterval: dashboard.updateInterval, + mediaUpdateInterval: dashboard.mediaUpdateInterval, + resourceUpdateInterval: dashboard.resourceUpdateInterval, dragThreshold: dashboard.dragThreshold, performance: { showBattery: dashboard.performance.showBattery, diff --git a/config/DashboardConfig.qml b/config/DashboardConfig.qml index e089550..0a16cc1 100644 --- a/config/DashboardConfig.qml +++ b/config/DashboardConfig.qml @@ -6,6 +6,10 @@ JsonObject { property int mediaUpdateInterval: 500 property int resourceUpdateInterval: 1000 property int dragThreshold: 50 + property bool showDashboard: true + property bool showMedia: true + property bool showPerformance: true + property bool showWeather: true property Sizes sizes: Sizes {} property Performance performance: Performance {} diff --git a/modules/controlcenter/dashboard/DashboardPane.qml b/modules/controlcenter/dashboard/DashboardPane.qml index 72e3e6e..df29f09 100644 --- a/modules/controlcenter/dashboard/DashboardPane.qml +++ b/modules/controlcenter/dashboard/DashboardPane.qml @@ -22,15 +22,22 @@ Item { // General Settings property bool enabled: Config.dashboard.enabled ?? true property bool showOnHover: Config.dashboard.showOnHover ?? true - property int updateInterval: Config.dashboard.updateInterval ?? 1000 + property int mediaUpdateInterval: Config.dashboard.mediaUpdateInterval ?? 1000 + property int resourceUpdateInterval: Config.dashboard.resourceUpdateInterval ?? 1000 property int dragThreshold: Config.dashboard.dragThreshold ?? 50 - + + // Dashboard Tabs + property bool showDashboard: Config.dashboard.showDashboard ?? true + property bool showMedia: Config.dashboard.showMedia ?? true + property bool showPerformance: Config.dashboard.showPerformance ?? true + property bool showWeather: Config.dashboard.showWeather ?? true + // Performance Resources property bool showBattery: Config.dashboard.performance.showBattery ?? false property bool showGpu: Config.dashboard.performance.showGpu ?? true property bool showCpu: Config.dashboard.performance.showCpu ?? true property bool showMemory: Config.dashboard.performance.showMemory ?? true - property bool showStorage: Config.dashboard.performance.showStorage ?? true + property bool showStorage: Config.dashboard.performance.showStorage ?? true property bool showNetwork: Config.dashboard.performance.showNetwork ?? true anchors.fill: parent @@ -38,8 +45,13 @@ Item { function saveConfig() { Config.dashboard.enabled = root.enabled; Config.dashboard.showOnHover = root.showOnHover; - Config.dashboard.updateInterval = root.updateInterval; + Config.dashboard.mediaUpdateInterval = root.mediaUpdateInterval; + Config.dashboard.resourceUpdateInterval = root.resourceUpdateInterval; Config.dashboard.dragThreshold = root.dragThreshold; + Config.dashboard.showDashboard = root.showDashboard; + Config.dashboard.showMedia = root.showMedia; + Config.dashboard.showPerformance = root.showPerformance; + Config.dashboard.showWeather = root.showWeather; Config.dashboard.performance.showBattery = root.showBattery; Config.dashboard.performance.showGpu = root.showGpu; Config.dashboard.performance.showCpu = root.showCpu; diff --git a/modules/controlcenter/dashboard/GeneralSection.qml b/modules/controlcenter/dashboard/GeneralSection.qml index bf54e97..95e7531 100644 --- a/modules/controlcenter/dashboard/GeneralSection.qml +++ b/modules/controlcenter/dashboard/GeneralSection.qml @@ -38,44 +38,91 @@ SectionContainer { } } - SectionContainer { - contentSpacing: Appearance.spacing.normal + RowLayout { + Layout.fillWidth: true + spacing: Appearance.spacing.normal - SliderInput { + SwitchRow { Layout.fillWidth: true - - label: qsTr("Update interval") - value: root.rootItem.updateInterval - from: 100 - to: 10000 - stepSize: 100 - suffix: "ms" - validator: IntValidator { bottom: 100; top: 10000 } - formatValueFunction: (val) => Math.round(val).toString() - parseValueFunction: (text) => parseInt(text) - - onValueModified: (newValue) => { - root.rootItem.updateInterval = Math.round(newValue); + label: qsTr("Show Dashboard tab") + checked: root.rootItem.showDashboard + onToggled: checked => { + root.rootItem.showDashboard = checked; root.rootItem.saveConfig(); } } - SliderInput { + SwitchRow { Layout.fillWidth: true - - label: qsTr("Drag threshold") - value: root.rootItem.dragThreshold - from: 0 - to: 100 - suffix: "px" - validator: IntValidator { bottom: 0; top: 100 } - formatValueFunction: (val) => Math.round(val).toString() - parseValueFunction: (text) => parseInt(text) - - onValueModified: (newValue) => { - root.rootItem.dragThreshold = Math.round(newValue); + label: qsTr("Show Media tab") + checked: root.rootItem.showMedia + onToggled: checked => { + root.rootItem.showMedia = checked; root.rootItem.saveConfig(); } } + + SwitchRow { + Layout.fillWidth: true + label: qsTr("Show Performance tab") + checked: root.rootItem.showPerformance + onToggled: checked => { + root.rootItem.showPerformance = checked; + root.rootItem.saveConfig(); + } + } + + SwitchRow { + Layout.fillWidth: true + label: qsTr("Show Weather tab") + checked: root.rootItem.showWeather + onToggled: checked => { + root.rootItem.showWeather = checked; + root.rootItem.saveConfig(); + } + } + } + + SliderInput { + Layout.fillWidth: true + + label: qsTr("Media update interval") + value: root.rootItem.mediaUpdateInterval + from: 100 + to: 10000 + stepSize: 100 + suffix: "ms" + validator: IntValidator { + bottom: 100 + top: 10000 + } + formatValueFunction: val => Math.round(val).toString() + parseValueFunction: text => parseInt(text) + + onValueModified: newValue => { + root.rootItem.mediaUpdateInterval = Math.round(newValue); + root.rootItem.saveConfig(); + } + } + + SliderInput { + Layout.fillWidth: true + + label: qsTr("Drag threshold") + value: root.rootItem.dragThreshold + from: 0 + to: 100 + suffix: "px" + validator: IntValidator { + bottom: 0 + top: 100 + } + formatValueFunction: val => Math.round(val).toString() + parseValueFunction: text => parseInt(text) + + onValueModified: newValue => { + root.rootItem.dragThreshold = Math.round(newValue); + root.rootItem.saveConfig(); + } } } diff --git a/modules/controlcenter/dashboard/PerformanceSection.qml b/modules/controlcenter/dashboard/PerformanceSection.qml index 7e72782..ac84752 100644 --- a/modules/controlcenter/dashboard/PerformanceSection.qml +++ b/modules/controlcenter/dashboard/PerformanceSection.qml @@ -33,7 +33,7 @@ SectionContainer { opts.push({ "label": qsTr("Battery"), "propertyName": "showBattery", - "onToggled": function(checked) { + "onToggled": function (checked) { root.rootItem.showBattery = checked; root.rootItem.saveConfig(); } @@ -41,39 +41,39 @@ SectionContainer { if (root.gpuAvailable) opts.push({ - "label": qsTr("GPU"), - "propertyName": "showGpu", - "onToggled": function(checked) { - root.rootItem.showGpu = checked; - root.rootItem.saveConfig(); - } - }); + "label": qsTr("GPU"), + "propertyName": "showGpu", + "onToggled": function (checked) { + root.rootItem.showGpu = checked; + root.rootItem.saveConfig(); + } + }); opts.push({ "label": qsTr("CPU"), "propertyName": "showCpu", - "onToggled": function(checked) { + "onToggled": function (checked) { root.rootItem.showCpu = checked; root.rootItem.saveConfig(); } }, { "label": qsTr("Memory"), "propertyName": "showMemory", - "onToggled": function(checked) { + "onToggled": function (checked) { root.rootItem.showMemory = checked; root.rootItem.saveConfig(); } }, { "label": qsTr("Storage"), "propertyName": "showStorage", - "onToggled": function(checked) { + "onToggled": function (checked) { root.rootItem.showStorage = checked; root.rootItem.saveConfig(); } }, { "label": qsTr("Network"), "propertyName": "showNetwork", - "onToggled": function(checked) { + "onToggled": function (checked) { root.rootItem.showNetwork = checked; root.rootItem.saveConfig(); } @@ -82,4 +82,25 @@ SectionContainer { } } + SliderInput { + Layout.fillWidth: true + + label: qsTr("Resource update interval") + value: root.rootItem.resourceUpdateInterval + from: 100 + to: 10000 + stepSize: 100 + suffix: "ms" + validator: IntValidator { + bottom: 100 + top: 10000 + } + formatValueFunction: val => Math.round(val).toString() + parseValueFunction: text => parseInt(text) + + onValueModified: newValue => { + root.rootItem.resourceUpdateInterval = Math.round(newValue); + root.rootItem.saveConfig(); + } + } } diff --git a/modules/dashboard/Content.qml b/modules/dashboard/Content.qml index 1cc960a..bbb4272 100644 --- a/modules/dashboard/Content.qml +++ b/modules/dashboard/Content.qml @@ -14,6 +14,37 @@ Item { required property PersistentProperties visibilities required property PersistentProperties state required property FileDialog facePicker + + readonly property var dashboardTabs: { + const allTabs = [ + { + component: dashComponent, + iconName: "dashboard", + text: qsTr("Dashboard"), + enabled: Config.dashboard.showDashboard + }, + { + component: mediaComponent, + iconName: "queue_music", + text: qsTr("Media"), + enabled: Config.dashboard.showMedia + }, + { + component: performanceComponent, + iconName: "speed", + text: qsTr("Performance"), + enabled: Config.dashboard.showPerformance && (Config.dashboard.performance.showCpu || Config.dashboard.performance.showGpu || Config.dashboard.performance.showMemory || Config.dashboard.performance.showStorage || Config.dashboard.performance.showNetwork || Config.dashboard.performance.showBattery) + }, + { + component: weatherComponent, + iconName: "cloud", + text: qsTr("Weather"), + enabled: Config.dashboard.showWeather + } + ]; + return allTabs.filter(tab => tab.enabled); + } + readonly property real nonAnimWidth: view.implicitWidth + viewWrapper.anchors.margins * 2 readonly property real nonAnimHeight: tabs.implicitHeight + tabs.anchors.topMargin + view.implicitHeight + viewWrapper.anchors.margins * 2 @@ -31,6 +62,7 @@ Item { nonAnimWidth: root.nonAnimWidth - anchors.margins * 2 state: root.state + tabs: root.dashboardTabs } ClippingRectangle { @@ -86,33 +118,58 @@ Item { RowLayout { id: row - Pane { - index: 0 - sourceComponent: Dash { - visibilities: root.visibilities - state: root.state - facePicker: root.facePicker + Repeater { + model: ScriptModel { + values: root.dashboardTabs } - } - Pane { - index: 1 - sourceComponent: Media { - visibilities: root.visibilities + delegate: Loader { + id: paneLoader + + required property int index + required property var modelData + + Layout.alignment: Qt.AlignTop + + sourceComponent: modelData.component + + Component.onCompleted: active = Qt.binding(() => { + if (index === view.currentIndex) + return true; + const vx = Math.floor(view.visibleArea.xPosition * view.contentWidth); + const vex = Math.floor(vx + view.visibleArea.widthRatio * view.contentWidth); + return (vx >= x && vx <= x + implicitWidth) || (vex >= x && vex <= x + implicitWidth); + }) } } + } - Pane { - index: 2 - sourceComponent: Performance {} + Component { + id: dashComponent + Dash { + visibilities: root.visibilities + state: root.state + facePicker: root.facePicker } + } - Pane { - index: 3 - sourceComponent: Weather {} + Component { + id: mediaComponent + Media { + visibilities: root.visibilities } } + Component { + id: performanceComponent + Performance {} + } + + Component { + id: weatherComponent + Weather {} + } + Behavior on contentX { Anim {} } @@ -132,21 +189,4 @@ Item { easing.bezierCurve: Appearance.anim.curves.emphasized } } - - component Pane: Loader { - id: pane - - required property int index - - Layout.alignment: Qt.AlignTop - - Component.onCompleted: active = Qt.binding(() => { - // Always keep current tab loaded - if (pane.index === view.currentIndex) - return true; - const vx = Math.floor(view.visibleArea.xPosition * view.contentWidth); - const vex = Math.floor(vx + view.visibleArea.widthRatio * view.contentWidth); - return (vx >= x && vx <= x + implicitWidth) || (vex >= x && vex <= x + implicitWidth); - }) - } } diff --git a/modules/dashboard/Tabs.qml b/modules/dashboard/Tabs.qml index 1d50d26..ed4613d 100644 --- a/modules/dashboard/Tabs.qml +++ b/modules/dashboard/Tabs.qml @@ -14,6 +14,8 @@ Item { required property real nonAnimWidth required property PersistentProperties state + required property var tabs + readonly property alias count: bar.count implicitHeight: bar.implicitHeight + indicator.implicitHeight + indicator.anchors.topMargin + separator.implicitHeight @@ -30,30 +32,18 @@ Item { onCurrentIndexChanged: root.state.currentTab = currentIndex - Tab { - iconName: "dashboard" - text: qsTr("Dashboard") - } - - Tab { - iconName: "queue_music" - text: qsTr("Media") - } + Repeater { + model: ScriptModel { + values: root.tabs + } - Tab { - iconName: "speed" - text: qsTr("Performance") - } + delegate: Tab { + required property var modelData - Tab { - iconName: "cloud" - text: qsTr("Weather") + iconName: modelData.iconName + text: modelData.text + } } - - // Tab { - // iconName: "workspaces" - // text: qsTr("Workspaces") - // } } Item { @@ -62,11 +52,13 @@ Item { anchors.top: bar.bottom anchors.topMargin: 5 - implicitWidth: bar.currentItem.implicitWidth + implicitWidth: bar.currentItem?.implicitWidth ?? 0 implicitHeight: 3 x: { const tab = bar.currentItem; + if (!tab) + return 0; const width = (root.nonAnimWidth - bar.spacing * (bar.count - 1)) / bar.count; return width * tab.TabBar.index + (width - tab.implicitWidth) / 2; } diff --git a/modules/dashboard/Wrapper.qml b/modules/dashboard/Wrapper.qml index 0e37909..81bfcd3 100644 --- a/modules/dashboard/Wrapper.qml +++ b/modules/dashboard/Wrapper.qml @@ -82,7 +82,6 @@ Item { running: true interval: Appearance.anim.durations.extraLarge onTriggered: { - content.active = Qt.binding(() => (root.visibilities.dashboard && Config.dashboard.enabled) || root.visible); content.visible = true; } } |