Files
ReLibreHardwareMonitor/LibreHardwareMonitor.Windows.WinUI/Services/SecondaryWindowCoordinator.cs
T
JMR-devandCopilot 0cfb9ba3a4 Extract SecondaryWindowCoordinator for plot/gadget lifecycle
Move the PlotWindow + SensorGadgetWindow create/show/sync/close lifecycle out of MainWindow into Services/SecondaryWindowCoordinator. The coordinator owns the _plotWindow and _gadgetWindow fields and exposes UpdatePlotWindowVisibility / UpdateGadgetVisibility / SyncGadgetSensors / ApplyTheme / RedrawPlot / CloseAll.

MainWindow's matching methods become one-line delegators; the gadget's HideShowMainWindowRequested event is wired back via a callback passed into the coordinator's constructor.

MainWindow shrinks from 1362 to 1300 lines; no behaviour change.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-06-02 13:04:51 -05:00

110 lines
3.2 KiB
C#

// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
// If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
// Copyright (C) LibreHardwareMonitor and Contributors.
using System;
using LibreHardwareMonitor.Windows.WinUI.ViewModels;
namespace LibreHardwareMonitor.Windows.WinUI.Services;
internal sealed class SecondaryWindowCoordinator
{
private readonly MainWindowViewModel _viewModel;
private readonly Action _hideShowMainWindowRequested;
private PlotWindow? _plotWindow;
private SensorGadgetWindow? _gadgetWindow;
public SecondaryWindowCoordinator(MainWindowViewModel viewModel, Action hideShowMainWindowRequested)
{
_viewModel = viewModel ?? throw new ArgumentNullException(nameof(viewModel));
_hideShowMainWindowRequested = hideShowMainWindowRequested ?? throw new ArgumentNullException(nameof(hideShowMainWindowRequested));
}
public void UpdateGadgetVisibility()
{
if (_viewModel.ShowGadget)
{
if (_gadgetWindow == null)
{
_gadgetWindow = new SensorGadgetWindow(_viewModel);
_gadgetWindow.HideShowMainWindowRequested += (_, _) => _hideShowMainWindowRequested();
_gadgetWindow.UserClosed += (_, _) =>
{
_gadgetWindow = null;
_viewModel.ShowGadget = false;
};
SyncGadgetSensors();
_gadgetWindow.Activate();
}
return;
}
if (_gadgetWindow != null)
{
SensorGadgetWindow gadgetWindow = _gadgetWindow;
_gadgetWindow = null;
gadgetWindow.CloseFromOwner();
}
}
public void UpdatePlotWindowVisibility()
{
if (_viewModel.IsPlotWindowVisible)
{
if (_plotWindow == null)
{
_plotWindow = new PlotWindow(_viewModel.Settings, _viewModel);
_plotWindow.ApplyTheme(_viewModel.ThemeMode);
_plotWindow.UserClosed += (_, _) =>
{
_plotWindow = null;
_viewModel.ShowPlot = false;
};
_plotWindow.Activate();
}
return;
}
if (_plotWindow != null)
{
PlotWindow plotWindow = _plotWindow;
_plotWindow = null;
plotWindow.CloseFromOwner();
}
}
public void SyncGadgetSensors()
{
_gadgetWindow?.UpdateSensors(_viewModel.GetGadgetSensorItems());
}
public void ApplyTheme(AppThemeMode themeMode)
{
_plotWindow?.ApplyTheme(themeMode);
}
public void RedrawPlot()
{
_plotWindow?.RedrawPlot();
}
public void CloseAll()
{
if (_gadgetWindow != null)
{
SensorGadgetWindow gadgetWindow = _gadgetWindow;
_gadgetWindow = null;
gadgetWindow.CloseFromOwner();
}
if (_plotWindow != null)
{
PlotWindow plotWindow = _plotWindow;
_plotWindow = null;
plotWindow.CloseFromOwner();
}
}
}