From fdc18a1de05fb59f53c0c230b113637023a99c6d Mon Sep 17 00:00:00 2001 From: SpoinkyNL Date: Sun, 22 May 2016 23:57:56 +0200 Subject: [PATCH] Polished lots of layer related UI stuff --- .../BindableSelectedItemBehavior.cs | 15 +++- Artemis/Artemis/Models/Profiles/LayerModel.cs | 67 ++++++++++++++++ .../Artemis/Models/Profiles/ProfileModel.cs | 40 ++-------- .../LayerEditor/LayerEditorViewModel.cs | 14 ++-- .../ViewModels/ProfileEditorViewModel.cs | 79 +++++++++++++------ 5 files changed, 144 insertions(+), 71 deletions(-) diff --git a/Artemis/Artemis/ItemBehaviours/BindableSelectedItemBehavior.cs b/Artemis/Artemis/ItemBehaviours/BindableSelectedItemBehavior.cs index d12b3ceb1..477ae38d6 100644 --- a/Artemis/Artemis/ItemBehaviours/BindableSelectedItemBehavior.cs +++ b/Artemis/Artemis/ItemBehaviours/BindableSelectedItemBehavior.cs @@ -6,6 +6,9 @@ using System.Windows.Interactivity; namespace Artemis.ItemBehaviours { + /// + /// Chaitanya Kadamati - http://stackoverflow.com/a/33233162/5015269 + /// public class BindableSelectedItemBehavior : Behavior { protected override void OnAttached() @@ -18,9 +21,7 @@ namespace Artemis.ItemBehaviours { base.OnDetaching(); if (AssociatedObject != null) - { AssociatedObject.SelectedItemChanged -= OnTreeViewSelectedItemChanged; - } } private void OnTreeViewSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs e) @@ -44,10 +45,14 @@ namespace Artemis.ItemBehaviours { var behavior = sender as BindableSelectedItemBehavior; var tree = behavior?.AssociatedObject; - if (tree == null) return; + if (tree == null) + return; + if (e.NewValue == null) + { foreach (var item in tree.Items.OfType()) item.SetValue(TreeViewItem.IsSelectedProperty, false); + } var treeViewItem = e.NewValue as TreeViewItem; if (treeViewItem != null) treeViewItem.SetValue(TreeViewItem.IsSelectedProperty, true); @@ -56,7 +61,9 @@ namespace Artemis.ItemBehaviours var itemsHostProperty = tree.GetType() .GetProperty("ItemsHost", BindingFlags.NonPublic | BindingFlags.Instance); var itemsHost = itemsHostProperty?.GetValue(tree, null) as Panel; - if (itemsHost == null) return; + if (itemsHost == null) + return; + foreach (var item in itemsHost.Children.OfType()) { if (WalkTreeViewItem(item, e.NewValue)) diff --git a/Artemis/Artemis/Models/Profiles/LayerModel.cs b/Artemis/Artemis/Models/Profiles/LayerModel.cs index c5a573a5d..2952d7e62 100644 --- a/Artemis/Artemis/Models/Profiles/LayerModel.cs +++ b/Artemis/Artemis/Models/Profiles/LayerModel.cs @@ -155,6 +155,30 @@ namespace Artemis.Models.Profiles // Fix the sorting just in case FixOrder(); + // Possibly remove selectedLayer from a folder + if (selectedLayer.Parent?.LayerType == LayerType.Folder) + { + var parent = selectedLayer.Parent; + var siblings = parent.Children; + if ((selectedLayer == siblings.FirstOrDefault() && moveUp) || + (selectedLayer == siblings.LastOrDefault() && !moveUp)) + { + // If selectedLayer is on the edge of a folder and moved off of it, remove it from the folder + parent.Children.Remove(selectedLayer); + if (parent.Parent != null) + parent.Parent.Children.Add(selectedLayer); + else + parent.Profile.Layers.Add(selectedLayer); + + if (moveUp) + selectedLayer.Order = parent.Order - 1; + else + selectedLayer.Order = parent.Order + 1; + + return; + } + } + int newOrder; if (moveUp) newOrder = selectedLayer.Order - 1; @@ -165,6 +189,47 @@ namespace Artemis.Models.Profiles if (target == null) return; + ApplyReorder(selectedLayer, target, newOrder, moveUp); + } + + + public static void ApplyReorder(LayerModel selectedLayer, LayerModel target, int newOrder, bool moveUp) + { + if (target.LayerType == LayerType.Folder) + { + if (selectedLayer.Parent == null) + selectedLayer.Profile.Layers.Remove(selectedLayer); + else + selectedLayer.Parent.Children.Remove(selectedLayer); + + target.Children.Add(selectedLayer); + selectedLayer.Parent = target; + + if (moveUp) + { + var parentTarget = target.Children.OrderBy(c => c.Order).LastOrDefault(); + if (parentTarget != null) + { + parentTarget.Order--; + selectedLayer.Order = parentTarget.Order + 1; + } + else + selectedLayer.Order = 1; + } + else + { + var parentTarget = target.Children.OrderBy(c => c.Order).FirstOrDefault(); + if (parentTarget != null) + { + parentTarget.Order++; + selectedLayer.Order = parentTarget.Order - 1; + } + else + selectedLayer.Order = 1; + } + target.FixOrder(); + return; + } target.Order = selectedLayer.Order; selectedLayer.Order = newOrder; } @@ -190,6 +255,8 @@ namespace Artemis.Models.Profiles var layers = new List(); foreach (var layerModel in Children) { + if (!layerModel.Enabled) + continue; layers.Add(layerModel); layers.AddRange(layerModel.Children); } diff --git a/Artemis/Artemis/Models/Profiles/ProfileModel.cs b/Artemis/Artemis/Models/Profiles/ProfileModel.cs index c06c326cd..2537c3d8e 100644 --- a/Artemis/Artemis/Models/Profiles/ProfileModel.cs +++ b/Artemis/Artemis/Models/Profiles/ProfileModel.cs @@ -88,7 +88,6 @@ namespace Artemis.Models.Profiles public void Reorder(LayerModel selectedLayer, bool moveUp) { - // Fix the sorting just in case FixOrder(); int newOrder; @@ -101,36 +100,7 @@ namespace Artemis.Models.Profiles if (target == null) return; - if (target.LayerType == LayerType.Folder) - { - if (selectedLayer.Parent == null) - selectedLayer.Profile.Layers.Remove(selectedLayer); - else - selectedLayer.Parent.Children.Remove(selectedLayer); - - target.Children.Add(selectedLayer); - - - if (moveUp) - { - var parentTarget = target.Children.OrderBy(c => c.Order).LastOrDefault(); - if (parentTarget != null) - selectedLayer.Order = parentTarget.Order + 1; - else - selectedLayer.Order = 1; - } - else - { - var parentTarget = target.Children.OrderBy(c => c.Order).LastOrDefault(); - if (parentTarget != null) - selectedLayer.Order = parentTarget.Order - 1; - else - selectedLayer.Order = 1; - } - target.FixOrder(); - } - target.Order = selectedLayer.Order; - selectedLayer.Order = newOrder; + LayerModel.ApplyReorder(selectedLayer, target, newOrder, moveUp); } public void FixOrder() @@ -181,17 +151,19 @@ namespace Artemis.Models.Profiles } /// - /// Gives all the layers and their children in a flat list + /// Gives all the layers and their children in a flat list /// - public List GetAllLayers() + public List GetEnabledLayers() { var layers = new List(); foreach (var layerModel in Layers) { + if (!layerModel.Enabled) + continue; layers.Add(layerModel); layers.AddRange(layerModel.GetAllLayers()); } - + return layers; } } diff --git a/Artemis/Artemis/ViewModels/LayerEditor/LayerEditorViewModel.cs b/Artemis/Artemis/ViewModels/LayerEditor/LayerEditorViewModel.cs index c3c1df973..6b151b23c 100644 --- a/Artemis/Artemis/ViewModels/LayerEditor/LayerEditorViewModel.cs +++ b/Artemis/Artemis/ViewModels/LayerEditor/LayerEditorViewModel.cs @@ -108,6 +108,10 @@ namespace Artemis.ViewModels.LayerEditor public void PreSelect() { LayerType = Layer.LayerType; + + if (LayerType == LayerType.Folder && !(LayerPropertiesViewModel is FolderPropertiesViewModel)) + LayerPropertiesViewModel = new FolderPropertiesViewModel(_gameDataModel, Layer.Properties); + ProposedProperties = GeneralHelpers.Clone(Layer.Properties); } @@ -128,13 +132,6 @@ namespace Artemis.ViewModels.LayerEditor if (model != null) model.IsGif = LayerType == LayerType.KeyboardGif; - // If the layer was a folder, but isn't anymore, assign it's children to it's parent. - if (LayerType != LayerType.Folder && LayerPropertiesViewModel is FolderPropertiesViewModel) - { - foreach (var child in Layer.Children) - child.Parent = Layer.Parent; - } - // Apply the proper PropertiesViewModel if ((LayerType == LayerType.Keyboard || LayerType == LayerType.KeyboardGif) && !(LayerPropertiesViewModel is KeyboardPropertiesViewModel)) @@ -162,7 +159,8 @@ namespace Artemis.ViewModels.LayerEditor public void Apply() { - Layer.Properties = LayerPropertiesViewModel.GetAppliedProperties(); + if (LayerPropertiesViewModel != null) + Layer.Properties = LayerPropertiesViewModel.GetAppliedProperties(); Layer.Properties.Conditions.Clear(); foreach (var conditionViewModel in LayerConditionVms) Layer.Properties.Conditions.Add(conditionViewModel.LayerConditionModel); diff --git a/Artemis/Artemis/ViewModels/ProfileEditorViewModel.cs b/Artemis/Artemis/ViewModels/ProfileEditorViewModel.cs index 156c8c7c2..925b224e6 100644 --- a/Artemis/Artemis/ViewModels/ProfileEditorViewModel.cs +++ b/Artemis/Artemis/ViewModels/ProfileEditorViewModel.cs @@ -2,6 +2,8 @@ using System.ComponentModel; using System.Dynamic; using System.Linq; +using System.Threading; +using System.Threading.Tasks; using System.Timers; using System.Windows; using System.Windows.Controls; @@ -21,6 +23,7 @@ using Artemis.ViewModels.LayerEditor; using Caliburn.Micro; using MahApps.Metro; using Ninject; +using Timer = System.Timers.Timer; namespace Artemis.ViewModels { @@ -238,9 +241,27 @@ namespace Artemis.ViewModels settings.Title = "Artemis | Edit " + layer.Name; manager.ShowDialog(_editorVm, null, settings); - // Refresh the layer list and reselect the last layer - NotifyOfPropertyChange(() => Layers); - SelectedLayer = layer; + // If the layer was a folder, but isn't anymore, assign it's children to it's parent. + if (layer.LayerType != LayerType.Folder && layer.Children.Any()) + { + while (layer.Children.Any()) + { + var child = layer.Children[0]; + layer.Children.Remove(child); + if (layer.Parent != null) + { + layer.Parent.Children.Add(child); + layer.Parent.FixOrder(); + } + else + { + layer.Profile.Layers.Add(child); + layer.Profile.FixOrder(); + } + } + } + + UpdateLayerList(layer); } /// @@ -302,27 +323,22 @@ namespace Artemis.ViewModels /// public void LayerUp() { - if (SelectedLayer == null) - return; - - var reorderLayer = SelectedLayer; - - if (SelectedLayer.Parent != null) - SelectedLayer.Parent.Reorder(SelectedLayer, true); - else - SelectedLayer.Profile.Reorder(SelectedLayer, true); - - // Update the UI - Layers.Clear(); - if (SelectedProfile != null) - Layers.AddRange(SelectedProfile.Layers); - SelectedLayer = reorderLayer; + MoveLayer(true); } /// /// Moves the currently selected layer down in the profile's layer tree /// public void LayerDown() + { + MoveLayer(false); + } + + /// + /// Moves the currently selected layer up or down in the profile's layer tree + /// + /// + private void MoveLayer(bool moveUp) { if (SelectedLayer == null) return; @@ -330,15 +346,26 @@ namespace Artemis.ViewModels var reorderLayer = SelectedLayer; if (SelectedLayer.Parent != null) - SelectedLayer.Parent.Reorder(SelectedLayer, false); + SelectedLayer.Parent.Reorder(SelectedLayer, moveUp); else - SelectedLayer.Profile.Reorder(SelectedLayer, false); + SelectedLayer.Profile.Reorder(SelectedLayer, moveUp); + UpdateLayerList(reorderLayer); + } + + private void UpdateLayerList(LayerModel selectModel) + { // Update the UI Layers.Clear(); if (SelectedProfile != null) Layers.AddRange(SelectedProfile.Layers); - SelectedLayer = reorderLayer; + + // A small delay to allow the profile list to rebuild + Task.Factory.StartNew(() => + { + Thread.Sleep(20); + SelectedLayer = selectModel; + }); } /// @@ -369,7 +396,7 @@ namespace Artemis.ViewModels var x = pos.X/((double) ActiveKeyboard.PreviewSettings.Width/ActiveKeyboard.Width); var y = pos.Y/((double) ActiveKeyboard.PreviewSettings.Height/ActiveKeyboard.Height); - var hoverLayer = SelectedProfile.GetAllLayers() + var hoverLayer = SelectedProfile.GetEnabledLayers() .OrderBy(l => l.Order) .Where(l => l.MustDraw()) .FirstOrDefault(l => ((KeyboardPropertiesModel) l.Properties) @@ -391,8 +418,10 @@ namespace Artemis.ViewModels var pos = e.GetPosition((Image) e.OriginalSource); var x = pos.X/((double) ActiveKeyboard.PreviewSettings.Width/ActiveKeyboard.Width); var y = pos.Y/((double) ActiveKeyboard.PreviewSettings.Height/ActiveKeyboard.Height); - var hoverLayer = SelectedProfile.GetAllLayers().OrderBy(l => l.Order).Where(l => l.MustDraw()) - .FirstOrDefault(l => ((KeyboardPropertiesModel) l.Properties).GetRect(1).Contains(x, y)); + var hoverLayer = SelectedProfile.GetEnabledLayers() + .Where(l => l.MustDraw()) + .FirstOrDefault(l => ((KeyboardPropertiesModel) l.Properties) + .GetRect(1).Contains(x, y)); HandleDragging(e, x, y, hoverLayer); @@ -441,7 +470,7 @@ namespace Artemis.ViewModels drawingContext.DrawRectangle(new SolidColorBrush(Color.FromArgb(0, 0, 0, 0)), null, keyboardRect); // Draw the layers - var drawLayers = SelectedProfile.GetAllLayers() + var drawLayers = SelectedProfile.Layers .OrderByDescending(l => l.Order) .Where(l => l.Enabled && (l.LayerType == LayerType.Keyboard ||