import qs import qs.modules.common import qs.modules.common.widgets import qs.services import QtQuick import QtQuick.Layouts import Quickshell Item { id: root required property string iconName required property double percentage property int warningThreshold: 100 property bool shown: true clip: true visible: width > 0 && height > 0 implicitWidth: resourceRowLayout.x < 0 ? 0 : resourceRowLayout.implicitWidth implicitHeight: Appearance.sizes.barHeight property bool warning: percentage * 100 >= warningThreshold RowLayout { id: resourceRowLayout spacing: 2 x: shown ? 0 : -resourceRowLayout.width anchors { verticalCenter: parent.verticalCenter } ClippedFilledCircularProgress { id: resourceCircProg Layout.alignment: Qt.AlignVCenter lineWidth: Appearance.rounding.unsharpen value: percentage implicitSize: 20 colPrimary: root.warning ? Appearance.colors.colError : Appearance.colors.colOnSecondaryContainer accountForLightBleeding: !root.warning enableAnimation: false Item { anchors.centerIn: parent width: resourceCircProg.implicitSize height: resourceCircProg.implicitSize MaterialSymbol { anchors.centerIn: parent font.weight: Font.DemiBold fill: 1 text: iconName iconSize: Appearance.font.pixelSize.normal color: Appearance.m3colors.m3onSecondaryContainer } } } Item { Layout.alignment: Qt.AlignVCenter implicitWidth: fullPercentageTextMetrics.width implicitHeight: percentageText.implicitHeight TextMetrics { id: fullPercentageTextMetrics text: "100" font.pixelSize: Appearance.font.pixelSize.small } StyledText { id: percentageText anchors.centerIn: parent color: Appearance.colors.colOnLayer1 font.pixelSize: Appearance.font.pixelSize.small text: `${Math.round(percentage * 100).toString()}` } } Behavior on x { animation: Appearance.animation.elementMove.numberAnimation.createObject(this) } } MouseArea { id: mouseArea anchors.fill: parent hoverEnabled: true acceptedButtons: Qt.NoButton enabled: resourceRowLayout.x >= 0 && root.width > 0 && root.visible } Behavior on implicitWidth { NumberAnimation { duration: Appearance.animation.elementMove.duration easing.type: Appearance.animation.elementMove.type easing.bezierCurve: Appearance.animation.elementMove.bezierCurve } } }