diff options
Diffstat (limited to 'modules/utilities')
| -rw-r--r-- | modules/utilities/Content.qml | 30 | ||||
| -rw-r--r-- | modules/utilities/Wrapper.qml | 15 | ||||
| -rw-r--r-- | modules/utilities/cards/IdleInhibit.qml | 122 | ||||
| -rw-r--r-- | modules/utilities/cards/Toggles.qml | 144 |
4 files changed, 285 insertions, 26 deletions
diff --git a/modules/utilities/Content.qml b/modules/utilities/Content.qml index 49fdaa4..bcac9b8 100644 --- a/modules/utilities/Content.qml +++ b/modules/utilities/Content.qml @@ -1,31 +1,17 @@ -import qs.components -import qs.services +import "cards" import qs.config -import Quickshell -import Quickshell.Widgets -import QtQuick +import QtQuick.Layouts -Item { +ColumnLayout { id: root - anchors.top: parent.top - anchors.bottom: parent.bottom - anchors.right: parent.right + required property var visibilities - // implicitWidth: 300 - // implicitHeight: 100 + spacing: Appearance.spacing.normal - // Rectangle { - // anchors.fill: parent - // } + IdleInhibit {} - Behavior on implicitHeight { - Anim {} - } - - component Anim: NumberAnimation { - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.type: Easing.BezierSpline - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + Toggles { + visibilities: root.visibilities } } diff --git a/modules/utilities/Wrapper.qml b/modules/utilities/Wrapper.qml index 1da4c67..a5637a4 100644 --- a/modules/utilities/Wrapper.qml +++ b/modules/utilities/Wrapper.qml @@ -5,18 +5,18 @@ import QtQuick Item { id: root - required property bool visibility + required property var visibilities visible: height > 0 implicitHeight: 0 - implicitWidth: content.implicitWidth + implicitWidth: Config.utilities.sizes.width states: State { name: "visible" - when: root.visibility + when: root.visibilities.utilities PropertyChanges { - root.implicitHeight: content.implicitHeight + root.implicitHeight: content.implicitHeight + Appearance.padding.large * 2 } } @@ -46,5 +46,12 @@ Item { Content { id: content + + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + anchors.margins: Appearance.padding.large + + visibilities: root.visibilities } } diff --git a/modules/utilities/cards/IdleInhibit.qml b/modules/utilities/cards/IdleInhibit.qml new file mode 100644 index 0000000..87f6211 --- /dev/null +++ b/modules/utilities/cards/IdleInhibit.qml @@ -0,0 +1,122 @@ +import qs.components +import qs.components.controls +import qs.services +import qs.config +import QtQuick +import QtQuick.Layouts + +StyledRect { + id: root + + Layout.fillWidth: true + implicitHeight: layout.implicitHeight + (IdleInhibitor.enabled ? activeChip.implicitHeight + activeChip.anchors.topMargin : 0) + Appearance.padding.large * 2 + + radius: Appearance.rounding.normal + color: Colours.palette.m3surfaceContainer + clip: true + + RowLayout { + id: layout + + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + anchors.margins: Appearance.padding.large + spacing: Appearance.spacing.normal + + StyledRect { + implicitWidth: implicitHeight + implicitHeight: icon.implicitHeight + Appearance.padding.smaller * 2 + + radius: Appearance.rounding.full + color: IdleInhibitor.enabled ? Colours.palette.m3secondary : Colours.palette.m3secondaryContainer + + MaterialIcon { + id: icon + + anchors.centerIn: parent + text: "coffee" + color: IdleInhibitor.enabled ? Colours.palette.m3onSecondary : Colours.palette.m3onSecondaryContainer + font.pointSize: Appearance.font.size.large + } + } + + ColumnLayout { + Layout.fillWidth: true + spacing: 0 + + StyledText { + Layout.fillWidth: true + text: qsTr("Keep Awake") + font.pointSize: Appearance.font.size.normal + elide: Text.ElideRight + } + + StyledText { + Layout.fillWidth: true + text: IdleInhibitor.enabled ? qsTr("Preventing sleep mode") : qsTr("Normal power management") + color: Colours.palette.m3onSurfaceVariant + font.pointSize: Appearance.font.size.small + elide: Text.ElideRight + } + } + + StyledSwitch { + checked: IdleInhibitor.enabled + onToggled: IdleInhibitor.enabled = checked + } + } + + Loader { + id: activeChip + + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.topMargin: Appearance.spacing.larger + anchors.bottomMargin: IdleInhibitor.enabled ? Appearance.padding.large : -implicitHeight + anchors.leftMargin: Appearance.padding.large + + opacity: IdleInhibitor.enabled ? 1 : 0 + scale: IdleInhibitor.enabled ? 1 : 0.5 + + Component.onCompleted: active = Qt.binding(() => opacity > 0) + + sourceComponent: StyledRect { + implicitWidth: activeText.implicitWidth + Appearance.padding.normal * 2 + implicitHeight: activeText.implicitHeight + Appearance.padding.small * 2 + + radius: Appearance.rounding.full + color: Colours.palette.m3primary + + StyledText { + id: activeText + + anchors.centerIn: parent + text: qsTr("Active since %1").arg(Qt.formatTime(IdleInhibitor.enabledSince, Config.services.useTwelveHourClock ? "hh:mm a" : "hh:mm")) + color: Colours.palette.m3onPrimary + font.pointSize: Math.round(Appearance.font.size.small * 0.9) + } + } + + Behavior on anchors.bottomMargin { + Anim { + duration: Appearance.anim.durations.expressiveDefaultSpatial + easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial + } + } + + Behavior on opacity { + Anim { + duration: Appearance.anim.durations.small + } + } + + Behavior on scale { + Anim {} + } + } + + Behavior on implicitHeight { + Anim {} + } +} diff --git a/modules/utilities/cards/Toggles.qml b/modules/utilities/cards/Toggles.qml new file mode 100644 index 0000000..8e4dfb5 --- /dev/null +++ b/modules/utilities/cards/Toggles.qml @@ -0,0 +1,144 @@ +import qs.components +import qs.services +import qs.config +import qs.modules.controlcenter +import Quickshell +import Quickshell.Bluetooth +import QtQuick +import QtQuick.Layouts + +StyledRect { + id: root + + required property var visibilities + + Layout.fillWidth: true + implicitHeight: layout.implicitHeight + Appearance.padding.large * 2 + + radius: Appearance.rounding.normal + color: Colours.palette.m3surfaceContainer + + GridLayout { + id: layout + + anchors.fill: parent + anchors.margins: Appearance.padding.large + + columns: 2 + rowSpacing: Appearance.spacing.normal + columnSpacing: Appearance.spacing.normal + uniformCellWidths: true + + StyledText { + Layout.columnSpan: 2 + text: qsTr("Quick Toggles") + font.pointSize: Appearance.font.size.normal + } + + Toggle { + icon: "wifi" + text: qsTr("WiFi") + checked: Network.wifiEnabled + + function onClicked(): void { + Network.toggleWifi(); + } + } + + Toggle { + icon: "bluetooth" + text: qsTr("Bluetooth") + checked: Bluetooth.defaultAdapter?.enabled ?? false + + function onClicked(): void { + const adapter = Bluetooth.defaultAdapter; + if (adapter) + adapter.enabled = !adapter.enabled; + } + } + + Toggle { + icon: "mic" + text: qsTr("Microphone") + checked: !Audio.sourceMuted + + function onClicked(): void { + const audio = Audio.source?.audio; + if (audio) + audio.muted = !audio.muted; + } + } + + Toggle { + icon: "settings" + text: qsTr("Settings") + toggle: false + + function onClicked(): void { + root.visibilities.utilities = false; + WindowFactory.create(null, { + screen: QsWindow.window?.screen ?? null + }); + } + } + } + + component Toggle: StyledRect { + id: toggle + + required property string icon + required property string text + property bool checked + property bool toggle + property bool internalChecked + + function onClicked(): void { + } + + onCheckedChanged: internalChecked = checked + + radius: internalChecked ? Appearance.rounding.small : implicitHeight / 2 + color: internalChecked ? Colours.palette.m3primary : Colours.palette.m3surfaceContainerHigh + + Layout.fillWidth: true + implicitWidth: label.implicitWidth + Appearance.padding.larger * 2 + implicitHeight: label.implicitHeight + Appearance.padding.smaller * 2 + + StateLayer { + color: toggle.internalChecked ? Colours.palette.m3onPrimary : Colours.palette.m3onSurface + + function onClicked(): void { + if (toggle.toggle) + toggle.internalChecked = !toggle.internalChecked; + toggle.onClicked(); + } + } + + RowLayout { + id: label + + anchors.centerIn: parent + spacing: Appearance.spacing.small + + MaterialIcon { + text: toggle.icon + color: toggle.internalChecked ? Colours.palette.m3onPrimary : Colours.palette.m3onSurface + fill: toggle.internalChecked ? 1 : 0 + + Behavior on fill { + Anim {} + } + } + + StyledText { + text: toggle.text + color: toggle.internalChecked ? Colours.palette.m3onPrimary : Colours.palette.m3onSurface + font.pointSize: Appearance.font.size.small + } + } + + Behavior on radius { + Anim {} + } + } +} |