Files
z-bar-qt/Modules/Resource.qml
T
2025-10-13 20:06:51 +02:00

100 lines
3.1 KiB
QML

import qs.Modules
import QtQuick
import QtQuick.Layouts
import Quickshell
Item {
id: root
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: 22
property bool warning: percentage * 100 >= warningThreshold
RowLayout {
id: resourceRowLayout
spacing: 2
x: shown ? 0 : -resourceRowLayout.width
anchors {
verticalCenter: parent.verticalCenter
}
Item {
Layout.alignment: Qt.AlignVCenter
implicitWidth: 14
implicitHeight: root.implicitHeight
// Background circle
Rectangle {
id: backgroundCircle
anchors.centerIn: parent
width: 14
height: 14
radius: height / 2
color: "#40000000"
border.color: "#404040"
border.width: 1
}
// Pie progress indicator
Canvas {
id: progressCanvas
anchors.fill: backgroundCircle
Connections {
target: root
function onPercentageChanged() {
progressCanvas.requestPaint()
}
function onWarningChanged() {
progressCanvas.requestPaint()
}
}
onPaint: {
var ctx = getContext("2d");
ctx.reset();
var centerX = width / 2;
var centerY = height / 2;
var radius = width / 2;
var startAngle = -Math.PI / 2; // Start at top
var endAngle = startAngle + (2 * Math.PI * percentage);
ctx.fillStyle = warning ? "#ff6b6b" : "#4080ff";
ctx.beginPath();
ctx.moveTo(centerX, centerY);
ctx.arc(centerX, centerY, radius, startAngle, endAngle);
ctx.lineTo(centerX, centerY);
ctx.fill();
}
}
// // Percentage text
// Item {
// anchors.centerIn: backgroundCircle
// implicitWidth: fullPercentageTextMetrics.width
// implicitHeight: percentageText.implicitHeight
//
// TextMetrics {
// id: fullPercentageTextMetrics
// text: "100"
// font.pixelSize: 12
// }
//
// Text {
// id: percentageText
// anchors.centerIn: parent
// color: "#ffffff"
// font.pixelSize: 12
// font.bold: true
// text: `${Math.round(percentage * 100).toString()}`
// }
// }
}
}
}