From 23f1fde76647ecadac0f17bf2f87195cc2ea3c14 Mon Sep 17 00:00:00 2001 From: "Danilo M." Date: Fri, 16 Oct 2026 09:58:33 +0200 Subject: feat(desktop): a greeting row above the notifications Avatar, Hello and the real name, re-read whenever the grid view shows again so an edit is visible on the way back from the page. Module gains tiled, so a module can own a page without a tile. Co-Authored-By: Claude Sonnet 5.5 --- desktop/modules/user/UserRow.qml | 102 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 desktop/modules/user/UserRow.qml (limited to 'desktop/modules/user/UserRow.qml') diff --git a/desktop/modules/user/UserRow.qml b/desktop/modules/user/UserRow.qml new file mode 100644 index 0000000..106a490 --- /dev/null +++ b/desktop/modules/user/UserRow.qml @@ -0,0 +1,102 @@ +// Copyright (C) 2026 Danilo M. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +import Quickshell +import Quickshell.Io +import Quickshell.Widgets +import QtQuick +import "../.." +import "User.js" as U + +// The drawer's greeting: avatar, login name, real name. It re-reads each time +// it becomes visible, which is every drawer open and every return from a +// page, so a save on the user page shows here on the way back. +Rectangle { + id: row + + signal clicked + property var info: ({}) + + implicitHeight: 64 + radius: 12 + color: area.containsMouse ? Qt.alpha(Theme.accent, 0.22) : Qt.alpha(Theme.surface, 0.35) + border.width: 1 + border.color: Qt.alpha(Theme.text, 0.08) + + function read() { + reader.running = false; + reader.running = true; + } + onVisibleChanged: if (visible) read() + Component.onCompleted: read() + + Process { + id: reader + command: [Qt.resolvedUrl("userctl").toString().replace(/^file:\/\//, ""), "get"] + // Cleared first: the icon path never changes, so only a source going + // through "" makes an uncached Image load the new picture. + stdout: StdioCollector { + onStreamFinished: { row.info = ({}); row.info = U.parse(text); } + } + } + + ClippingRectangle { + id: face + anchors { left: parent.left; leftMargin: 12; verticalCenter: parent.verticalCenter } + width: 44 + height: 44 + radius: 22 + color: Theme.surfaceAlt + + Image { + id: pic + anchors.fill: parent + source: row.info.avatar ? "file://" + row.info.avatar : "" + fillMode: Image.PreserveAspectCrop + sourceSize: Qt.size(88, 88) + cache: false + } + Text { + anchors.centerIn: parent + visible: pic.status !== Image.Ready + text: "" + font { family: Theme.iconFamily; pixelSize: 20 } + color: Theme.subtext + } + } + + Column { + anchors { left: face.right; leftMargin: 12; right: parent.right; rightMargin: 12 + verticalCenter: parent.verticalCenter } + spacing: 2 + Text { + text: "Hello " + Quickshell.env("USER") + font { family: Theme.fontFamily; pixelSize: Theme.fontSize + 2; bold: true } + color: Theme.text + } + Text { + width: parent.width + visible: text !== "" + text: row.info.name ?? "" + elide: Text.ElideRight + font { family: Theme.fontFamily; pixelSize: Theme.fontSize - 3 } + color: Theme.subtext + } + } + + MouseArea { + id: area + anchors.fill: parent + hoverEnabled: true + cursorShape: Qt.PointingHandCursor + onClicked: row.clicked() + } +} -- cgit v1.2.3