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; /// /// Interaction logic for MainWindow.xaml /// public partial class MainWindow:IRecipient { 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(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 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; } }