diff --git a/src/Artemis.Plugins.Modules.General/GeneralModule.cs b/src/Artemis.Plugins.Modules.General/GeneralModule.cs index a39519bcd..4547ccfef 100644 --- a/src/Artemis.Plugins.Modules.General/GeneralModule.cs +++ b/src/Artemis.Plugins.Modules.General/GeneralModule.cs @@ -21,6 +21,7 @@ namespace Artemis.Plugins.Modules.General _settings = settings; DisplayName = "General"; ExpandsMainDataModel = true; + DeviceBrushes= new Dictionary(); var testSetting = _settings.GetSetting("TestSetting", DateTime.Now); @@ -82,17 +83,18 @@ namespace Artemis.Plugins.Modules.General { foreach (var device in surface.Devices) { - using (var gradient = RenderGradientForDevice(device)) - { - using (var brush = new TextureBrush(gradient, WrapMode.Tile)) - { - brush.TranslateTransform((int) Math.Round(device.RenderRectangle.Width / 100.0 * MovePercentage), 0); - graphics.FillPath(brush, device.RenderPath); - } - } + if (!DeviceBrushes.ContainsKey(device)) + DeviceBrushes.Add(device, new TextureBrush(RenderGradientForDevice(device), WrapMode.Tile)); + + var brush = DeviceBrushes[device]; + brush.TranslateTransform((int) Math.Round(device.RenderRectangle.Width / 100.0 * MovePercentage), 0); + graphics.FillPath(brush, device.RenderPath); + brush.TranslateTransform((int)Math.Round(device.RenderRectangle.Width / 100.0 * MovePercentage) * -1, 0); } } + public Dictionary DeviceBrushes { get; set; } + private Image RenderGradientForDevice(Device device) { var brush = new LinearGradientBrush(device.RenderRectangle, Color.Black, Color.Black, 0, false) diff --git a/src/Artemis.UI/Artemis.UI.csproj b/src/Artemis.UI/Artemis.UI.csproj index 5127bd6a9..c7650c883 100644 --- a/src/Artemis.UI/Artemis.UI.csproj +++ b/src/Artemis.UI/Artemis.UI.csproj @@ -174,93 +174,103 @@ True Resources.resx - + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + App.xaml Code - - + + Designer MSBuild:Compile - - MSBuild:Compile - Designer - - - MSBuild:Compile - Designer - - + Designer MSBuild:Compile - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - + MSBuild:Compile Designer - + + MSBuild:Compile + Designer + + Designer MSBuild:Compile - + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + MSBuild:Compile + Designer + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + Designer MSBuild:Compile diff --git a/src/Artemis.UI/Bootstrapper.cs b/src/Artemis.UI/Bootstrapper.cs index 16aabc25c..a87d9b3cd 100644 --- a/src/Artemis.UI/Bootstrapper.cs +++ b/src/Artemis.UI/Bootstrapper.cs @@ -3,8 +3,9 @@ using System.Windows; using Artemis.Core.Ninject; using Artemis.Core.Services.Interfaces; using Artemis.UI.Ninject; +using Artemis.UI.Screens; +using Artemis.UI.Screens.Splash; using Artemis.UI.Stylet; -using Artemis.UI.ViewModels.Screens; using Ninject; using Stylet; diff --git a/src/Artemis.UI/Ninject/Factories/IModuleViewModelFactory.cs b/src/Artemis.UI/Ninject/Factories/IModuleViewModelFactory.cs index 6dad4814d..66ee20cce 100644 --- a/src/Artemis.UI/Ninject/Factories/IModuleViewModelFactory.cs +++ b/src/Artemis.UI/Ninject/Factories/IModuleViewModelFactory.cs @@ -1,5 +1,5 @@ using Artemis.Core.Plugins.Abstract; -using Artemis.UI.ViewModels.Screens; +using Artemis.UI.Screens.Module; namespace Artemis.UI.Ninject.Factories { diff --git a/src/Artemis.UI/Ninject/Factories/IProfileEditorViewModelFactory.cs b/src/Artemis.UI/Ninject/Factories/IProfileEditorViewModelFactory.cs index 8708d0236..6ed149c55 100644 --- a/src/Artemis.UI/Ninject/Factories/IProfileEditorViewModelFactory.cs +++ b/src/Artemis.UI/Ninject/Factories/IProfileEditorViewModelFactory.cs @@ -1,5 +1,5 @@ using Artemis.Core.Plugins.Abstract; -using Artemis.UI.ViewModels.Controls.ProfileEditor; +using Artemis.UI.Screens.Module.ProfileEditor; namespace Artemis.UI.Ninject.Factories { diff --git a/src/Artemis.UI/Ninject/UiModule.cs b/src/Artemis.UI/Ninject/UiModule.cs index 6ff3209b5..fe53db1a8 100644 --- a/src/Artemis.UI/Ninject/UiModule.cs +++ b/src/Artemis.UI/Ninject/UiModule.cs @@ -1,8 +1,8 @@ using Artemis.UI.Ninject.Factories; +using Artemis.UI.Screens; using Artemis.UI.Services.Interfaces; using Artemis.UI.Stylet; using Artemis.UI.ViewModels.Dialogs; -using Artemis.UI.ViewModels.Interfaces; using FluentValidation; using Ninject.Extensions.Conventions; using Ninject.Extensions.Factory; diff --git a/src/Artemis.UI/Views/Dialogs/ConfirmDialogView.xaml b/src/Artemis.UI/Screens/Dialogs/ConfirmDialogView.xaml similarity index 87% rename from src/Artemis.UI/Views/Dialogs/ConfirmDialogView.xaml rename to src/Artemis.UI/Screens/Dialogs/ConfirmDialogView.xaml index 9bb72ccb2..6d000610c 100644 --- a/src/Artemis.UI/Views/Dialogs/ConfirmDialogView.xaml +++ b/src/Artemis.UI/Screens/Dialogs/ConfirmDialogView.xaml @@ -1,12 +1,11 @@ - diff --git a/src/Artemis.UI/ViewModels/Dialogs/ConfirmDialogViewModel.cs b/src/Artemis.UI/Screens/Dialogs/ConfirmDialogViewModel.cs similarity index 89% rename from src/Artemis.UI/ViewModels/Dialogs/ConfirmDialogViewModel.cs rename to src/Artemis.UI/Screens/Dialogs/ConfirmDialogViewModel.cs index 20b7e2893..14b842bab 100644 --- a/src/Artemis.UI/ViewModels/Dialogs/ConfirmDialogViewModel.cs +++ b/src/Artemis.UI/Screens/Dialogs/ConfirmDialogViewModel.cs @@ -1,4 +1,6 @@ -namespace Artemis.UI.ViewModels.Dialogs +using Artemis.UI.ViewModels.Dialogs; + +namespace Artemis.UI.Screens.Dialogs { public class ConfirmDialogViewModel : DialogViewModelBase { diff --git a/src/Artemis.UI/Views/Screens/HomeView.xaml b/src/Artemis.UI/Screens/Home/HomeView.xaml similarity index 98% rename from src/Artemis.UI/Views/Screens/HomeView.xaml rename to src/Artemis.UI/Screens/Home/HomeView.xaml index 49d621a66..10e71d72c 100644 --- a/src/Artemis.UI/Views/Screens/HomeView.xaml +++ b/src/Artemis.UI/Screens/Home/HomeView.xaml @@ -1,15 +1,15 @@ - + d:DataContext="{d:DesignInstance home:HomeViewModel, IsDesignTimeCreatable=True}"> diff --git a/src/Artemis.UI/ViewModels/Screens/HomeViewModel.cs b/src/Artemis.UI/Screens/Home/HomeViewModel.cs similarity index 83% rename from src/Artemis.UI/ViewModels/Screens/HomeViewModel.cs rename to src/Artemis.UI/Screens/Home/HomeViewModel.cs index 94e74b5db..339714fa4 100644 --- a/src/Artemis.UI/ViewModels/Screens/HomeViewModel.cs +++ b/src/Artemis.UI/Screens/Home/HomeViewModel.cs @@ -1,9 +1,8 @@ using System; using System.Diagnostics; -using Artemis.UI.ViewModels.Interfaces; using Stylet; -namespace Artemis.UI.ViewModels.Screens +namespace Artemis.UI.Screens.Home { public class HomeViewModel : Screen, IScreenViewModel { diff --git a/src/Artemis.UI/ViewModels/Interfaces/IScreenViewModel.cs b/src/Artemis.UI/Screens/IScreenViewModel.cs similarity index 72% rename from src/Artemis.UI/ViewModels/Interfaces/IScreenViewModel.cs rename to src/Artemis.UI/Screens/IScreenViewModel.cs index 96734ea11..71257977b 100644 --- a/src/Artemis.UI/ViewModels/Interfaces/IScreenViewModel.cs +++ b/src/Artemis.UI/Screens/IScreenViewModel.cs @@ -1,6 +1,6 @@ using Stylet; -namespace Artemis.UI.ViewModels.Interfaces +namespace Artemis.UI.Screens { public interface IScreenViewModel : IScreen { diff --git a/src/Artemis.UI/Views/Screens/ModuleRootView.xaml b/src/Artemis.UI/Screens/Module/ModuleRootView.xaml similarity index 79% rename from src/Artemis.UI/Views/Screens/ModuleRootView.xaml rename to src/Artemis.UI/Screens/Module/ModuleRootView.xaml index cad55cdf7..9bd2d971e 100644 --- a/src/Artemis.UI/Views/Screens/ModuleRootView.xaml +++ b/src/Artemis.UI/Screens/Module/ModuleRootView.xaml @@ -1,15 +1,14 @@ - + d:DataContext="{d:DesignInstance module:ModuleRootViewModel}"> @@ -18,7 +17,7 @@ - + diff --git a/src/Artemis.UI/ViewModels/Screens/ModuleRootViewModel.cs b/src/Artemis.UI/Screens/Module/ModuleRootViewModel.cs similarity index 68% rename from src/Artemis.UI/ViewModels/Screens/ModuleRootViewModel.cs rename to src/Artemis.UI/Screens/Module/ModuleRootViewModel.cs index f2a2abb49..3cf0b7fe1 100644 --- a/src/Artemis.UI/ViewModels/Screens/ModuleRootViewModel.cs +++ b/src/Artemis.UI/Screens/Module/ModuleRootViewModel.cs @@ -2,11 +2,11 @@ using Artemis.UI.Ninject.Factories; using Stylet; -namespace Artemis.UI.ViewModels.Screens +namespace Artemis.UI.Screens.Module { public class ModuleRootViewModel : Conductor.Collection.OneActive { - public ModuleRootViewModel(Module module, IProfileEditorViewModelFactory profileEditorViewModelFactory) + public ModuleRootViewModel(Core.Plugins.Abstract.Module module, IProfileEditorViewModelFactory profileEditorViewModelFactory) { Module = module; @@ -19,8 +19,8 @@ namespace Artemis.UI.ViewModels.Screens ActiveItem = profileEditor; } - public Module Module { get; } - + public string Title => Module?.DisplayName; + public Core.Plugins.Abstract.Module Module { get; } public int FixedHeaderCount => Items.Count; } } \ No newline at end of file diff --git a/src/Artemis.UI/Views/Controls/ProfileEditor/ProfileEditorView.xaml b/src/Artemis.UI/Screens/Module/ProfileEditor/ProfileEditorView.xaml similarity index 76% rename from src/Artemis.UI/Views/Controls/ProfileEditor/ProfileEditorView.xaml rename to src/Artemis.UI/Screens/Module/ProfileEditor/ProfileEditorView.xaml index 92005f7b3..5c0285449 100644 --- a/src/Artemis.UI/Views/Controls/ProfileEditor/ProfileEditorView.xaml +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/ProfileEditorView.xaml @@ -1,13 +1,11 @@ - @@ -24,23 +22,25 @@ + - - + + - + The profile defines what colors the LEDs will have. Multiple groups of LEDs are defined into layers. On these layers you can apply effects. - + + - + @@ -145,40 +144,57 @@ + + + + + Initializing LED visualization... + + + + - + + + + - - - + + + - - - + + Right top + + + + + + Right bottom + - + + + + - - - + + + - - - + + Bottom left + + + + + + Bottom right + - - - - - - - - - - \ No newline at end of file diff --git a/src/Artemis.UI/ViewModels/Controls/ProfileEditor/ProfileEditorViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/ProfileEditorViewModel.cs similarity index 81% rename from src/Artemis.UI/ViewModels/Controls/ProfileEditor/ProfileEditorViewModel.cs rename to src/Artemis.UI/Screens/Module/ProfileEditor/ProfileEditorViewModel.cs index 0e2b11a75..99aa9d7c2 100644 --- a/src/Artemis.UI/ViewModels/Controls/ProfileEditor/ProfileEditorViewModel.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/ProfileEditorViewModel.cs @@ -9,19 +9,20 @@ using Artemis.Core.Models.Surface; using Artemis.Core.Plugins.Abstract; using Artemis.Core.Services; using Artemis.Core.Services.Storage; -using Artemis.UI.ViewModels.Screens; -using Artemis.UI.ViewModels.Utilities; +using Artemis.UI.Screens.Module.ProfileEditor.Visualization; +using Artemis.UI.Screens.Shared; +using Artemis.UI.Screens.SurfaceEditor; using RGB.NET.Core; using Stylet; using Point = System.Windows.Point; -namespace Artemis.UI.ViewModels.Controls.ProfileEditor +namespace Artemis.UI.Screens.Module.ProfileEditor { public class ProfileEditorViewModel : ModuleViewModel { private readonly TimerUpdateTrigger _updateTrigger; - public ProfileEditorViewModel(Module module, ISurfaceService surfaceService, ISettingsService settingsService) : base(module, "Profile Editor") + public ProfileEditorViewModel(Core.Plugins.Abstract.Module module, ISurfaceService surfaceService, ISettingsService settingsService) : base(module, "Profile Editor") { surfaceService.ActiveSurfaceConfigurationChanged += OnActiveSurfaceConfigurationChanged; Devices = new ObservableCollection(); @@ -33,13 +34,16 @@ namespace Artemis.UI.ViewModels.Controls.ProfileEditor ApplySurfaceConfiguration(surfaceService.ActiveSurface); - // Borrow RGB.NET's update trigger, update up to 25 FPS, ignore higher settings than that - var targetFps = Math.Min(settingsService.GetSetting("TargetFrameRate", 25).Value, 25); + // Borrow RGB.NET's update trigger but limit the FPS + var targetFpsSetting = settingsService.GetSetting("TargetFrameRate", 25); + var editorTargetFpsSetting = settingsService.GetSetting("EditorTargetFrameRate", 15); + var targetFps = Math.Min(targetFpsSetting.Value, editorTargetFpsSetting.Value); _updateTrigger = new TimerUpdateTrigger {UpdateFrequency = 1.0 / targetFps}; _updateTrigger.Update += UpdateLeds; } public ObservableCollection Devices { get; set; } + public bool IsInitializing { get; private set; } public RectangleGeometry SelectionRectangle { get; set; } public PanZoomViewModel PanZoomViewModel { get; set; } @@ -50,6 +54,9 @@ namespace Artemis.UI.ViewModels.Controls.ProfileEditor private void UpdateLeds(object sender, CustomUpdateData customUpdateData) { + if (IsInitializing) + IsInitializing = Devices.Any(d => !d.AddedLeds); + foreach (var profileDeviceViewModel in Devices) profileDeviceViewModel.Update(); } @@ -62,7 +69,16 @@ namespace Artemis.UI.ViewModels.Controls.ProfileEditor // Create VMs for missing devices var viewModel = Devices.FirstOrDefault(vm => vm.Device.RgbDevice == surfaceDeviceConfiguration.RgbDevice); if (viewModel == null) - Execute.OnUIThread(() => Devices.Add(new ProfileDeviceViewModel(surfaceDeviceConfiguration))); + { + // Create outside the UI thread to avoid slowdowns as much as possible + var profileDeviceViewModel = new ProfileDeviceViewModel(surfaceDeviceConfiguration); + Execute.OnUIThread(() => + { + // Gotta call IsInitializing on the UI thread or its never gets picked up + IsInitializing = true; + Devices.Add(profileDeviceViewModel); + }); + } // Update existing devices else viewModel.Device = surfaceDeviceConfiguration; @@ -71,7 +87,7 @@ namespace Artemis.UI.ViewModels.Controls.ProfileEditor // Sort the devices by ZIndex Execute.OnUIThread(() => { - foreach (var device in Devices.OrderBy(d => d.ZIndex).ToList()) + foreach (var device in Devices.OrderBy(d => d.ZIndex).ToList()) Devices.Move(Devices.IndexOf(device), device.ZIndex - 1); }); } diff --git a/src/Artemis.UI/Views/Controls/ProfileEditor/ProfileDeviceView.xaml b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileDeviceView.xaml similarity index 78% rename from src/Artemis.UI/Views/Controls/ProfileEditor/ProfileDeviceView.xaml rename to src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileDeviceView.xaml index f1d7319d3..74fabaf5a 100644 --- a/src/Artemis.UI/Views/Controls/ProfileEditor/ProfileDeviceView.xaml +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileDeviceView.xaml @@ -1,13 +1,13 @@ - @@ -15,14 +15,14 @@ - + + Visibility="{Binding Device.RgbDevice.DeviceInfo.Image, ConverterParameter=Inverted, Converter={StaticResource NullToVisibilityConverter}, Mode=OneWay}" /> - + diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileDeviceViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileDeviceViewModel.cs new file mode 100644 index 000000000..f0fb95d62 --- /dev/null +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileDeviceViewModel.cs @@ -0,0 +1,79 @@ +using System.Collections.ObjectModel; +using System.Linq; +using System.Threading.Tasks; +using System.Windows; +using Artemis.Core.Models.Surface; +using Stylet; + +namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization +{ + public class ProfileDeviceViewModel : PropertyChangedBase + { + public ProfileDeviceViewModel(Device device) + { + Device = device; + Leds = new ObservableCollection(); + + if (Device.RgbDevice != null) + Task.Run(AddLedsAsync); + } + + public ObservableCollection Leds { get; set; } + public Device Device { get; set; } + public bool AddedLeds { get; private set; } + + public double X + { + get => Device.X; + set => Device.X = value; + } + + public double Y + { + get => Device.Y; + set => Device.Y = value; + } + + public int ZIndex + { + get => Device.ZIndex; + set => Device.ZIndex = value; + } + + + public Rect DeviceRectangle => Device.RgbDevice == null + ? new Rect() + : new Rect(X, Y, Device.RgbDevice.Size.Width, Device.RgbDevice.Size.Height); + + /// + /// Adds LEDs in batches of 5 to avoid UI freezes + /// + /// + private async Task AddLedsAsync() + { + var index = 0; + foreach (var led in Device.RgbDevice.ToList()) + { + Execute.OnUIThreadSync(() => Leds.Add(new ProfileLedViewModel(led))); + if (index % 5 == 0) + await Task.Delay(1); + + index++; + } + + AddedLeds = true; + } + + /// + /// Update the color of all LEDs if finished adding + /// + public void Update() + { + if (!AddedLeds) + return; + + foreach (var ledViewModel in Leds) + ledViewModel.Update(); + } + } +} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileLedView.xaml b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileLedView.xaml new file mode 100644 index 000000000..668515d7c --- /dev/null +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileLedView.xaml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Artemis.UI/ViewModels/Controls/ProfileEditor/ProfileLedViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileLedViewModel.cs similarity index 93% rename from src/Artemis.UI/ViewModels/Controls/ProfileEditor/ProfileLedViewModel.cs rename to src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileLedViewModel.cs index 9c0905c8a..59265975c 100644 --- a/src/Artemis.UI/ViewModels/Controls/ProfileEditor/ProfileLedViewModel.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileLedViewModel.cs @@ -6,7 +6,7 @@ using RGB.NET.Core; using Stylet; using Color = System.Windows.Media.Color; -namespace Artemis.UI.ViewModels.Controls.ProfileEditor +namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization { public class ProfileLedViewModel : PropertyChangedBase { @@ -23,10 +23,10 @@ namespace Artemis.UI.ViewModels.Controls.ProfileEditor public Led Led { get; } - public double X { get; private set; } - public double Y { get; private set; } - public double Width { get; private set; } - public double Height { get; private set; } + public double X { get; } + public double Y { get; } + public double Width { get; } + public double Height { get; } public Geometry DisplayGeometry { get; private set; } public Geometry StrokeGeometry { get; private set; } @@ -89,7 +89,7 @@ namespace Artemis.UI.ViewModels.Controls.ProfileEditor Children = new TransformCollection { new ScaleTransform(Led.LedRectangle.Width - deflateAmount, Led.LedRectangle.Height - deflateAmount), - new TranslateTransform(deflateAmount/2, deflateAmount/2) + new TranslateTransform(deflateAmount / 2, deflateAmount / 2) } } ); diff --git a/src/Artemis.UI/Screens/News/NewsView.xaml b/src/Artemis.UI/Screens/News/NewsView.xaml new file mode 100644 index 000000000..767131af9 --- /dev/null +++ b/src/Artemis.UI/Screens/News/NewsView.xaml @@ -0,0 +1,12 @@ + + + Today's news: There is no news (yet)! + + diff --git a/src/Artemis.UI/Screens/News/NewsViewModel.cs b/src/Artemis.UI/Screens/News/NewsViewModel.cs new file mode 100644 index 000000000..149d8d22a --- /dev/null +++ b/src/Artemis.UI/Screens/News/NewsViewModel.cs @@ -0,0 +1,9 @@ +using Stylet; + +namespace Artemis.UI.Screens.News +{ + public class NewsViewModel : Screen, IScreenViewModel + { + public string Title => "News"; + } +} \ No newline at end of file diff --git a/src/Artemis.UI/Views/Screens/RootView.xaml b/src/Artemis.UI/Screens/RootView.xaml similarity index 98% rename from src/Artemis.UI/Views/Screens/RootView.xaml rename to src/Artemis.UI/Screens/RootView.xaml index d1f1c31e8..12842873b 100644 --- a/src/Artemis.UI/Views/Screens/RootView.xaml +++ b/src/Artemis.UI/Screens/RootView.xaml @@ -1,4 +1,4 @@ -.Collection.OneActive { @@ -30,8 +33,8 @@ namespace Artemis.UI.ViewModels.Screens ActiveItem = _artemisViewModels.First(v => v.GetType() == typeof(HomeViewModel)); // Sync up with the plugin service - Modules = new BindableCollection(); - Modules.AddRange(_pluginService.GetPluginsOfType()); + Modules = new BindableCollection(); + Modules.AddRange(_pluginService.GetPluginsOfType()); _pluginService.PluginEnabled += PluginServiceOnPluginEnabled; _pluginService.PluginDisabled += PluginServiceOnPluginDisabled; @@ -39,10 +42,10 @@ namespace Artemis.UI.ViewModels.Screens PropertyChanged += OnSelectedPageChanged; } - public IObservableCollection Modules { get; set; } + public IObservableCollection Modules { get; set; } public bool MenuOpen { get; set; } public ListBoxItem SelectedPage { get; set; } - public Module SelectedModule { get; set; } + public Core.Plugins.Abstract.Module SelectedModule { get; set; } public async Task NavigateToSelectedModule() { @@ -67,7 +70,7 @@ namespace Artemis.UI.ViewModels.Screens Modules.Remove(existing); } - if (e.PluginInfo.Instance is Module module) + if (e.PluginInfo.Instance is Core.Plugins.Abstract.Module module) Modules.Add(module); } @@ -96,19 +99,19 @@ namespace Artemis.UI.ViewModels.Screens switch (SelectedPage.Name) { case "Home": - ActivateItem(_artemisViewModels.First(v => v.GetType() == typeof(HomeViewModel))); + ActivateItem(_artemisViewModels.First(v => v is HomeViewModel)); break; case "News": - // ActivateItem(_artemisViewModels.First(v => v.GetType() == typeof(NewsViewModel))); + ActivateItem(_artemisViewModels.First(v => v is NewsViewModel)); break; case "Workshop": - // ActivateItem(_artemisViewModels.First(v => v.GetType() == typeof(WorkshopViewModel))); + ActivateItem(_artemisViewModels.First(v => v is WorkshopViewModel)); break; case "SurfaceEditor": - ActivateItem(_artemisViewModels.First(v => v.GetType() == typeof(SurfaceEditorViewModel))); + ActivateItem(_artemisViewModels.First(v => v is SurfaceEditorViewModel)); break; case "Settings": - ActivateItem(_artemisViewModels.First(v => v.GetType() == typeof(SettingsViewModel))); + ActivateItem(_artemisViewModels.First(v => v is SettingsViewModel)); break; } diff --git a/src/Artemis.UI/Views/Screens/SettingsView.xaml b/src/Artemis.UI/Screens/Settings/SettingsView.xaml similarity index 96% rename from src/Artemis.UI/Views/Screens/SettingsView.xaml rename to src/Artemis.UI/Screens/Settings/SettingsView.xaml index 79aa3eb4b..5c6de26a3 100644 --- a/src/Artemis.UI/Views/Screens/SettingsView.xaml +++ b/src/Artemis.UI/Screens/Settings/SettingsView.xaml @@ -1,10 +1,9 @@ - + d:DataContext="{d:DesignInstance splash:SplashViewModel}"> @@ -25,8 +25,7 @@ - + Artemis is initializing... diff --git a/src/Artemis.UI/ViewModels/Screens/SplashViewModel.cs b/src/Artemis.UI/Screens/Splash/SplashViewModel.cs similarity index 95% rename from src/Artemis.UI/ViewModels/Screens/SplashViewModel.cs rename to src/Artemis.UI/Screens/Splash/SplashViewModel.cs index fe87c166e..7760a92b0 100644 --- a/src/Artemis.UI/ViewModels/Screens/SplashViewModel.cs +++ b/src/Artemis.UI/Screens/Splash/SplashViewModel.cs @@ -2,7 +2,7 @@ using Ninject; using Stylet; -namespace Artemis.UI.ViewModels.Screens +namespace Artemis.UI.Screens.Splash { public class SplashViewModel : Screen { diff --git a/src/Artemis.UI/Views/Dialogs/SurfaceCreateView.xaml b/src/Artemis.UI/Screens/SurfaceEditor/Dialogs/SurfaceCreateView.xaml similarity index 93% rename from src/Artemis.UI/Views/Dialogs/SurfaceCreateView.xaml rename to src/Artemis.UI/Screens/SurfaceEditor/Dialogs/SurfaceCreateView.xaml index a15a17a62..ac771e309 100644 --- a/src/Artemis.UI/Views/Dialogs/SurfaceCreateView.xaml +++ b/src/Artemis.UI/Screens/SurfaceEditor/Dialogs/SurfaceCreateView.xaml @@ -1,9 +1,8 @@ - { diff --git a/src/Artemis.UI/Views/Screens/SurfaceEditorView.xaml b/src/Artemis.UI/Screens/SurfaceEditor/SurfaceEditorView.xaml similarity index 99% rename from src/Artemis.UI/Views/Screens/SurfaceEditorView.xaml rename to src/Artemis.UI/Screens/SurfaceEditor/SurfaceEditorView.xaml index d2c36c23e..3f241634c 100644 --- a/src/Artemis.UI/Views/Screens/SurfaceEditorView.xaml +++ b/src/Artemis.UI/Screens/SurfaceEditor/SurfaceEditorView.xaml @@ -1,4 +1,4 @@ - diff --git a/src/Artemis.UI/ViewModels/Controls/SurfaceEditor/SurfaceLedViewModel.cs b/src/Artemis.UI/Screens/SurfaceEditor/Visualization/SurfaceLedViewModel.cs similarity index 92% rename from src/Artemis.UI/ViewModels/Controls/SurfaceEditor/SurfaceLedViewModel.cs rename to src/Artemis.UI/Screens/SurfaceEditor/Visualization/SurfaceLedViewModel.cs index d60a333de..802ebe5b2 100644 --- a/src/Artemis.UI/ViewModels/Controls/SurfaceEditor/SurfaceLedViewModel.cs +++ b/src/Artemis.UI/Screens/SurfaceEditor/Visualization/SurfaceLedViewModel.cs @@ -1,7 +1,7 @@ using RGB.NET.Core; using Stylet; -namespace Artemis.UI.ViewModels.Controls.SurfaceEditor +namespace Artemis.UI.Screens.SurfaceEditor.Visualization { public class SurfaceLedViewModel : PropertyChangedBase { diff --git a/src/Artemis.UI/Screens/Workshop/WorkshopView.xaml b/src/Artemis.UI/Screens/Workshop/WorkshopView.xaml new file mode 100644 index 000000000..96713ef1e --- /dev/null +++ b/src/Artemis.UI/Screens/Workshop/WorkshopView.xaml @@ -0,0 +1,12 @@ + + + Work work! + + diff --git a/src/Artemis.UI/Screens/Workshop/WorkshopViewModel.cs b/src/Artemis.UI/Screens/Workshop/WorkshopViewModel.cs new file mode 100644 index 000000000..b32848801 --- /dev/null +++ b/src/Artemis.UI/Screens/Workshop/WorkshopViewModel.cs @@ -0,0 +1,9 @@ +using Stylet; + +namespace Artemis.UI.Screens.Workshop +{ + public class WorkshopViewModel : Screen, IScreenViewModel + { + public string Title => "Workshop"; + } +} \ No newline at end of file diff --git a/src/Artemis.UI/Services/DialogService.cs b/src/Artemis.UI/Services/Dialog/DialogService.cs similarity index 98% rename from src/Artemis.UI/Services/DialogService.cs rename to src/Artemis.UI/Services/Dialog/DialogService.cs index bfaa6b234..7dcead687 100644 --- a/src/Artemis.UI/Services/DialogService.cs +++ b/src/Artemis.UI/Services/Dialog/DialogService.cs @@ -1,4 +1,5 @@ using System.Threading.Tasks; +using Artemis.UI.Screens.Dialogs; using Artemis.UI.Services.Interfaces; using Artemis.UI.ViewModels.Dialogs; using MaterialDesignThemes.Wpf; diff --git a/src/Artemis.UI/ViewModels/Dialogs/DialogViewModelBase.cs b/src/Artemis.UI/Services/Dialog/DialogViewModelBase.cs similarity index 100% rename from src/Artemis.UI/ViewModels/Dialogs/DialogViewModelBase.cs rename to src/Artemis.UI/Services/Dialog/DialogViewModelBase.cs diff --git a/src/Artemis.UI/ViewModels/Utilities/DialogViewModelHost.cs b/src/Artemis.UI/Services/Dialog/DialogViewModelHost.cs similarity index 100% rename from src/Artemis.UI/ViewModels/Utilities/DialogViewModelHost.cs rename to src/Artemis.UI/Services/Dialog/DialogViewModelHost.cs diff --git a/src/Artemis.UI/ViewModels/Controls/ProfileEditor/ProfileDeviceViewModel.cs b/src/Artemis.UI/ViewModels/Controls/ProfileEditor/ProfileDeviceViewModel.cs deleted file mode 100644 index cfcd70bc2..000000000 --- a/src/Artemis.UI/ViewModels/Controls/ProfileEditor/ProfileDeviceViewModel.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System.Collections.Generic; -using System.Windows; -using Artemis.Core.Models.Surface; -using Stylet; - -namespace Artemis.UI.ViewModels.Controls.ProfileEditor -{ - public class ProfileDeviceViewModel : PropertyChangedBase - { - private readonly List _leds; - - public ProfileDeviceViewModel(Device device) - { - Device = device; - _leds = new List(); - - if (Device.RgbDevice != null) - { - foreach (var led in Device.RgbDevice) - _leds.Add(new ProfileLedViewModel(led)); - } - } - - public Device Device { get; set; } - - public double X - { - get => Device.X; - set => Device.X = value; - } - - public double Y - { - get => Device.Y; - set => Device.Y = value; - } - - public int ZIndex - { - get => Device.ZIndex; - set => Device.ZIndex = value; - } - - public IReadOnlyCollection Leds => _leds.AsReadOnly(); - - public Rect DeviceRectangle => Device.RgbDevice == null - ? new Rect() - : new Rect(X, Y, Device.RgbDevice.Size.Width, Device.RgbDevice.Size.Height); - - public void Update() - { - foreach (var ledViewModel in _leds) - ledViewModel.Update(); - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI/ViewModels/Screens/DebugViewModel.cs b/src/Artemis.UI/ViewModels/Screens/DebugViewModel.cs deleted file mode 100644 index 6c313ee88..000000000 --- a/src/Artemis.UI/ViewModels/Screens/DebugViewModel.cs +++ /dev/null @@ -1,80 +0,0 @@ -using System; -using System.Drawing; -using System.Runtime.InteropServices; -using System.Windows; -using System.Windows.Interop; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using Artemis.Core.Events; -using Artemis.Core.Services.Interfaces; -using Artemis.UI.ViewModels.Interfaces; -using Stylet; - -namespace Artemis.UI.ViewModels.Screens -{ - public class DebugViewModel : Screen, IScreenViewModel - { - private readonly ICoreService _coreService; - private readonly IRgbService _rgbService; - - public DebugViewModel(ICoreService coreService, IRgbService rgbService) - { - _coreService = coreService; - _rgbService = rgbService; - - _coreService.FrameRendered += CoreServiceOnFrameRendered; - _coreService.FrameRendering += CoreServiceOnFrameRendering; - } - - public ImageSource CurrentFrame { get; set; } - public double CurrentFps { get; set; } - - public string Title => "Debugger"; - - public void ForceGarbageCollection() - { - GC.Collect(); - GC.WaitForPendingFinalizers(); - } - - private void CoreServiceOnFrameRendered(object sender, FrameRenderedEventArgs e) - { - if (e.Bitmap == null) - return; - - var imageSource = ImageSourceFromBitmap(e.Bitmap); - imageSource.Freeze(); - Execute.OnUIThread(() => { CurrentFrame = imageSource; }); - } - - private void CoreServiceOnFrameRendering(object sender, FrameRenderingEventArgs e) - { - CurrentFps = Math.Round(1.0 / e.DeltaTime, 2); - } - - protected override void OnClose() - { - _coreService.FrameRendered -= CoreServiceOnFrameRendered; - _coreService.FrameRendering -= CoreServiceOnFrameRendering; - base.OnClose(); - } - - // This is much quicker than saving the bitmap into a memory stream and converting it - private static ImageSource ImageSourceFromBitmap(Bitmap bmp) - { - var handle = bmp.GetHbitmap(); - try - { - return Imaging.CreateBitmapSourceFromHBitmap(handle, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); - } - finally - { - DeleteObject(handle); - } - } - - [DllImport("gdi32.dll", EntryPoint = "DeleteObject")] - [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool DeleteObject([In] IntPtr hObject); - } -} \ No newline at end of file diff --git a/src/Artemis.UI/Views/Controls/ProfileEditor/ProfileLedView.xaml b/src/Artemis.UI/Views/Controls/ProfileEditor/ProfileLedView.xaml deleted file mode 100644 index ff9b31fd1..000000000 --- a/src/Artemis.UI/Views/Controls/ProfileEditor/ProfileLedView.xaml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Artemis.UI/Views/Screens/DebugView.xaml b/src/Artemis.UI/Views/Screens/DebugView.xaml deleted file mode 100644 index 7b41083dc..000000000 --- a/src/Artemis.UI/Views/Screens/DebugView.xaml +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - - - - - - - - - - - In this window you can view the inner workings of Artemis. - Please not that having this window open can have a performance impact on your system. - - - - - - - - - - This image shows what is being rendered and dispatched to RGB.NET - - - FPS: - - - - - - - - - - - - \ No newline at end of file