livia-test/Livia/Views/MainWindow.xaml.cs
2025-03-28 14:31:53 +08:00

239 lines
7.3 KiB
C#

using System.ComponentModel;
using System.Windows;
using System.Windows.Input;
using CommunityToolkit.Mvvm.Messaging;
using Livia.Models;
using Livia.Models.Data;
using Livia.Properties;
using Livia.Utility;
using Livia.Utility.DependencyInjection;
using Livia.ViewModels;
using Livia.Views.Utility;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Ookii.Dialogs.Wpf;
namespace Livia.Views;
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow:IRecipient<DataLoadedMessage>
{
private readonly ILogger _logger;
private readonly IIdleTimer _idleTimer;
private readonly MainWindowViewModel _viewModel;
private readonly DebounceHelper _updateServerJobListBounceHelper;
public MainWindow(ILogger logger, IIdleTimer idleTimer, IWarningSystem warningSystem)
{
_logger = logger;
_idleTimer = idleTimer;
logger.LogInformation("MainWindow Starting");
_viewModel = ActivatorUtilities.GetServiceOrCreateInstance<MainWindowViewModel>(ServiceProviderFactory.ServiceProvider);
InitializeComponent();
DataContext = _viewModel;
if (ViewSettings.Default.MainWindowIsMaximized)
{
MaterialTitleBar.WindowIsMaximized = true;
}
warningSystem.SetSnackbar(MainWindowSnackbar);
_updateServerJobListBounceHelper = new DebounceHelper(TimeSpan.FromSeconds(0.5));
WeakReferenceMessenger.Default.RegisterAll(this);
FocusVisualStyleClear.Init();
}
public void AddMainControl(UIElement dataContext)
{
ControlHost.Children.Add(dataContext);
}
private void TitleBarMouseLeftButtonDown(object sender, MouseEventArgs e)
{
try
{
DragMove();
}
catch (Exception exception)
{
_logger.LogError(exception, "Error dragging window, sender = {sender}, event = {event}", sender, e);
}
}
private void WindowActivated(object sender, EventArgs e)
{
_logger.LogInformation("WindowActivated");
LoginControl.UpdateCapsLockOnState();
}
private void WindowPreviewKeyDown(object sender, KeyEventArgs e)
{
LoginControl.UpdateCapsLockOnState();
}
private void WindowClosing(object sender, CancelEventArgs e)
{
if (!_viewModel.ConfirmClosing())
{
e.Cancel = true;
return;
}
WeakReferenceMessenger.Default.Send(new ShutdownMessage());
_logger.LogInformation("Window Closing");
ViewSettings.Default.Save();
_viewModel.Dispose();
Application.Current.Shutdown();
}
private void WindowSizeChanged(object sender, SizeChangedEventArgs e)
{
//ignores start up
if (e.PreviousSize == new Size())
{
return;
}
_logger.LogInformation("Window Size Changed");
MaterialTitleBar.TryManuallyExitMaximizedMode(this, e);
}
private void MainWindowOnPreviewMouseDown(object sender, MouseButtonEventArgs e)
{
_idleTimer.ResetTimer();
//_logger.LogInformation("MainWindowOnPreviewMouseDown");
}
private void MainWindowOnPreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
_idleTimer.ResetTimer();
//_logger.LogInformation("MainWindowOnPreviewMouseWheel");
}
private void MainWindowOnPreviewMouseMove(object sender, MouseEventArgs e)
{
_idleTimer.ResetTimer();
//_logger.LogInformation("MainWindowOnPreviewMouseMove");
}
private async void ProcessDataButtonClick(object sender, RoutedEventArgs e)
{
VistaFolderBrowserDialog dialog = new();
if (!(dialog.ShowDialog() ?? false))
return;
ProgressBarDialog progressBarDialog = new(true, "Importing");
progressBarDialog.Show();
await progressBarDialog.SetTask(_viewModel.ProcessData(dialog.SelectedPath, progressBarDialog.CancellationToken)).ConfigureAwait(false);
}
public void ProcessDataCommandLine(Dictionary<string, string> argsDict)
{
ProgressBarDialog progressBarDialog = new(true);
progressBarDialog.Show();
progressBarDialog.SetTask(_viewModel.ProcessDataCommandLine(argsDict, progressBarDialog.CancellationToken)).ConfigureAwait(false);
}
private void ExportReportButtonClick(object sender, RoutedEventArgs e)
{
string? key = _viewModel.DataBlockLoader.CurrentDisplayingDataBlock?.Key;
if (key == null)
return;
SelectReportModuleDialog selectReportModuleDialog = new();
selectReportModuleDialog.Show();
//auto click
if (!Settings.Default.ShowSelectReportModuleDialog)
selectReportModuleDialog.ConfirmButtonClick(this, new RoutedEventArgs());
}
private void CheckReportsButtonClick(object sender, RoutedEventArgs e)
{
string? key = _viewModel.DataBlockLoader.CurrentDisplayingDataBlock?.Key;
if (key == null)
return;
CheckReportDialog checkReportDialog = new(key);
checkReportDialog.ShowDialog();
}
private void LogoutButtonClick(object sender, RoutedEventArgs e)
{
if (_viewModel.ConfirmLogout())
{
WeakReferenceMessenger.Default.Send(new LogoutMessage());
}
}
private void SettingsButtonClick(object sender, RoutedEventArgs e)
{
if (ViewUtility.WindowExists(out SettingsWindow? window))
{
if (window == null)
return;
window.WindowState = WindowState.Normal;
window.Activate();
}
else
{
SettingsWindow newWindow = new();
newWindow.Show();
}
}
private void AnonymousModeButtonClick(object sender, RoutedEventArgs e)
{
_viewModel.PatientInfoManager.AnonymousMode = !_viewModel.PatientInfoManager.AnonymousMode;
}
private async void ShowRightDrawerButtonClick(object sender, RoutedEventArgs e)
{
if (!_updateServerJobListBounceHelper.TryFire())
return;
DrawerHost.IsLeftDrawerOpen = false;
DrawerHost.IsRightDrawerOpen = true;
await _viewModel.JobListTableViewModel.UpdateServerJobList();
}
private async void ShowLeftDrawerButtonClick(object sender, RoutedEventArgs e)
{
DrawerHost.IsLeftDrawerOpen = true;
DrawerHost.IsRightDrawerOpen = false;
await _viewModel.JobListTableViewModel.UpdateServerJobList();
}
private void HideRightDrawerButtonClick(object sender, RoutedEventArgs e)
{
DrawerHost.IsRightDrawerOpen = false;
}
private void HideLeftDrawerButtonClick(object sender, RoutedEventArgs e)
{
DrawerHost.IsLeftDrawerOpen = false;
}
private async void ImportDataButtonClick(object sender, RoutedEventArgs e)
{
VistaFolderBrowserDialog dialog = new();
if (!(dialog.ShowDialog() ?? false))
return;
DataBlock data = new(dialog.SelectedPath)
{
Key = "0000",
ResultPath = dialog.SelectedPath
};
await _viewModel.DataBlockLoader.LoadData(data);
}
public void Receive(DataLoadedMessage message)
{
DrawerHost.IsRightDrawerOpen = false;
DrawerHost.IsLeftDrawerOpen = false;
}
}