From 7f002507fdd7c5420471ec2e0451ed4aee325635 Mon Sep 17 00:00:00 2001 From: masarray Date: Thu, 16 Jul 2026 10:37:32 +0700 Subject: [PATCH 1/8] chore: stage compact premium UI patch --- .github/compact-ui.patch.gz.b64 | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/compact-ui.patch.gz.b64 diff --git a/.github/compact-ui.patch.gz.b64 b/.github/compact-ui.patch.gz.b64 new file mode 100644 index 00000000..a6004722 --- /dev/null +++ b/.github/compact-ui.patch.gz.b64 @@ -0,0 +1 @@ +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 \ No newline at end of file From 7ca42d4f7e9a51961feeb48be6b77a9492f7a6b2 Mon Sep 17 00:00:00 2001 From: masarray Date: Thu, 16 Jul 2026 10:37:51 +0700 Subject: [PATCH 2/8] ci: apply compact premium UI patch --- .github/workflows/apply-compact-ui.yml | 74 ++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 .github/workflows/apply-compact-ui.yml diff --git a/.github/workflows/apply-compact-ui.yml b/.github/workflows/apply-compact-ui.yml new file mode 100644 index 00000000..d3e38d8b --- /dev/null +++ b/.github/workflows/apply-compact-ui.yml @@ -0,0 +1,74 @@ +name: Apply compact premium UI + +on: + push: + branches: [ fix/compact-ied-goose-ui ] + paths: + - .github/compact-ui.patch.gz.b64 + - .github/workflows/apply-compact-ui.yml + +permissions: + contents: write + +jobs: + apply: + runs-on: ubuntu-latest + steps: + - name: Checkout feature branch + uses: actions/checkout@v4 + with: + ref: fix/compact-ied-goose-ui + fetch-depth: 0 + + - name: Decode and apply UI patch + shell: bash + run: | + python3 - <<'PY' + from pathlib import Path + import base64, gzip + encoded = Path('.github/compact-ui.patch.gz.b64').read_text(encoding='utf-8').strip() + Path('/tmp/compact-ui.patch').write_bytes(gzip.decompress(base64.b64decode(encoded))) + PY + git apply --ignore-whitespace /tmp/compact-ui.patch + + - name: Preserve repository line endings and validate XAML + shell: bash + run: | + python3 - <<'PY' + from pathlib import Path + import xml.etree.ElementTree as ET + + files = [ + 'App.xaml', + 'MainWindow.xaml', + 'SaveSclWindow.xaml', + 'SaveSclWindow.xaml.cs', + 'MainWindow.xaml.cs', + 'Models/MonitorModels.cs', + ] + for name in files: + path = Path(name) + data = path.read_bytes().replace(b'\r\n', b'\n').replace(b'\r', b'\n') + path.write_bytes(data.replace(b'\n', b'\r\n')) + + for name in ['App.xaml', 'MainWindow.xaml', 'SaveSclWindow.xaml']: + ET.parse(name) + PY + grep -q 'Binding IsMonitoring' MainWindow.xaml + grep -q 'x:Name="MonitorStateText" Text="STOP"' MainWindow.xaml + grep -q 'x:Name="Edition2Toggle"' SaveSclWindow.xaml + grep -q 'x:Name="Edition1Toggle"' SaveSclWindow.xaml + ! grep -q 'EditionIndicatorTranslate' SaveSclWindow.xaml SaveSclWindow.xaml.cs + grep -q 'Text="GOOSE Subscriber"' MainWindow.xaml + grep -q 'Style="{StaticResource ModernComboBox}"' MainWindow.xaml + git diff --check + + - name: Commit compact premium UI + shell: bash + run: | + git rm .github/compact-ui.patch.gz.b64 .github/workflows/apply-compact-ui.yml + git add App.xaml MainWindow.xaml MainWindow.xaml.cs Models/MonitorModels.cs SaveSclWindow.xaml SaveSclWindow.xaml.cs + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git commit -m "fix: compact IED discovery and simplify premium GOOSE UI" + git push origin HEAD:fix/compact-ied-goose-ui From 528b0209e49b8d1d50545169204c5485cfff3e6c Mon Sep 17 00:00:00 2001 From: masarray Date: Thu, 16 Jul 2026 10:41:37 +0700 Subject: [PATCH 3/8] ci: run compact UI patch on pull request --- .github/workflows/apply-compact-ui.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/apply-compact-ui.yml b/.github/workflows/apply-compact-ui.yml index d3e38d8b..d8ac9cb7 100644 --- a/.github/workflows/apply-compact-ui.yml +++ b/.github/workflows/apply-compact-ui.yml @@ -6,6 +6,11 @@ on: paths: - .github/compact-ui.patch.gz.b64 - .github/workflows/apply-compact-ui.yml + pull_request: + branches: [ main ] + paths: + - .github/compact-ui.patch.gz.b64 + - .github/workflows/apply-compact-ui.yml permissions: contents: write From 158fdf6f62fdd6a7f8dd1c72888efec83bd2e109 Mon Sep 17 00:00:00 2001 From: masarray Date: Thu, 16 Jul 2026 10:42:34 +0700 Subject: [PATCH 4/8] ci: simplify compact UI patch validation --- .github/workflows/apply-compact-ui.yml | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/.github/workflows/apply-compact-ui.yml b/.github/workflows/apply-compact-ui.yml index d8ac9cb7..8a239d45 100644 --- a/.github/workflows/apply-compact-ui.yml +++ b/.github/workflows/apply-compact-ui.yml @@ -36,7 +36,7 @@ jobs: PY git apply --ignore-whitespace /tmp/compact-ui.patch - - name: Preserve repository line endings and validate XAML + - name: Preserve line endings and parse XAML shell: bash run: | python3 - <<'PY' @@ -59,14 +59,6 @@ jobs: for name in ['App.xaml', 'MainWindow.xaml', 'SaveSclWindow.xaml']: ET.parse(name) PY - grep -q 'Binding IsMonitoring' MainWindow.xaml - grep -q 'x:Name="MonitorStateText" Text="STOP"' MainWindow.xaml - grep -q 'x:Name="Edition2Toggle"' SaveSclWindow.xaml - grep -q 'x:Name="Edition1Toggle"' SaveSclWindow.xaml - ! grep -q 'EditionIndicatorTranslate' SaveSclWindow.xaml SaveSclWindow.xaml.cs - grep -q 'Text="GOOSE Subscriber"' MainWindow.xaml - grep -q 'Style="{StaticResource ModernComboBox}"' MainWindow.xaml - git diff --check - name: Commit compact premium UI shell: bash From 50101961b13885ee805da15ade302cb5b7125eeb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 16 Jul 2026 03:42:44 +0000 Subject: [PATCH 5/8] fix: compact IED discovery and simplify premium GOOSE UI --- .github/compact-ui.patch.gz.b64 | 1 - .github/workflows/apply-compact-ui.yml | 71 - App.xaml | 1791 ++++----- MainWindow.xaml | 2358 ++++++------ MainWindow.xaml.cs | 4868 ++++++++++++------------ Models/MonitorModels.cs | 1822 ++++----- SaveSclWindow.xaml | 338 +- SaveSclWindow.xaml.cs | 241 +- 8 files changed, 5734 insertions(+), 5756 deletions(-) delete mode 100644 .github/compact-ui.patch.gz.b64 delete mode 100644 .github/workflows/apply-compact-ui.yml diff --git a/.github/compact-ui.patch.gz.b64 b/.github/compact-ui.patch.gz.b64 deleted file mode 100644 index a6004722..00000000 --- a/.github/compact-ui.patch.gz.b64 +++ /dev/null @@ -1 +0,0 @@ -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 \ No newline at end of file diff --git a/.github/workflows/apply-compact-ui.yml b/.github/workflows/apply-compact-ui.yml deleted file mode 100644 index 8a239d45..00000000 --- a/.github/workflows/apply-compact-ui.yml +++ /dev/null @@ -1,71 +0,0 @@ -name: Apply compact premium UI - -on: - push: - branches: [ fix/compact-ied-goose-ui ] - paths: - - .github/compact-ui.patch.gz.b64 - - .github/workflows/apply-compact-ui.yml - pull_request: - branches: [ main ] - paths: - - .github/compact-ui.patch.gz.b64 - - .github/workflows/apply-compact-ui.yml - -permissions: - contents: write - -jobs: - apply: - runs-on: ubuntu-latest - steps: - - name: Checkout feature branch - uses: actions/checkout@v4 - with: - ref: fix/compact-ied-goose-ui - fetch-depth: 0 - - - name: Decode and apply UI patch - shell: bash - run: | - python3 - <<'PY' - from pathlib import Path - import base64, gzip - encoded = Path('.github/compact-ui.patch.gz.b64').read_text(encoding='utf-8').strip() - Path('/tmp/compact-ui.patch').write_bytes(gzip.decompress(base64.b64decode(encoded))) - PY - git apply --ignore-whitespace /tmp/compact-ui.patch - - - name: Preserve line endings and parse XAML - shell: bash - run: | - python3 - <<'PY' - from pathlib import Path - import xml.etree.ElementTree as ET - - files = [ - 'App.xaml', - 'MainWindow.xaml', - 'SaveSclWindow.xaml', - 'SaveSclWindow.xaml.cs', - 'MainWindow.xaml.cs', - 'Models/MonitorModels.cs', - ] - for name in files: - path = Path(name) - data = path.read_bytes().replace(b'\r\n', b'\n').replace(b'\r', b'\n') - path.write_bytes(data.replace(b'\n', b'\r\n')) - - for name in ['App.xaml', 'MainWindow.xaml', 'SaveSclWindow.xaml']: - ET.parse(name) - PY - - - name: Commit compact premium UI - shell: bash - run: | - git rm .github/compact-ui.patch.gz.b64 .github/workflows/apply-compact-ui.yml - git add App.xaml MainWindow.xaml MainWindow.xaml.cs Models/MonitorModels.cs SaveSclWindow.xaml SaveSclWindow.xaml.cs - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git commit -m "fix: compact IED discovery and simplify premium GOOSE UI" - git push origin HEAD:fix/compact-ied-goose-ui diff --git a/App.xaml b/App.xaml index f5e41f98..3ec77fbd 100644 --- a/App.xaml +++ b/App.xaml @@ -1,856 +1,935 @@ - - - #111827 - #667085 - #2563EB - #1D4ED8 - #EAF1FF - #EEF3F9 - #DDE5F0 - - #F8FAFD - #FFFFFF - #DDE5F0 - #B9C8DC - #15803D - #DC2626 - #D97706 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - M8,5 L19,12 L8,19 Z - M6,6 H18 V18 H6 Z - M12,20 H21 M16.5,3.5 A2.12,2.12 0 0 1 19.5,6.5 L7,19 L3,20 L4,16 Z - M19,21 H5 A2,2 0 0 1 3,19 V5 A2,2 0 0 1 5,3 H16 L21,8 V19 A2,2 0 0 1 19,21 Z M17,21 V13 H7 V21 M7,3 V8 H15 - M18,6 L6,18 M6,6 L18,18 - M20,11 A8,8 0 1 0 18.3,16 M20,4 V11 H13 - M3,7 H9 L11,9 H21 L19,20 H3 Z M3,7 V5 H9 L11,7 - M14,2 V8 H20 M14,2 H6 A2,2 0 0 0 4,4 V20 A2,2 0 0 0 6,22 H18 A2,2 0 0 0 20,20 V8 Z M9,15 H15 M12,12 L15,15 L12,18 - M14,2 V8 H20 M14,2 H6 A2,2 0 0 0 4,4 V20 A2,2 0 0 0 6,22 H18 A2,2 0 0 0 20,20 V8 Z M10,15 H16 M13,12 L16,15 L13,18 - M12,5 V19 M5,12 H19 - M21,4 H14 M10,4 H3 M21,12 H12 M8,12 H3 M21,20 H16 M12,20 H3 M14,2 V6 M10,10 V14 M16,18 V22 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + #111827 + #667085 + #2563EB + #1D4ED8 + #EAF1FF + #EEF3F9 + #DDE5F0 + + #F8FAFD + #FFFFFF + #DDE5F0 + #B9C8DC + #15803D + #DC2626 + #D97706 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + M8,5 L19,12 L8,19 Z + M6,6 H18 V18 H6 Z + M12,20 H21 M16.5,3.5 A2.12,2.12 0 0 1 19.5,6.5 L7,19 L3,20 L4,16 Z + M19,21 H5 A2,2 0 0 1 3,19 V5 A2,2 0 0 1 5,3 H16 L21,8 V19 A2,2 0 0 1 19,21 Z M17,21 V13 H7 V21 M7,3 V8 H15 + M18,6 L6,18 M6,6 L18,18 + M20,11 A8,8 0 1 0 18.3,16 M20,4 V11 H13 + M3,7 H9 L11,9 H21 L19,20 H3 Z M3,7 V5 H9 L11,7 + M14,2 V8 H20 M14,2 H6 A2,2 0 0 0 4,4 V20 A2,2 0 0 0 6,22 H18 A2,2 0 0 0 20,20 V8 Z M9,15 H15 M12,12 L15,15 L12,18 + M14,2 V8 H20 M14,2 H6 A2,2 0 0 0 4,4 V20 A2,2 0 0 0 6,22 H18 A2,2 0 0 0 20,20 V8 Z M10,15 H16 M13,12 L16,15 L13,18 + M12,5 V19 M5,12 H19 + M21,4 H14 M10,4 H3 M21,12 H12 M8,12 H3 M21,20 H16 M12,20 H3 M14,2 V6 M10,10 V14 M16,18 V22 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MainWindow.xaml b/MainWindow.xaml index d1b9f417..2e543902 100644 --- a/MainWindow.xaml +++ b/MainWindow.xaml @@ -1,1183 +1,1175 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SaveSclWindow.xaml.cs b/SaveSclWindow.xaml.cs index 5092859a..e5e5fb2f 100644 --- a/SaveSclWindow.xaml.cs +++ b/SaveSclWindow.xaml.cs @@ -1,130 +1,111 @@ -using System.ComponentModel; -using System.Runtime.CompilerServices; -using System.Windows; -using System.Windows.Media; -using System.Windows.Media.Animation; -using AR.Iec61850.Scl.Export; - -namespace ArIED61850Tester; - -public sealed class SaveSclDialogViewModel : INotifyPropertyChanged -{ - private SclSchemaProfileDescriptor _selectedSchemaProfile; - private string _editionHint = string.Empty; - - public SaveSclDialogViewModel( - string iedName, - string sourceDescription, - SclSchemaProfile selectedProfile = SclSchemaProfile.Edition2V31) - { - IedName = string.IsNullOrWhiteSpace(iedName) ? "IED" : iedName.Trim(); - SourceDescription = string.IsNullOrWhiteSpace(sourceDescription) - ? "IEC 61850 model" - : sourceDescription.Trim(); - _selectedSchemaProfile = SclSchemaProfiles.Get(selectedProfile); - UpdateHint(); - } - - public event PropertyChangedEventHandler? PropertyChanged; - - public string IedName { get; } - public string SourceDescription { get; } - - public SclSchemaProfileDescriptor SelectedSchemaProfile - { - get => _selectedSchemaProfile; - private set - { - if (_selectedSchemaProfile.Profile == value.Profile) - return; - _selectedSchemaProfile = value; - OnPropertyChanged(); - UpdateHint(); - } - } - - public string EditionHint - { - get => _editionHint; - private set - { - if (string.Equals(_editionHint, value, StringComparison.Ordinal)) - return; - _editionHint = value; - OnPropertyChanged(); - } - } - - public bool IsEdition2 => SelectedSchemaProfile.IsEdition2; - - public void Select(SclSchemaProfile profile) - { - SelectedSchemaProfile = SclSchemaProfiles.Get(profile); - OnPropertyChanged(nameof(IsEdition2)); - } - - private void UpdateHint() - { - EditionHint = SelectedSchemaProfile.IsEdition2 - ? "Recommended for modern engineering exchange. The output is saved as an IID file." - : "Use for legacy engineering systems that require Edition 1. The output is saved as an ICD file."; - } - - private void OnPropertyChanged([CallerMemberName] string? propertyName = null) - => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); -} - -public partial class SaveSclWindow : Window -{ - private const double IndicatorOffset = 192d; - - public SaveSclWindow( - string iedName, - string sourceDescription, - SclSchemaProfile selectedProfile = SclSchemaProfile.Edition2V31) - { - InitializeComponent(); - DataContext = new SaveSclDialogViewModel(iedName, sourceDescription, selectedProfile); - } - - public SaveSclDialogViewModel ViewModel => (SaveSclDialogViewModel)DataContext; - - private void Window_Loaded(object sender, RoutedEventArgs e) - => ApplyEditionVisuals(animate: false); - - private void Edition2_Click(object sender, RoutedEventArgs e) - { - ViewModel.Select(SclSchemaProfile.Edition2V31); - ApplyEditionVisuals(animate: true); - } - - private void Edition1_Click(object sender, RoutedEventArgs e) - { - ViewModel.Select(SclSchemaProfile.Edition1V16); - ApplyEditionVisuals(animate: true); - } - - private void ApplyEditionVisuals(bool animate) - { - var target = ViewModel.IsEdition2 ? 0d : IndicatorOffset; - Edition2Button.Foreground = ViewModel.IsEdition2 ? Brushes.White : new SolidColorBrush(Color.FromRgb(52, 64, 84)); - Edition1Button.Foreground = ViewModel.IsEdition2 ? new SolidColorBrush(Color.FromRgb(52, 64, 84)) : Brushes.White; - - if (!animate) - { - EditionIndicatorTranslate.X = target; - return; - } - - var animation = new DoubleAnimation - { - To = target, - Duration = TimeSpan.FromMilliseconds(185), - EasingFunction = new CubicEase { EasingMode = EasingMode.EaseOut } - }; - EditionIndicatorTranslate.BeginAnimation(TranslateTransform.XProperty, animation, HandoffBehavior.SnapshotAndReplace); - } - - private void Save_Click(object sender, RoutedEventArgs e) - => DialogResult = true; -} +using System.ComponentModel; +using System.Runtime.CompilerServices; +using System.Windows; +using AR.Iec61850.Scl.Export; + +namespace ArIED61850Tester; + +public sealed class SaveSclDialogViewModel : INotifyPropertyChanged +{ + private SclSchemaProfileDescriptor _selectedSchemaProfile; + private string _editionHint = string.Empty; + + public SaveSclDialogViewModel( + string iedName, + string sourceDescription, + SclSchemaProfile selectedProfile = SclSchemaProfile.Edition2V31) + { + IedName = string.IsNullOrWhiteSpace(iedName) ? "IED" : iedName.Trim(); + SourceDescription = string.IsNullOrWhiteSpace(sourceDescription) + ? "IEC 61850 model" + : sourceDescription.Trim(); + _selectedSchemaProfile = SclSchemaProfiles.Get(selectedProfile); + UpdateHint(); + } + + public event PropertyChangedEventHandler? PropertyChanged; + + public string IedName { get; } + public string SourceDescription { get; } + + public SclSchemaProfileDescriptor SelectedSchemaProfile + { + get => _selectedSchemaProfile; + private set + { + if (_selectedSchemaProfile.Profile == value.Profile) + return; + _selectedSchemaProfile = value; + OnPropertyChanged(); + UpdateHint(); + } + } + + public string EditionHint + { + get => _editionHint; + private set + { + if (string.Equals(_editionHint, value, StringComparison.Ordinal)) + return; + _editionHint = value; + OnPropertyChanged(); + } + } + + public bool IsEdition2 => SelectedSchemaProfile.IsEdition2; + + public void Select(SclSchemaProfile profile) + { + SelectedSchemaProfile = SclSchemaProfiles.Get(profile); + OnPropertyChanged(nameof(IsEdition2)); + } + + private void UpdateHint() + { + EditionHint = SelectedSchemaProfile.IsEdition2 + ? "Recommended for modern engineering exchange. The output is saved as an IID file." + : "Use for legacy engineering systems that require Edition 1. The output is saved as an ICD file."; + } + + private void OnPropertyChanged([CallerMemberName] string? propertyName = null) + => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); +} + +public partial class SaveSclWindow : Window +{ + public SaveSclWindow( + string iedName, + string sourceDescription, + SclSchemaProfile selectedProfile = SclSchemaProfile.Edition2V31) + { + InitializeComponent(); + DataContext = new SaveSclDialogViewModel(iedName, sourceDescription, selectedProfile); + } + + public SaveSclDialogViewModel ViewModel => (SaveSclDialogViewModel)DataContext; + + private void Window_Loaded(object sender, RoutedEventArgs e) + => ApplyEditionVisuals(); + + private void Edition2_Click(object sender, RoutedEventArgs e) + { + ViewModel.Select(SclSchemaProfile.Edition2V31); + ApplyEditionVisuals(); + } + + private void Edition1_Click(object sender, RoutedEventArgs e) + { + ViewModel.Select(SclSchemaProfile.Edition1V16); + ApplyEditionVisuals(); + } + + private void ApplyEditionVisuals() + { + Edition2Toggle.IsChecked = ViewModel.IsEdition2; + Edition1Toggle.IsChecked = !ViewModel.IsEdition2; + } + + private void Save_Click(object sender, RoutedEventArgs e) + => DialogResult = true; +} From 441869e1c6f15542c718ba5f8e02a9841d2b628d Mon Sep 17 00:00:00 2001 From: masarray Date: Thu, 16 Jul 2026 10:43:49 +0700 Subject: [PATCH 6/8] ci: normalize compact UI source line endings --- .github/workflows/normalize-compact-ui.yml | 49 ++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 .github/workflows/normalize-compact-ui.yml diff --git a/.github/workflows/normalize-compact-ui.yml b/.github/workflows/normalize-compact-ui.yml new file mode 100644 index 00000000..d18e24e1 --- /dev/null +++ b/.github/workflows/normalize-compact-ui.yml @@ -0,0 +1,49 @@ +name: Normalize compact UI line endings + +on: + push: + branches: [ fix/compact-ied-goose-ui ] + paths: + - .github/workflows/normalize-compact-ui.yml + pull_request: + branches: [ main ] + paths: + - .github/workflows/normalize-compact-ui.yml + +permissions: + contents: write + +jobs: + normalize: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: fix/compact-ied-goose-ui + fetch-depth: 0 + - name: Normalize modified sources to LF + shell: bash + run: | + python3 - <<'PY' + from pathlib import Path + for name in [ + 'App.xaml', + 'MainWindow.xaml', + 'MainWindow.xaml.cs', + 'Models/MonitorModels.cs', + 'SaveSclWindow.xaml', + 'SaveSclWindow.xaml.cs', + ]: + path = Path(name) + data = path.read_bytes().replace(b'\r\n', b'\n').replace(b'\r', b'\n') + path.write_bytes(data) + PY + git diff --stat + - name: Commit normalized sources + shell: bash + run: | + git add App.xaml MainWindow.xaml MainWindow.xaml.cs Models/MonitorModels.cs SaveSclWindow.xaml SaveSclWindow.xaml.cs + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git commit -m "chore: preserve source line endings for focused UI diff" + git push origin HEAD:fix/compact-ied-goose-ui From 891903290098041c8637df7d5155aff70c4d56ee Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 16 Jul 2026 03:43:57 +0000 Subject: [PATCH 7/8] chore: preserve source line endings for focused UI diff --- App.xaml | 1870 +++++++-------- MainWindow.xaml | 2350 +++++++++---------- MainWindow.xaml.cs | 4868 +++++++++++++++++++-------------------- Models/MonitorModels.cs | 1822 +++++++-------- SaveSclWindow.xaml | 336 +-- SaveSclWindow.xaml.cs | 222 +- 6 files changed, 5734 insertions(+), 5734 deletions(-) diff --git a/App.xaml b/App.xaml index 3ec77fbd..ede97eaf 100644 --- a/App.xaml +++ b/App.xaml @@ -1,935 +1,935 @@ - - - #111827 - #667085 - #2563EB - #1D4ED8 - #EAF1FF - #EEF3F9 - #DDE5F0 - - #F8FAFD - #FFFFFF - #DDE5F0 - #B9C8DC - #15803D - #DC2626 - #D97706 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - M8,5 L19,12 L8,19 Z - M6,6 H18 V18 H6 Z - M12,20 H21 M16.5,3.5 A2.12,2.12 0 0 1 19.5,6.5 L7,19 L3,20 L4,16 Z - M19,21 H5 A2,2 0 0 1 3,19 V5 A2,2 0 0 1 5,3 H16 L21,8 V19 A2,2 0 0 1 19,21 Z M17,21 V13 H7 V21 M7,3 V8 H15 - M18,6 L6,18 M6,6 L18,18 - M20,11 A8,8 0 1 0 18.3,16 M20,4 V11 H13 - M3,7 H9 L11,9 H21 L19,20 H3 Z M3,7 V5 H9 L11,7 - M14,2 V8 H20 M14,2 H6 A2,2 0 0 0 4,4 V20 A2,2 0 0 0 6,22 H18 A2,2 0 0 0 20,20 V8 Z M9,15 H15 M12,12 L15,15 L12,18 - M14,2 V8 H20 M14,2 H6 A2,2 0 0 0 4,4 V20 A2,2 0 0 0 6,22 H18 A2,2 0 0 0 20,20 V8 Z M10,15 H16 M13,12 L16,15 L13,18 - M12,5 V19 M5,12 H19 - M21,4 H14 M10,4 H3 M21,12 H12 M8,12 H3 M21,20 H16 M12,20 H3 M14,2 V6 M10,10 V14 M16,18 V22 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + #111827 + #667085 + #2563EB + #1D4ED8 + #EAF1FF + #EEF3F9 + #DDE5F0 + + #F8FAFD + #FFFFFF + #DDE5F0 + #B9C8DC + #15803D + #DC2626 + #D97706 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + M8,5 L19,12 L8,19 Z + M6,6 H18 V18 H6 Z + M12,20 H21 M16.5,3.5 A2.12,2.12 0 0 1 19.5,6.5 L7,19 L3,20 L4,16 Z + M19,21 H5 A2,2 0 0 1 3,19 V5 A2,2 0 0 1 5,3 H16 L21,8 V19 A2,2 0 0 1 19,21 Z M17,21 V13 H7 V21 M7,3 V8 H15 + M18,6 L6,18 M6,6 L18,18 + M20,11 A8,8 0 1 0 18.3,16 M20,4 V11 H13 + M3,7 H9 L11,9 H21 L19,20 H3 Z M3,7 V5 H9 L11,7 + M14,2 V8 H20 M14,2 H6 A2,2 0 0 0 4,4 V20 A2,2 0 0 0 6,22 H18 A2,2 0 0 0 20,20 V8 Z M9,15 H15 M12,12 L15,15 L12,18 + M14,2 V8 H20 M14,2 H6 A2,2 0 0 0 4,4 V20 A2,2 0 0 0 6,22 H18 A2,2 0 0 0 20,20 V8 Z M10,15 H16 M13,12 L16,15 L13,18 + M12,5 V19 M5,12 H19 + M21,4 H14 M10,4 H3 M21,12 H12 M8,12 H3 M21,20 H16 M12,20 H3 M14,2 V6 M10,10 V14 M16,18 V22 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MainWindow.xaml b/MainWindow.xaml index 2e543902..3befad76 100644 --- a/MainWindow.xaml +++ b/MainWindow.xaml @@ -1,1175 +1,1175 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SaveSclWindow.xaml.cs b/SaveSclWindow.xaml.cs index e5e5fb2f..c1e9263b 100644 --- a/SaveSclWindow.xaml.cs +++ b/SaveSclWindow.xaml.cs @@ -1,111 +1,111 @@ -using System.ComponentModel; -using System.Runtime.CompilerServices; -using System.Windows; -using AR.Iec61850.Scl.Export; - -namespace ArIED61850Tester; - -public sealed class SaveSclDialogViewModel : INotifyPropertyChanged -{ - private SclSchemaProfileDescriptor _selectedSchemaProfile; - private string _editionHint = string.Empty; - - public SaveSclDialogViewModel( - string iedName, - string sourceDescription, - SclSchemaProfile selectedProfile = SclSchemaProfile.Edition2V31) - { - IedName = string.IsNullOrWhiteSpace(iedName) ? "IED" : iedName.Trim(); - SourceDescription = string.IsNullOrWhiteSpace(sourceDescription) - ? "IEC 61850 model" - : sourceDescription.Trim(); - _selectedSchemaProfile = SclSchemaProfiles.Get(selectedProfile); - UpdateHint(); - } - - public event PropertyChangedEventHandler? PropertyChanged; - - public string IedName { get; } - public string SourceDescription { get; } - - public SclSchemaProfileDescriptor SelectedSchemaProfile - { - get => _selectedSchemaProfile; - private set - { - if (_selectedSchemaProfile.Profile == value.Profile) - return; - _selectedSchemaProfile = value; - OnPropertyChanged(); - UpdateHint(); - } - } - - public string EditionHint - { - get => _editionHint; - private set - { - if (string.Equals(_editionHint, value, StringComparison.Ordinal)) - return; - _editionHint = value; - OnPropertyChanged(); - } - } - - public bool IsEdition2 => SelectedSchemaProfile.IsEdition2; - - public void Select(SclSchemaProfile profile) - { - SelectedSchemaProfile = SclSchemaProfiles.Get(profile); - OnPropertyChanged(nameof(IsEdition2)); - } - - private void UpdateHint() - { - EditionHint = SelectedSchemaProfile.IsEdition2 - ? "Recommended for modern engineering exchange. The output is saved as an IID file." - : "Use for legacy engineering systems that require Edition 1. The output is saved as an ICD file."; - } - - private void OnPropertyChanged([CallerMemberName] string? propertyName = null) - => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); -} - -public partial class SaveSclWindow : Window -{ - public SaveSclWindow( - string iedName, - string sourceDescription, - SclSchemaProfile selectedProfile = SclSchemaProfile.Edition2V31) - { - InitializeComponent(); - DataContext = new SaveSclDialogViewModel(iedName, sourceDescription, selectedProfile); - } - - public SaveSclDialogViewModel ViewModel => (SaveSclDialogViewModel)DataContext; - - private void Window_Loaded(object sender, RoutedEventArgs e) - => ApplyEditionVisuals(); - - private void Edition2_Click(object sender, RoutedEventArgs e) - { - ViewModel.Select(SclSchemaProfile.Edition2V31); - ApplyEditionVisuals(); - } - - private void Edition1_Click(object sender, RoutedEventArgs e) - { - ViewModel.Select(SclSchemaProfile.Edition1V16); - ApplyEditionVisuals(); - } - - private void ApplyEditionVisuals() - { - Edition2Toggle.IsChecked = ViewModel.IsEdition2; - Edition1Toggle.IsChecked = !ViewModel.IsEdition2; - } - - private void Save_Click(object sender, RoutedEventArgs e) - => DialogResult = true; -} +using System.ComponentModel; +using System.Runtime.CompilerServices; +using System.Windows; +using AR.Iec61850.Scl.Export; + +namespace ArIED61850Tester; + +public sealed class SaveSclDialogViewModel : INotifyPropertyChanged +{ + private SclSchemaProfileDescriptor _selectedSchemaProfile; + private string _editionHint = string.Empty; + + public SaveSclDialogViewModel( + string iedName, + string sourceDescription, + SclSchemaProfile selectedProfile = SclSchemaProfile.Edition2V31) + { + IedName = string.IsNullOrWhiteSpace(iedName) ? "IED" : iedName.Trim(); + SourceDescription = string.IsNullOrWhiteSpace(sourceDescription) + ? "IEC 61850 model" + : sourceDescription.Trim(); + _selectedSchemaProfile = SclSchemaProfiles.Get(selectedProfile); + UpdateHint(); + } + + public event PropertyChangedEventHandler? PropertyChanged; + + public string IedName { get; } + public string SourceDescription { get; } + + public SclSchemaProfileDescriptor SelectedSchemaProfile + { + get => _selectedSchemaProfile; + private set + { + if (_selectedSchemaProfile.Profile == value.Profile) + return; + _selectedSchemaProfile = value; + OnPropertyChanged(); + UpdateHint(); + } + } + + public string EditionHint + { + get => _editionHint; + private set + { + if (string.Equals(_editionHint, value, StringComparison.Ordinal)) + return; + _editionHint = value; + OnPropertyChanged(); + } + } + + public bool IsEdition2 => SelectedSchemaProfile.IsEdition2; + + public void Select(SclSchemaProfile profile) + { + SelectedSchemaProfile = SclSchemaProfiles.Get(profile); + OnPropertyChanged(nameof(IsEdition2)); + } + + private void UpdateHint() + { + EditionHint = SelectedSchemaProfile.IsEdition2 + ? "Recommended for modern engineering exchange. The output is saved as an IID file." + : "Use for legacy engineering systems that require Edition 1. The output is saved as an ICD file."; + } + + private void OnPropertyChanged([CallerMemberName] string? propertyName = null) + => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); +} + +public partial class SaveSclWindow : Window +{ + public SaveSclWindow( + string iedName, + string sourceDescription, + SclSchemaProfile selectedProfile = SclSchemaProfile.Edition2V31) + { + InitializeComponent(); + DataContext = new SaveSclDialogViewModel(iedName, sourceDescription, selectedProfile); + } + + public SaveSclDialogViewModel ViewModel => (SaveSclDialogViewModel)DataContext; + + private void Window_Loaded(object sender, RoutedEventArgs e) + => ApplyEditionVisuals(); + + private void Edition2_Click(object sender, RoutedEventArgs e) + { + ViewModel.Select(SclSchemaProfile.Edition2V31); + ApplyEditionVisuals(); + } + + private void Edition1_Click(object sender, RoutedEventArgs e) + { + ViewModel.Select(SclSchemaProfile.Edition1V16); + ApplyEditionVisuals(); + } + + private void ApplyEditionVisuals() + { + Edition2Toggle.IsChecked = ViewModel.IsEdition2; + Edition1Toggle.IsChecked = !ViewModel.IsEdition2; + } + + private void Save_Click(object sender, RoutedEventArgs e) + => DialogResult = true; +} From c2d2a3ddc9c9557d66cd988a0d86d46e6212df5a Mon Sep 17 00:00:00 2001 From: masarray Date: Thu, 16 Jul 2026 10:44:32 +0700 Subject: [PATCH 8/8] chore: remove temporary UI normalization workflow --- .github/workflows/normalize-compact-ui.yml | 49 ---------------------- 1 file changed, 49 deletions(-) delete mode 100644 .github/workflows/normalize-compact-ui.yml diff --git a/.github/workflows/normalize-compact-ui.yml b/.github/workflows/normalize-compact-ui.yml deleted file mode 100644 index d18e24e1..00000000 --- a/.github/workflows/normalize-compact-ui.yml +++ /dev/null @@ -1,49 +0,0 @@ -name: Normalize compact UI line endings - -on: - push: - branches: [ fix/compact-ied-goose-ui ] - paths: - - .github/workflows/normalize-compact-ui.yml - pull_request: - branches: [ main ] - paths: - - .github/workflows/normalize-compact-ui.yml - -permissions: - contents: write - -jobs: - normalize: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - ref: fix/compact-ied-goose-ui - fetch-depth: 0 - - name: Normalize modified sources to LF - shell: bash - run: | - python3 - <<'PY' - from pathlib import Path - for name in [ - 'App.xaml', - 'MainWindow.xaml', - 'MainWindow.xaml.cs', - 'Models/MonitorModels.cs', - 'SaveSclWindow.xaml', - 'SaveSclWindow.xaml.cs', - ]: - path = Path(name) - data = path.read_bytes().replace(b'\r\n', b'\n').replace(b'\r', b'\n') - path.write_bytes(data) - PY - git diff --stat - - name: Commit normalized sources - shell: bash - run: | - git add App.xaml MainWindow.xaml MainWindow.xaml.cs Models/MonitorModels.cs SaveSclWindow.xaml SaveSclWindow.xaml.cs - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git commit -m "chore: preserve source line endings for focused UI diff" - git push origin HEAD:fix/compact-ied-goose-ui