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