From 956e706f74468f29ea5fba5c122ea0a8e675c9de Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 21 Jun 2025 00:55:03 +1000 Subject: feat: launcher calculator Requires libqalculate --- modules/launcher/CalcItem.qml | 162 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 modules/launcher/CalcItem.qml (limited to 'modules/launcher/CalcItem.qml') diff --git a/modules/launcher/CalcItem.qml b/modules/launcher/CalcItem.qml new file mode 100644 index 0000000..4d87f94 --- /dev/null +++ b/modules/launcher/CalcItem.qml @@ -0,0 +1,162 @@ +import "root:/widgets" +import "root:/services" +import "root:/config" +import Quickshell +import Quickshell.Io +import QtQuick +import QtQuick.Layouts + +Item { + id: root + + required property var list + readonly property string math: list.search.text.slice(`${Config.launcher.actionPrefix}calc `.length) + + function onClicked(): void { + Quickshell.execDetached(["sh", "-c", `qalc -t -m 100 '${root.math}' | wl-copy`]); + root.list.visibilities.launcher = false; + } + + implicitHeight: Config.launcher.sizes.itemHeight + + anchors.left: parent?.left + anchors.right: parent?.right + + onMathChanged: { + if (math) { + qalcProc.command = ["qalc", "-m", "100", math]; + qalcProc.running = true; + } + } + + StateLayer { + radius: Appearance.rounding.full + + function onClicked(): void { + root.onClicked(); + } + } + + Binding { + id: binding + + when: root.math.length > 0 + target: metrics + property: "text" + } + + Process { + id: qalcProc + + stdout: StdioCollector { + onStreamFinished: binding.value = text.trim() + } + } + + RowLayout { + anchors.left: parent.left + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + anchors.margins: Appearance.padding.larger + + spacing: Appearance.spacing.normal + + MaterialIcon { + text: "function" + font.pointSize: Appearance.font.size.extraLarge + Layout.alignment: Qt.AlignVCenter + } + + StyledText { + id: result + + color: { + if (metrics.text.includes("error: ")) + return Colours.palette.m3error; + if (!root.math) + return Colours.palette.m3onSurfaceVariant; + return Colours.palette.m3onSurface; + } + + text: metrics.elidedText + font.pointSize: Appearance.font.size.normal + + Layout.fillWidth: true + Layout.alignment: Qt.AlignVCenter + + TextMetrics { + id: metrics + + text: qsTr("Type an expression to calculate") + font.family: result.font.family + font.pointSize: result.font.pointSize + elide: Text.ElideRight + elideWidth: result.width + } + } + + StyledRect { + color: Colours.palette.m3tertiary + radius: Appearance.rounding.normal + clip: true + + implicitWidth: (stateLayer.containsMouse ? label.implicitWidth + label.anchors.rightMargin : 0) + icon.implicitWidth + Appearance.padding.normal * 2 + implicitHeight: Math.max(label.implicitHeight, icon.implicitHeight) + Appearance.padding.small * 2 + + Layout.alignment: Qt.AlignVCenter + + StateLayer { + id: stateLayer + + color: Colours.palette.m3onTertiary + + function onClicked(): void { + Quickshell.execDetached(["app2unit", "--", "foot", "fish", "-C", `exec qalc -i '${root.math}'`]); + root.list.visibilities.launcher = false; + } + } + + StyledText { + id: label + + anchors.verticalCenter: parent.verticalCenter + anchors.right: icon.left + anchors.rightMargin: Appearance.spacing.small + + text: qsTr("Open in calculator") + color: Colours.palette.m3onTertiary + font.pointSize: Appearance.font.size.normal + + opacity: stateLayer.containsMouse ? 1 : 0 + + Behavior on opacity { + NumberAnimation { + duration: Appearance.anim.durations.normal + easing.type: Easing.BezierSpline + easing.bezierCurve: Appearance.anim.curves.standard + } + } + } + + MaterialIcon { + id: icon + + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + anchors.rightMargin: Appearance.padding.normal + + text: "exit_to_app" + color: Colours.palette.m3onTertiary + font.pointSize: Appearance.font.size.large + } + + Behavior on implicitWidth { + NumberAnimation { + duration: Appearance.anim.durations.normal + easing.type: Easing.BezierSpline + easing.bezierCurve: Appearance.anim.curves.emphasized + } + } + } + } +} -- cgit v1.2.3-freya