diff --git a/Resources/Locale/en-US/controls.ftl b/Resources/Locale/en-US/controls.ftl index f23a6e14c70..c7c8506e3ba 100644 --- a/Resources/Locale/en-US/controls.ftl +++ b/Resources/Locale/en-US/controls.ftl @@ -5,6 +5,7 @@ color-selector-sliders-hue = H color-selector-sliders-saturation = S color-selector-sliders-value = V color-selector-sliders-alpha = A +color-selector-input-hex = Hex color-selector-sliders-rgb = RGB color-selector-sliders-hsv = HSV diff --git a/Robust.Client/UserInterface/Controls/ColorSelectorSliders.cs b/Robust.Client/UserInterface/Controls/ColorSelectorSliders.cs index f59039c392c..624ef636789 100644 --- a/Robust.Client/UserInterface/Controls/ColorSelectorSliders.cs +++ b/Robust.Client/UserInterface/Controls/ColorSelectorSliders.cs @@ -73,11 +73,13 @@ public bool IsAlphaVisible private SpinBox _middleInputBox; private SpinBox _bottomInputBox; private SpinBox _alphaInputBox; + private LineEdit _hexInputEdit; private Label _topSliderLabel = new(); private Label _middleSliderLabel = new(); private Label _bottomSliderLabel = new(); private Label _alphaSliderLabel = new(); + private Label _hexInputLabel = new(); private Label _colorDescriptionLabel = new(); private OptionButton _typeSelector; @@ -151,12 +153,23 @@ public ColorSelectorSliders() }; _alphaInputBox.InitDefaultButtons(); + _hexInputEdit = new LineEdit + { + HorizontalExpand = true, + VerticalAlignment = VAlignment.Center, + }; + _topInputBox.ValueChanged += value => { OnInputBoxValueChanged(value, ColorSliderOrder.Top); }; _middleInputBox.ValueChanged += value => { OnInputBoxValueChanged(value, ColorSliderOrder.Middle); }; _bottomInputBox.ValueChanged += value => { OnInputBoxValueChanged(value, ColorSliderOrder.Bottom); }; _alphaInputBox.ValueChanged += value => { OnInputBoxValueChanged(value, ColorSliderOrder.Alpha); }; + _hexInputEdit.OnTextEntered += value => { OnHexInputValueChanged(value); }; + // The above triggers ONLY when the Enter key is pressed, which can be a bit unintuitive + // when making changes to multiple colors (e.g. editing markings) + _hexInputEdit.OnFocusExit += value => { OnHexInputValueChanged(value); }; _alphaSliderLabel.Text = Loc.GetString("color-selector-sliders-alpha"); + _hexInputLabel.Text = Loc.GetString("color-selector-input-hex"); _typeSelector = new OptionButton(); foreach (var ty in Enum.GetValues()) @@ -216,10 +229,16 @@ public ColorSelectorSliders() _alphaSliderBox.AddChild(_alphaSlider); _alphaSliderBox.AddChild(_alphaInputBox); + var hexInputBox = new BoxContainer(); + + hexInputBox.AddChild(_hexInputLabel); + hexInputBox.AddChild(_hexInputEdit); + bodyBox.AddChild(topSliderBox); bodyBox.AddChild(middleSliderBox); bodyBox.AddChild(bottomSliderBox); bodyBox.AddChild(_alphaSliderBox); + bodyBox.AddChild(hexInputBox); rootBox.AddChild(bodyBox); @@ -293,6 +312,7 @@ private void UpdateSliderVisuals() _middleStyle.SetBaseColor(_colorData); _bottomStyle.SetBaseColor(_colorData); _colorDescriptionLabel.Text = ColorNaming.Describe(Color, _localization); + _hexInputEdit.Text = _currentColor.ToHex(); } private void UpdateAllSliders() @@ -337,6 +357,15 @@ private void OnSliderValueChanged(ColorSliderOrder order) UpdateSlider(order); } + private void OnHexInputValueChanged(LineEdit.LineEditEventArgs args) + { + _currentColor = Color.FromHex(args.Text, _currentColor); + _colorData = GetStrategy().ToColorData(_currentColor); + OnColorChanged?.Invoke(_currentColor); + + UpdateAllSliders(); + } + private enum ColorSliderOrder { Top,