private void OnColorChanged <T>(AvaloniaPropertyChangedEventArgs <T> args)
        {
            // If we're in the process of internally updating the color, then we don't want to respond to the Color property changing,
            // aside from raising the ColorChanged event.
            if (!m_updatingColor)
            {
                var color = Color;

                m_currentRgb   = new Rgb(color.R / 255.0, color.G / 255.0, color.B / 255.0);
                m_currentAlpha = color.A / 255.0;
                m_currentHsv   = ColorConversion.RgbToHsv(m_currentRgb);
                m_currentHex   = GetCurrentHexValue();

                UpdateColorControls(ColorUpdateReason.ColorPropertyChanged);
            }

            var oldColor = args.OldValue.GetValueOrDefault <Color>();
            var newColor = args.NewValue.GetValueOrDefault <Color>();

            if (oldColor.A != newColor.A ||
                oldColor.R != newColor.R ||
                oldColor.G != newColor.G ||
                oldColor.B != newColor.B)
            {
                var colorChangedEventArgs = new ColorChangedEventArgs(oldColor, newColor);
                ColorChanged?.Invoke(this, colorChangedEventArgs);
            }
        }
        private void UpdateColor(Hsv hsv, ColorUpdateReason reason)
        {
            m_currentHsv = hsv;
            m_currentRgb = ColorConversion.HsvToRgb(hsv);
            m_currentHex = GetCurrentHexValue();

            SetColorAndUpdateControls(reason);
        }
        private void UpdateColor(Rgb rgb, ColorUpdateReason reason)
        {
            m_currentRgb = rgb;
            m_currentHsv = ColorConversion.RgbToHsv(m_currentRgb);
            m_currentHex = GetCurrentHexValue();

            SetColorAndUpdateControls(reason);
        }
        private void SetColorAndUpdateControls(ColorUpdateReason reason)
        {
            m_updatingColor = true;

            Color = ColorConversion.ColorFromRgba(m_currentRgb, m_currentAlpha);
            UpdateColorControls(reason);

            m_updatingColor = false;
        }
        private string GetCurrentHexValue()
        {
            var colorHex = ColorConversion.ColorFromRgba(m_currentRgb, m_currentAlpha).ToUint32().ToString("x8", CultureInfo.InvariantCulture);

            if (!IsAlphaEnabled)
            {
                colorHex = colorHex.Substring(2);
            }
            return("#" + colorHex);
        }
        private void InitializeColor()
        {
            var color = Color;

            m_currentRgb   = new Rgb(color.R / 255.0, color.G / 255.0, color.B / 255.0);
            m_currentHsv   = ColorConversion.RgbToHsv(m_currentRgb);
            m_currentAlpha = color.A / 255.0;
            m_currentHex   = GetCurrentHexValue();

            SetColorAndUpdateControls(ColorUpdateReason.InitializingColor);
        }
        private static void AddGradientStop(LinearGradientBrush brush, double offset, Hsv hsvColor, double alpha)
        {
            var rgbColor = ColorConversion.HsvToRgb(hsvColor);

            var color = Color.FromArgb(
                (byte)Math.Round(alpha * 255),
                (byte)Math.Round(rgbColor.R * 255),
                (byte)Math.Round(rgbColor.G * 255),
                (byte)Math.Round(rgbColor.B * 255));
            var stop = new GradientStop(color, offset);

            brush.GradientStops.Add(stop);
        }
        private Rgb ApplyConstraintsToRgbColor(Rgb rgb)
        {
            double minHue        = MinHue;
            double maxHue        = MaxHue;
            var    minSaturation = MinSaturation / 100.0;
            var    maxSaturation = MaxSaturation / 100.0;
            var    minValue      = MinValue / 100.0;
            var    maxValue      = MaxValue / 100.0;

            var hsv = ColorConversion.RgbToHsv(rgb);

            hsv.H = Math.Min(Math.Max(hsv.H, minHue), maxHue);
            hsv.S = Math.Min(Math.Max(hsv.S, minSaturation), maxSaturation);
            hsv.V = Math.Min(Math.Max(hsv.V, minValue), maxValue);

            return(ColorConversion.HsvToRgb(hsv));
        }
Пример #9
0
        private string GetToolTipString()
        {
            var sliderValue = (uint)Math.Round(Value);

            if (ColorChannel == ColorPickerHsvChannel.Alpha)
            {
                return(string.Format(
                           CultureInfo.CurrentCulture,
                           LocalizedStrings.ToolTipStringAlphaSlider,
                           sliderValue));
            }
            else
            {
                var parentColorPicker = GetParentColorPicker();
                if (parentColorPicker != null)
                {
                    var    currentHsv = parentColorPicker.CurrentHsv;
                    string localizedString;

                    switch (ColorChannel)
                    {
                    case ColorPickerHsvChannel.Hue:
                        currentHsv.H    = Value;
                        localizedString = LocalizedStrings.ToolTipStringHueSliderWithColorName;
                        break;

                    case ColorPickerHsvChannel.Saturation:
                        localizedString = LocalizedStrings.ToolTipStringSaturationSliderWithColorName;
                        currentHsv.S    = Value / 100;
                        break;

                    case ColorPickerHsvChannel.Value:
                        localizedString = LocalizedStrings.ToolTipStringValueSliderWithColorName;
                        currentHsv.V    = Value / 100;
                        break;

                    default:
                        throw new NotSupportedException("Invalid ColorPickerHsvChannel.");
                    }

                    return(string.Format(
                               CultureInfo.CurrentCulture,
                               localizedString,
                               sliderValue,
                               ColorHelpers.ToDisplayName(ColorConversion.ColorFromRgba(ColorConversion.HsvToRgb(currentHsv)))));
                }
                else
                {
                    var localizedString = ColorChannel switch
                    {
                        ColorPickerHsvChannel.Hue => LocalizedStrings.ToolTipStringHueSliderWithoutColorName,
                        ColorPickerHsvChannel.Saturation => LocalizedStrings.ToolTipStringSaturationSliderWithoutColorName,
                        ColorPickerHsvChannel.Value => LocalizedStrings.ToolTipStringValueSliderWithoutColorName,
                        _ => throw new NotSupportedException("Invalid ColorPickerHsvChannel."),
                    };

                    return(string.Format(
                               CultureInfo.CurrentCulture,
                               localizedString,
                               sliderValue));
                }
            }
        }