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:
parent
8adc6b1b9d
commit
fdc18a1de0
@ -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))
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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 ||
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user