A chamfer with no neighbour behind it now carries the corner it removed, put back OUTSIDE the panel as a detached accent triangle. capGap is the perpendicular distance from the cut, hence the per-axis shift of capGap over root 2: the cap moves along the cut's normal, not along an axis. The trace joining two caps belongs to the RAIL, not the panel — the run it draws is the gap BETWEEN two panels, which no panel can see. HyprChromeBar filters the row down to panels (a slack Item has no `rightChamfer`, so spacers drop out, and dropping them is exactly what makes a trace span them), then joins each right cap to the next left cap: straight, one 45° step at the midpoint of the gap, straight. It meets the middle of each cap's outward face rather than its tip. TestPanel is a staging slot between two spacers. It counts seconds since load, which is the cheapest proof the panel is live, and standing alone it exercises a cap and a trace at both ends — something a rail of butted panels never does. Restructures the module in the same commit, since the moves and the edits above land in the same files: folders are PascalCase, the bar and its widgets moved under Widgets/Bar, and DebugWindow takes the HyprChrome Theme instead of the legacy one. The two singletons are identical today, so that is not a visual fix — it is a palette edit reaching the debug stage in future. Rename detection needs -M40% to follow HyprChromeBar, which grew past the default similarity threshold. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01U19X5LGTxtq4pb4jdNVivv
59 lines
1.5 KiB
QML
59 lines
1.5 KiB
QML
pragma ComponentBehavior: Bound
|
|
|
|
import QtQuick
|
|
import qs.HyprChrome.Theme
|
|
|
|
// One metric of the expanded vitals panel: label, meter, readout on a line.
|
|
//
|
|
// The label and readout columns are fixed so the meters of stacked rows line
|
|
// up on both edges regardless of how long any one readout gets.
|
|
Item {
|
|
id: row
|
|
|
|
property string label: ""
|
|
property real value: 0 // 0..1
|
|
property string readout: "--"
|
|
property bool ready: false
|
|
property real warn: 0.85
|
|
|
|
property int labelWidth: 52
|
|
property int readoutWidth: 46
|
|
|
|
readonly property bool hot: row.ready && row.value >= row.warn
|
|
|
|
implicitHeight: 11
|
|
|
|
Text {
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
width: row.labelWidth
|
|
text: row.label
|
|
color: Theme.muted
|
|
font.family: Theme.microFont
|
|
font.pixelSize: 10
|
|
font.letterSpacing: 0.7
|
|
elide: Text.ElideRight
|
|
}
|
|
|
|
SegmentMeter {
|
|
x: row.labelWidth
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
width: Math.max(0, row.width - row.labelWidth - row.readoutWidth)
|
|
height: 9
|
|
value: row.value
|
|
ready: row.ready
|
|
warn: row.warn
|
|
}
|
|
|
|
Text {
|
|
anchors.right: parent.right
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
width: row.readoutWidth
|
|
text: row.readout
|
|
color: row.hot ? Theme.hot : Theme.text
|
|
font.family: Theme.displayFont
|
|
font.pixelSize: 10
|
|
font.bold: true
|
|
horizontalAlignment: Text.AlignRight
|
|
}
|
|
}
|