From fd55a89e22c2ed500983c7b829736a87435cb04f Mon Sep 17 00:00:00 2001 From: Jason Ross Date: Tue, 2 Jun 2026 13:31:24 -0500 Subject: [PATCH] Convert sensor pane scaffold and TreeView to MainWindow.xaml (Phase 5b step 4) Declare the sensor pane (SensorPane), header host (SensorHeaderHost), and TreeView (SensorTree, with its ContentPresenter DataTemplate and SelectionChanged handler) in XAML. The measurer-managed header grid and the per-row CreateSensorRow content remain imperative since they involve dynamic column-width pushing and per-item context flyouts/double-tap handlers; this is the hybrid fallback called out in the Phase 5b plan. Drop _sensorTree/_sensorPane fields; replace BuildSensorPane with a small PopulateSensorHeader and delete the old XamlReader-loaded DataTemplate. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../MainWindow.cs | 64 +++---------------- .../MainWindow.xaml | 18 ++++++ 2 files changed, 26 insertions(+), 56 deletions(-) diff --git a/LibreHardwareMonitor.Windows.WinUI/MainWindow.cs b/LibreHardwareMonitor.Windows.WinUI/MainWindow.cs index 84c1c6a..c520cde 100644 --- a/LibreHardwareMonitor.Windows.WinUI/MainWindow.cs +++ b/LibreHardwareMonitor.Windows.WinUI/MainWindow.cs @@ -36,8 +36,6 @@ public sealed partial class MainWindow : Window private readonly DispatcherQueueTimer _timer; private readonly PlotView _plotView; private readonly Grid _plotPane; - private readonly TreeView _sensorTree; - private readonly Grid _sensorPane; private readonly WinUiStartupTrace? _startupTrace; private readonly TrayIconService _trayIconService; private readonly DialogService _dialogService; @@ -96,17 +94,7 @@ public sealed partial class MainWindow : Window Bind(ContentGrid, UIElement.IsHitTestVisibleProperty, ViewModel, nameof(ViewModel.IsHardwareInteractionEnabled)); MeasureStartup("MainWindow.PopulateMenuSubmenus", PopulateMenuSubmenus); - - TreeView? builtTree = null; - Grid sensorPane = MeasureStartup("MainWindow.BuildSensorPane", () => - { - Grid pane = BuildSensorPane(out TreeView tree); - builtTree = tree; - return pane; - }); - _sensorPane = sensorPane; - _sensorTree = builtTree!; - ContentGrid.Children.Add(sensorPane); + MeasureStartup("MainWindow.PopulateSensorHeader", PopulateSensorHeader); PlotView? builtPlot = null; Grid plotPane = MeasureStartup("MainWindow.BuildPlotPane", () => @@ -226,7 +214,7 @@ public sealed partial class MainWindow : Window private string GetRootSizeDetail() { - return FormattableString.Invariant($"root={RootGrid.ActualWidth:F0}x{RootGrid.ActualHeight:F0}, rows={_columnMeasurer.RowCount}, rootNodes={_sensorTree.RootNodes.Count}"); + return FormattableString.Invariant($"root={RootGrid.ActualWidth:F0}x{RootGrid.ActualHeight:F0}, rows={_columnMeasurer.RowCount}, rootNodes={SensorTree.RootNodes.Count}"); } private void RootGrid_Loaded(object sender, RoutedEventArgs e) @@ -371,17 +359,8 @@ public sealed partial class MainWindow : Window private async void OnWebServerAuthentication(object sender, RoutedEventArgs e) => await _dialogService.ShowWebServerAuthenticationAsync(); private async void OnAbout(object sender, RoutedEventArgs e) => await _dialogService.ShowAboutAsync(); - private Grid BuildSensorPane(out TreeView tree) + private void PopulateSensorHeader() { - Grid pane = new() - { - RowDefinitions = - { - new RowDefinition { Height = GridLength.Auto }, - new RowDefinition { Height = new GridLength(1, GridUnitType.Star) } - } - }; - Grid header = _columnMeasurer.CreateHeaderGrid(); header.Padding = new Thickness(8, 5, 8, 5); header.Background = (Brush)Application.Current.Resources["SystemControlBackgroundChromeMediumLowBrush"]; @@ -389,20 +368,7 @@ public sealed partial class MainWindow : Window header.Children.Add(CreateHeaderText("Value", 1, ViewModel.ValueColumnVisibility, nameof(ViewModel.ValueColumnVisibility))); header.Children.Add(CreateHeaderText("Min", 2, ViewModel.MinColumnVisibility, nameof(ViewModel.MinColumnVisibility))); header.Children.Add(CreateHeaderText("Max", 3, ViewModel.MaxColumnVisibility, nameof(ViewModel.MaxColumnVisibility))); - pane.Children.Add(header); - - Grid treeHost = new(); - Grid.SetRow(treeHost, 1); - tree = new() - { - ItemTemplate = CreateTreeViewNodeContentTemplate(), - SelectionMode = TreeViewSelectionMode.Single - }; - tree.SelectionChanged += SensorTree_SelectionChanged; - treeHost.Children.Add(tree); - pane.Children.Add(treeHost); - - return pane; + SensorHeaderHost.Children.Add(header); } private Grid BuildPlotPane(out PlotView plotView) @@ -636,16 +602,13 @@ public sealed partial class MainWindow : Window private void RebuildSensorTreeCore() { - if (_sensorTree == null) - return; - _columnMeasurer.ResetRows(); - _sensorTree.RootNodes.Clear(); + SensorTree.RootNodes.Clear(); foreach (SensorTreeItemViewModel item in ViewModel.RootItems) { TreeViewNode? node = CreateTreeNode(item); if (node != null) - _sensorTree.RootNodes.Add(node); + SensorTree.RootNodes.Add(node); } UpdateSensorColumnWidths(); @@ -667,17 +630,6 @@ public sealed partial class MainWindow : Window CompleteStartupTraceIfReady(); } - private static DataTemplate CreateTreeViewNodeContentTemplate() - { - const string xaml = """ - - - - """; - - return (DataTemplate)XamlReader.Load(xaml); - } - private TreeViewNode? CreateTreeNode(SensorTreeItemViewModel item) { if (item.RowVisibility == Visibility.Collapsed) @@ -881,8 +833,8 @@ public sealed partial class MainWindow : Window Grid.SetColumn(_plotPane, ViewModel.PlotGridColumn); Grid.SetRowSpan(_plotPane, ViewModel.PlotGridRowSpan); Grid.SetColumnSpan(_plotPane, ViewModel.PlotGridColumnSpan); - Grid.SetRowSpan(_sensorPane, ViewModel.SensorGridRowSpan); - Grid.SetColumnSpan(_sensorPane, ViewModel.SensorGridColumnSpan); + Grid.SetRowSpan(SensorPane, ViewModel.SensorGridRowSpan); + Grid.SetColumnSpan(SensorPane, ViewModel.SensorGridColumnSpan); UpdatePlotWindowVisibility(); DrawPlot(); } diff --git a/LibreHardwareMonitor.Windows.WinUI/MainWindow.xaml b/LibreHardwareMonitor.Windows.WinUI/MainWindow.xaml index 6128d5c..b3b2281 100644 --- a/LibreHardwareMonitor.Windows.WinUI/MainWindow.xaml +++ b/LibreHardwareMonitor.Windows.WinUI/MainWindow.xaml @@ -87,6 +87,24 @@ + + + + + + + + + + + + + + + +