diff --git a/Artemis/Artemis/DeviceProviders/Corsair/CorsairKeyboards.cs b/Artemis/Artemis/DeviceProviders/Corsair/CorsairKeyboards.cs index 3497f4df9..b739b0800 100644 --- a/Artemis/Artemis/DeviceProviders/Corsair/CorsairKeyboards.cs +++ b/Artemis/Artemis/DeviceProviders/Corsair/CorsairKeyboards.cs @@ -77,6 +77,11 @@ namespace Artemis.DeviceProviders.Corsair break; } +// Height = 7; +// Width = 18; +// Slug = "corsair-k65-rgb"; +// PreviewSettings = new PreviewSettings(610, 240, new Thickness(0, -30, 0, 0), Resources.k65); + Logger.Debug("Corsair SDK reported device as: {0}", _keyboard.DeviceInfo.Model); _keyboard.Brush = _keyboardBrush ?? (_keyboardBrush = new ImageBrush()); } diff --git a/Artemis/Artemis/Managers/ProfileManager.cs b/Artemis/Artemis/Managers/ProfileManager.cs index 2c1861c66..50edc8d10 100644 --- a/Artemis/Artemis/Managers/ProfileManager.cs +++ b/Artemis/Artemis/Managers/ProfileManager.cs @@ -73,6 +73,7 @@ namespace Artemis.Managers // LoopManager might be running, this method won't do any harm in that case. _loopManager.StartAsync(); + ProfilePreviewModel.ProfileViewModel = activePreview.ProfileEditor.ProfileViewModel; if (!ReferenceEquals(ProfilePreviewModel.Profile, activePreview.ProfileEditor.SelectedProfile)) ProfilePreviewModel.Profile = activePreview.ProfileEditor.SelectedProfile; } diff --git a/Artemis/Artemis/Modules/Effects/ProfilePreview/ProfilePreviewModel.cs b/Artemis/Artemis/Modules/Effects/ProfilePreview/ProfilePreviewModel.cs index 6566a68fe..513a9619d 100644 --- a/Artemis/Artemis/Modules/Effects/ProfilePreview/ProfilePreviewModel.cs +++ b/Artemis/Artemis/Modules/Effects/ProfilePreview/ProfilePreviewModel.cs @@ -7,6 +7,8 @@ using Artemis.Models; using Artemis.Models.Interfaces; using Artemis.Profiles.Layers.Interfaces; using Artemis.Profiles.Layers.Models; +using Artemis.ViewModels.Profiles; +using Castle.Components.DictionaryAdapter; namespace Artemis.Modules.Effects.ProfilePreview { @@ -17,6 +19,8 @@ namespace Artemis.Modules.Effects.ProfilePreview Name = "Profile Preview"; } + public ProfileViewModel ProfileViewModel { get; set; } + public override void Dispose() { Initialized = false; @@ -33,7 +37,7 @@ namespace Artemis.Modules.Effects.ProfilePreview public override List GetRenderLayers(bool keyboardOnly) { - return Profile.GetRenderLayers(DataModel, keyboardOnly, true); + return ProfileViewModel != null ? ProfileViewModel.GetRenderLayers() : new EditableList(); } public override void Render(RenderFrame frame, bool keyboardOnly) diff --git a/Artemis/Artemis/ViewModels/Profiles/ProfileViewModel.cs b/Artemis/Artemis/ViewModels/Profiles/ProfileViewModel.cs index 9f1260cd7..a96f755a9 100644 --- a/Artemis/Artemis/ViewModels/Profiles/ProfileViewModel.cs +++ b/Artemis/Artemis/ViewModels/Profiles/ProfileViewModel.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using System.Timers; using System.Windows; @@ -10,9 +11,11 @@ using Artemis.Managers; using Artemis.Modules.Effects.ProfilePreview; using Artemis.Profiles; using Artemis.Profiles.Layers.Models; +using Artemis.Profiles.Layers.Types.Folder; using Artemis.Properties; using Artemis.Utilities; using Caliburn.Micro; +using Castle.Components.DictionaryAdapter; using MahApps.Metro; namespace Artemis.ViewModels.Profiles @@ -29,6 +32,7 @@ namespace Artemis.ViewModels.Profiles private Cursor _keyboardPreviewCursor; private bool _resizing; private LayerModel _selectedLayer; + private bool _showAll; public ProfileViewModel(IEventAggregator events, DeviceManager deviceManager) { @@ -36,6 +40,8 @@ namespace Artemis.ViewModels.Profiles _deviceManager = deviceManager; PreviewTimer = new Timer(40); + ShowAll = false; + PreviewTimer.Elapsed += InvokeUpdateKeyboardPreview; } @@ -75,6 +81,17 @@ namespace Artemis.ViewModels.Profiles } } + public bool ShowAll + { + get { return _showAll; } + set + { + if (value == _showAll) return; + _showAll = value; + NotifyOfPropertyChange(() => ShowAll); + } + } + public ImageSource KeyboardImage => ImageUtilities .BitmapToBitmapImage(_deviceManager.ActiveKeyboard?.PreviewSettings.Image ?? Resources.none); @@ -92,7 +109,7 @@ namespace Artemis.ViewModels.Profiles _blurProgress = _blurProgress + 0.025; BlurRadius = (Math.Sin(_blurProgress*Math.PI) + 1)*10 + 10; - if (SelectedProfile == null || _deviceManager.ActiveKeyboard == null) + if (SelectedProfile == null || _deviceManager.ActiveKeyboard == null || (!ShowAll && SelectedLayer == null)) { var preview = new DrawingImage(); preview.Freeze(); @@ -100,6 +117,7 @@ namespace Artemis.ViewModels.Profiles return; } + var keyboardRect = _deviceManager.ActiveKeyboard.KeyboardRectangle(4); var visual = new DrawingVisual(); using (var drawingContext = visual.RenderOpen()) @@ -108,8 +126,10 @@ namespace Artemis.ViewModels.Profiles drawingContext.PushClip(new RectangleGeometry(keyboardRect)); drawingContext.DrawRectangle(new SolidColorBrush(Color.FromArgb(0, 0, 0, 0)), null, keyboardRect); + // Get the layers that must be drawn + var drawLayers = GetRenderLayers(); + // Draw the layers - var drawLayers = SelectedProfile.GetRenderLayers(new ProfilePreviewDataModel(), false, true); foreach (var layer in drawLayers) { layer.Update(null, true, false); @@ -120,7 +140,12 @@ namespace Artemis.ViewModels.Profiles // Get the selection color var accentColor = ThemeManager.DetectAppStyle(Application.Current)?.Item2?.Resources["AccentColor"]; if (accentColor == null) + { + var preview = new DrawingImage(); + preview.Freeze(); + KeyboardPreview = preview; return; + } var pen = new Pen(new SolidColorBrush((Color) accentColor), 0.4); @@ -198,8 +223,7 @@ namespace Artemis.ViewModels.Profiles var x = pos.X/((double) keyboard.PreviewSettings.Width/keyboard.Width); var y = pos.Y/((double) keyboard.PreviewSettings.Height/keyboard.Height); - var hoverLayer = SelectedProfile.GetLayers() - .Where(l => l.MustDraw()) + var hoverLayer = GetLayers().Where(l => l.MustDraw()) .FirstOrDefault(l => l.Properties.GetRect(1).Contains(x, y)); SelectedLayer = hoverLayer; @@ -218,8 +242,7 @@ namespace Artemis.ViewModels.Profiles var keyboard = _deviceManager.ActiveKeyboard; var x = pos.X/((double) keyboard.PreviewSettings.Width/keyboard.Width); var y = pos.Y/((double) keyboard.PreviewSettings.Height/keyboard.Height); - var hoverLayer = SelectedProfile.GetLayers() - .Where(l => l.MustDraw()) + var hoverLayer = GetLayers().Where(l => l.MustDraw()) .FirstOrDefault(l => l.Properties.GetRect(1).Contains(x, y)); HandleDragging(e, x, y, hoverLayer); @@ -308,6 +331,39 @@ namespace Artemis.ViewModels.Profiles } } + public List GetRenderLayers() + { + // Get the layers that must be drawn + List drawLayers; + if (ShowAll) + return SelectedProfile.GetRenderLayers(new ProfilePreviewDataModel(), false, true); + + if (SelectedLayer == null) + return new EditableList(); + + if (SelectedLayer.LayerType is FolderType) + drawLayers = SelectedLayer.GetRenderLayers(new ProfilePreviewDataModel(), false, true); + else + drawLayers = new List {SelectedLayer}; + + return drawLayers; + } + + + private List GetLayers() + { + // Get the layers that must be drawn + List drawLayers; + if (ShowAll) + drawLayers = SelectedProfile.GetLayers(); + else if (SelectedLayer.LayerType is FolderType) + drawLayers = SelectedLayer.GetLayers().ToList(); + else + drawLayers = new List { SelectedLayer }; + + return drawLayers; + } + #endregion } } \ No newline at end of file diff --git a/Artemis/Artemis/Views/Profiles/ProfileEditorView.xaml b/Artemis/Artemis/Views/Profiles/ProfileEditorView.xaml index a1abb62bc..237331530 100644 --- a/Artemis/Artemis/Views/Profiles/ProfileEditorView.xaml +++ b/Artemis/Artemis/Views/Profiles/ProfileEditorView.xaml @@ -9,6 +9,7 @@ xmlns:utilities="clr-namespace:Artemis.Utilities" xmlns:dragDrop="clr-namespace:GongSolutions.Wpf.DragDrop;assembly=GongSolutions.Wpf.DragDrop" xmlns:converters="clr-namespace:Artemis.Utilities.Converters" + xmlns:controls="http://metro.mahapps.com/winfx/xaml/controls" mc:Ignorable="d" d:DesignHeight="510" Width="1055"> @@ -23,6 +24,7 @@ + @@ -147,7 +149,14 @@ -