style(ui): minor styling adjustments for AboutDialog and OverlapMapCard
CI / preflight (push) Waiting to run

This commit is contained in:
jack
2026-07-13 13:41:13 -07:00
parent 5060df1527
commit 8707d467f5
5 changed files with 203 additions and 78 deletions
-1
View File
@@ -37,7 +37,6 @@ moc_*.cpp
# Build / packaging artifacts # Build / packaging artifacts
build/ build/
dist/ dist/
*.spec
*.icns *.icns
*.ico *.ico
+19 -3
View File
@@ -3,6 +3,7 @@ import QtQuick.Controls
import QtQuick.Dialogs import QtQuick.Dialogs
import QtQuick.Layouts import QtQuick.Layouts
import ISC import ISC
import ISC.Tabs.components
Popup { Popup {
id: root id: root
@@ -133,13 +134,28 @@ Popup {
Label { text: modelData.mfgDate; font.pixelSize: Theme.fontMd; color: Theme.bodyColor; Layout.preferredWidth: 120 } Label { text: modelData.mfgDate; font.pixelSize: Theme.fontMd; color: Theme.bodyColor; Layout.preferredWidth: 120 }
Label { text: modelData.level; font.pixelSize: Theme.fontMd; color: Theme.bodyColor; Layout.preferredWidth: 80 } Label { text: modelData.level; font.pixelSize: Theme.fontMd; color: Theme.bodyColor; Layout.preferredWidth: 80 }
Label { text: modelData.licDate; font.pixelSize: Theme.fontMd; color: Theme.bodyColor; Layout.fillWidth: true } Label { text: modelData.licDate; font.pixelSize: Theme.fontMd; color: Theme.bodyColor; Layout.fillWidth: true }
ToolButton { Button {
id: removeLicenseBtn
Layout.preferredWidth: 28 Layout.preferredWidth: 28
implicitHeight: 28
hoverEnabled: true
background: Rectangle {
color: removeLicenseBtn.pressed ? Theme.buttonPressed : removeLicenseBtn.hovered ? Theme.buttonNeutralHover : "transparent"
radius: Theme.radiusSm
}
contentItem: Text {
text: "✕" text: "✕"
font.pixelSize: Theme.fontSm font.pixelSize: Theme.fontSm
ToolTip.visible: hovered color: Theme.bodyColor
ToolTip.text: "Remove license" horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
}
onClicked: licenseModel.removeLicense(modelData.serial, modelData.level) onClicked: licenseModel.removeLicense(modelData.serial, modelData.level)
AppToolTip {
visible: removeLicenseBtn.hovered
text: "Remove license"
}
} }
} }
} }
+12 -5
View File
@@ -124,19 +124,25 @@ Rectangle {
licenseModel.startReplayTrial() licenseModel.startReplayTrial()
} }
} }
function onParsedDataReady(result) { }
if (result.success && result.csv_path) { Connections {
streamController.loadFile(result.csv_path) // Deferred until the post-read metadata dialog (StatusTab.qml) closes —
// jumping tabs from onParsedDataReady directly would deactivate the
// Status Loader (StackLayout.index !== selectedTabIndex) and tear down
// the dialog before the technician could see or use it.
target: statusTabLoader.item
function onCsvMetadataDialogClosed(csvPath) {
if (!csvPath) return
streamController.loadFile(csvPath)
// Fires while still on Status(0), before the tab switch below — // Fires while still on Status(0), before the tab switch below —
// the generic per-tab tracker only attributes picks made while // the generic per-tab tracker only attributes picks made while
// already on Map/Graph, so record this one explicitly. // already on Map/Graph, so record this one explicitly.
root.mapReviewFile = result.csv_path root.mapReviewFile = csvPath
if (root.selectedTabIndex === 0 && licenseModel.licenses.length > 0) { if (root.selectedTabIndex === 0 && licenseModel.licenses.length > 0) {
root.selectedTabIndex = 2 root.selectedTabIndex = 2
} }
} }
} }
}
Connections { Connections {
target: licenseModel target: licenseModel
function onLicensesChanged() { function onLicensesChanged() {
@@ -764,6 +770,7 @@ Rectangle {
currentIndex: root.selectedTabIndex currentIndex: root.selectedTabIndex
Loader { Loader {
id: statusTabLoader
source: "Tabs/StatusTab.qml" source: "Tabs/StatusTab.qml"
active: StackLayout.index === root.selectedTabIndex active: StackLayout.index === root.selectedTabIndex
} }
+119 -17
View File
@@ -15,6 +15,12 @@ ColumnLayout {
anchors.margins: Theme.panelPadding anchors.margins: Theme.panelPadding
spacing: 8 spacing: 8
// Fired once the post-read metadata dialog is dismissed (Save or Cancel),
// so HomePage can defer its auto-jump-to-Map until after the technician
// has had a chance to edit metadata — jumping tabs immediately would
// deactivate this Loader's item and kill the dialog mid-display.
signal csvMetadataDialogClosed(string csvPath)
// ── Reusable Inline Components ── // ── Reusable Inline Components ──
component StatCard : Rectangle { component StatCard : Rectangle {
property alias value: valueText.text property alias value: valueText.text
@@ -147,31 +153,127 @@ ColumnLayout {
id: editCsvDialog id: editCsvDialog
parent: Overlay.overlay parent: Overlay.overlay
modal: true modal: true
title: "Edit CSV Metadata"
width: 460 width: 460
anchors.centerIn: parent anchors.centerIn: parent
standardButtons: Dialog.Save | Dialog.Cancel standardButtons: Dialog.NoButton
padding: 20
onAccepted: file_browser.saveMetadata(root.csvPath, metaWafer.text, metaDate.text, metaChamber.text, metaNotes.text, false, "") onAccepted: file_browser.saveMetadata(root.csvPath, metaWafer.text, metaDate.text, metaChamber.text, metaNotes.text, false, "")
onClosed: root.csvMetadataDialogClosed(root.csvPath)
background: Rectangle {
radius: Theme.radiusLg
color: Theme.cardBackground
border.color: Theme.cardBorder
border.width: Theme.borderThin
}
component MetaField: TextField {
id: metaField
Layout.fillWidth: true
color: Theme.fieldText
placeholderTextColor: Theme.fieldPlaceholder
selectedTextColor: Theme.fieldBackground
selectionColor: Theme.fieldText
font.pixelSize: Theme.fontMd
background: Rectangle {
radius: Theme.radiusXs
color: Theme.fieldBackground
border.width: metaField.activeFocus ? Theme.borderStrong : Theme.borderThin
border.color: metaField.activeFocus ? Theme.fieldBorderFocus : Theme.fieldBorder
Behavior on border.color {
ColorAnimation { duration: Theme.durationFast }
}
}
}
ColumnLayout { ColumnLayout {
anchors.fill: parent anchors.fill: parent
spacing: 6 spacing: 6
// ── header ───────────────────────────────────────────────
Label {
text: "EDIT CSV METADATA"
color: Theme.headingColor
font.pixelSize: Theme.fontLg
font.bold: true
font.letterSpacing: 1
Layout.fillWidth: true
}
Text { Text {
text: root.csvPath.split("/").pop() text: root.csvPath.split("/").pop()
color: Theme.sideMutedText color: Theme.sideMutedText
font.pixelSize: Theme.fontXs font.pixelSize: Theme.fontXs
elide: Text.ElideMiddle elide: Text.ElideMiddle
Layout.fillWidth: true Layout.fillWidth: true
Layout.bottomMargin: 4
}
Rectangle {
Layout.fillWidth: true
Layout.bottomMargin: 8
height: 1
color: Theme.cardBorder
}
Label { text: "Wafer"; color: Theme.bodyColor; font.pixelSize: Theme.fontXs }
MetaField { id: metaWafer }
Label { text: "Date"; color: Theme.bodyColor; font.pixelSize: Theme.fontXs; Layout.topMargin: 6 }
MetaField { id: metaDate }
Label { text: "Chamber"; color: Theme.bodyColor; font.pixelSize: Theme.fontXs; Layout.topMargin: 6 }
MetaField { id: metaChamber }
Label { text: "Notes"; color: Theme.bodyColor; font.pixelSize: Theme.fontXs; Layout.topMargin: 6 }
MetaField { id: metaNotes }
// ── buttons ───────────────────────────────────────────────
RowLayout {
Layout.fillWidth: true
Layout.topMargin: 14
spacing: 8
Button {
id: cancelCsvBtn
text: "Cancel"
Layout.fillWidth: true
hoverEnabled: true
background: Rectangle {
radius: Theme.radiusSm
color: cancelCsvBtn.down ? Theme.buttonNeutralPressed : cancelCsvBtn.hovered ? Theme.buttonNeutralHover : Theme.buttonNeutralBackground
border.width: Theme.borderThin
border.color: Theme.fieldBorder
}
contentItem: Text {
text: cancelCsvBtn.text
color: Theme.buttonNeutralText
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
font.bold: true
font.pixelSize: Theme.fontSm
}
onClicked: editCsvDialog.reject()
}
Button {
id: saveCsvBtn
text: "Save"
Layout.fillWidth: true
hoverEnabled: true
background: Rectangle {
radius: Theme.radiusSm
color: saveCsvBtn.hovered ? Qt.lighter(Theme.primaryAccent, 1.1) : Theme.primaryAccent
border.width: Theme.borderThin
border.color: Theme.primaryAccent
}
contentItem: Text {
text: saveCsvBtn.text
color: Theme.tone100
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
font.bold: true
font.pixelSize: Theme.fontSm
}
onClicked: editCsvDialog.accept()
}
} }
Label { text: "Wafer" }
TextField { id: metaWafer; Layout.fillWidth: true }
Label { text: "Date" }
TextField { id: metaDate; Layout.fillWidth: true }
Label { text: "Chamber" }
TextField { id: metaChamber; Layout.fillWidth: true }
Label { text: "Notes" }
TextField { id: metaNotes; Layout.fillWidth: true }
} }
} }
@@ -214,13 +316,12 @@ ColumnLayout {
Item { Layout.fillHeight: true } Item { Layout.fillHeight: true }
RowLayout { // Badge cluster centers on the full card width; port name overlays
Layout.fillWidth: true // the right edge independently so a long port string can't drag
spacing: 8 // the centered badge off-center (was sharing width via RowLayout).
Item { Item {
Layout.fillWidth: true Layout.fillWidth: true
implicitHeight: 22 Layout.preferredHeight: 22
Row { Row {
anchors.centerIn: parent anchors.centerIn: parent
@@ -279,9 +380,10 @@ ColumnLayout {
} }
} }
} }
}
Text { Text {
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
text: root.portName text: root.portName
color: root.isConnected ? Theme.statusSuccessColor : Theme.headingColor color: root.isConnected ? Theme.statusSuccessColor : Theme.headingColor
font.pixelSize: Theme.fontMd font.pixelSize: Theme.fontMd
@@ -612,7 +714,7 @@ ColumnLayout {
root.dataCols = 0; root.dataCols = 0;
root.csvPath = ""; root.csvPath = "";
if (result && result.success === true) if (result && result.success === true)
saveDirDialog.open(); root.parseAndSavePendingRead();
} }
} }
@@ -53,6 +53,7 @@ PanelBox {
margin: 1.0 margin: 1.0
blend: card.blendAmount / 100 blend: card.blendAmount / 100
showLabels: true showLabels: true
showExtremes: false
ringColor: Theme.waferRingColor ringColor: Theme.waferRingColor
axisColor: Theme.waferAxisColor axisColor: Theme.waferAxisColor
lowColor: Theme.sensorLow lowColor: Theme.sensorLow