diff --git a/modules/nexus/PageCompRegistry.qml b/modules/nexus/PageCompRegistry.qml index dde05a62..53a53edd 100644 --- a/modules/nexus/PageCompRegistry.qml +++ b/modules/nexus/PageCompRegistry.qml @@ -11,6 +11,7 @@ import qs.modules.nexus.pages.audio import qs.modules.nexus.pages.bluetooth import qs.modules.nexus.pages.panels import qs.modules.nexus.pages.wallandstyle +import qs.modules.nexus.pages.panels.taskbar QtObject { id: root @@ -97,6 +98,23 @@ QtObject { Component { SidebarPanel {} } + + // Taskbar component sub-pages + Component { + BarWorkspaces {} + } + Component { + BarActiveWindow {} + } + Component { + BarTray {} + } + Component { + BarStatusIcons {} + } + Component { + BarClock {} + } } } ] diff --git a/modules/nexus/common/NavRow.qml b/modules/nexus/common/NavRow.qml new file mode 100644 index 00000000..f8f06eff --- /dev/null +++ b/modules/nexus/common/NavRow.qml @@ -0,0 +1,72 @@ +pragma ComponentBehavior: Bound + +import QtQuick +import QtQuick.Layouts +import Caelestia.Config +import qs.components +import qs.services +import qs.modules.nexus.common + +ConnectedRect { + id: root + + property alias icon: icon.text + property alias label: label.text + property alias status: status.text + + signal clicked + + Layout.fillWidth: true + implicitHeight: navLayout.implicitHeight + navLayout.anchors.margins * 2 + + StateLayer { + onClicked: root.clicked() + } + + RowLayout { + id: navLayout + + anchors.fill: parent + anchors.margins: Tokens.padding.medium + anchors.leftMargin: Tokens.padding.largeIncreased + anchors.rightMargin: Tokens.padding.largeIncreased + spacing: Tokens.spacing.medium + + MaterialIcon { + id: icon + + color: Colours.palette.m3onSurfaceVariant + font: Tokens.font.icon.medium + } + + ColumnLayout { + Layout.fillWidth: true + spacing: 0 + + StyledText { + id: label + + Layout.fillWidth: true + font: Tokens.font.body.small + elide: Text.ElideRight + } + + StyledText { + id: status + + Layout.fillWidth: true + visible: text + color: Colours.palette.m3outline + font: Tokens.font.label.small + elide: Text.ElideRight + animate: true + } + } + + MaterialIcon { + text: "chevron_right" + color: Colours.palette.m3onSurfaceVariant + font: Tokens.font.icon.medium + } + } +} diff --git a/modules/nexus/pages/PanelsPage.qml b/modules/nexus/pages/PanelsPage.qml index cdfa27b3..af4970a5 100644 --- a/modules/nexus/pages/PanelsPage.qml +++ b/modules/nexus/pages/PanelsPage.qml @@ -1,10 +1,5 @@ -pragma ComponentBehavior: Bound - -import QtQuick import QtQuick.Layouts import Caelestia.Config -import qs.components -import qs.services import qs.modules.nexus.common PageBase { @@ -23,21 +18,21 @@ PageBase { icon: "dashboard" label: qsTr("Dashboard") status: Config.dashboard.enabled ? qsTr("Enabled") : qsTr("Disabled") - target: 1 + onClicked: root.nState.openSubPage(1) } NavRow { icon: "dock_to_bottom" label: qsTr("Taskbar") status: Config.bar.persistent ? qsTr("Always visible") : qsTr("Reveal on hover") - target: 2 + onClicked: root.nState.openSubPage(2) } NavRow { icon: "apps" label: qsTr("Launcher") status: Config.launcher.enabled ? qsTr("Enabled") : qsTr("Disabled") - target: 3 + onClicked: root.nState.openSubPage(3) } NavRow { @@ -45,70 +40,7 @@ PageBase { icon: "dock_to_right" label: qsTr("Sidebar") status: Config.sidebar.enabled ? qsTr("Enabled") : qsTr("Disabled") - target: 4 - } - } - - component NavRow: ConnectedRect { - id: navRow - - property alias icon: icon.text - property alias label: label.text - property alias status: status.text - property int target - - Layout.fillWidth: true - implicitHeight: navLayout.implicitHeight + navLayout.anchors.topMargin + navLayout.anchors.bottomMargin - - StateLayer { - onClicked: root.nState.openSubPage(navRow.target) - } - - RowLayout { - id: navLayout - - anchors.fill: parent - anchors.leftMargin: Tokens.padding.largeIncreased - anchors.rightMargin: Tokens.padding.largeIncreased - anchors.topMargin: Tokens.padding.medium - anchors.bottomMargin: Tokens.padding.medium - spacing: Tokens.spacing.medium - - MaterialIcon { - id: icon - - color: Colours.palette.m3onSurfaceVariant - font: Tokens.font.icon.medium - } - - ColumnLayout { - Layout.fillWidth: true - spacing: 0 - - StyledText { - id: label - - Layout.fillWidth: true - font: Tokens.font.body.small - elide: Text.ElideRight - } - - StyledText { - id: status - - Layout.fillWidth: true - color: Colours.palette.m3outline - font: Tokens.font.label.small - elide: Text.ElideRight - animate: true - } - } - - MaterialIcon { - text: "chevron_right" - color: Colours.palette.m3onSurfaceVariant - font: Tokens.font.icon.medium - } + onClicked: root.nState.openSubPage(4) } } } diff --git a/modules/nexus/pages/panels/TaskbarPanel.qml b/modules/nexus/pages/panels/TaskbarPanel.qml index 9fc587ef..ff9101d1 100644 --- a/modules/nexus/pages/panels/TaskbarPanel.qml +++ b/modules/nexus/pages/panels/TaskbarPanel.qml @@ -1,9 +1,7 @@ pragma ComponentBehavior: Bound -import QtQuick import QtQuick.Layouts import Caelestia.Config -import qs.components import qs.modules.nexus.common PageBase { @@ -53,223 +51,46 @@ PageBase { onMoved: v => GlobalConfig.bar.dragThreshold = v } - // Workspaces + // Components SectionHeader { - text: qsTr("Workspaces") + text: qsTr("Components") } - StepperRow { - Layout.fillWidth: true + NavRow { first: true - label: qsTr("Shown") - subtext: qsTr("Number of workspaces displayed") - value: Config.bar.workspaces.shown - from: 1 - to: 20 - stepSize: 1 - onMoved: v => GlobalConfig.bar.workspaces.shown = v + icon: "workspaces" + label: qsTr("Workspaces") + status: qsTr("Indicators, window icons") + onClicked: root.nState.openSubPage(5) } - ToggleRow { - Layout.fillWidth: true - text: qsTr("Active indicator") - checked: Config.bar.workspaces.activeIndicator - onToggled: GlobalConfig.bar.workspaces.activeIndicator = checked + NavRow { + icon: "web_asset" + label: qsTr("Active window") + status: qsTr("Title display, popout") + onClicked: root.nState.openSubPage(6) } - ToggleRow { - Layout.fillWidth: true - text: qsTr("Active trail") - checked: Config.bar.workspaces.activeTrail - onToggled: GlobalConfig.bar.workspaces.activeTrail = checked + NavRow { + icon: "widgets" + label: qsTr("Tray") + status: qsTr("System tray icons") + onClicked: root.nState.openSubPage(7) } - ToggleRow { - Layout.fillWidth: true - text: qsTr("Occupied background") - checked: Config.bar.workspaces.occupiedBg - onToggled: GlobalConfig.bar.workspaces.occupiedBg = checked + NavRow { + icon: "signal_cellular_alt" + label: qsTr("Status icons") + status: qsTr("Visible indicators") + onClicked: root.nState.openSubPage(8) } - ToggleRow { - Layout.fillWidth: true - text: qsTr("Show windows") - subtext: qsTr("Show icons of open windows on each workspace") - checked: Config.bar.workspaces.showWindows - onToggled: GlobalConfig.bar.workspaces.showWindows = checked - } - - ToggleRow { - Layout.fillWidth: true - text: qsTr("Windows on special workspaces") - checked: Config.bar.workspaces.showWindowsOnSpecialWorkspaces - onToggled: GlobalConfig.bar.workspaces.showWindowsOnSpecialWorkspaces = checked - } - - StepperRow { - Layout.fillWidth: true - label: qsTr("Max window icons") - value: Config.bar.workspaces.maxWindowIcons - from: 0 - to: 20 - stepSize: 1 - onMoved: v => GlobalConfig.bar.workspaces.maxWindowIcons = v - } - - ToggleRow { - Layout.fillWidth: true + NavRow { last: true - text: qsTr("Per-monitor workspaces") - subtext: qsTr("Show each monitor's workspaces independently") - checked: GlobalConfig.bar.workspaces.perMonitorWorkspaces - onToggled: GlobalConfig.bar.workspaces.perMonitorWorkspaces = checked - } - - // Active window - SectionHeader { - text: qsTr("Active window") - } - - ToggleRow { - Layout.fillWidth: true - first: true - text: qsTr("Compact") - checked: Config.bar.activeWindow.compact - onToggled: GlobalConfig.bar.activeWindow.compact = checked - } - - ToggleRow { - Layout.fillWidth: true - text: qsTr("Inverted") - checked: Config.bar.activeWindow.inverted - onToggled: GlobalConfig.bar.activeWindow.inverted = checked - } - - ToggleRow { - Layout.fillWidth: true - last: true - text: qsTr("Show on hover") - checked: Config.bar.activeWindow.showOnHover - onToggled: GlobalConfig.bar.activeWindow.showOnHover = checked - } - - // Tray - SectionHeader { - text: qsTr("Tray") - } - - ToggleRow { - Layout.fillWidth: true - first: true - text: qsTr("Background") - checked: Config.bar.tray.background - onToggled: GlobalConfig.bar.tray.background = checked - } - - ToggleRow { - Layout.fillWidth: true - text: qsTr("Recolour icons") - checked: Config.bar.tray.recolour - onToggled: GlobalConfig.bar.tray.recolour = checked - } - - ToggleRow { - Layout.fillWidth: true - last: true - text: qsTr("Compact") - checked: Config.bar.tray.compact - onToggled: GlobalConfig.bar.tray.compact = checked - } - - // Status icons - SectionHeader { - text: qsTr("Status icons") - } - - ToggleRow { - Layout.fillWidth: true - first: true - text: qsTr("Speakers") - checked: Config.bar.status.showAudio - onToggled: GlobalConfig.bar.status.showAudio = checked - } - - ToggleRow { - Layout.fillWidth: true - text: qsTr("Microphone") - checked: Config.bar.status.showMicrophone - onToggled: GlobalConfig.bar.status.showMicrophone = checked - } - - ToggleRow { - Layout.fillWidth: true - text: qsTr("Keyboard layout") - checked: Config.bar.status.showKbLayout - onToggled: GlobalConfig.bar.status.showKbLayout = checked - } - - ToggleRow { - Layout.fillWidth: true - text: qsTr("Network") - checked: Config.bar.status.showNetwork - onToggled: GlobalConfig.bar.status.showNetwork = checked - } - - ToggleRow { - Layout.fillWidth: true - text: qsTr("Wi-Fi") - checked: Config.bar.status.showWifi - onToggled: GlobalConfig.bar.status.showWifi = checked - } - - ToggleRow { - Layout.fillWidth: true - text: qsTr("Bluetooth") - checked: Config.bar.status.showBluetooth - onToggled: GlobalConfig.bar.status.showBluetooth = checked - } - - ToggleRow { - Layout.fillWidth: true - text: qsTr("Battery") - checked: Config.bar.status.showBattery - onToggled: GlobalConfig.bar.status.showBattery = checked - } - - ToggleRow { - Layout.fillWidth: true - last: true - text: qsTr("Caps lock") - checked: Config.bar.status.showLockStatus - onToggled: GlobalConfig.bar.status.showLockStatus = checked - } - - // Clock - SectionHeader { - text: qsTr("Clock") - } - - ToggleRow { - Layout.fillWidth: true - first: true - text: qsTr("Background") - checked: Config.bar.clock.background - onToggled: GlobalConfig.bar.clock.background = checked - } - - ToggleRow { - Layout.fillWidth: true - text: qsTr("Show date") - checked: Config.bar.clock.showDate - onToggled: GlobalConfig.bar.clock.showDate = checked - } - - ToggleRow { - Layout.fillWidth: true - last: true - text: qsTr("Show icon") - checked: Config.bar.clock.showIcon - onToggled: GlobalConfig.bar.clock.showIcon = checked + icon: "schedule" + label: qsTr("Clock") + status: qsTr("Date, icon, background") + onClicked: root.nState.openSubPage(9) } // Scroll actions @@ -300,33 +121,5 @@ PageBase { checked: Config.bar.scrollActions.brightness onToggled: GlobalConfig.bar.scrollActions.brightness = checked } - - // Popouts - SectionHeader { - text: qsTr("Popouts") - } - - ToggleRow { - Layout.fillWidth: true - first: true - text: qsTr("Active window") - checked: Config.bar.popouts.activeWindow - onToggled: GlobalConfig.bar.popouts.activeWindow = checked - } - - ToggleRow { - Layout.fillWidth: true - text: qsTr("Tray") - checked: Config.bar.popouts.tray - onToggled: GlobalConfig.bar.popouts.tray = checked - } - - ToggleRow { - Layout.fillWidth: true - last: true - text: qsTr("Status icons") - checked: Config.bar.popouts.statusIcons - onToggled: GlobalConfig.bar.popouts.statusIcons = checked - } } } diff --git a/modules/nexus/pages/panels/taskbar/BarActiveWindow.qml b/modules/nexus/pages/panels/taskbar/BarActiveWindow.qml new file mode 100644 index 00000000..e61685e1 --- /dev/null +++ b/modules/nexus/pages/panels/taskbar/BarActiveWindow.qml @@ -0,0 +1,51 @@ +pragma ComponentBehavior: Bound + +import QtQuick.Layouts +import Caelestia.Config +import qs.modules.nexus.common + +PageBase { + id: root + + title: qsTr("Active window") + isSubPage: true + + ColumnLayout { + anchors.horizontalCenter: parent.horizontalCenter + anchors.top: parent.top + width: root.cappedWidth + spacing: Tokens.spacing.extraSmall / 2 + + ToggleRow { + Layout.fillWidth: true + first: true + text: qsTr("Compact") + checked: Config.bar.activeWindow.compact + onToggled: GlobalConfig.bar.activeWindow.compact = checked + } + + ToggleRow { + Layout.fillWidth: true + text: qsTr("Inverted") + checked: Config.bar.activeWindow.inverted + onToggled: GlobalConfig.bar.activeWindow.inverted = checked + } + + ToggleRow { + Layout.fillWidth: true + text: qsTr("Show on hover") + subtext: qsTr("Only show the active window title while hovering") + checked: Config.bar.activeWindow.showOnHover + onToggled: GlobalConfig.bar.activeWindow.showOnHover = checked + } + + ToggleRow { + Layout.fillWidth: true + last: true + text: qsTr("Popout on hover") + subtext: qsTr("Show a window details popout when hovering") + checked: Config.bar.popouts.activeWindow + onToggled: GlobalConfig.bar.popouts.activeWindow = checked + } + } +} diff --git a/modules/nexus/pages/panels/taskbar/BarClock.qml b/modules/nexus/pages/panels/taskbar/BarClock.qml new file mode 100644 index 00000000..b4291b00 --- /dev/null +++ b/modules/nexus/pages/panels/taskbar/BarClock.qml @@ -0,0 +1,42 @@ +pragma ComponentBehavior: Bound + +import QtQuick.Layouts +import Caelestia.Config +import qs.modules.nexus.common + +PageBase { + id: root + + title: qsTr("Clock") + isSubPage: true + + ColumnLayout { + anchors.horizontalCenter: parent.horizontalCenter + anchors.top: parent.top + width: root.cappedWidth + spacing: Tokens.spacing.extraSmall / 2 + + ToggleRow { + Layout.fillWidth: true + first: true + text: qsTr("Background") + checked: Config.bar.clock.background + onToggled: GlobalConfig.bar.clock.background = checked + } + + ToggleRow { + Layout.fillWidth: true + text: qsTr("Show date") + checked: Config.bar.clock.showDate + onToggled: GlobalConfig.bar.clock.showDate = checked + } + + ToggleRow { + Layout.fillWidth: true + last: true + text: qsTr("Show icon") + checked: Config.bar.clock.showIcon + onToggled: GlobalConfig.bar.clock.showIcon = checked + } + } +} diff --git a/modules/nexus/pages/panels/taskbar/BarStatusIcons.qml b/modules/nexus/pages/panels/taskbar/BarStatusIcons.qml new file mode 100644 index 00000000..0b9c2631 --- /dev/null +++ b/modules/nexus/pages/panels/taskbar/BarStatusIcons.qml @@ -0,0 +1,98 @@ +pragma ComponentBehavior: Bound + +import QtQuick.Layouts +import Caelestia.Config +import qs.modules.nexus.common + +PageBase { + id: root + + title: qsTr("Status icons") + isSubPage: true + + ColumnLayout { + anchors.horizontalCenter: parent.horizontalCenter + anchors.top: parent.top + width: root.cappedWidth + spacing: Tokens.spacing.extraSmall / 2 + + // Visible icons + SectionHeader { + first: true + text: qsTr("Visible icons") + } + + ToggleRow { + Layout.fillWidth: true + first: true + text: qsTr("Speakers") + checked: Config.bar.status.showAudio + onToggled: GlobalConfig.bar.status.showAudio = checked + } + + ToggleRow { + Layout.fillWidth: true + text: qsTr("Microphone") + checked: Config.bar.status.showMicrophone + onToggled: GlobalConfig.bar.status.showMicrophone = checked + } + + ToggleRow { + Layout.fillWidth: true + text: qsTr("Keyboard layout") + checked: Config.bar.status.showKbLayout + onToggled: GlobalConfig.bar.status.showKbLayout = checked + } + + ToggleRow { + Layout.fillWidth: true + text: qsTr("Network") + checked: Config.bar.status.showNetwork + onToggled: GlobalConfig.bar.status.showNetwork = checked + } + + ToggleRow { + Layout.fillWidth: true + text: qsTr("Wi-Fi") + checked: Config.bar.status.showWifi + onToggled: GlobalConfig.bar.status.showWifi = checked + } + + ToggleRow { + Layout.fillWidth: true + text: qsTr("Bluetooth") + checked: Config.bar.status.showBluetooth + onToggled: GlobalConfig.bar.status.showBluetooth = checked + } + + ToggleRow { + Layout.fillWidth: true + text: qsTr("Battery") + checked: Config.bar.status.showBattery + onToggled: GlobalConfig.bar.status.showBattery = checked + } + + ToggleRow { + Layout.fillWidth: true + last: true + text: qsTr("Caps lock") + checked: Config.bar.status.showLockStatus + onToggled: GlobalConfig.bar.status.showLockStatus = checked + } + + // Behaviour + SectionHeader { + text: qsTr("Behaviour") + } + + ToggleRow { + Layout.fillWidth: true + first: true + last: true + text: qsTr("Popout on hover") + subtext: qsTr("Show a details popout when hovering the status icons") + checked: Config.bar.popouts.statusIcons + onToggled: GlobalConfig.bar.popouts.statusIcons = checked + } + } +} diff --git a/modules/nexus/pages/panels/taskbar/BarTray.qml b/modules/nexus/pages/panels/taskbar/BarTray.qml new file mode 100644 index 00000000..3d00196e --- /dev/null +++ b/modules/nexus/pages/panels/taskbar/BarTray.qml @@ -0,0 +1,50 @@ +pragma ComponentBehavior: Bound + +import QtQuick.Layouts +import Caelestia.Config +import qs.modules.nexus.common + +PageBase { + id: root + + title: qsTr("Tray") + isSubPage: true + + ColumnLayout { + anchors.horizontalCenter: parent.horizontalCenter + anchors.top: parent.top + width: root.cappedWidth + spacing: Tokens.spacing.extraSmall / 2 + + ToggleRow { + Layout.fillWidth: true + first: true + text: qsTr("Background") + checked: Config.bar.tray.background + onToggled: GlobalConfig.bar.tray.background = checked + } + + ToggleRow { + Layout.fillWidth: true + text: qsTr("Recolour icons") + checked: Config.bar.tray.recolour + onToggled: GlobalConfig.bar.tray.recolour = checked + } + + ToggleRow { + Layout.fillWidth: true + text: qsTr("Compact") + checked: Config.bar.tray.compact + onToggled: GlobalConfig.bar.tray.compact = checked + } + + ToggleRow { + Layout.fillWidth: true + last: true + text: qsTr("Popout on hover") + subtext: qsTr("Show the tray menu popout when hovering") + checked: Config.bar.popouts.tray + onToggled: GlobalConfig.bar.popouts.tray = checked + } + } +} diff --git a/modules/nexus/pages/panels/taskbar/BarWorkspaces.qml b/modules/nexus/pages/panels/taskbar/BarWorkspaces.qml new file mode 100644 index 00000000..d1388f58 --- /dev/null +++ b/modules/nexus/pages/panels/taskbar/BarWorkspaces.qml @@ -0,0 +1,86 @@ +pragma ComponentBehavior: Bound + +import QtQuick.Layouts +import Caelestia.Config +import qs.modules.nexus.common + +PageBase { + id: root + + title: qsTr("Workspaces") + isSubPage: true + + ColumnLayout { + anchors.horizontalCenter: parent.horizontalCenter + anchors.top: parent.top + width: root.cappedWidth + spacing: Tokens.spacing.extraSmall / 2 + + StepperRow { + Layout.fillWidth: true + first: true + label: qsTr("Shown") + subtext: qsTr("Number of workspaces displayed") + value: Config.bar.workspaces.shown + from: 1 + to: 20 + stepSize: 1 + onMoved: v => GlobalConfig.bar.workspaces.shown = v + } + + ToggleRow { + Layout.fillWidth: true + text: qsTr("Active indicator") + checked: Config.bar.workspaces.activeIndicator + onToggled: GlobalConfig.bar.workspaces.activeIndicator = checked + } + + ToggleRow { + Layout.fillWidth: true + text: qsTr("Active trail") + checked: Config.bar.workspaces.activeTrail + onToggled: GlobalConfig.bar.workspaces.activeTrail = checked + } + + ToggleRow { + Layout.fillWidth: true + text: qsTr("Occupied background") + checked: Config.bar.workspaces.occupiedBg + onToggled: GlobalConfig.bar.workspaces.occupiedBg = checked + } + + ToggleRow { + Layout.fillWidth: true + text: qsTr("Show windows") + subtext: qsTr("Show icons of open windows on each workspace") + checked: Config.bar.workspaces.showWindows + onToggled: GlobalConfig.bar.workspaces.showWindows = checked + } + + ToggleRow { + Layout.fillWidth: true + text: qsTr("Windows on special workspaces") + checked: Config.bar.workspaces.showWindowsOnSpecialWorkspaces + onToggled: GlobalConfig.bar.workspaces.showWindowsOnSpecialWorkspaces = checked + } + + StepperRow { + Layout.fillWidth: true + label: qsTr("Max window icons") + value: Config.bar.workspaces.maxWindowIcons + from: 0 + to: 20 + stepSize: 1 + onMoved: v => GlobalConfig.bar.workspaces.maxWindowIcons = v + } + + ToggleRow { + Layout.fillWidth: true + last: true + text: qsTr("Per-monitor workspaces") + subtext: qsTr("Show each monitor's workspaces independently") + checked: GlobalConfig.bar.workspaces.perMonitorWorkspaces + onToggled: GlobalConfig.bar.workspaces.perMonitorWorkspaces = checked + } + } +}