Skip to content
Closed
Changes from 1 commit
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
5057316
feat(browser): add canonical read-only Signal Catalog for SCL and dis…
masarray Sep 27, 2026
833e1a4
build(qml): include canonical Signal Catalog in workbench module
masarray Sep 27, 2026
df22ef6
feat(browser): unify canonical DataSet catalog selection across Open …
masarray Sep 27, 2026
a546e14
feat(browser): expose Signal Catalog action and route DataSets throug…
masarray Sep 27, 2026
eb0329b
feat(browser): navigate canonical DataSets offline and route live sel…
masarray Sep 27, 2026
fbe879a
feat(browser): inspect ordered canonical DataSet signals offline or o…
masarray Sep 27, 2026
a2ebb68
fix(qml): normalize IEC reference FC suffix with proper regex escaping
masarray Sep 27, 2026
d7f5dca
test(browser): enrich rendered offline fixture with ordered static Da…
masarray Sep 27, 2026
55286a9
test(browser): expose rendered ordered DataSet member list for QA
masarray Sep 27, 2026
26979bb
test(browser): assert canonical offline DataSet projection and explic…
masarray Sep 27, 2026
918e3d9
test(browser): add R1A canonical Signal Catalog and safety contract
masarray Sep 27, 2026
0429bbc
test(browser): expose first rendered DataSet member text
masarray Sep 27, 2026
57c1658
test(browser): require rendered offline canonical DataSet member in f…
masarray Sep 27, 2026
2e66813
ci(browser): gate R1A catalog source contract and rendered offline Da…
masarray Sep 27, 2026
6456880
test(browser): verify normalized canonical reference lookup in DataSe…
masarray Sep 27, 2026
a389e94
fix(browser): normalize DataSet FC labels for explicit Global Data MM…
masarray Sep 27, 2026
2359103
fix(qml): bind nested DataSet member text explicitly from required de…
masarray Sep 27, 2026
7d7cc5e
test(browser): allow one render frame for virtualized ordered DataSet…
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
Next Next commit
feat(browser): add canonical read-only Signal Catalog for SCL and dis…
…covery
  • Loading branch information
masarray committed Sep 27, 2026
commit 50573164ef2e2aa0217396badd58ba955857d474
163 changes: 163 additions & 0 deletions apps/ied_simulator/qml/BrowserSignalCatalog.qml
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
// SPDX-License-Identifier: GPL-3.0-or-later
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts

// Read-only entry point for both Open SCL and live MMS discovery. The catalog
// derives solely from the canonical engineering context; it never creates a
// DataSet, connects another association or enables reporting implicitly.
Dialog {
id: root
objectName: "iedSignalCatalog"
required property var theme
required property var context
signal dataSetRequested(string reference)
signal browseRequested()

title: "Signal Catalog"
modal: true
width: Math.min(650, Overlay.overlay ? Overlay.overlay.width - 32 : 650)
height: Math.min(520, Overlay.overlay ? Overlay.overlay.height - 32 : 520)
anchors.centerIn: Overlay.overlay
standardButtons: Dialog.Close

readonly property var canonicalDataSets: context.loaded ? context.dataSets : []

contentItem: ColumnLayout {
spacing: 10

Label {
Layout.fillWidth: true
text: root.context.iedName + " · " + root.context.authority
color: root.theme.text
font.pixelSize: root.theme.labelSize
font.weight: Font.DemiBold
elide: Text.ElideMiddle
}
Label {
Layout.fillWidth: true
text: "Choose exact DataSet members or browse the complete canonical model."
color: root.theme.textSoft
font.pixelSize: root.theme.captionSize
wrapMode: Text.WordWrap
}
RowLayout {
Layout.fillWidth: true
spacing: 8
Button {
objectName: "iedCatalogDatasetSignals"
text: "Dataset Signals"
enabled: root.canonicalDataSets.length > 0
onClicked: {
root.dataSetRequested(root.canonicalDataSets[0].reference)
root.close()
}
}
Button {
objectName: "iedCatalogBrowseSignals"
text: "Browse All Signals"
onClicked: {
root.browseRequested()
root.close()
}
}
Item { Layout.fillWidth: true }
Label {
text: root.canonicalDataSets.length + " DataSet(s)"
color: root.theme.muted
font.pixelSize: root.theme.captionSize
}
}

Rectangle { Layout.fillWidth: true; Layout.preferredHeight: 1; color: root.theme.lineSoft }
Label {
text: "DATASET SIGNALS · ORDERED IED MEMBERSHIP"
color: root.theme.muted
font.pixelSize: root.theme.captionSize
font.weight: Font.DemiBold
}

ListView {
id: dataSetsView
objectName: "iedSignalCatalogDataSets"
Layout.fillWidth: true
Layout.fillHeight: true
clip: true
reuseItems: true
model: root.canonicalDataSets
spacing: 2
ScrollBar.vertical: ScrollBar {}

delegate: Rectangle {
required property int index
required property var modelData
width: ListView.view.width
height: 48
radius: 5
color: dsMouse.containsMouse ? root.theme.surfaceRaised : root.theme.surface
border.width: 1
border.color: root.theme.lineSoft
RowLayout {
anchors.fill: parent
anchors.leftMargin: 10
anchors.rightMargin: 10
spacing: 8
ColumnLayout {
Layout.fillWidth: true
spacing: 2
Label {
Layout.fillWidth: true
text: modelData.reference || "DataSet"
color: root.theme.text
font.pixelSize: root.theme.labelSize
elide: Text.ElideMiddle
}
Label {
Layout.fillWidth: true
text: modelData.usedByReports && modelData.usedByReports.length
? "RCB: " + modelData.usedByReports.join(", ")
: "RCB binding not identified in model"
color: root.theme.muted
font.pixelSize: root.theme.captionSize
elide: Text.ElideMiddle
}
}
Label {
text: (modelData.memberCount || 0) + " members"
color: root.theme.textSoft
font.pixelSize: root.theme.captionSize
}
Label {
text: "›"
color: root.theme.accent
font.pixelSize: root.theme.labelSize
}
}
MouseArea {
id: dsMouse
anchors.fill: parent
hoverEnabled: true
onClicked: {
root.dataSetRequested(modelData.reference)
root.close()
}
}
}

Label {
anchors.centerIn: parent
visible: dataSetsView.count === 0
text: "No DataSets in this canonical model. Browse All Signals instead."
color: root.theme.muted
font.pixelSize: root.theme.labelSize
}
}
Label {
Layout.fillWidth: true
text: "Viewing never changes IED membership or writes an RCB. Report enable and GI remain explicit actions."
color: root.theme.muted
font.pixelSize: root.theme.captionSize
wrapMode: Text.WordWrap
}
}
}
Loading