1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-31 17:53:32 +00:00

Polished lots of layer related UI stuff

This commit is contained in:
SpoinkyNL 2016-05-22 23:57:56 +02:00
parent 8adc6b1b9d
commit fdc18a1de0
5 changed files with 144 additions and 71 deletions

View File

@ -6,6 +6,9 @@ using System.Windows.Interactivity;
namespace Artemis.ItemBehaviours namespace Artemis.ItemBehaviours
{ {
/// <summary>
/// Chaitanya Kadamati - http://stackoverflow.com/a/33233162/5015269
/// </summary>
public class BindableSelectedItemBehavior : Behavior<TreeView> public class BindableSelectedItemBehavior : Behavior<TreeView>
{ {
protected override void OnAttached() protected override void OnAttached()
@ -18,9 +21,7 @@ namespace Artemis.ItemBehaviours
{ {
base.OnDetaching(); base.OnDetaching();
if (AssociatedObject != null) if (AssociatedObject != null)
{
AssociatedObject.SelectedItemChanged -= OnTreeViewSelectedItemChanged; AssociatedObject.SelectedItemChanged -= OnTreeViewSelectedItemChanged;
}
} }
private void OnTreeViewSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) private void OnTreeViewSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
@ -44,10 +45,14 @@ namespace Artemis.ItemBehaviours
{ {
var behavior = sender as BindableSelectedItemBehavior; var behavior = sender as BindableSelectedItemBehavior;
var tree = behavior?.AssociatedObject; var tree = behavior?.AssociatedObject;
if (tree == null) return; if (tree == null)
return;
if (e.NewValue == null) if (e.NewValue == null)
{
foreach (var item in tree.Items.OfType<TreeViewItem>()) foreach (var item in tree.Items.OfType<TreeViewItem>())
item.SetValue(TreeViewItem.IsSelectedProperty, false); item.SetValue(TreeViewItem.IsSelectedProperty, false);
}
var treeViewItem = e.NewValue as TreeViewItem; var treeViewItem = e.NewValue as TreeViewItem;
if (treeViewItem != null) if (treeViewItem != null)
treeViewItem.SetValue(TreeViewItem.IsSelectedProperty, true); treeViewItem.SetValue(TreeViewItem.IsSelectedProperty, true);
@ -56,7 +61,9 @@ namespace Artemis.ItemBehaviours
var itemsHostProperty = tree.GetType() var itemsHostProperty = tree.GetType()
.GetProperty("ItemsHost", BindingFlags.NonPublic | BindingFlags.Instance); .GetProperty("ItemsHost", BindingFlags.NonPublic | BindingFlags.Instance);
var itemsHost = itemsHostProperty?.GetValue(tree, null) as Panel; var itemsHost = itemsHostProperty?.GetValue(tree, null) as Panel;
if (itemsHost == null) return; if (itemsHost == null)
return;
foreach (var item in itemsHost.Children.OfType<TreeViewItem>()) foreach (var item in itemsHost.Children.OfType<TreeViewItem>())
{ {
if (WalkTreeViewItem(item, e.NewValue)) if (WalkTreeViewItem(item, e.NewValue))

View File

@ -155,6 +155,30 @@ namespace Artemis.Models.Profiles
// Fix the sorting just in case // Fix the sorting just in case
FixOrder(); 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; int newOrder;
if (moveUp) if (moveUp)
newOrder = selectedLayer.Order - 1; newOrder = selectedLayer.Order - 1;
@ -165,6 +189,47 @@ namespace Artemis.Models.Profiles
if (target == null) if (target == null)
return; 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; target.Order = selectedLayer.Order;
selectedLayer.Order = newOrder; selectedLayer.Order = newOrder;
} }
@ -190,6 +255,8 @@ namespace Artemis.Models.Profiles
var layers = new List<LayerModel>(); var layers = new List<LayerModel>();
foreach (var layerModel in Children) foreach (var layerModel in Children)
{ {
if (!layerModel.Enabled)
continue;
layers.Add(layerModel); layers.Add(layerModel);
layers.AddRange(layerModel.Children); layers.AddRange(layerModel.Children);
} }

View File

@ -88,7 +88,6 @@ namespace Artemis.Models.Profiles
public void Reorder(LayerModel selectedLayer, bool moveUp) public void Reorder(LayerModel selectedLayer, bool moveUp)
{ {
// Fix the sorting just in case
FixOrder(); FixOrder();
int newOrder; int newOrder;
@ -101,36 +100,7 @@ namespace Artemis.Models.Profiles
if (target == null) if (target == null)
return; return;
if (target.LayerType == LayerType.Folder) LayerModel.ApplyReorder(selectedLayer, target, newOrder, moveUp);
{
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;
} }
public void FixOrder() public void FixOrder()
@ -181,17 +151,19 @@ namespace Artemis.Models.Profiles
} }
/// <summary> /// <summary>
/// Gives all the layers and their children in a flat list /// Gives all the layers and their children in a flat list
/// </summary> /// </summary>
public List<LayerModel> GetAllLayers() public List<LayerModel> GetEnabledLayers()
{ {
var layers = new List<LayerModel>(); var layers = new List<LayerModel>();
foreach (var layerModel in Layers) foreach (var layerModel in Layers)
{ {
if (!layerModel.Enabled)
continue;
layers.Add(layerModel); layers.Add(layerModel);
layers.AddRange(layerModel.GetAllLayers()); layers.AddRange(layerModel.GetAllLayers());
} }
return layers; return layers;
} }
} }

View File

@ -108,6 +108,10 @@ namespace Artemis.ViewModels.LayerEditor
public void PreSelect() public void PreSelect()
{ {
LayerType = Layer.LayerType; LayerType = Layer.LayerType;
if (LayerType == LayerType.Folder && !(LayerPropertiesViewModel is FolderPropertiesViewModel))
LayerPropertiesViewModel = new FolderPropertiesViewModel(_gameDataModel, Layer.Properties);
ProposedProperties = GeneralHelpers.Clone(Layer.Properties); ProposedProperties = GeneralHelpers.Clone(Layer.Properties);
} }
@ -128,13 +132,6 @@ namespace Artemis.ViewModels.LayerEditor
if (model != null) if (model != null)
model.IsGif = LayerType == LayerType.KeyboardGif; 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 // Apply the proper PropertiesViewModel
if ((LayerType == LayerType.Keyboard || LayerType == LayerType.KeyboardGif) && if ((LayerType == LayerType.Keyboard || LayerType == LayerType.KeyboardGif) &&
!(LayerPropertiesViewModel is KeyboardPropertiesViewModel)) !(LayerPropertiesViewModel is KeyboardPropertiesViewModel))
@ -162,7 +159,8 @@ namespace Artemis.ViewModels.LayerEditor
public void Apply() public void Apply()
{ {
Layer.Properties = LayerPropertiesViewModel.GetAppliedProperties(); if (LayerPropertiesViewModel != null)
Layer.Properties = LayerPropertiesViewModel.GetAppliedProperties();
Layer.Properties.Conditions.Clear(); Layer.Properties.Conditions.Clear();
foreach (var conditionViewModel in LayerConditionVms) foreach (var conditionViewModel in LayerConditionVms)
Layer.Properties.Conditions.Add(conditionViewModel.LayerConditionModel); Layer.Properties.Conditions.Add(conditionViewModel.LayerConditionModel);

View File

@ -2,6 +2,8 @@
using System.ComponentModel; using System.ComponentModel;
using System.Dynamic; using System.Dynamic;
using System.Linq; using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Timers; using System.Timers;
using System.Windows; using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
@ -21,6 +23,7 @@ using Artemis.ViewModels.LayerEditor;
using Caliburn.Micro; using Caliburn.Micro;
using MahApps.Metro; using MahApps.Metro;
using Ninject; using Ninject;
using Timer = System.Timers.Timer;
namespace Artemis.ViewModels namespace Artemis.ViewModels
{ {
@ -238,9 +241,27 @@ namespace Artemis.ViewModels
settings.Title = "Artemis | Edit " + layer.Name; settings.Title = "Artemis | Edit " + layer.Name;
manager.ShowDialog(_editorVm, null, settings); manager.ShowDialog(_editorVm, null, settings);
// Refresh the layer list and reselect the last layer // If the layer was a folder, but isn't anymore, assign it's children to it's parent.
NotifyOfPropertyChange(() => Layers); if (layer.LayerType != LayerType.Folder && layer.Children.Any())
SelectedLayer = layer; {
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);
} }
/// <summary> /// <summary>
@ -302,27 +323,22 @@ namespace Artemis.ViewModels
/// </summary> /// </summary>
public void LayerUp() public void LayerUp()
{ {
if (SelectedLayer == null) MoveLayer(true);
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;
} }
/// <summary> /// <summary>
/// Moves the currently selected layer down in the profile's layer tree /// Moves the currently selected layer down in the profile's layer tree
/// </summary> /// </summary>
public void LayerDown() public void LayerDown()
{
MoveLayer(false);
}
/// <summary>
/// Moves the currently selected layer up or down in the profile's layer tree
/// </summary>
/// <param name="moveUp"></param>
private void MoveLayer(bool moveUp)
{ {
if (SelectedLayer == null) if (SelectedLayer == null)
return; return;
@ -330,15 +346,26 @@ namespace Artemis.ViewModels
var reorderLayer = SelectedLayer; var reorderLayer = SelectedLayer;
if (SelectedLayer.Parent != null) if (SelectedLayer.Parent != null)
SelectedLayer.Parent.Reorder(SelectedLayer, false); SelectedLayer.Parent.Reorder(SelectedLayer, moveUp);
else else
SelectedLayer.Profile.Reorder(SelectedLayer, false); SelectedLayer.Profile.Reorder(SelectedLayer, moveUp);
UpdateLayerList(reorderLayer);
}
private void UpdateLayerList(LayerModel selectModel)
{
// Update the UI // Update the UI
Layers.Clear(); Layers.Clear();
if (SelectedProfile != null) if (SelectedProfile != null)
Layers.AddRange(SelectedProfile.Layers); Layers.AddRange(SelectedProfile.Layers);
SelectedLayer = reorderLayer;
// A small delay to allow the profile list to rebuild
Task.Factory.StartNew(() =>
{
Thread.Sleep(20);
SelectedLayer = selectModel;
});
} }
/// <summary> /// <summary>
@ -369,7 +396,7 @@ namespace Artemis.ViewModels
var x = pos.X/((double) ActiveKeyboard.PreviewSettings.Width/ActiveKeyboard.Width); var x = pos.X/((double) ActiveKeyboard.PreviewSettings.Width/ActiveKeyboard.Width);
var y = pos.Y/((double) ActiveKeyboard.PreviewSettings.Height/ActiveKeyboard.Height); var y = pos.Y/((double) ActiveKeyboard.PreviewSettings.Height/ActiveKeyboard.Height);
var hoverLayer = SelectedProfile.GetAllLayers() var hoverLayer = SelectedProfile.GetEnabledLayers()
.OrderBy(l => l.Order) .OrderBy(l => l.Order)
.Where(l => l.MustDraw()) .Where(l => l.MustDraw())
.FirstOrDefault(l => ((KeyboardPropertiesModel) l.Properties) .FirstOrDefault(l => ((KeyboardPropertiesModel) l.Properties)
@ -391,8 +418,10 @@ namespace Artemis.ViewModels
var pos = e.GetPosition((Image) e.OriginalSource); var pos = e.GetPosition((Image) e.OriginalSource);
var x = pos.X/((double) ActiveKeyboard.PreviewSettings.Width/ActiveKeyboard.Width); var x = pos.X/((double) ActiveKeyboard.PreviewSettings.Width/ActiveKeyboard.Width);
var y = pos.Y/((double) ActiveKeyboard.PreviewSettings.Height/ActiveKeyboard.Height); var y = pos.Y/((double) ActiveKeyboard.PreviewSettings.Height/ActiveKeyboard.Height);
var hoverLayer = SelectedProfile.GetAllLayers().OrderBy(l => l.Order).Where(l => l.MustDraw()) var hoverLayer = SelectedProfile.GetEnabledLayers()
.FirstOrDefault(l => ((KeyboardPropertiesModel) l.Properties).GetRect(1).Contains(x, y)); .Where(l => l.MustDraw())
.FirstOrDefault(l => ((KeyboardPropertiesModel) l.Properties)
.GetRect(1).Contains(x, y));
HandleDragging(e, x, y, hoverLayer); HandleDragging(e, x, y, hoverLayer);
@ -441,7 +470,7 @@ namespace Artemis.ViewModels
drawingContext.DrawRectangle(new SolidColorBrush(Color.FromArgb(0, 0, 0, 0)), null, keyboardRect); drawingContext.DrawRectangle(new SolidColorBrush(Color.FromArgb(0, 0, 0, 0)), null, keyboardRect);
// Draw the layers // Draw the layers
var drawLayers = SelectedProfile.GetAllLayers() var drawLayers = SelectedProfile.Layers
.OrderByDescending(l => l.Order) .OrderByDescending(l => l.Order)
.Where(l => l.Enabled && .Where(l => l.Enabled &&
(l.LayerType == LayerType.Keyboard || (l.LayerType == LayerType.Keyboard ||