mirror of
https://github.com/danbulant/dots-hyprland
synced 2026-05-24 12:22:09 +00:00
101 lines
2.7 KiB
QML
101 lines
2.7 KiB
QML
import qs.modules.common
|
|
import qs.modules.common.functions
|
|
import qs.modules.common.widgets
|
|
import QtQuick
|
|
import QtQuick.Controls
|
|
import Qt5Compat.GraphicalEffects
|
|
|
|
/**
|
|
* A progress bar with both ends rounded and text acts as clipping like OneUI 7's battery indicator.
|
|
*/
|
|
ProgressBar {
|
|
id: root
|
|
property bool vertical: false
|
|
property real valueBarWidth: 30
|
|
property real valueBarHeight: 18
|
|
property color highlightColor: Appearance?.colors.colOnSecondaryContainer ?? "#685496"
|
|
property color trackColor: ColorUtils.transparentize(highlightColor, 0.5) ?? "#F1D3F9"
|
|
property alias radius: contentItem.radius
|
|
property string text
|
|
default property Item textMask: Item {
|
|
width: valueBarWidth
|
|
height: valueBarHeight
|
|
StyledText {
|
|
anchors.centerIn: parent
|
|
font: root.font
|
|
text: root.text
|
|
}
|
|
}
|
|
|
|
text: Math.round(value * 100)
|
|
font {
|
|
pixelSize: 13
|
|
weight: text.length > 2 ? Font.Medium : Font.DemiBold
|
|
}
|
|
|
|
background: Item {
|
|
implicitHeight: valueBarHeight
|
|
implicitWidth: valueBarWidth
|
|
}
|
|
|
|
contentItem: Rectangle {
|
|
id: contentItem
|
|
anchors.fill: parent
|
|
radius: 9999
|
|
color: root.trackColor
|
|
visible: false
|
|
|
|
Rectangle {
|
|
id: progressFill
|
|
anchors {
|
|
top: parent.top
|
|
bottom: parent.bottom
|
|
left: parent.left
|
|
right: undefined
|
|
}
|
|
width: parent.width * root.visualPosition
|
|
height: parent.height
|
|
|
|
states: State {
|
|
name: "vertical"
|
|
when: root.vertical
|
|
AnchorChanges {
|
|
target: progressFill
|
|
anchors {
|
|
top: undefined
|
|
bottom: parent.bottom
|
|
left: parent.left
|
|
right: parent.right
|
|
}
|
|
}
|
|
PropertyChanges {
|
|
target: progressFill
|
|
width: parent.width
|
|
height: parent.height * root.visualPosition
|
|
}
|
|
}
|
|
|
|
radius: Appearance.rounding.unsharpen
|
|
color: root.highlightColor
|
|
}
|
|
}
|
|
|
|
OpacityMask {
|
|
id: roundingMask
|
|
visible: false
|
|
anchors.fill: parent
|
|
source: contentItem
|
|
maskSource: Rectangle {
|
|
width: contentItem.width
|
|
height: contentItem.height
|
|
radius: contentItem.radius
|
|
}
|
|
}
|
|
|
|
OpacityMask {
|
|
anchors.fill: parent
|
|
source: roundingMask
|
|
invert: true
|
|
maskSource: root.textMask
|
|
}
|
|
}
|