1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-13 05:48:35 +00:00
Artemis/Artemis/ColorBox/ColorBox.cs

1024 lines
37 KiB
C#

/***************** NCore Softwares Pvt. Ltd., India **************************
ColorBox
Copyright (C) 2013 NCore Softwares Pvt. Ltd.
This program is provided to you under the terms of the Microsoft Public
License (Ms-PL) as published at http://colorbox.codeplex.com/license
***********************************************************************************/
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
namespace ColorBox
{
[TemplatePart(Name = PartCurrentColor, Type = typeof(TextBox))]
public class ColorBox : Control
{
internal const string PartCurrentColor = "PART_CurrentColor";
public static RoutedCommand RemoveGradientStop = new RoutedCommand();
public static RoutedCommand ReverseGradientStop = new RoutedCommand();
public static RoutedCommand DirectionHorizontal = new RoutedCommand();
public static RoutedCommand DirectionVertical = new RoutedCommand();
public static RoutedCommand DirectionTopLeftBottomRight = new RoutedCommand();
public static RoutedCommand DirectionTopRightBottomLeft = new RoutedCommand();
public static RoutedCommand SelectPreset = new RoutedCommand();
internal bool BrushSetInternally;
internal bool BrushTypeSetInternally;
//internal bool _GradientStopSetInternally = false;
internal bool HsbSetInternally;
internal bool RgbSetInternally;
internal bool UpdateBrush = true;
static ColorBox()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(ColorBox), new FrameworkPropertyMetadata(typeof(ColorBox)));
}
internal TextBox CurrentColorTextBox { get; private set; }
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
CurrentColorTextBox = GetTemplateChild(PartCurrentColor) as TextBox;
if (CurrentColorTextBox != null)
CurrentColorTextBox.PreviewKeyDown += CurrentColorTextBox_PreviewKeyDown;
CommandBindings.Add(new CommandBinding(RemoveGradientStop, RemoveGradientStop_Executed));
CommandBindings.Add(new CommandBinding(ReverseGradientStop, ReverseGradientStop_Executed));
CommandBindings.Add(new CommandBinding(DirectionHorizontal, DirectionHorizontal_Executed));
CommandBindings.Add(new CommandBinding(DirectionVertical, DirectionVertical_Executed));
CommandBindings.Add(new CommandBinding(DirectionTopLeftBottomRight, DirectionTopLeftBottomRight_Executed));
CommandBindings.Add(new CommandBinding(DirectionTopRightBottomLeft, DirectionTopRightBottomLeft_Executed));
CommandBindings.Add(new CommandBinding(SelectPreset, SelectPreset_Executed));
}
private void SelectPreset_Executed(object sender, ExecutedRoutedEventArgs e)
{
var presetBrush = (LinearGradientBrush) e.Parameter;
if (presetBrush == null)
return;
UpdateBrush = false;
BrushSetInternally = true;
Gradients.Clear();
foreach (var presetBrushGradientStop in presetBrush.GradientStops)
Gradients.Add(presetBrushGradientStop.CloneCurrentValue());
StartX = presetBrush.StartPoint.X;
StartY = presetBrush.StartPoint.Y;
EndX = presetBrush.EndPoint.X;
EndY = presetBrush.EndPoint.Y;
UpdateBrush = true;
BrushSetInternally = false;
SetBrush();
}
private void CurrentColorTextBox_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
var be = CurrentColorTextBox.GetBindingExpression(TextBox.TextProperty);
if (be != null)
be.UpdateSource();
}
}
private void RemoveGradientStop_Executed(object sender, ExecutedRoutedEventArgs e)
{
if ((Gradients != null) && (Gradients.Count > 2))
{
Gradients.Remove(SelectedGradient);
SetBrush();
}
}
private void ReverseGradientStop_Executed(object sender, ExecutedRoutedEventArgs e)
{
UpdateBrush = false;
BrushSetInternally = true;
foreach (var gs in Gradients)
gs.Offset = 1.0 - gs.Offset;
UpdateBrush = true;
BrushSetInternally = false;
SetBrush();
}
private void DirectionHorizontal_Executed(object sender, ExecutedRoutedEventArgs e)
{
UpdateBrush = false;
BrushSetInternally = true;
StartX = 0.5;
StartY = 0.0;
EndX = 0.5;
EndY = 1.0;
UpdateBrush = true;
BrushSetInternally = false;
SetBrush();
}
private void DirectionVertical_Executed(object sender, ExecutedRoutedEventArgs e)
{
UpdateBrush = false;
BrushSetInternally = true;
StartX = 0.0;
StartY = 0.5;
EndX = 1.0;
EndY = 0.5;
UpdateBrush = true;
BrushSetInternally = false;
SetBrush();
}
private void DirectionTopLeftBottomRight_Executed(object sender, ExecutedRoutedEventArgs e)
{
UpdateBrush = false;
BrushSetInternally = true;
StartX = 0.0;
StartY = 1.0;
EndX = 1.0;
EndY = 0.0;
UpdateBrush = true;
BrushSetInternally = false;
SetBrush();
}
private void DirectionTopRightBottomLeft_Executed(object sender, ExecutedRoutedEventArgs e)
{
UpdateBrush = false;
BrushSetInternally = true;
StartX = 0.0;
StartY = 0.0;
EndX = 1.0;
EndY = 1.0;
UpdateBrush = true;
BrushSetInternally = false;
SetBrush();
}
private void InitTransform()
{
if ((Brush.Transform == null) || Brush.Transform.Value.IsIdentity)
{
BrushSetInternally = true;
var tg = new TransformGroup();
tg.Children.Add(new RotateTransform());
tg.Children.Add(new ScaleTransform());
tg.Children.Add(new SkewTransform());
tg.Children.Add(new TranslateTransform());
Brush.Transform = tg;
BrushSetInternally = false;
}
}
/// <summary>
/// Shared property changed callback to update the Color property
/// </summary>
public static void UpdateColorHsb(object o, DependencyPropertyChangedEventArgs e)
{
var c = (ColorBox) o;
var n = ColorHelper.ColorFromAhsb(c.Alpha, c.Hue, c.Saturation, c.Brightness);
c.HsbSetInternally = true;
c.Color = n;
if (c.SelectedGradient != null)
c.SelectedGradient.Color = n;
c.SetBrush();
c.HsbSetInternally = false;
}
/// <summary>
/// Shared property changed callback to update the Color property
/// </summary>
public static void UpdateColorRgb(object o, DependencyPropertyChangedEventArgs e)
{
var c = (ColorBox) o;
var n = Color.FromArgb((byte) c.A, (byte) c.R, (byte) c.G, (byte) c.B);
c.RgbSetInternally = true;
c.Color = n;
if (c.SelectedGradient != null)
c.SelectedGradient.Color = n;
c.SetBrush();
c.RgbSetInternally = false;
}
internal void SetBrush()
{
if (!UpdateBrush)
return;
BrushSetInternally = true;
// retain old opacity
double opacity = 1;
TransformGroup tempTg = null;
if (Brush != null)
{
opacity = Brush.Opacity;
tempTg = Brush.Transform as TransformGroup;
}
switch (BrushType)
{
case BrushTypes.None:
Brush = null;
break;
case BrushTypes.Solid:
Brush = new SolidColorBrush(Color);
break;
case BrushTypes.Linear:
var brush = new LinearGradientBrush();
foreach (var g in Gradients)
brush.GradientStops.Add(new GradientStop(g.Color, g.Offset));
brush.StartPoint = new Point(StartX, StartY);
brush.EndPoint = new Point(EndX, EndY);
brush.MappingMode = MappingMode;
brush.SpreadMethod = SpreadMethod;
Brush = brush;
break;
case BrushTypes.Radial:
var brush1 = new RadialGradientBrush();
foreach (var g in Gradients)
brush1.GradientStops.Add(new GradientStop(g.Color, g.Offset));
brush1.GradientOrigin = new Point(GradientOriginX, GradientOriginY);
brush1.Center = new Point(CenterX, CenterY);
brush1.RadiusX = RadiusX;
brush1.RadiusY = RadiusY;
brush1.MappingMode = MappingMode;
brush1.SpreadMethod = SpreadMethod;
Brush = brush1;
break;
}
if (BrushType != BrushTypes.None)
{
Brush.Opacity = opacity; // retain old opacity
if (tempTg != null)
Brush.Transform = tempTg;
}
BrushSetInternally = false;
}
#region Private Properties
private double StartX
{
get { return (double) GetValue(StartXProperty); }
set { SetValue(StartXProperty, value); }
}
private static readonly DependencyProperty StartXProperty =
DependencyProperty.Register("StartX", typeof(double), typeof(ColorBox),
new PropertyMetadata(0.5, StartXChanged));
private static void StartXChanged(DependencyObject property, DependencyPropertyChangedEventArgs args)
{
var cp = property as ColorBox;
if (cp.Brush is LinearGradientBrush)
{
cp.BrushSetInternally = true;
(cp.Brush as LinearGradientBrush).StartPoint = new Point((double) args.NewValue,
(cp.Brush as LinearGradientBrush).StartPoint.Y);
cp.BrushSetInternally = false;
}
}
private double StartY
{
get { return (double) GetValue(StartYProperty); }
set { SetValue(StartYProperty, value); }
}
private static readonly DependencyProperty StartYProperty =
DependencyProperty.Register("StartY", typeof(double), typeof(ColorBox),
new PropertyMetadata(0.0, StartYChanged));
private static void StartYChanged(DependencyObject property, DependencyPropertyChangedEventArgs args)
{
var cp = property as ColorBox;
if (cp.Brush is LinearGradientBrush)
{
cp.BrushSetInternally = true;
(cp.Brush as LinearGradientBrush).StartPoint = new Point(
(cp.Brush as LinearGradientBrush).StartPoint.X, (double) args.NewValue);
cp.BrushSetInternally = false;
}
}
private double EndX
{
get { return (double) GetValue(EndXProperty); }
set { SetValue(EndXProperty, value); }
}
private static readonly DependencyProperty EndXProperty =
DependencyProperty.Register("EndX", typeof(double), typeof(ColorBox), new PropertyMetadata(0.5, EndXChanged));
private static void EndXChanged(DependencyObject property, DependencyPropertyChangedEventArgs args)
{
var cp = property as ColorBox;
if (cp.Brush is LinearGradientBrush)
{
cp.BrushSetInternally = true;
(cp.Brush as LinearGradientBrush).EndPoint = new Point((double) args.NewValue,
(cp.Brush as LinearGradientBrush).EndPoint.Y);
cp.BrushSetInternally = false;
}
}
private double EndY
{
get { return (double) GetValue(EndYProperty); }
set { SetValue(EndYProperty, value); }
}
private static readonly DependencyProperty EndYProperty =
DependencyProperty.Register("EndY", typeof(double), typeof(ColorBox), new PropertyMetadata(1.0, EndYChanged));
private static void EndYChanged(DependencyObject property, DependencyPropertyChangedEventArgs args)
{
var cp = property as ColorBox;
if (cp.Brush is LinearGradientBrush)
{
cp.BrushSetInternally = true;
(cp.Brush as LinearGradientBrush).EndPoint = new Point((cp.Brush as LinearGradientBrush).EndPoint.X,
(double) args.NewValue);
cp.BrushSetInternally = false;
}
}
private double GradientOriginX
{
get { return (double) GetValue(GradientOriginXProperty); }
set { SetValue(GradientOriginXProperty, value); }
}
private static readonly DependencyProperty GradientOriginXProperty =
DependencyProperty.Register("GradientOriginX", typeof(double), typeof(ColorBox),
new PropertyMetadata(0.5, GradientOriginXChanged));
private static void GradientOriginXChanged(DependencyObject property, DependencyPropertyChangedEventArgs args)
{
var cp = property as ColorBox;
if (cp.Brush is RadialGradientBrush)
{
cp.BrushSetInternally = true;
(cp.Brush as RadialGradientBrush).GradientOrigin = new Point((double) args.NewValue,
(cp.Brush as RadialGradientBrush).GradientOrigin.Y);
cp.BrushSetInternally = false;
}
}
private double GradientOriginY
{
get { return (double) GetValue(GradientOriginYProperty); }
set { SetValue(GradientOriginYProperty, value); }
}
private static readonly DependencyProperty GradientOriginYProperty =
DependencyProperty.Register("GradientOriginY", typeof(double), typeof(ColorBox),
new PropertyMetadata(0.5, GradientOriginYChanged));
private static void GradientOriginYChanged(DependencyObject property, DependencyPropertyChangedEventArgs args)
{
var cp = property as ColorBox;
if (cp.Brush is RadialGradientBrush)
{
cp.BrushSetInternally = true;
(cp.Brush as RadialGradientBrush).GradientOrigin =
new Point((cp.Brush as RadialGradientBrush).GradientOrigin.X, (double) args.NewValue);
cp.BrushSetInternally = false;
}
}
private double CenterX
{
get { return (double) GetValue(CenterXProperty); }
set { SetValue(CenterXProperty, value); }
}
private static readonly DependencyProperty CenterXProperty =
DependencyProperty.Register("CenterX", typeof(double), typeof(ColorBox),
new PropertyMetadata(0.5, CenterXChanged));
private static void CenterXChanged(DependencyObject property, DependencyPropertyChangedEventArgs args)
{
var cp = property as ColorBox;
if (cp.Brush is RadialGradientBrush)
{
cp.BrushSetInternally = true;
(cp.Brush as RadialGradientBrush).Center = new Point((double) args.NewValue,
(cp.Brush as RadialGradientBrush).Center.Y);
cp.BrushSetInternally = false;
}
}
private double CenterY
{
get { return (double) GetValue(CenterYProperty); }
set { SetValue(CenterYProperty, value); }
}
private static readonly DependencyProperty CenterYProperty =
DependencyProperty.Register("CenterY", typeof(double), typeof(ColorBox),
new PropertyMetadata(0.5, CenterYChanged));
private static void CenterYChanged(DependencyObject property, DependencyPropertyChangedEventArgs args)
{
var cp = property as ColorBox;
if (cp.Brush is RadialGradientBrush)
{
cp.BrushSetInternally = true;
(cp.Brush as RadialGradientBrush).Center = new Point((cp.Brush as RadialGradientBrush).Center.X,
(double) args.NewValue);
cp.BrushSetInternally = false;
}
}
private double RadiusX
{
get { return (double) GetValue(RadiusXProperty); }
set { SetValue(RadiusXProperty, value); }
}
private static readonly DependencyProperty RadiusXProperty =
DependencyProperty.Register("RadiusX", typeof(double), typeof(ColorBox),
new PropertyMetadata(0.5, RadiusXChanged));
private static void RadiusXChanged(DependencyObject property, DependencyPropertyChangedEventArgs args)
{
var cp = property as ColorBox;
if (cp.Brush is RadialGradientBrush)
{
cp.BrushSetInternally = true;
(cp.Brush as RadialGradientBrush).RadiusX = (double) args.NewValue;
cp.BrushSetInternally = false;
}
}
private double RadiusY
{
get { return (double) GetValue(RadiusYProperty); }
set { SetValue(RadiusYProperty, value); }
}
private static readonly DependencyProperty RadiusYProperty =
DependencyProperty.Register("RadiusY", typeof(double), typeof(ColorBox),
new PropertyMetadata(0.5, RadiusYChanged));
private static void RadiusYChanged(DependencyObject property, DependencyPropertyChangedEventArgs args)
{
var cp = property as ColorBox;
if (cp.Brush is RadialGradientBrush)
{
cp.BrushSetInternally = true;
(cp.Brush as RadialGradientBrush).RadiusY = (double) args.NewValue;
cp.BrushSetInternally = false;
}
}
private double BrushOpacity
{
get { return (double) GetValue(BrushOpacityProperty); }
set { SetValue(BrushOpacityProperty, value); }
}
private static readonly DependencyProperty BrushOpacityProperty =
DependencyProperty.Register("BrushOpacity", typeof(double), typeof(ColorBox), new PropertyMetadata(1.0));
//static void BrushOpacityChanged(DependencyObject property, DependencyPropertyChangedEventArgs args)
//{
// ColorBox cp = property as ColorBox;
// cp._BrushSetInternally = true;
// cp.Brush.Opacity = (double)args.NewValue;
// cp._BrushSetInternally = false;
//}
private GradientSpreadMethod SpreadMethod
{
get { return (GradientSpreadMethod) GetValue(SpreadMethodProperty); }
set { SetValue(SpreadMethodProperty, value); }
}
private static readonly DependencyProperty SpreadMethodProperty =
DependencyProperty.Register("SpreadMethod", typeof(GradientSpreadMethod), typeof(ColorBox),
new PropertyMetadata(GradientSpreadMethod.Pad, SpreadMethodChanged));
private static void SpreadMethodChanged(DependencyObject property, DependencyPropertyChangedEventArgs args)
{
var cp = property as ColorBox;
if (cp.Brush is GradientBrush)
{
cp.BrushSetInternally = true;
(cp.Brush as GradientBrush).SpreadMethod = (GradientSpreadMethod) args.NewValue;
cp.BrushSetInternally = false;
}
}
private BrushMappingMode MappingMode
{
get { return (BrushMappingMode) GetValue(MappingModeProperty); }
set { SetValue(MappingModeProperty, value); }
}
private static readonly DependencyProperty MappingModeProperty =
DependencyProperty.Register("MappingMode", typeof(BrushMappingMode), typeof(ColorBox),
new PropertyMetadata(BrushMappingMode.RelativeToBoundingBox, MappingModeChanged));
private static void MappingModeChanged(DependencyObject property, DependencyPropertyChangedEventArgs args)
{
var cp = property as ColorBox;
if (cp.Brush is GradientBrush)
{
cp.BrushSetInternally = true;
(cp.Brush as GradientBrush).MappingMode = (BrushMappingMode) args.NewValue;
cp.BrushSetInternally = false;
}
}
#endregion
#region Internal Properties
internal ObservableCollection<GradientStop> Gradients
{
get { return (ObservableCollection<GradientStop>) GetValue(GradientsProperty); }
set { SetValue(GradientsProperty, value); }
}
internal static readonly DependencyProperty GradientsProperty =
DependencyProperty.Register("Gradients", typeof(ObservableCollection<GradientStop>), typeof(ColorBox));
internal GradientStop SelectedGradient
{
get { return (GradientStop) GetValue(SelectedGradientProperty); }
set { SetValue(SelectedGradientProperty, value); }
}
internal static readonly DependencyProperty SelectedGradientProperty =
DependencyProperty.Register("SelectedGradient", typeof(GradientStop), typeof(ColorBox));
internal BrushTypes BrushType
{
get { return (BrushTypes) GetValue(BrushTypeProperty); }
set { SetValue(BrushTypeProperty, value); }
}
internal static readonly DependencyProperty BrushTypeProperty =
DependencyProperty.Register("BrushType", typeof(BrushTypes), typeof(ColorBox),
new FrameworkPropertyMetadata(BrushTypes.None, BrushTypeChanged));
private static void BrushTypeChanged(DependencyObject property, DependencyPropertyChangedEventArgs args)
{
var c = property as ColorBox;
if (!c.BrushTypeSetInternally)
{
if (c.Gradients == null)
{
c.Gradients = new ObservableCollection<GradientStop>();
c.Gradients.Add(new GradientStop(Colors.Black, 0));
c.Gradients.Add(new GradientStop(Colors.White, 1));
}
c.SetBrush();
}
}
#endregion
#region Public Properties
public IEnumerable<Enum> SpreadMethodTypes
{
get
{
var temp = GradientSpreadMethod.Pad | GradientSpreadMethod.Reflect | GradientSpreadMethod.Repeat;
foreach (Enum value in Enum.GetValues(temp.GetType()))
if (temp.HasFlag(value))
yield return value;
}
}
public IEnumerable<Enum> MappingModeTypes
{
get
{
var temp = BrushMappingMode.Absolute | BrushMappingMode.RelativeToBoundingBox;
foreach (Enum value in Enum.GetValues(temp.GetType()))
if (temp.HasFlag(value))
yield return value;
}
}
public IEnumerable<Enum> AvailableBrushTypes
{
get
{
if (ShowNone)
yield return BrushTypes.None;
if (ShowSolid)
yield return BrushTypes.Solid;
if (ShowLinear)
yield return BrushTypes.Linear;
if (ShowRadial)
yield return BrushTypes.Radial;
}
}
public Brush Brush
{
get { return (Brush) GetValue(BrushProperty); }
set { SetValue(BrushProperty, value); }
}
public bool ShowNone
{
get { return (bool) GetValue(ShowNoneProperty); }
set { SetValue(ShowNoneProperty, value); }
}
public bool ShowSolid
{
get { return (bool) GetValue(ShowSolidProperty); }
set { SetValue(ShowSolidProperty, value); }
}
public bool ShowLinear
{
get { return (bool) GetValue(ShowLinearProperty); }
set { SetValue(ShowLinearProperty, value); }
}
public bool ShowRadial
{
get { return (bool) GetValue(ShowRadialProperty); }
set { SetValue(ShowRadialProperty, value); }
}
public static readonly DependencyProperty ShowNoneProperty = DependencyProperty.Register("ShowNone",
typeof(bool), typeof(ColorBox), new FrameworkPropertyMetadata(true));
public static readonly DependencyProperty ShowSolidProperty = DependencyProperty.Register("ShowSolid",
typeof(bool), typeof(ColorBox), new FrameworkPropertyMetadata(true));
public static readonly DependencyProperty ShowLinearProperty = DependencyProperty.Register("ShowLinear",
typeof(bool), typeof(ColorBox), new FrameworkPropertyMetadata(true));
public static readonly DependencyProperty ShowRadialProperty = DependencyProperty.Register("ShowRadial",
typeof(bool), typeof(ColorBox), new FrameworkPropertyMetadata(true));
public static readonly DependencyProperty BrushProperty = DependencyProperty.Register("Brush", typeof(Brush),
typeof(ColorBox), new FrameworkPropertyMetadata(null, BrushChanged));
private static void BrushChanged(DependencyObject property, DependencyPropertyChangedEventArgs args)
{
var c = property as ColorBox;
var brush = args.NewValue as Brush;
if (!c.BrushSetInternally)
{
c.BrushTypeSetInternally = true;
if (brush == null)
{
c.BrushType = BrushTypes.None;
}
else if (brush is SolidColorBrush)
{
c.BrushType = BrushTypes.Solid;
c.Color = (brush as SolidColorBrush).Color;
}
else if (brush is LinearGradientBrush)
{
var lgb = brush as LinearGradientBrush;
//c.Opacity = lgb.Opacity;
c.StartX = lgb.StartPoint.X;
c.StartY = lgb.StartPoint.Y;
c.EndX = lgb.EndPoint.X;
c.EndY = lgb.EndPoint.Y;
c.MappingMode = lgb.MappingMode;
c.SpreadMethod = lgb.SpreadMethod;
c.Gradients = new ObservableCollection<GradientStop>(lgb.GradientStops);
c.BrushType = BrushTypes.Linear;
//c.Color = lgb.GradientStops.OrderBy(x => x.Offset).Last().Color;
//c.SelectedGradient = lgb.GradientStops.OrderBy(x => x.Offset).Last();
}
else
{
var rgb = brush as RadialGradientBrush;
c.GradientOriginX = rgb.GradientOrigin.X;
c.GradientOriginY = rgb.GradientOrigin.Y;
c.RadiusX = rgb.RadiusX;
c.RadiusY = rgb.RadiusY;
c.CenterX = rgb.Center.X;
c.CenterY = rgb.Center.Y;
c.MappingMode = rgb.MappingMode;
c.SpreadMethod = rgb.SpreadMethod;
c.Gradients = new ObservableCollection<GradientStop>(rgb.GradientStops);
c.BrushType = BrushTypes.Radial;
//c.Color = rgb.GradientStops.OrderBy(x => x.Offset).Last().Color;
//c.SelectedGradient = rgb.GradientStops.OrderBy(x => x.Offset).Last();
}
c.BrushTypeSetInternally = false;
}
}
public Color Color
{
get { return (Color) GetValue(ColorProperty); }
set { SetValue(ColorProperty, value); }
}
public static readonly DependencyProperty ColorProperty =
DependencyProperty.Register("Color", typeof(Color), typeof(ColorBox),
new UIPropertyMetadata(Colors.Black, OnColorChanged));
public static void OnColorChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
{
var c = (ColorBox) o;
if (e.NewValue is Color)
{
var color = (Color) e.NewValue;
if (!c.HsbSetInternally)
{
// update HSB value based on new value of color
double h = 0;
double s = 0;
double b = 0;
ColorHelper.HsbFromColor(color, ref h, ref s, ref b);
c.HsbSetInternally = true;
c.Alpha = color.A/255d;
c.Hue = h;
c.Saturation = s;
c.Brightness = b;
c.HsbSetInternally = false;
}
if (!c.RgbSetInternally)
{
// update RGB value based on new value of color
c.RgbSetInternally = true;
c.A = color.A;
c.R = color.R;
c.G = color.G;
c.B = color.B;
c.RgbSetInternally = false;
}
c.RaiseColorChangedEvent((Color) e.NewValue);
}
}
#endregion
#region Color Specific Properties
private double Hue
{
get { return (double) GetValue(HueProperty); }
set { SetValue(HueProperty, value); }
}
private static readonly DependencyProperty HueProperty =
DependencyProperty.Register("Hue", typeof(double), typeof(ColorBox),
new FrameworkPropertyMetadata(1.0, UpdateColorHsb, HueCoerce));
private static object HueCoerce(DependencyObject d, object hue)
{
var v = (double) hue;
if (v < 0) return 0.0;
if (v > 1) return 1.0;
return v;
}
private double Brightness
{
get { return (double) GetValue(BrightnessProperty); }
set { SetValue(BrightnessProperty, value); }
}
private static readonly DependencyProperty BrightnessProperty =
DependencyProperty.Register("Brightness", typeof(double), typeof(ColorBox),
new FrameworkPropertyMetadata(0.0, UpdateColorHsb, BrightnessCoerce));
private static object BrightnessCoerce(DependencyObject d, object brightness)
{
var v = (double) brightness;
if (v < 0) return 0.0;
if (v > 1) return 1.0;
return v;
}
private double Saturation
{
get { return (double) GetValue(SaturationProperty); }
set { SetValue(SaturationProperty, value); }
}
private static readonly DependencyProperty SaturationProperty =
DependencyProperty.Register("Saturation", typeof(double), typeof(ColorBox),
new FrameworkPropertyMetadata(0.0, UpdateColorHsb, SaturationCoerce));
private static object SaturationCoerce(DependencyObject d, object saturation)
{
var v = (double) saturation;
if (v < 0) return 0.0;
if (v > 1) return 1.0;
return v;
}
private double Alpha
{
get { return (double) GetValue(AlphaProperty); }
set { SetValue(AlphaProperty, value); }
}
private static readonly DependencyProperty AlphaProperty =
DependencyProperty.Register("Alpha", typeof(double), typeof(ColorBox),
new FrameworkPropertyMetadata(1.0, UpdateColorHsb, AlphaCoerce));
private static object AlphaCoerce(DependencyObject d, object alpha)
{
var v = (double) alpha;
if (v < 0) return 0.0;
if (v > 1) return 1.0;
return v;
}
private int A
{
get { return (int) GetValue(AProperty); }
set { SetValue(AProperty, value); }
}
private static readonly DependencyProperty AProperty =
DependencyProperty.Register("A", typeof(int), typeof(ColorBox),
new FrameworkPropertyMetadata(255, UpdateColorRgb, RgbCoerce));
private int R
{
get { return (int) GetValue(RProperty); }
set { SetValue(RProperty, value); }
}
private static readonly DependencyProperty RProperty =
DependencyProperty.Register("R", typeof(int), typeof(ColorBox),
new FrameworkPropertyMetadata(default(int), UpdateColorRgb, RgbCoerce));
private int G
{
get { return (int) GetValue(GProperty); }
set { SetValue(GProperty, value); }
}
private static readonly DependencyProperty GProperty =
DependencyProperty.Register("G", typeof(int), typeof(ColorBox),
new FrameworkPropertyMetadata(default(int), UpdateColorRgb, RgbCoerce));
private int B
{
get { return (int) GetValue(BProperty); }
set { SetValue(BProperty, value); }
}
public static LinearGradientBrush RainbowPreset => new LinearGradientBrush(
new GradientStopCollection(new[]
{
new GradientStop(Colors.Red, 0),
new GradientStop(Colors.Yellow, 0.2),
new GradientStop(Colors.LawnGreen, 0.4),
new GradientStop(Colors.Blue, 0.6),
new GradientStop(Colors.Purple, 0.8),
new GradientStop(Colors.Red, 1)
}), new Point(0, 0.5), new Point(1, 0.5));
public static LinearGradientBrush PolicePreset => new LinearGradientBrush(
new GradientStopCollection(new[]
{
new GradientStop(Colors.Red, 0),
new GradientStop(Colors.Blue, 0.5),
new GradientStop(Colors.Red, 1)
}), new Point(0, 0.5), new Point(1, 0.5));
public static LinearGradientBrush ArtemisPreset => new LinearGradientBrush(
new GradientStopCollection(new[]
{
new GradientStop(Color.FromArgb(255, 7, 144, 142), 0.1),
new GradientStop(Color.FromArgb(255, 105, 255, 29), 0.3),
new GradientStop(Color.FromArgb(255, 255, 203, 16), 0.5),
new GradientStop(Color.FromArgb(255, 156, 0, 255), 0.7),
new GradientStop(Color.FromArgb(255, 7, 144, 142), 0.9)
}), new Point(0, 0), new Point(1, 1));
public static LinearGradientBrush HelloKittyPreset => new LinearGradientBrush(
new GradientStopCollection(new[]
{
new GradientStop(Color.FromArgb(255, 255, 93, 255), 0),
new GradientStop(Color.FromArgb(255, 255, 220, 255), 0.5),
new GradientStop(Color.FromArgb(255, 255, 93, 255), 1)
}), new Point(0.5, 0), new Point(0.5, 1));
public static LinearGradientBrush GreenToRedPreset => new LinearGradientBrush(
new GradientStopCollection(new[]
{
new GradientStop(Colors.LawnGreen, 0),
new GradientStop(Colors.Orange, 0.5),
new GradientStop(Colors.Red, 1)
}), new Point(0.5, 0), new Point(0.5, 1));
private static readonly DependencyProperty BProperty =
DependencyProperty.Register("B", typeof(int), typeof(ColorBox),
new FrameworkPropertyMetadata(default(int), UpdateColorRgb, RgbCoerce));
private static object RgbCoerce(DependencyObject d, object value)
{
var v = (int) value;
if (v < 0) return 0;
if (v > 255) return 255;
return v;
}
#endregion
#region ColorChanged Event
public delegate void ColorChangedEventHandler(object sender, ColorChangedEventArgs e);
public static readonly RoutedEvent ColorChangedEvent =
EventManager.RegisterRoutedEvent("ColorChanged", RoutingStrategy.Bubble, typeof(ColorChangedEventHandler),
typeof(ColorBox));
public event ColorChangedEventHandler ColorChanged
{
add { AddHandler(ColorChangedEvent, value); }
remove { RemoveHandler(ColorChangedEvent, value); }
}
private void RaiseColorChangedEvent(Color color)
{
var newEventArgs = new ColorChangedEventArgs(ColorChangedEvent, color);
RaiseEvent(newEventArgs);
}
#endregion
}
}