style: increase ReadoutPanel font sizes and add CSV test fixture for data logging

This commit is contained in:
jack
2026-07-07 12:10:47 -07:00
parent 7df7fd4c6f
commit 1e03227788
12 changed files with 587 additions and 315 deletions
+28 -28
View File
@@ -101,7 +101,7 @@ ColumnLayout {
text: "LIVE STREAM"
color: Theme.sideMutedText
font.family: Theme.uiFontFamily
font.pixelSize: Theme.fontXs
font.pixelSize: Theme.fontSm
font.letterSpacing: 1.5
font.bold: true
Layout.bottomMargin: 4
@@ -113,7 +113,7 @@ ColumnLayout {
text: "Received"
color: Theme.sideMutedText
font.family: Theme.uiFontFamily
font.pixelSize: Theme.fontXs
font.pixelSize: Theme.fontSm
font.bold: true
}
Item { Layout.fillWidth: true }
@@ -121,7 +121,7 @@ ColumnLayout {
text: streamController.receivedCount
color: Theme.headingColor
font.family: Theme.codeFontFamily
font.pixelSize: Theme.fontMd
font.pixelSize: Theme.fontLg
font.bold: true
}
}
@@ -138,7 +138,7 @@ ColumnLayout {
text: "Errors"
color: Theme.sideMutedText
font.family: Theme.uiFontFamily
font.pixelSize: Theme.fontXs
font.pixelSize: Theme.fontSm
font.bold: true
}
Item { Layout.fillWidth: true }
@@ -146,7 +146,7 @@ ColumnLayout {
text: streamController.errorCount
color: streamController.errorCount > 0 ? Theme.statusWarningColor : Theme.headingColor
font.family: Theme.codeFontFamily
font.pixelSize: Theme.fontMd
font.pixelSize: Theme.fontLg
font.bold: true
}
}
@@ -207,7 +207,7 @@ ColumnLayout {
text: "READOUT"
color: Theme.sideMutedText
font.family: Theme.uiFontFamily
font.pixelSize: Theme.fontXs
font.pixelSize: Theme.fontSm
font.letterSpacing: 1.5
font.bold: true
Layout.leftMargin: 14
@@ -226,7 +226,7 @@ ColumnLayout {
text: "MIN TEMP"
color: Theme.sideMutedText
font.family: Theme.uiFontFamily
font.pixelSize: Theme.fontXs
font.pixelSize: Theme.fontSm
font.bold: true
}
Item { Layout.fillWidth: true }
@@ -236,7 +236,7 @@ ColumnLayout {
text: s.min !== undefined ? s.min : "—"
color: Theme.sensorLow
font.family: Theme.codeFontFamily
font.pixelSize: Theme.fontMd
font.pixelSize: Theme.fontLg
font.bold: true
}
Label {
@@ -267,7 +267,7 @@ ColumnLayout {
text: "MAX TEMP"
color: Theme.sideMutedText
font.family: Theme.uiFontFamily
font.pixelSize: Theme.fontXs
font.pixelSize: Theme.fontSm
font.bold: true
}
Item { Layout.fillWidth: true }
@@ -277,7 +277,7 @@ ColumnLayout {
text: s.max !== undefined ? s.max : "—"
color: Theme.sensorHigh
font.family: Theme.codeFontFamily
font.pixelSize: Theme.fontMd
font.pixelSize: Theme.fontLg
font.bold: true
}
Label {
@@ -308,7 +308,7 @@ ColumnLayout {
text: "DIFF"
color: Theme.sideMutedText
font.family: Theme.uiFontFamily
font.pixelSize: Theme.fontXs
font.pixelSize: Theme.fontSm
font.bold: true
}
Item { Layout.fillWidth: true }
@@ -316,7 +316,7 @@ ColumnLayout {
text: s.diff !== undefined ? s.diff : "—"
color: Theme.diffAccent
font.family: Theme.codeFontFamily
font.pixelSize: Theme.fontMd
font.pixelSize: Theme.fontLg
font.bold: true
}
}
@@ -337,7 +337,7 @@ ColumnLayout {
text: "AVERAGE"
color: Theme.sideMutedText
font.family: Theme.uiFontFamily
font.pixelSize: Theme.fontXs
font.pixelSize: Theme.fontSm
font.bold: true
}
Item { Layout.fillWidth: true }
@@ -345,7 +345,7 @@ ColumnLayout {
text: s.avg !== undefined ? s.avg : "—"
color: Theme.headingColor
font.family: Theme.codeFontFamily
font.pixelSize: Theme.fontMd
font.pixelSize: Theme.fontLg
font.bold: true
}
}
@@ -366,7 +366,7 @@ ColumnLayout {
text: "SIGMA (Σ)"
color: Theme.sideMutedText
font.family: Theme.uiFontFamily
font.pixelSize: Theme.fontXs
font.pixelSize: Theme.fontSm
font.bold: true
}
Item { Layout.fillWidth: true }
@@ -374,7 +374,7 @@ ColumnLayout {
text: s.sigma !== undefined ? s.sigma : "—"
color: Theme.headingColor
font.family: Theme.codeFontFamily
font.pixelSize: Theme.fontMd
font.pixelSize: Theme.fontLg
font.bold: true
}
}
@@ -395,7 +395,7 @@ ColumnLayout {
text: "3Σ VALUE"
color: Theme.sideMutedText
font.family: Theme.uiFontFamily
font.pixelSize: Theme.fontXs
font.pixelSize: Theme.fontSm
font.bold: true
}
Item { Layout.fillWidth: true }
@@ -403,7 +403,7 @@ ColumnLayout {
text: s.threeSigma !== undefined ? s.threeSigma : "—"
color: Theme.headingColor
font.family: Theme.codeFontFamily
font.pixelSize: Theme.fontMd
font.pixelSize: Theme.fontLg
font.bold: true
}
}
@@ -432,7 +432,7 @@ ColumnLayout {
text: "DISPLAY"
color: Theme.sideMutedText
font.family: Theme.uiFontFamily
font.pixelSize: Theme.fontXs
font.pixelSize: Theme.fontSm
font.letterSpacing: 1.5
font.bold: true
Layout.bottomMargin: 4
@@ -442,21 +442,21 @@ ColumnLayout {
id: thicknessToggle
text: "Show Thickness"
checked: false
font.pixelSize: Theme.fontXs
font.pixelSize: Theme.fontSm
}
PanelCheckBox {
id: labelsToggle
text: "Labels"
checked: true
font.pixelSize: Theme.fontXs
font.pixelSize: Theme.fontSm
}
PanelCheckBox {
id: clusterAverageToggle
text: "Average Clusters"
checked: streamController.clusterAveragingEnabled
font.pixelSize: Theme.fontXs
font.pixelSize: Theme.fontSm
onCheckedChanged: streamController.clusterAveragingEnabled = checked
}
@@ -472,7 +472,7 @@ ColumnLayout {
Label {
text: "Heatmap"
color: Theme.bodyColor
font.pixelSize: Theme.fontXs
font.pixelSize: Theme.fontSm
Layout.preferredWidth: 52
}
Slider {
@@ -500,7 +500,7 @@ ColumnLayout {
Label {
text: Math.round(heatmapSlider.value * 100) + "%"
color: Theme.bodyColor
font.pixelSize: Theme.fontXs
font.pixelSize: Theme.fontSm
font.weight: Font.Medium
Layout.preferredWidth: 32
horizontalAlignment: Text.AlignRight
@@ -531,7 +531,7 @@ ColumnLayout {
text: "THRESHOLDS"
color: Theme.sideMutedText
font.family: Theme.uiFontFamily
font.pixelSize: Theme.fontXs
font.pixelSize: Theme.fontSm
font.letterSpacing: 1.5
font.bold: true
Layout.bottomMargin: 4
@@ -540,7 +540,7 @@ ColumnLayout {
Label {
text: "Set Point (°C)"
color: Theme.bodyColor
font.pixelSize: Theme.fontXs
font.pixelSize: Theme.fontSm
}
TextField {
id: spField
@@ -570,7 +570,7 @@ ColumnLayout {
Label {
text: "Margin (±°C)"
color: Theme.bodyColor
font.pixelSize: Theme.fontXs
font.pixelSize: Theme.fontSm
}
TextField {
id: mgField
@@ -601,7 +601,7 @@ ColumnLayout {
id: autoCheck
text: "Auto range (mean ± 1σ)"
checked: true
font.pixelSize: Theme.fontXs
font.pixelSize: Theme.fontSm
onCheckedChanged: pushThresholds()
}
}
@@ -212,6 +212,7 @@ Popup {
Label { text: "START (s)"; Layout.preferredWidth: 120; color: Theme.sideMutedText; font.bold: true; font.pixelSize: Theme.fontSm }
Label { text: "END (s)"; Layout.preferredWidth: 120; color: Theme.sideMutedText; font.bold: true; font.pixelSize: Theme.fontSm }
Label { text: "AVG TEMP (°C)"; Layout.fillWidth: true; color: Theme.sideMutedText; font.bold: true; font.pixelSize: Theme.fontSm }
Item { Layout.preferredWidth: 80 }
}
}
@@ -267,6 +268,31 @@ Popup {
color: Theme.bodyColor
font.pixelSize: Theme.fontSm
}
Button {
id: exportBtn
text: "Export"
Layout.preferredWidth: 80
Layout.preferredHeight: 26
hoverEnabled: true
onClicked: streamController.exportSegment(index)
background: Rectangle {
radius: Theme.radiusXs
color: exportBtn.pressed ? Theme.buttonNeutralPressed
: exportBtn.hovered ? Theme.buttonNeutralHover
: Theme.buttonNeutralBackground
border.color: Theme.fieldBorder
border.width: 1
}
contentItem: Label {
text: exportBtn.text
color: Theme.buttonNeutralText
font.pixelSize: Theme.fontXs
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
}
}
}
}
}
@@ -295,6 +321,16 @@ Popup {
color: Theme.bodyColor
font.pixelSize: Theme.fontSm
}
// ── Export feedback ───────────────────────────────────────
Label {
id: exportStatus
visible: text !== ""
color: Theme.bodyColor
font.pixelSize: Theme.fontSm
elide: Text.ElideMiddle
Layout.fillWidth: true
}
}
// ── Backend Connection ────────────────────────────────────────
@@ -302,6 +338,7 @@ Popup {
target: streamController
function onSplitResult(result) {
root.segmenting = false;
exportStatus.text = "";
if (result && result.success) {
root.segments = result.segments || [];
console.log("[SplitDialog] Segmented into", root.segments.length, "phases");
@@ -310,6 +347,13 @@ Popup {
console.log("[SplitDialog] Split failed:", result.error || "unknown");
}
}
function onSegmentExported(result) {
if (result && result.success)
exportStatus.text = "Exported: " + result.path.split("/").pop();
else
exportStatus.text = "Export failed: " + (result.error || "unknown");
}
}
}