1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-13 05:48:35 +00:00
Artemis/src/Artemis.UI/Screens/TrayViewModel.cs
Robert ef4e5b4c3b UI - Moved color scheme code away from tray VM
UI - Cleaned up settings page code
Core - Changed default framerate to 30
2021-09-18 20:40:57 +02:00

234 lines
7.3 KiB
C#

using System;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using Artemis.Core.Services;
using Artemis.UI.Events;
using Artemis.UI.Screens.Splash;
using Artemis.UI.Services;
using Artemis.UI.Shared.Services;
using Hardcodet.Wpf.TaskbarNotification;
using Ninject;
using Stylet;
namespace Artemis.UI.Screens
{
public class TrayViewModel : Screen, IMainWindowProvider
{
private readonly IDebugService _debugService;
private readonly IEventAggregator _eventAggregator;
private readonly IKernel _kernel;
private readonly IThemeService _themeService;
private readonly IWindowManager _windowManager;
private ImageSource _icon;
private bool _openingMainWindow;
private RootViewModel _rootViewModel;
private SplashViewModel _splashViewModel;
private TaskbarIcon _taskBarIcon;
public TrayViewModel(IKernel kernel,
IWindowManager windowManager,
IWindowService windowService,
IUpdateService updateService,
IEventAggregator eventAggregator,
ICoreService coreService,
IDebugService debugService,
ISettingsService settingsService,
IThemeService themeService)
{
_kernel = kernel;
_windowManager = windowManager;
_eventAggregator = eventAggregator;
_debugService = debugService;
_themeService = themeService;
Core.Utilities.ShutdownRequested += UtilitiesOnShutdownRequested;
Core.Utilities.RestartRequested += UtilitiesOnShutdownRequested;
_themeService.SystemThemeChanged += ThemeServiceOnSystemThemeChanged;
ApplyTrayIconTheme(_themeService.GetSystemTheme());
windowService.ConfigureMainWindowProvider(this);
bool autoRunning = Bootstrapper.StartupArguments.Contains("--autorun");
bool minimized = Bootstrapper.StartupArguments.Contains("--minimized");
bool showOnAutoRun = settingsService.GetSetting("UI.ShowOnStartup", true).Value;
if (autoRunning && !showOnAutoRun || minimized)
{
coreService.Initialized += (_, _) => updateService.AutoUpdate();
}
else
{
ShowSplashScreen();
coreService.Initialized += (_, _) => TrayBringToForeground();
}
}
public ImageSource Icon
{
get => _icon;
set => SetAndNotify(ref _icon, value);
}
public void TrayBringToForeground()
{
if (_openingMainWindow)
return;
try
{
_openingMainWindow = true;
if (IsMainWindowOpen)
{
Execute.OnUIThreadSync(() =>
{
FocusMainWindow();
_openingMainWindow = false;
});
return;
}
// Initialize the shared UI when first showing the window
if (!UI.Shared.Bootstrapper.Initialized)
UI.Shared.Bootstrapper.Initialize(_kernel);
Execute.OnUIThreadSync(() =>
{
_splashViewModel?.RequestClose();
_splashViewModel = null;
_rootViewModel = _kernel.Get<RootViewModel>();
_rootViewModel.Closed += RootViewModelOnClosed;
_windowManager.ShowWindow(_rootViewModel);
IsMainWindowOpen = true;
_openingMainWindow = false;
});
OnMainWindowOpened();
}
finally
{
_openingMainWindow = false;
}
}
public void TrayActivateSidebarItem(string sidebarItem)
{
TrayBringToForeground();
_eventAggregator.Publish(new RequestSelectSidebarItemEvent(sidebarItem));
}
public async Task TrayExit()
{
// Don't freeze the UI right after clicking
await Task.Delay(200);
Core.Utilities.Shutdown();
}
public void TrayOpenDebugger()
{
_debugService.ShowDebugger();
}
public void SetTaskbarIcon(UIElement view)
{
_taskBarIcon = (TaskbarIcon) ((ContentControl) view).Content;
}
private void FocusMainWindow()
{
// Wrestle the main window to the front
Window mainWindow = (Window) _rootViewModel.View;
if (mainWindow.WindowState == WindowState.Minimized)
mainWindow.WindowState = WindowState.Normal;
mainWindow.Activate();
mainWindow.Topmost = true;
mainWindow.Topmost = false;
mainWindow.Focus();
}
private void UtilitiesOnShutdownRequested(object sender, EventArgs e)
{
Execute.OnUIThread(() => _taskBarIcon?.Dispose());
}
private void ShowSplashScreen()
{
Execute.OnUIThread(() =>
{
_splashViewModel = _kernel.Get<SplashViewModel>();
_windowManager.ShowWindow(_splashViewModel);
});
}
private void RootViewModelOnClosed(object sender, CloseEventArgs e)
{
lock (this)
{
if (_rootViewModel != null)
{
_rootViewModel.Closed -= RootViewModelOnClosed;
_rootViewModel = null;
}
IsMainWindowOpen = false;
}
OnMainWindowClosed();
}
#region Theme
private void ApplyTrayIconTheme(IThemeService.WindowsTheme theme)
{
Execute.PostToUIThread(() =>
{
Icon = theme == IThemeService.WindowsTheme.Dark
? new BitmapImage(new Uri("pack://application:,,,/Artemis.UI;component/Resources/Images/Logo/bow-white.ico"))
: new BitmapImage(new Uri("pack://application:,,,/Artemis.UI;component/Resources/Images/Logo/bow-black.ico"));
});
}
private void ThemeServiceOnSystemThemeChanged(object sender, WindowsThemeEventArgs e)
{
ApplyTrayIconTheme(e.Theme);
}
#endregion
#region Implementation of IMainWindowProvider
public bool IsMainWindowOpen { get; private set; }
public bool OpenMainWindow()
{
TrayBringToForeground();
return _rootViewModel.ScreenState == ScreenState.Active;
}
public bool CloseMainWindow()
{
Execute.OnUIThread(() => _rootViewModel.RequestClose());
return _rootViewModel.ScreenState == ScreenState.Closed;
}
public event EventHandler MainWindowOpened;
public event EventHandler MainWindowClosed;
protected virtual void OnMainWindowOpened()
{
MainWindowOpened?.Invoke(this, EventArgs.Empty);
}
protected virtual void OnMainWindowClosed()
{
MainWindowClosed?.Invoke(this, EventArgs.Empty);
}
#endregion
}
}