Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
81ee7c0
fix(qml): show the selected IED Browser with non-shadowed slot services
masarray Sep 27, 2026
cd8244a
test(browser): restore validated rendered fleet routing and service c…
masarray Sep 27, 2026
edc3540
test(browser): restore validated rendered fleet routing and service c…
masarray Sep 27, 2026
ec8d87e
test(browser): restore validated rendered fleet routing and service c…
masarray Sep 27, 2026
517c786
test(browser): reject shadowed services and wrong active-slot geometry
masarray Sep 27, 2026
3550f2f
ci(browser): gate rendered active IED and offline signal routing
masarray Sep 27, 2026
f59089f
ci(browser): verify active slot routing in release hardening
masarray Sep 27, 2026
684e32e
fix(qml): restore canonical Browser tree roles and rendered-tree iden…
masarray Sep 27, 2026
1b104d4
fix(qml): bind value-table model roles with required delegate index
masarray Sep 27, 2026
0d1beb8
test(browser): assert rendered model values as well as active signal …
masarray Sep 27, 2026
ed68748
test(qml): lock required model roles and observable Browser tree IDs
masarray Sep 27, 2026
b649c71
test(qml): lock required model roles and observable Browser tree IDs
masarray Sep 27, 2026
cd5551b
test(browser): verify all live service pointers match selected IED slot
masarray Sep 27, 2026
f092db2
test(qml): expose rendered model value label for nonblank GUI assertion
masarray Sep 27, 2026
21dc6df
test(browser): fail rendered QA when first model value label is blank
masarray Sep 27, 2026
4873962
test(browser): retain visible value label identity in observation con…
masarray Sep 27, 2026
18e3977
fix(qml): prevent File Home session self-binding loop
masarray Sep 27, 2026
24bba54
fix(qml): guard transient DataSet selection before dereferencing owne…
masarray Sep 27, 2026
2f71067
test(browser): traverse ListView visual children for rendered label a…
masarray Sep 27, 2026
0d322f0
fix(qml): correct DataSet guard syntax and use safe selection throughout
masarray Sep 27, 2026
aeefe1b
fix(qml): give confirmation dialogs explicit widths to avoid implicit…
masarray Sep 27, 2026
c821c58
fix(qml): give confirmation dialogs explicit widths to avoid implicit…
masarray Sep 27, 2026
f4a12d6
ci(browser): fail rendered milestone on QML binding and runtime errors
masarray Sep 27, 2026
4af3da4
ci(browser): fail rendered milestone on QML binding and runtime errors
masarray Sep 27, 2026
0d858cf
fix(qml): normalize transient undefined DataSet entry to null
masarray Sep 27, 2026
cab1eb0
ci: cancel superseded workbench Qt and release runs; validate exact head
masarray Sep 27, 2026
35e97a7
ci: cancel superseded workbench Qt and release runs; validate exact head
masarray Sep 27, 2026
e53a353
test(browser): reject File session self-binding regression
masarray Sep 27, 2026
4872870
test(browser): enforce null-safe DataSet ownership binding
masarray Sep 27, 2026
08b9ac9
fix(fleet): defer retired QObject services until QML Repeater visual …
masarray Sep 27, 2026
4e93973
test(fleet): require deferred visual-safe service retirement
masarray Sep 27, 2026
fe1e41b
fix(browser): detach QML delegates before fleet destruction
masarray Sep 27, 2026
b883d55
fix(browser): detach QML fleet views in aboutToQuit before C++ teardown
masarray Sep 27, 2026
d06716a
test(browser): preserve shutdown delegate-detach contract
masarray Sep 27, 2026
ca040f0
ci(release): gate Windows RC artifacts on rendered Browser acceptance
masarray Sep 27, 2026
fcb2c0a
fix(qml): freeze per-IED service bindings at delegate creation across…
masarray Sep 27, 2026
c33e7d2
fix(fleet): keep removed IED services alive through visual teardown f…
masarray Sep 27, 2026
d64d4b9
test(browser): lock per-slot service snapshots against Repeater reindex
masarray Sep 27, 2026
8b077f5
test(fleet): track bounded visual teardown grace period
masarray Sep 27, 2026
0f581c8
feat(browser-ux): compact two-row IEDScout-style model and connection…
masarray Sep 27, 2026
a7ed2bb
test(browser-ux): expose command-bar and endpoint geometry for minimu…
masarray Sep 27, 2026
1c3e3c5
test(browser-ux): render 1024px minimum width and assert endpoint com…
masarray Sep 27, 2026
3a3ceef
test(browser-ux): enforce compact two-row header and unique endpoint …
masarray Sep 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions .github/workflows/ied-simulator-qt.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,11 @@ on:
- 'CMakeLists.txt'
- '.github/workflows/ied-simulator-qt.yml'

# Superseded commits must not occupy CI runners or mask the exact-head result.
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

permissions:
contents: read

Expand Down Expand Up @@ -71,6 +76,17 @@ jobs:
QT_QPA_PLATFORM: offscreen
run: ./build-ied-simulator-qt/arstack_ied_simulator --smoke-test

- name: P0 rendered fleet Browser and offline signal routing
env:
QT_QPA_PLATFORM: offscreen
run: |
set -o pipefail
./build-ied-simulator-qt/arstack_ied_simulator --qa-browser-routing 2>&1 | tee browser-routing.log
if grep -E 'ReferenceError:|TypeError:|Binding loop detected' browser-routing.log; then
echo '::error::Qt Browser emitted an unresolved runtime binding diagnostic'
exit 1
fi

- name: MMS client discovery workbench gates
env:
QT_QPA_PLATFORM: offscreen
Expand Down
18 changes: 18 additions & 0 deletions .github/workflows/ied-simulator-release-hardening.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,11 @@ on:
- 'apps/ied_simulator/**'
- '.github/workflows/ied-simulator-release-hardening.yml'

# Superseded commits must not occupy CI runners or mask the exact-head result.
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

permissions:
contents: read

Expand Down Expand Up @@ -42,6 +47,17 @@ jobs:
QT_QPA_PLATFORM: offscreen
run: ./build-ied-simulator-release/ied_product_hardening_qa

- name: P0 rendered fleet Browser and offline signal routing
env:
QT_QPA_PLATFORM: offscreen
run: |
set -o pipefail
./build-ied-simulator-release/arstack_ied_simulator --qa-browser-routing 2>&1 | tee browser-routing.log
if grep -E 'ReferenceError:|TypeError:|Binding loop detected' browser-routing.log; then
echo '::error::Qt Browser emitted an unresolved runtime binding diagnostic'
exit 1
fi

- name: MMS reconnect association soak
env:
QT_QPA_PLATFORM: offscreen
Expand All @@ -59,6 +75,8 @@ jobs:
--cycles 12

windows-release-package:
# Do not publish a Windows RC if rendered Linux Browser QA is red.
needs: linux-release-soak
runs-on: windows-2025
steps:
- uses: actions/checkout@v4
Expand Down
2 changes: 2 additions & 0 deletions apps/ied_simulator/qml/BrowserDataSetAuthoringDialog.qml
Original file line number Diff line number Diff line change
Expand Up @@ -285,6 +285,7 @@ Dialog {

Dialog {
id: createConfirm
width: 510
title: "Confirm dynamic DataSet create"
modal: true
anchors.centerIn: Overlay.overlay
Expand All @@ -303,6 +304,7 @@ Dialog {

Dialog {
id: deleteDialog
width: 510
title: "Confirm dynamic DataSet delete"
modal: true
anchors.centerIn: Overlay.overlay
Expand Down
22 changes: 13 additions & 9 deletions apps/ied_simulator/qml/BrowserDataSetPane.qml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,11 @@ Rectangle {
return context.treeModel.nodeForReference(reference)
}

readonly property var selectedDataSet: reports && reports.dataSets
&& reports.selectedDataSetIndex >= 0
&& reports.selectedDataSetIndex < reports.dataSets.length
? (reports.dataSets[reports.selectedDataSetIndex] || null) : null

function hasValue(value) {
return value !== undefined && value !== null && String(value).length > 0
}
Expand All @@ -50,8 +55,8 @@ Rectangle {

Label {
Layout.fillWidth: true
text: reports.selectedDataSetIndex >= 0 && reports.selectedDataSetIndex < reports.dataSets.length
? root.text(reports.dataSets[reports.selectedDataSetIndex].reference)
text: root.selectedDataSet !== null
? root.text(root.selectedDataSet.reference)
: "Select a DataSet in the navigation tree."
color: theme.textSoft
font.pixelSize: theme.labelSize
Expand All @@ -60,30 +65,29 @@ Rectangle {

RowLayout {
Layout.fillWidth: true
visible: reports.selectedDataSetIndex >= 0
&& reports.selectedDataSetIndex < reports.dataSets.length
visible: root.selectedDataSet !== null
Rectangle {
Layout.preferredWidth: 104
Layout.preferredHeight: 22
radius: 11
color: reports.dataSets[reports.selectedDataSetIndex].dynamicOwned === true
color: root.selectedDataSet !== null && root.selectedDataSet.dynamicOwned === true
? theme.greenSoft : theme.surface
border.width: 1
border.color: reports.dataSets[reports.selectedDataSetIndex].dynamicOwned === true
border.color: root.selectedDataSet !== null && root.selectedDataSet.dynamicOwned === true
? theme.green : theme.lineSoft
Label {
anchors.centerIn: parent
text: reports.dataSets[reports.selectedDataSetIndex].dynamicOwned === true
text: root.selectedDataSet !== null && root.selectedDataSet.dynamicOwned === true
? "DYNAMIC OWNED" : "STATIC / READ-ONLY"
color: reports.dataSets[reports.selectedDataSetIndex].dynamicOwned === true
color: root.selectedDataSet !== null && root.selectedDataSet.dynamicOwned === true
? theme.green : theme.muted
font.pixelSize: 7
font.weight: Font.Bold
}
}
Label {
Layout.fillWidth: true
text: reports.dataSets[reports.selectedDataSetIndex].dynamicOwned === true
text: root.selectedDataSet !== null && root.selectedDataSet.dynamicOwned === true
? "Created and verified on this live association; eligible for owned-only delete."
: "Membership is immutable in Browser authoring."
color: theme.muted
Expand Down
1 change: 1 addition & 0 deletions apps/ied_simulator/qml/BrowserReportAuthoringDialog.qml
Original file line number Diff line number Diff line change
Expand Up @@ -321,6 +321,7 @@ Dialog {

Dialog {
id: confirmEnable
width: 540
title: "Confirm authored RCB enable"
modal: true
anchors.centerIn: Overlay.overlay
Expand Down
3 changes: 3 additions & 0 deletions apps/ied_simulator/qml/IedBrowserNavigation.qml
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,7 @@ Rectangle {

ListView {
id: modelTree
objectName: "iedBrowserSignalTree"
Layout.fillWidth: true
Layout.preferredHeight: Math.max(260, Math.min(contentHeight, 620))
clip: true
Expand All @@ -398,6 +399,8 @@ Rectangle {
delegate: Rectangle {
id: modelRow
required property int index
// Required delegate properties disable implicit model context roles.
required property var model
width: modelTree.width
height: 30
color: model.selected ? root.theme.accentSoft
Expand Down
Loading
Loading