1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-13 05:48:35 +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
{
/// <summary>
/// Chaitanya Kadamati - http://stackoverflow.com/a/33233162/5015269
/// </summary>
public class BindableSelectedItemBehavior : Behavior<TreeView>
{
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<object> 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<TreeViewItem>())
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<TreeViewItem>())
{
if (WalkTreeViewItem(item, e.NewValue))

View File

@ -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<LayerModel>();
foreach (var layerModel in Children)
{
if (!layerModel.Enabled)
continue;
layers.Add(layerModel);
layers.AddRange(layerModel.Children);
}

View File

@ -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
}
/// <summary>
/// Gives all the layers and their children in a flat list
/// Gives all the layers and their children in a flat list
/// </summary>
public List<LayerModel> GetAllLayers()
public List<LayerModel> GetEnabledLayers()
{
var layers = new List<LayerModel>();
foreach (var layerModel in Layers)
{
if (!layerModel.Enabled)
continue;
layers.Add(layerModel);
layers.AddRange(layerModel.GetAllLayers());
}
return layers;
}
}

View File

@ -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);

View File

@ -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);
}
/// <summary>
@ -302,27 +323,22 @@ namespace Artemis.ViewModels
/// </summary>
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);
}
/// <summary>
/// Moves the currently selected layer down in the profile's layer tree
/// </summary>
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)
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;
});
}
/// <summary>
@ -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 ||