From c6181ea823463ddf0fff486f771074993499486f Mon Sep 17 00:00:00 2001 From: SpoinkyNL Date: Fri, 11 Dec 2020 22:48:40 +0100 Subject: [PATCH] UI - Added setup wizard --- .../Resources/ArtemisShared.xaml | 11 +++ src/Artemis.UI/Screens/RootViewModel.cs | 27 +++++- .../Tabs/General/GeneralSettingsTabView.xaml | 25 +++++- .../General/GeneralSettingsTabViewModel.cs | 19 ++++- .../Screens/SetupWizard/SetupWizardView.xaml | 63 ++++++++++++++ .../SetupWizard/SetupWizardViewModel.cs | 64 ++++++++++++++ .../SetupWizard/Steps/DevicesStepView.xaml | 37 ++++++++ .../SetupWizard/Steps/DevicesStepViewModel.cs | 34 ++++++++ .../SetupWizard/Steps/FinishStepView.xaml | 66 ++++++++++++++ .../SetupWizard/Steps/FinishStepViewModel.cs | 18 ++++ .../SetupWizard/Steps/LayoutStepView.xaml | 73 ++++++++++++++++ .../SetupWizard/Steps/LayoutStepViewModel.cs | 29 +++++++ .../SetupWizard/Steps/SettingsStepView.xaml | 85 +++++++++++++++++++ .../Steps/SettingsStepViewModel.cs | 80 +++++++++++++++++ .../SetupWizard/Steps/WelcomeStepView.xaml | 30 +++++++ .../SetupWizard/Steps/WelcomeStepViewModel.cs | 13 +++ 16 files changed, 668 insertions(+), 6 deletions(-) create mode 100644 src/Artemis.UI/Screens/SetupWizard/SetupWizardView.xaml create mode 100644 src/Artemis.UI/Screens/SetupWizard/SetupWizardViewModel.cs create mode 100644 src/Artemis.UI/Screens/SetupWizard/Steps/DevicesStepView.xaml create mode 100644 src/Artemis.UI/Screens/SetupWizard/Steps/DevicesStepViewModel.cs create mode 100644 src/Artemis.UI/Screens/SetupWizard/Steps/FinishStepView.xaml create mode 100644 src/Artemis.UI/Screens/SetupWizard/Steps/FinishStepViewModel.cs create mode 100644 src/Artemis.UI/Screens/SetupWizard/Steps/LayoutStepView.xaml create mode 100644 src/Artemis.UI/Screens/SetupWizard/Steps/LayoutStepViewModel.cs create mode 100644 src/Artemis.UI/Screens/SetupWizard/Steps/SettingsStepView.xaml create mode 100644 src/Artemis.UI/Screens/SetupWizard/Steps/SettingsStepViewModel.cs create mode 100644 src/Artemis.UI/Screens/SetupWizard/Steps/WelcomeStepView.xaml create mode 100644 src/Artemis.UI/Screens/SetupWizard/Steps/WelcomeStepViewModel.cs diff --git a/src/Artemis.UI.Shared/Resources/ArtemisShared.xaml b/src/Artemis.UI.Shared/Resources/ArtemisShared.xaml index 5c5a50b54..329817f4b 100644 --- a/src/Artemis.UI.Shared/Resources/ArtemisShared.xaml +++ b/src/Artemis.UI.Shared/Resources/ArtemisShared.xaml @@ -31,4 +31,15 @@ + + \ No newline at end of file diff --git a/src/Artemis.UI/Screens/RootViewModel.cs b/src/Artemis.UI/Screens/RootViewModel.cs index c021e1542..42d642e08 100644 --- a/src/Artemis.UI/Screens/RootViewModel.cs +++ b/src/Artemis.UI/Screens/RootViewModel.cs @@ -10,12 +10,14 @@ using Artemis.Core.Services; using Artemis.UI.Events; using Artemis.UI.Screens.Modules; using Artemis.UI.Screens.Settings.Tabs.General; +using Artemis.UI.Screens.SetupWizard; using Artemis.UI.Screens.Sidebar; using Artemis.UI.Services; using Artemis.UI.Services.Interfaces; using Artemis.UI.Utilities; using MaterialDesignExtensions.Controls; using MaterialDesignThemes.Wpf; +using Ninject; using Stylet; namespace Artemis.UI.Screens @@ -25,8 +27,11 @@ namespace Artemis.UI.Screens private readonly IRegistrationService _builtInRegistrationService; private readonly PluginSetting _colorScheme; private readonly ICoreService _coreService; + private readonly IWindowManager _windowManager; private readonly IDebugService _debugService; + private readonly IKernel _kernel; private readonly IEventAggregator _eventAggregator; + private readonly ISettingsService _settingsService; private readonly Timer _frameTimeUpdateTimer; private readonly SidebarViewModel _sidebarViewModel; private readonly ISnackbarMessageQueue _snackbarMessageQueue; @@ -40,16 +45,21 @@ namespace Artemis.UI.Screens private string _windowTitle; public RootViewModel( + IKernel kernel, IEventAggregator eventAggregator, ISettingsService settingsService, ICoreService coreService, + IWindowManager windowManager, IDebugService debugService, IRegistrationService builtInRegistrationService, ISnackbarMessageQueue snackbarMessageQueue, SidebarViewModel sidebarViewModel) { + _kernel = kernel; _eventAggregator = eventAggregator; + _settingsService = settingsService; _coreService = coreService; + _windowManager = windowManager; _debugService = debugService; _builtInRegistrationService = builtInRegistrationService; _snackbarMessageQueue = snackbarMessageQueue; @@ -57,16 +67,16 @@ namespace Artemis.UI.Screens _frameTimeUpdateTimer = new Timer(500); - _colorScheme = settingsService.GetSetting("UI.ColorScheme", ApplicationColorScheme.Automatic); - _windowSize = settingsService.GetSetting("UI.RootWindowSize"); + _colorScheme = _settingsService.GetSetting("UI.ColorScheme", ApplicationColorScheme.Automatic); + _windowSize = _settingsService.GetSetting("UI.RootWindowSize"); _themeWatcher = new ThemeWatcher(); ApplyColorSchemeSetting(); ActiveItem = sidebarViewModel.SelectedItem; ActiveItemReady = true; - PinSidebar = settingsService.GetSetting("UI.PinSidebar", false); - + PinSidebar = _settingsService.GetSetting("UI.PinSidebar", false); + AssemblyInformationalVersionAttribute versionAttribute = typeof(RootViewModel).Assembly.GetCustomAttribute(); WindowTitle = $"Artemis {versionAttribute?.InformationalVersion}"; } @@ -281,9 +291,18 @@ namespace Artemis.UI.Screens _window = (MaterialWindow) View; + PluginSetting setupWizardCompleted = _settingsService.GetSetting("UI.SetupWizardCompleted", false); + if (!setupWizardCompleted.Value) + ShowSetupWizard(); + base.OnInitialActivate(); } + private void ShowSetupWizard() + { + _windowManager.ShowDialog(_kernel.Get()); + } + protected override void OnClose() { // Ensure no element with focus can leak, if we don't do this the root VM is retained by Window.EffectiveValues diff --git a/src/Artemis.UI/Screens/Settings/Tabs/General/GeneralSettingsTabView.xaml b/src/Artemis.UI/Screens/Settings/Tabs/General/GeneralSettingsTabView.xaml index 71e96e90e..2d4984145 100644 --- a/src/Artemis.UI/Screens/Settings/Tabs/General/GeneralSettingsTabView.xaml +++ b/src/Artemis.UI/Screens/Settings/Tabs/General/GeneralSettingsTabView.xaml @@ -80,6 +80,29 @@ + + + + + + + + + + + Setup wizard + + Opens the setup wizard usually shown when Artemis first starts. + + + + + + + + @@ -148,7 +171,7 @@ - + diff --git a/src/Artemis.UI/Screens/Settings/Tabs/General/GeneralSettingsTabViewModel.cs b/src/Artemis.UI/Screens/Settings/Tabs/General/GeneralSettingsTabViewModel.cs index 06c65f3c4..c19d3edf1 100644 --- a/src/Artemis.UI/Screens/Settings/Tabs/General/GeneralSettingsTabViewModel.cs +++ b/src/Artemis.UI/Screens/Settings/Tabs/General/GeneralSettingsTabViewModel.cs @@ -7,9 +7,11 @@ using System.Threading.Tasks; using Artemis.Core; using Artemis.Core.LayerBrushes; using Artemis.Core.Services; +using Artemis.UI.Screens.SetupWizard; using Artemis.UI.Services.Interfaces; using Artemis.UI.Shared; using Artemis.UI.Shared.Services; +using Ninject; using Serilog.Events; using Stylet; @@ -18,6 +20,8 @@ namespace Artemis.UI.Screens.Settings.Tabs.General public class GeneralSettingsTabViewModel : Screen { private readonly IDebugService _debugService; + private readonly IKernel _kernel; + private readonly IWindowManager _windowManager; private readonly IDialogService _dialogService; private readonly ISettingsService _settingsService; private List> _renderScales; @@ -25,10 +29,18 @@ namespace Artemis.UI.Screens.Settings.Tabs.General private List> _targetFrameRates; private readonly PluginSetting _defaultLayerBrushDescriptor; - public GeneralSettingsTabViewModel(IDialogService dialogService, IDebugService debugService, ISettingsService settingsService, IPluginManagementService pluginManagementService) + public GeneralSettingsTabViewModel( + IKernel kernel, + IWindowManager windowManager, + IDialogService dialogService, + IDebugService debugService, + ISettingsService settingsService, + IPluginManagementService pluginManagementService) { DisplayName = "GENERAL"; + _kernel = kernel; + _windowManager = windowManager; _dialogService = dialogService; _debugService = debugService; _settingsService = settingsService; @@ -199,6 +211,11 @@ namespace Artemis.UI.Screens.Settings.Tabs.General } } + public void ShowSetupWizard() + { + _windowManager.ShowDialog(_kernel.Get()); + } + public void ShowDataFolder() { try diff --git a/src/Artemis.UI/Screens/SetupWizard/SetupWizardView.xaml b/src/Artemis.UI/Screens/SetupWizard/SetupWizardView.xaml new file mode 100644 index 000000000..2c92a59a0 --- /dev/null +++ b/src/Artemis.UI/Screens/SetupWizard/SetupWizardView.xaml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Artemis.UI/Screens/SetupWizard/SetupWizardViewModel.cs b/src/Artemis.UI/Screens/SetupWizard/SetupWizardViewModel.cs new file mode 100644 index 000000000..47cfb3bac --- /dev/null +++ b/src/Artemis.UI/Screens/SetupWizard/SetupWizardViewModel.cs @@ -0,0 +1,64 @@ +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using Artemis.Core; +using Artemis.Core.Services; +using Artemis.UI.Screens.SetupWizard.Steps; +using MaterialDesignExtensions.Controllers; +using MaterialDesignExtensions.Controls; +using MaterialDesignExtensions.Model; +using Stylet; + +namespace Artemis.UI.Screens.SetupWizard +{ + public class SetupWizardViewModel : Conductor.Collection.OneActive + { + private readonly ISettingsService _settingsService; + private StepperController _stepperController; + + public SetupWizardViewModel(ISettingsService settingsService, + WelcomeStepViewModel welcome, + DevicesStepViewModel devices, + LayoutStepViewModel layout, + SettingsStepViewModel settings, + FinishStepViewModel finish) + { + _settingsService = settingsService; + Items.Add(welcome); + Items.Add(devices); + Items.Add(layout); + Items.Add(settings); + Items.Add(finish); + + ActiveItem = Items.First(); + } + + public void ActiveStepChanged(object sender, ActiveStepChangedEventArgs e) + { + Stepper stepper = (Stepper) sender; + _stepperController = stepper.Controller; + + int activeStepIndex = stepper.Steps.IndexOf(e.Step); + ActiveItem = Items[activeStepIndex]; + } + + public void SkipOrFinishWizard() + { + RequestClose(); + } + + protected override void OnClose() + { + PluginSetting setting = _settingsService.GetSetting("UI.SetupWizardCompleted", false); + setting.Value = true; + setting.Save(); + + base.OnClose(); + } + + public void Continue() + { + _stepperController.Continue(); + } + } +} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/SetupWizard/Steps/DevicesStepView.xaml b/src/Artemis.UI/Screens/SetupWizard/Steps/DevicesStepView.xaml new file mode 100644 index 000000000..2d01adffe --- /dev/null +++ b/src/Artemis.UI/Screens/SetupWizard/Steps/DevicesStepView.xaml @@ -0,0 +1,37 @@ + + + + + + + + + + + Devices are supported through the use of device providers. + In the list below you can enable device providers for each brand you own by checking . + + + + + + + + + + + + To avoid possible instability it's recommended to disable the device providers of brands you don't own. + + + + + \ No newline at end of file diff --git a/src/Artemis.UI/Screens/SetupWizard/Steps/DevicesStepViewModel.cs b/src/Artemis.UI/Screens/SetupWizard/Steps/DevicesStepViewModel.cs new file mode 100644 index 000000000..a1fdbd68b --- /dev/null +++ b/src/Artemis.UI/Screens/SetupWizard/Steps/DevicesStepViewModel.cs @@ -0,0 +1,34 @@ +using System.Linq; +using Artemis.Core.DeviceProviders; +using Artemis.Core.Services; +using Artemis.UI.Ninject.Factories; +using Artemis.UI.Screens.Settings.Tabs.Plugins; +using Stylet; + +namespace Artemis.UI.Screens.SetupWizard.Steps +{ + public class DevicesStepViewModel : Conductor.Collection.AllActive + { + private readonly IPluginManagementService _pluginManagementService; + private readonly ISettingsVmFactory _settingsVmFactory; + + public DevicesStepViewModel(IPluginManagementService pluginManagementService, ISettingsVmFactory settingsVmFactory) + { + _pluginManagementService = pluginManagementService; + _settingsVmFactory = settingsVmFactory; + } + + #region Overrides of Screen + + /// + protected override void OnActivate() + { + Items.Clear(); + Items.AddRange(_pluginManagementService.GetFeaturesOfType().Select(d => _settingsVmFactory.CreatePluginFeatureViewModel(d))); + + base.OnActivate(); + } + + #endregion + } +} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/SetupWizard/Steps/FinishStepView.xaml b/src/Artemis.UI/Screens/SetupWizard/Steps/FinishStepView.xaml new file mode 100644 index 000000000..48a50ba42 --- /dev/null +++ b/src/Artemis.UI/Screens/SetupWizard/Steps/FinishStepView.xaml @@ -0,0 +1,66 @@ + + + + + + + + + + + + All finished! + + + You are now ready to start using Artemis, enjoy! (●'◡'●) + + + To learn more about Artemis and how to use it you may find these resources useful: + + + + - The + + Artemis wiki + + and more specifically the + + getting started + + guide + + + - The Artemis + + GitHub repository + + + + - Our + + Discord server + + + + + + + + \ No newline at end of file diff --git a/src/Artemis.UI/Screens/SetupWizard/Steps/FinishStepViewModel.cs b/src/Artemis.UI/Screens/SetupWizard/Steps/FinishStepViewModel.cs new file mode 100644 index 000000000..d9a4b7d43 --- /dev/null +++ b/src/Artemis.UI/Screens/SetupWizard/Steps/FinishStepViewModel.cs @@ -0,0 +1,18 @@ +using System.Windows.Navigation; +using Stylet; + +namespace Artemis.UI.Screens.SetupWizard.Steps +{ + public class FinishStepViewModel : Screen + { + public void OpenHyperlink(object sender, RequestNavigateEventArgs e) + { + Core.Utilities.OpenUrl(e.Uri.AbsoluteUri); + } + + public void Finish() + { + ((SetupWizardViewModel) Parent).SkipOrFinishWizard(); + } + } +} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/SetupWizard/Steps/LayoutStepView.xaml b/src/Artemis.UI/Screens/SetupWizard/Steps/LayoutStepView.xaml new file mode 100644 index 000000000..383fa1aab --- /dev/null +++ b/src/Artemis.UI/Screens/SetupWizard/Steps/LayoutStepView.xaml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + Artemis uses to create realistic effects across multiple devices. + In order to do this correctly, we need to know where your devices are located on your desk. + Select one of the two presets below, after the setup wizard finishes you can tweak this in detail in the . + + + + + + + + + \ No newline at end of file diff --git a/src/Artemis.UI/Screens/SetupWizard/Steps/LayoutStepViewModel.cs b/src/Artemis.UI/Screens/SetupWizard/Steps/LayoutStepViewModel.cs new file mode 100644 index 000000000..a3a5b1217 --- /dev/null +++ b/src/Artemis.UI/Screens/SetupWizard/Steps/LayoutStepViewModel.cs @@ -0,0 +1,29 @@ +using Artemis.Core.Services; +using Stylet; + +namespace Artemis.UI.Screens.SetupWizard.Steps +{ + public class LayoutStepViewModel : Screen + { + private readonly ISurfaceService _surfaceService; + + public LayoutStepViewModel(ISurfaceService surfaceService) + { + _surfaceService = surfaceService; + } + + public void ApplyLeftHandedPreset() + { + _surfaceService.AutoArrange(); + SetupWizardViewModel setupWizardViewModel = (SetupWizardViewModel) Parent; + setupWizardViewModel.Continue(); + } + + public void ApplyRightHandedPreset() + { + _surfaceService.AutoArrange(); + SetupWizardViewModel setupWizardViewModel = (SetupWizardViewModel) Parent; + setupWizardViewModel.Continue(); + } + } +} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/SetupWizard/Steps/SettingsStepView.xaml b/src/Artemis.UI/Screens/SetupWizard/Steps/SettingsStepView.xaml new file mode 100644 index 000000000..1385865a6 --- /dev/null +++ b/src/Artemis.UI/Screens/SetupWizard/Steps/SettingsStepView.xaml @@ -0,0 +1,85 @@ + + + + + + + + + + Artemis comes with a variety of settings you can change to tweak everything to your liking. + Below you can find a few relevant settings, many more can be changed later on the page. + + + + + + + + + + + + + + + Start up with Windows + + + + + + + + + + + + + + + + + + Start up with Windows minimized + + + + + + + + + + + + + + + + + + Color scheme + + Pick between a light and dark color scheme, the automatic option copies your Windows settings. + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Artemis.UI/Screens/SetupWizard/Steps/SettingsStepViewModel.cs b/src/Artemis.UI/Screens/SetupWizard/Steps/SettingsStepViewModel.cs new file mode 100644 index 000000000..468070145 --- /dev/null +++ b/src/Artemis.UI/Screens/SetupWizard/Steps/SettingsStepViewModel.cs @@ -0,0 +1,80 @@ +using System; +using System.IO; +using System.Threading.Tasks; +using Artemis.Core; +using Artemis.Core.Services; +using Artemis.UI.Screens.Settings.Tabs.General; +using Artemis.UI.Screens.Settings.Tabs.Plugins; +using Artemis.UI.Shared; +using Artemis.UI.Shared.Services; +using Stylet; + +namespace Artemis.UI.Screens.SetupWizard.Steps +{ + public class SettingsStepViewModel : Conductor.Collection.AllActive + { + private readonly IDialogService _dialogService; + private readonly ISettingsService _settingsService; + + public SettingsStepViewModel(IDialogService dialogService, ISettingsService settingsService) + { + _dialogService = dialogService; + _settingsService = settingsService; + + ColorSchemes = new BindableCollection(EnumUtilities.GetAllValuesAndDescriptions(typeof(ApplicationColorScheme))); + } + + public BindableCollection ColorSchemes { get; } + + public bool StartWithWindows + { + get => _settingsService.GetSetting("UI.AutoRun", false).Value; + set + { + _settingsService.GetSetting("UI.AutoRun", false).Value = value; + _settingsService.GetSetting("UI.AutoRun", false).Save(); + Task.Run(ApplyAutorun); + } + } + + public bool StartMinimized + { + get => !_settingsService.GetSetting("UI.ShowOnStartup", true).Value; + set + { + _settingsService.GetSetting("UI.ShowOnStartup", true).Value = !value; + _settingsService.GetSetting("UI.ShowOnStartup", true).Save(); + } + } + + + public ApplicationColorScheme SelectedColorScheme + { + get => _settingsService.GetSetting("UI.ColorScheme", ApplicationColorScheme.Automatic).Value; + set + { + _settingsService.GetSetting("UI.ColorScheme", ApplicationColorScheme.Automatic).Value = value; + _settingsService.GetSetting("UI.ColorScheme", ApplicationColorScheme.Automatic).Save(); + } + } + + private void ApplyAutorun() + { + try + { + string autoRunFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Startup), "Artemis.lnk"); + string executableFile = Constants.ExecutablePath; + + if (File.Exists(autoRunFile)) + File.Delete(autoRunFile); + if (StartWithWindows) + ShortcutUtilities.Create(autoRunFile, executableFile, "--autorun", new FileInfo(executableFile).DirectoryName, "Artemis", "", ""); + } + catch (Exception e) + { + _dialogService.ShowExceptionDialog("An exception occured while trying to apply the auto run setting", e); + throw; + } + } + } +} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/SetupWizard/Steps/WelcomeStepView.xaml b/src/Artemis.UI/Screens/SetupWizard/Steps/WelcomeStepView.xaml new file mode 100644 index 000000000..2c8dc8de4 --- /dev/null +++ b/src/Artemis.UI/Screens/SetupWizard/Steps/WelcomeStepView.xaml @@ -0,0 +1,30 @@ + + + + + + + + Welcome to the Artemis setup wizard! + + + In this wizard we'll walk you through the initial configuration of Artemis. + + + Before you can start you need to tell Artemis which devices you want to use and where they are placed on your desk. + You will also get the opportunity to choose some plugins to start off with. + + + PS: You can also skip the wizard and set things up yourself. + + + + + \ No newline at end of file diff --git a/src/Artemis.UI/Screens/SetupWizard/Steps/WelcomeStepViewModel.cs b/src/Artemis.UI/Screens/SetupWizard/Steps/WelcomeStepViewModel.cs new file mode 100644 index 000000000..840471e82 --- /dev/null +++ b/src/Artemis.UI/Screens/SetupWizard/Steps/WelcomeStepViewModel.cs @@ -0,0 +1,13 @@ +using System; +using Artemis.UI.Shared; +using Stylet; + +namespace Artemis.UI.Screens.SetupWizard.Steps +{ + public class WelcomeStepViewModel : Screen + { + public WelcomeStepViewModel() + { + } + } +} \ No newline at end of file