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