mirror of
https://github.com/Artemis-RGB/Artemis
synced 2026-11-12 11:56:30 +00:00
Gradient editor - Implemented stop create/remove and edit
This commit is contained in:
1 parent
81ec5bfe8f
commit
83cf9a45fb
12 files changed
+318
-82
No files matched your search
+1
@@ -7,6 +7,7 @@ using System.Windows.Media;
|
||||
using Artemis.UI.Events;
|
||||
using Artemis.UI.Ninject.Factories;
|
||||
using Artemis.UI.Services.Interfaces;
|
||||
using Artemis.UI.Shared.Utilities;
|
||||
using Artemis.UI.Utilities;
|
||||
using Stylet;
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
xmlns:s="https://github.com/canton7/Stylet"
|
||||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
||||
xmlns:profileEditor="clr-namespace:Artemis.UI.Screens.Module.ProfileEditor.Visualization"
|
||||
xmlns:utilities="clr-namespace:Artemis.UI.Utilities"
|
||||
xmlns:utilities="clr-namespace:Artemis.UI.Shared.Utilities;assembly=Artemis.UI.Shared"
|
||||
mc:Ignorable="d"
|
||||
d:DesignHeight="510.9" d:DesignWidth="800"
|
||||
d:DataContext="{d:DesignInstance {x:Type profileEditor:ProfileViewModel}}">
|
||||
|
||||
@@ -1,32 +0,0 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Windows;
|
||||
using System.Windows.Media;
|
||||
|
||||
namespace Artemis.UI.Utilities
|
||||
{
|
||||
public static class HitTestUtilities
|
||||
{
|
||||
/// <summary>
|
||||
/// Runs a hit test on children of the container within the rectangle matching all elements that have a data context of <see cref="T"/>.
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="container"></param>
|
||||
/// <param name="rectangleGeometry"></param>
|
||||
/// <returns></returns>
|
||||
public static List<T> GetHitViewModels<T>(Visual container, RectangleGeometry rectangleGeometry)
|
||||
{
|
||||
var result = new List<T>();
|
||||
var hitTestParams = new GeometryHitTestParameters(rectangleGeometry);
|
||||
var resultCallback = new HitTestResultCallback(r => HitTestResultBehavior.Continue);
|
||||
var filterCallback = new HitTestFilterCallback(e =>
|
||||
{
|
||||
if (e is FrameworkElement fe && fe.DataContext.GetType() == typeof(T) && !result.Contains((T) fe.DataContext))
|
||||
result.Add((T) fe.DataContext);
|
||||
return HitTestFilterBehavior.Continue;
|
||||
});
|
||||
VisualTreeHelper.HitTest(container, filterCallback, resultCallback, hitTestParams);
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,52 +0,0 @@
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace Artemis.UI.Utilities
|
||||
{
|
||||
public class ShortcutUtilities
|
||||
{
|
||||
|
||||
private static Type m_type = Type.GetTypeFromProgID("WScript.Shell");
|
||||
private static object m_shell = Activator.CreateInstance(m_type);
|
||||
|
||||
[ComImport, TypeLibType((short)0x1040), Guid("F935DC23-1CF0-11D0-ADB9-00C04FD58A0B")]
|
||||
private interface IWshShortcut
|
||||
{
|
||||
[DispId(0)]
|
||||
string FullName { [return: MarshalAs(UnmanagedType.BStr)] [DispId(0)] get; }
|
||||
[DispId(0x3e8)]
|
||||
string Arguments { [return: MarshalAs(UnmanagedType.BStr)] [DispId(0x3e8)] get; [param: In, MarshalAs(UnmanagedType.BStr)] [DispId(0x3e8)] set; }
|
||||
[DispId(0x3e9)]
|
||||
string Description { [return: MarshalAs(UnmanagedType.BStr)] [DispId(0x3e9)] get; [param: In, MarshalAs(UnmanagedType.BStr)] [DispId(0x3e9)] set; }
|
||||
[DispId(0x3ea)]
|
||||
string Hotkey { [return: MarshalAs(UnmanagedType.BStr)] [DispId(0x3ea)] get; [param: In, MarshalAs(UnmanagedType.BStr)] [DispId(0x3ea)] set; }
|
||||
[DispId(0x3eb)]
|
||||
string IconLocation { [return: MarshalAs(UnmanagedType.BStr)] [DispId(0x3eb)] get; [param: In, MarshalAs(UnmanagedType.BStr)] [DispId(0x3eb)] set; }
|
||||
[DispId(0x3ec)]
|
||||
string RelativePath { [param: In, MarshalAs(UnmanagedType.BStr)] [DispId(0x3ec)] set; }
|
||||
[DispId(0x3ed)]
|
||||
string TargetPath { [return: MarshalAs(UnmanagedType.BStr)] [DispId(0x3ed)] get; [param: In, MarshalAs(UnmanagedType.BStr)] [DispId(0x3ed)] set; }
|
||||
[DispId(0x3ee)]
|
||||
int WindowStyle { [DispId(0x3ee)] get; [param: In] [DispId(0x3ee)] set; }
|
||||
[DispId(0x3ef)]
|
||||
string WorkingDirectory { [return: MarshalAs(UnmanagedType.BStr)] [DispId(0x3ef)] get; [param: In, MarshalAs(UnmanagedType.BStr)] [DispId(0x3ef)] set; }
|
||||
[TypeLibFunc((short)0x40), DispId(0x7d0)]
|
||||
void Load([In, MarshalAs(UnmanagedType.BStr)] string PathLink);
|
||||
[DispId(0x7d1)]
|
||||
void Save();
|
||||
}
|
||||
|
||||
public static void Create(string fileName, string targetPath, string arguments, string workingDirectory, string description, string hotkey, string iconPath)
|
||||
{
|
||||
IWshShortcut shortcut = (IWshShortcut)m_type.InvokeMember("CreateShortcut", System.Reflection.BindingFlags.InvokeMethod, null, m_shell, new object[] { fileName });
|
||||
shortcut.Description = description;
|
||||
shortcut.Hotkey = hotkey;
|
||||
shortcut.TargetPath = targetPath;
|
||||
shortcut.WorkingDirectory = workingDirectory;
|
||||
shortcut.Arguments = arguments;
|
||||
if (!string.IsNullOrEmpty(iconPath))
|
||||
shortcut.IconLocation = iconPath;
|
||||
shortcut.Save();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,77 +0,0 @@
|
||||
using System.Windows;
|
||||
|
||||
namespace Artemis.UI.Utilities
|
||||
{
|
||||
public static class SizeObserver
|
||||
{
|
||||
public static readonly DependencyProperty ObserveProperty = DependencyProperty.RegisterAttached(
|
||||
"Observe",
|
||||
typeof(bool),
|
||||
typeof(SizeObserver),
|
||||
new FrameworkPropertyMetadata(OnObserveChanged));
|
||||
|
||||
public static readonly DependencyProperty ObservedWidthProperty = DependencyProperty.RegisterAttached(
|
||||
"ObservedWidth",
|
||||
typeof(double),
|
||||
typeof(SizeObserver));
|
||||
|
||||
public static readonly DependencyProperty ObservedHeightProperty = DependencyProperty.RegisterAttached(
|
||||
"ObservedHeight",
|
||||
typeof(double),
|
||||
typeof(SizeObserver));
|
||||
|
||||
public static bool GetObserve(FrameworkElement frameworkElement)
|
||||
{
|
||||
return (bool) frameworkElement.GetValue(ObserveProperty);
|
||||
}
|
||||
|
||||
public static void SetObserve(FrameworkElement frameworkElement, bool observe)
|
||||
{
|
||||
frameworkElement.SetValue(ObserveProperty, observe);
|
||||
}
|
||||
|
||||
public static double GetObservedWidth(FrameworkElement frameworkElement)
|
||||
{
|
||||
return (double) frameworkElement.GetValue(ObservedWidthProperty);
|
||||
}
|
||||
|
||||
public static void SetObservedWidth(FrameworkElement frameworkElement, double observedWidth)
|
||||
{
|
||||
frameworkElement.SetValue(ObservedWidthProperty, observedWidth);
|
||||
}
|
||||
|
||||
public static double GetObservedHeight(FrameworkElement frameworkElement)
|
||||
{
|
||||
return (double) frameworkElement.GetValue(ObservedHeightProperty);
|
||||
}
|
||||
|
||||
public static void SetObservedHeight(FrameworkElement frameworkElement, double observedHeight)
|
||||
{
|
||||
frameworkElement.SetValue(ObservedHeightProperty, observedHeight);
|
||||
}
|
||||
|
||||
private static void OnObserveChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
|
||||
{
|
||||
var frameworkElement = (FrameworkElement) dependencyObject;
|
||||
|
||||
if ((bool) e.NewValue)
|
||||
{
|
||||
frameworkElement.SizeChanged += OnFrameworkElementSizeChanged;
|
||||
UpdateObservedSizesForFrameworkElement(frameworkElement);
|
||||
}
|
||||
else
|
||||
frameworkElement.SizeChanged -= OnFrameworkElementSizeChanged;
|
||||
}
|
||||
|
||||
private static void OnFrameworkElementSizeChanged(object sender, SizeChangedEventArgs e)
|
||||
{
|
||||
UpdateObservedSizesForFrameworkElement((FrameworkElement) sender);
|
||||
}
|
||||
|
||||
private static void UpdateObservedSizesForFrameworkElement(FrameworkElement frameworkElement)
|
||||
{
|
||||
frameworkElement.SetCurrentValue(ObservedWidthProperty, frameworkElement.ActualWidth);
|
||||
frameworkElement.SetCurrentValue(ObservedHeightProperty, frameworkElement.ActualHeight);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,208 +0,0 @@
|
||||
using System.Diagnostics;
|
||||
using System.Windows;
|
||||
using System.Windows.Markup;
|
||||
using System.Windows.Media.Animation;
|
||||
|
||||
// Code from http://www.wpfmentor.com/2009/01/how-to-debug-triggers-using-trigger.html
|
||||
// No license specified - this code is trimmed out from Release build anyway so it should be ok using it this way
|
||||
|
||||
// HOWTO: add the following attached property to any trigger and you will see when it is activated/deactivated in the output window
|
||||
// TriggerTracing.TriggerName="your debug name"
|
||||
// TriggerTracing.TraceEnabled="True"
|
||||
|
||||
// Example:
|
||||
// <Trigger my:TriggerTracing.TriggerName="BoldWhenMouseIsOver"
|
||||
// my:TriggerTracing.TraceEnabled="True"
|
||||
// Property="IsMouseOver"
|
||||
// Value="True">
|
||||
// <Setter Property = "FontWeight" Value="Bold"/>
|
||||
// </Trigger>
|
||||
//
|
||||
// As this works on anything that inherits from TriggerBase, it will also work on <MultiTrigger>.
|
||||
|
||||
namespace Artemis.UI.Utilities
|
||||
{
|
||||
#if DEBUG
|
||||
|
||||
/// <summary>
|
||||
/// Contains attached properties to activate Trigger Tracing on the specified Triggers.
|
||||
/// This file alone should be dropped into your app.
|
||||
/// </summary>
|
||||
public static class TriggerTracing
|
||||
{
|
||||
static TriggerTracing()
|
||||
{
|
||||
// Initialise WPF Animation tracing and add a TriggerTraceListener
|
||||
PresentationTraceSources.Refresh();
|
||||
PresentationTraceSources.AnimationSource.Listeners.Clear();
|
||||
PresentationTraceSources.AnimationSource.Listeners.Add(new TriggerTraceListener());
|
||||
PresentationTraceSources.AnimationSource.Switch.Level = SourceLevels.All;
|
||||
}
|
||||
|
||||
private enum TriggerTraceStoryboardType
|
||||
{
|
||||
Enter,
|
||||
Exit
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// A dummy storyboard for tracing purposes
|
||||
/// </summary>
|
||||
private class TriggerTraceStoryboard : Storyboard
|
||||
{
|
||||
public TriggerTraceStoryboard(TriggerBase triggerBase, TriggerTraceStoryboardType storyboardType)
|
||||
{
|
||||
TriggerBase = triggerBase;
|
||||
StoryboardType = storyboardType;
|
||||
}
|
||||
|
||||
public TriggerTraceStoryboardType StoryboardType { get; }
|
||||
public TriggerBase TriggerBase { get; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// A custom tracelistener.
|
||||
/// </summary>
|
||||
private class TriggerTraceListener : TraceListener
|
||||
{
|
||||
public override void TraceEvent(TraceEventCache eventCache, string source, TraceEventType eventType, int id, string format, params object[] args)
|
||||
{
|
||||
base.TraceEvent(eventCache, source, eventType, id, format, args);
|
||||
|
||||
if (format.StartsWith("Storyboard has begun;"))
|
||||
{
|
||||
var storyboard = args[1] as TriggerTraceStoryboard;
|
||||
if (storyboard != null)
|
||||
{
|
||||
// add a breakpoint here to see when your trigger has been
|
||||
// entered or exited
|
||||
|
||||
// the element being acted upon
|
||||
var targetElement = args[5];
|
||||
|
||||
// the namescope of the element being acted upon
|
||||
var namescope = (INameScope) args[7];
|
||||
|
||||
var triggerBase = storyboard.TriggerBase;
|
||||
var triggerName = GetTriggerName(storyboard.TriggerBase);
|
||||
|
||||
Debug.WriteLine("Element: {0}, {1}: {2}: {3}", targetElement, triggerBase.GetType().Name, triggerName, storyboard.StoryboardType);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public override void Write(string message)
|
||||
{
|
||||
}
|
||||
|
||||
public override void WriteLine(string message)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
#region TriggerName attached property
|
||||
|
||||
/// <summary>
|
||||
/// Gets the trigger name for the specified trigger. This will be used
|
||||
/// to identify the trigger in the debug output.
|
||||
/// </summary>
|
||||
/// <param name="trigger">The trigger.</param>
|
||||
/// <returns></returns>
|
||||
public static string GetTriggerName(TriggerBase trigger)
|
||||
{
|
||||
return (string) trigger.GetValue(TriggerNameProperty);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets the trigger name for the specified trigger. This will be used
|
||||
/// to identify the trigger in the debug output.
|
||||
/// </summary>
|
||||
/// <param name="trigger">The trigger.</param>
|
||||
/// <returns></returns>
|
||||
public static void SetTriggerName(TriggerBase trigger, string value)
|
||||
{
|
||||
trigger.SetValue(TriggerNameProperty, value);
|
||||
}
|
||||
|
||||
public static readonly DependencyProperty TriggerNameProperty =
|
||||
DependencyProperty.RegisterAttached(
|
||||
"TriggerName",
|
||||
typeof(string),
|
||||
typeof(TriggerTracing),
|
||||
new UIPropertyMetadata(string.Empty));
|
||||
|
||||
#endregion
|
||||
|
||||
#region TraceEnabled attached property
|
||||
|
||||
/// <summary>
|
||||
/// Gets a value indication whether trace is enabled for the specified trigger.
|
||||
/// </summary>
|
||||
/// <param name="trigger">The trigger.</param>
|
||||
/// <returns></returns>
|
||||
public static bool GetTraceEnabled(TriggerBase trigger)
|
||||
{
|
||||
return (bool) trigger.GetValue(TraceEnabledProperty);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets a value specifying whether trace is enabled for the specified trigger
|
||||
/// </summary>
|
||||
/// <param name="trigger"></param>
|
||||
/// <param name="value"></param>
|
||||
public static void SetTraceEnabled(TriggerBase trigger, bool value)
|
||||
{
|
||||
trigger.SetValue(TraceEnabledProperty, value);
|
||||
}
|
||||
|
||||
public static readonly DependencyProperty TraceEnabledProperty =
|
||||
DependencyProperty.RegisterAttached(
|
||||
"TraceEnabled",
|
||||
typeof(bool),
|
||||
typeof(TriggerTracing),
|
||||
new UIPropertyMetadata(false, OnTraceEnabledChanged));
|
||||
|
||||
private static void OnTraceEnabledChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
||||
{
|
||||
var triggerBase = d as TriggerBase;
|
||||
|
||||
if (triggerBase == null)
|
||||
return;
|
||||
|
||||
if (!(e.NewValue is bool))
|
||||
return;
|
||||
|
||||
if ((bool) e.NewValue)
|
||||
{
|
||||
// insert dummy story-boards which can later be traced using WPF animation tracing
|
||||
|
||||
var storyboard = new TriggerTraceStoryboard(triggerBase, TriggerTraceStoryboardType.Enter);
|
||||
triggerBase.EnterActions.Insert(0, new BeginStoryboard {Storyboard = storyboard});
|
||||
|
||||
storyboard = new TriggerTraceStoryboard(triggerBase, TriggerTraceStoryboardType.Exit);
|
||||
triggerBase.ExitActions.Insert(0, new BeginStoryboard {Storyboard = storyboard});
|
||||
}
|
||||
else
|
||||
{
|
||||
// remove the dummy storyboards
|
||||
|
||||
foreach (var actionCollection in new[] {triggerBase.EnterActions, triggerBase.ExitActions})
|
||||
{
|
||||
foreach (var triggerAction in actionCollection)
|
||||
{
|
||||
var bsb = triggerAction as BeginStoryboard;
|
||||
|
||||
if (bsb != null && bsb.Storyboard != null && bsb.Storyboard is TriggerTraceStoryboard)
|
||||
{
|
||||
actionCollection.Remove(bsb);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
#endif
|
||||
}
|
||||
Reference in new issue
Block a user