diff --git a/src/pygui/ISC/AboutDialog.qml b/src/pygui/ISC/AboutDialog.qml index ed54ac6..3bf7058 100644 --- a/src/pygui/ISC/AboutDialog.qml +++ b/src/pygui/ISC/AboutDialog.qml @@ -9,8 +9,8 @@ Popup { modal: true dim: true closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside - width: 480 - height: 440 + width: 600 + height: 500 anchors.centerIn: Overlay.overlay onOpened: licenseModel.refresh() @@ -31,8 +31,8 @@ Popup { ColumnLayout { anchors.fill: parent - anchors.margins: 24 - spacing: 16 + anchors.margins: 28 + spacing: 20 // ── Title ── Label { @@ -44,27 +44,20 @@ Popup { // ── App info ── ColumnLayout { - spacing: 4 + spacing: 6 Label { - text: "ISenseCloud (ISC)" - font.pixelSize: Theme.fontLg + text: "ISenseCloud" + font.pixelSize: Theme.fontXl + font.bold: true color: Theme.headingColor } Label { text: "Version " + appVersion - font.pixelSize: Theme.fontSm + font.pixelSize: Theme.fontMd color: Theme.bodyColor } - - Label { - text: "Temperature-sensing wafer monitoring" - font.pixelSize: Theme.fontSm - color: Theme.bodyColor - wrapMode: Text.WordWrap - Layout.fillWidth: true - } } // ── Separator ── @@ -78,7 +71,7 @@ Popup { Rectangle { Layout.fillWidth: true Layout.fillHeight: true - Layout.minimumHeight: 120 + Layout.minimumHeight: 150 radius: Theme.radiusSm color: Theme.panelBackground border.color: Theme.cardBorder @@ -86,8 +79,8 @@ Popup { ColumnLayout { anchors.fill: parent - anchors.margins: 10 - spacing: 2 + anchors.margins: 14 + spacing: 6 RowLayout { Layout.fillWidth: true @@ -95,7 +88,8 @@ Popup { Label { text: "LICENSE" color: Theme.panelTitleText - font.pixelSize: Theme.fontXs + font.pixelSize: Theme.fontSm + font.bold: true font.letterSpacing: 0.5 Layout.fillWidth: true } @@ -105,18 +99,18 @@ Popup { visible: false text: "Invalid license file" color: Theme.statusWarningColor - font.pixelSize: Theme.fontXs + font.pixelSize: Theme.fontSm } } // Grid header RowLayout { Layout.fillWidth: true - spacing: 4 - Label { text: "Wafer SN"; font.pixelSize: Theme.fontXs; font.bold: true; color: Theme.subheadingColor; Layout.preferredWidth: 100 } - Label { text: "Mfg Date"; font.pixelSize: Theme.fontXs; font.bold: true; color: Theme.subheadingColor; Layout.preferredWidth: 90 } - Label { text: "Level"; font.pixelSize: Theme.fontXs; font.bold: true; color: Theme.subheadingColor; Layout.preferredWidth: 50 } - Label { text: "License Date"; font.pixelSize: Theme.fontXs; font.bold: true; color: Theme.subheadingColor; Layout.fillWidth: true } + spacing: 8 + Label { text: "Wafer SN"; font.pixelSize: Theme.fontSm; font.bold: true; color: Theme.subheadingColor; Layout.preferredWidth: 150 } + Label { text: "Mfg Date"; font.pixelSize: Theme.fontSm; font.bold: true; color: Theme.subheadingColor; Layout.preferredWidth: 120 } + Label { text: "Level"; font.pixelSize: Theme.fontSm; font.bold: true; color: Theme.subheadingColor; Layout.preferredWidth: 80 } + Label { text: "License Date"; font.pixelSize: Theme.fontSm; font.bold: true; color: Theme.subheadingColor; Layout.fillWidth: true } } Rectangle { @@ -133,11 +127,11 @@ Popup { model: licenseModel.licenses delegate: RowLayout { width: ListView.view.width - spacing: 4 - Label { text: modelData.serial; font.pixelSize: Theme.fontSm; color: Theme.bodyColor; Layout.preferredWidth: 100 } - Label { text: modelData.mfgDate; font.pixelSize: Theme.fontSm; color: Theme.bodyColor; Layout.preferredWidth: 90 } - Label { text: modelData.level; font.pixelSize: Theme.fontSm; color: Theme.bodyColor; Layout.preferredWidth: 50 } - Label { text: modelData.licDate; font.pixelSize: Theme.fontSm; color: Theme.bodyColor; Layout.fillWidth: true } + spacing: 8 + Label { text: modelData.serial; font.pixelSize: Theme.fontMd; color: Theme.bodyColor; Layout.preferredWidth: 150 } + 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.licDate; font.pixelSize: Theme.fontMd; color: Theme.bodyColor; Layout.fillWidth: true } } } @@ -145,7 +139,7 @@ Popup { visible: licenseModel.licenses.length === 0 text: "No license loaded" color: Theme.bodyColor - font.pixelSize: Theme.fontSm + font.pixelSize: Theme.fontMd Layout.fillWidth: true Layout.fillHeight: true verticalAlignment: Text.AlignVCenter @@ -157,11 +151,12 @@ Popup { // ── Buttons ── RowLayout { Layout.fillWidth: true + spacing: 12 Button { text: "Load License" - Layout.preferredWidth: 120 - Layout.preferredHeight: 32 + Layout.preferredWidth: 140 + Layout.preferredHeight: 36 onClicked: licenseFileDialog.open() background: Rectangle { @@ -173,6 +168,8 @@ Popup { contentItem: Label { text: parent.text color: Theme.buttonNeutralText + font.pixelSize: Theme.fontMd + font.bold: true horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter } @@ -183,7 +180,7 @@ Popup { Button { text: "Close" Layout.preferredWidth: 100 - Layout.preferredHeight: 32 + Layout.preferredHeight: 36 onClicked: root.close() background: Rectangle { @@ -195,6 +192,8 @@ Popup { contentItem: Label { text: parent.text color: Theme.buttonNeutralText + font.pixelSize: Theme.fontMd + font.bold: true horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter } diff --git a/src/pygui/ISC/HomePage.qml b/src/pygui/ISC/HomePage.qml index 62c238e..a32bd59 100644 --- a/src/pygui/ISC/HomePage.qml +++ b/src/pygui/ISC/HomePage.qml @@ -26,6 +26,8 @@ Rectangle { } } + + property bool memoryRead: false property bool waferDetected: false // TODO P2.2: add `property bool waferLicensed: false`; set it in @@ -213,9 +215,24 @@ Rectangle { ListModel { id: pillModel - ListElement { label: "STATUS"; icon: "Tabs/icons/status.svg"; expandW: 86 } - ListElement { label: "DATA"; icon: "Tabs/icons/data.svg"; expandW: 66 } - ListElement { label: "MAP"; icon: "Tabs/icons/map.svg"; expandW: 58 } + ListElement { + label: "STATUS" + icon: "Tabs/icons/status.svg" + expandW: 86 + desc: "Monitor real-time device connection, serial communication, and execute wafer actions." + } + ListElement { + label: "DATA" + icon: "Tabs/icons/data.svg" + expandW: 66 + desc: "Manage, review, compare (DTW), and split historical sensor data records." + } + ListElement { + label: "MAP" + icon: "Tabs/icons/map.svg" + expandW: 58 + desc: "Visualize spatial sensor readings on a 2D thin-plate spline RBF interpolated heatmap." + } } RowLayout { @@ -227,15 +244,6 @@ Rectangle { model: pillModel delegate: Button { id: pillBtn - // TODO P3.1: lock MAP pill (index 2) when no license: - // `enabled: index !== 2 || licenseModel.licenses.length > 0` - // and dim icon/label when disabled. licensesChanged - // notify already fires on Load License → unlocks live, - // no restart. Rule is "any valid license" (not - // per-wafer): Map also replays CSVs with no wafer - // attached. Also gate the Map Loader (see TODO at the - // StackLayout below) and the auto-switch at - // onParsedDataReady. See plan §3.1. checked: root.selectedTabIndex === index flat: true Layout.fillWidth: true @@ -305,6 +313,11 @@ Rectangle { } } + AppToolTip { + visible: pillBtn.hovered + text: "" + model.label + ": " + model.desc + } + onClicked: root.selectedTabIndex = index } } @@ -598,6 +611,8 @@ Rectangle { UtilityFooter { id: utilFooter Layout.fillWidth: true + settingsPopup: settingsPopup + aboutDialog: aboutDialog } } }