Skip to content

Commit

Permalink
Fixing the issue with HEX textbox not being updated with the correct …
Browse files Browse the repository at this point in the history
…RGB values (#12936)

* Fixing the issue with hex textbox not being updated with the correct values from RGB boxes #12931

* Update current color immediately when typing in RGB boxes #11108

* added expected words into dictionary
  • Loading branch information
martinchrzan committed Aug 30, 2021
1 parent 45b5545 commit 46bfd2c
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 34 deletions.
1 change: 1 addition & 0 deletions .github/actions/spell-check/expect.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1445,6 +1445,7 @@ nuget
null
nullopt
nullptr
numberbox
NUMLOCK
NUMPAD
nunit
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -398,7 +398,7 @@
Width="72"
ui:ControlHelper.CornerRadius="2,0,0,2"
AutomationProperties.Name="{x:Static p:Resources.Red_value}"
ValueChanged="RGBNumberBox_ValueChanged"
TextBoxBase.TextChanged="RGBNumberBox_TextChanged"
Minimum="0"
Maximum="255" />

Expand All @@ -408,7 +408,7 @@
Width="72"
ui:ControlHelper.CornerRadius="0"
AutomationProperties.Name="{x:Static p:Resources.Green_value}"
ValueChanged="RGBNumberBox_ValueChanged"
TextBoxBase.TextChanged="RGBNumberBox_TextChanged"
Minimum="0"
Maximum="255" />

Expand All @@ -418,7 +418,7 @@
Margin="-1,0,0,0"
ui:ControlHelper.CornerRadius="0,2,2,0"
AutomationProperties.Name="{x:Static p:Resources.Blue_value}"
ValueChanged="RGBNumberBox_ValueChanged"
TextBoxBase.TextChanged="RGBNumberBox_TextChanged"
Minimum="0"
Maximum="255" />
</StackPanel>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
using System.Windows.Media;
using System.Windows.Media.Animation;
using ColorPicker.Helpers;
using ModernWpf.Controls;
using ModernWpf.Controls.Primitives;

namespace ColorPicker.Controls
Expand Down Expand Up @@ -297,22 +298,6 @@ private void ValueGradientSlider_ValueChanged(object sender, RoutedPropertyChang
_ignoreGradientsChanges = false;
}

private static Point GetMousePositionWithinGrid(Border border)
{
var pos = System.Windows.Input.Mouse.GetPosition(border);
if (pos.X < 0)
{
pos.X = 0;
}

if (pos.X > border.Width)
{
pos.X = border.Width;
}

return pos;
}

private void HexCode_TextChanged(object sender, TextChangedEventArgs e)
{
var newValue = (sender as TextBox).Text;
Expand All @@ -336,21 +321,6 @@ private void HexCode_TextChanged(object sender, TextChangedEventArgs e)
}
}

#pragma warning disable CA1801 // Review unused parameters
private void RGBNumberBox_ValueChanged(ModernWpf.Controls.NumberBox sender, ModernWpf.Controls.NumberBoxValueChangedEventArgs args)
#pragma warning restore CA1801 // Review unused parameters
{
if (!_ignoreRGBChanges)
{
var r = byte.Parse(RNumberBox.Text, CultureInfo.InvariantCulture);
var g = byte.Parse(GNumberBox.Text, CultureInfo.InvariantCulture);
var b = byte.Parse(BNumberBox.Text, CultureInfo.InvariantCulture);
_ignoreRGBChanges = true;
SetColorFromTextBoxes(System.Drawing.Color.FromArgb(r, g, b));
_ignoreRGBChanges = false;
}
}

private void SetColorFromTextBoxes(System.Drawing.Color color)
{
if (!_ignoreGradientsChanges)
Expand All @@ -377,6 +347,65 @@ private void HexCode_GotKeyboardFocus(object sender, KeyboardFocusChangedEventAr
{
(sender as System.Windows.Controls.TextBox).SelectAll();
}

private void RGBNumberBox_TextChanged(object sender, TextChangedEventArgs e)
{
if (!_ignoreRGBChanges)
{
var numberBox = sender as NumberBox;
var r = numberBox.Name == "RNumberBox" ? GetValueFromNumberBox(numberBox) : (byte)RNumberBox.Value;
var g = numberBox.Name == "GNumberBox" ? GetValueFromNumberBox(numberBox) : (byte)GNumberBox.Value;
var b = numberBox.Name == "BNumberBox" ? GetValueFromNumberBox(numberBox) : (byte)BNumberBox.Value;
_ignoreRGBChanges = true;
SetColorFromTextBoxes(System.Drawing.Color.FromArgb(r, g, b));
_ignoreRGBChanges = false;
}
}

/// <summary>
/// NumberBox provides value only after it has been validated - happens after pressing enter or leaving this control.
/// However, we need to get value immediately after the underlying textbox value changes
/// </summary>
/// <param name="numberBox">numberBox control which value we want to get</param>
/// <returns>Validated value as per numberbox conditions, if content is invalid it returns previous value</returns>
private static byte GetValueFromNumberBox(NumberBox numberBox)
{
var internalTextBox = GetChildOfType<TextBox>(numberBox);
var parsedValue = numberBox.NumberFormatter.ParseDouble(internalTextBox.Text);
if (parsedValue != null)
{
var parsedValueByte = (byte)parsedValue;
if (parsedValueByte >= numberBox.Minimum && parsedValueByte <= numberBox.Maximum)
{
return parsedValueByte;
}
}

// not valid input, return previous value
return (byte)numberBox.Value;
}

public static T GetChildOfType<T>(DependencyObject depObj)
where T : DependencyObject
{
if (depObj == null)
{
return null;
}

for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
var child = VisualTreeHelper.GetChild(depObj, i);

var result = (child as T) ?? GetChildOfType<T>(child);
if (result != null)
{
return result;
}
}

return null;
}
}

#pragma warning disable SA1402 // File may only contain a single type
Expand Down

0 comments on commit 46bfd2c

Please sign in to comment.