diff --git a/doc/classes/ColorPicker.xml b/doc/classes/ColorPicker.xml
index 81624b1d740f..9f0e78475496 100644
--- a/doc/classes/ColorPicker.xml
+++ b/doc/classes/ColorPicker.xml
@@ -168,6 +168,9 @@
Custom texture for the hue selection slider on the right.
+
+ The icon for the button that switches color text to hexadecimal.
+
The icon for color preset drop down menu when expanded.
diff --git a/editor/themes/editor_theme_manager.cpp b/editor/themes/editor_theme_manager.cpp
index 1793418c2a22..ab81c52785f0 100644
--- a/editor/themes/editor_theme_manager.cpp
+++ b/editor/themes/editor_theme_manager.cpp
@@ -1769,6 +1769,7 @@ void EditorThemeManager::_populate_standard_styles(const Ref &p_the
p_theme->set_icon("bar_arrow", "ColorPicker", p_theme->get_icon(SNAME("ColorPickerBarArrow"), EditorStringName(EditorIcons)));
p_theme->set_icon("picker_cursor", "ColorPicker", p_theme->get_icon(SNAME("PickerCursor"), EditorStringName(EditorIcons)));
p_theme->set_icon("picker_cursor_bg", "ColorPicker", p_theme->get_icon(SNAME("PickerCursorBg"), EditorStringName(EditorIcons)));
+ p_theme->set_icon("color_script", "ColorPicker", p_theme->get_icon(SNAME("Script"), EditorStringName(EditorIcons)));
// ColorPickerButton.
p_theme->set_icon("bg", "ColorPickerButton", p_theme->get_icon(SNAME("GuiMiniCheckerboard"), EditorStringName(EditorIcons)));
diff --git a/scene/gui/color_mode.cpp b/scene/gui/color_mode.cpp
index 0ebb529d82b5..2226cc4b7b91 100644
--- a/scene/gui/color_mode.cpp
+++ b/scene/gui/color_mode.cpp
@@ -210,26 +210,41 @@ void ColorModeHSV::slider_draw(int p_which) {
}
String ColorModeRAW::get_slider_label(int idx) const {
- ERR_FAIL_INDEX_V_MSG(idx, 3, String(), "Couldn't get slider label.");
+ ERR_FAIL_INDEX_V_MSG(idx, 4, String(), "Couldn't get slider label.");
return labels[idx];
}
float ColorModeRAW::get_slider_max(int idx) const {
- ERR_FAIL_INDEX_V_MSG(idx, 4, 0, "Couldn't get slider max value.");
+ ERR_FAIL_INDEX_V_MSG(idx, 5, 0, "Couldn't get slider max value.");
return slider_max[idx];
}
+float ColorModeRAW::get_slider_min(int idx) const {
+ ERR_FAIL_INDEX_V_MSG(idx, 5, 0, "Couldn't get slider min value.");
+ return idx == 3 ? intensity_min : 0;
+}
+
float ColorModeRAW::get_slider_value(int idx) const {
- ERR_FAIL_INDEX_V_MSG(idx, 4, 0, "Couldn't get slider value.");
- return color_picker->get_pick_color().components[idx];
+ ERR_FAIL_INDEX_V_MSG(idx, 5, 0, "Couldn't get slider value.");
+ Color color = color_picker->get_pick_color();
+ float multiplier = MAX(1, MAX(MAX(color.r, color.g), color.b));
+ if (idx == 3) {
+ return Math::log2(multiplier);
+ } else if (idx == 4) {
+ return color.a;
+ } else {
+ return color.components[idx] / multiplier;
+ }
}
Color ColorModeRAW::get_color() const {
Vector values = color_picker->get_active_slider_values();
Color color;
- for (int i = 0; i < 4; i++) {
- color.components[i] = values[i];
+ float intensity = Math::pow(2, values[3]);
+ for (int i = 0; i < 3; i++) {
+ color.components[i] = values[i] * intensity;
}
+ color.a = values[4];
return color;
}
diff --git a/scene/gui/color_mode.h b/scene/gui/color_mode.h
index c035fe6f65a3..56e7e9263460 100644
--- a/scene/gui/color_mode.h
+++ b/scene/gui/color_mode.h
@@ -46,6 +46,7 @@ class ColorMode {
virtual float get_spinbox_arrow_step() const { return get_slider_step(); }
virtual String get_slider_label(int idx) const = 0;
virtual float get_slider_max(int idx) const = 0;
+ virtual float get_slider_min(int idx) const { return 0; }
virtual float get_slider_value(int idx) const = 0;
virtual Color get_color() const = 0;
@@ -105,15 +106,18 @@ class ColorModeRGB : public ColorMode {
class ColorModeRAW : public ColorMode {
public:
- String labels[3] = { "R", "G", "B" };
- float slider_max[4] = { 100, 100, 100, 1 };
+ String labels[4] = { "R", "G", "B", "I" };
+ float slider_max[5] = { 1, 1, 1, 6, 1 };
+ float intensity_min = -6;
virtual String get_name() const override { return "RAW"; }
+ virtual int get_slider_count() const override { return 4; }
virtual float get_slider_step() const override { return 0.001; }
virtual float get_spinbox_arrow_step() const override { return 0.01; }
virtual String get_slider_label(int idx) const override;
virtual float get_slider_max(int idx) const override;
+ virtual float get_slider_min(int idx) const override;
virtual float get_slider_value(int idx) const override;
virtual Color get_color() const override;
diff --git a/scene/gui/color_picker.cpp b/scene/gui/color_picker.cpp
index aab7c37bbb5e..e5f005ad3491 100644
--- a/scene/gui/color_picker.cpp
+++ b/scene/gui/color_picker.cpp
@@ -137,10 +137,8 @@ void ColorPicker::_notification(int p_what) {
_reset_sliders_theme();
- if (Engine::get_singleton()->is_editor_hint()) {
- // Adjust for the width of the "Script" icon.
- text_type->set_custom_minimum_size(Size2(28 * theme_cache.base_scale, 0));
- }
+ // Adjust for the width of the "script" icon.
+ text_type->set_custom_minimum_size(Size2(28 * theme_cache.base_scale, 0));
_update_presets();
_update_recent_presets();
@@ -625,7 +623,7 @@ void ColorPicker::_reset_sliders_theme() {
}
void ColorPicker::_html_submitted(const String &p_html) {
- if (updating || text_is_constructor || !c_text->is_visible()) {
+ if (updating || text_is_constructor || !c_text->is_editable()) {
return;
}
@@ -674,11 +672,13 @@ void ColorPicker::_update_color(bool p_update_sliders) {
float spinbox_arrow_step = modes[current_mode]->get_spinbox_arrow_step();
for (int i = 0; i < current_slider_count; i++) {
sliders[i]->set_max(modes[current_mode]->get_slider_max(i));
+ sliders[i]->set_min(modes[current_mode]->get_slider_min(i));
sliders[i]->set_step(step);
values[i]->set_custom_arrow_step(spinbox_arrow_step);
sliders[i]->set_value(modes[current_mode]->get_slider_value(i));
}
alpha_slider->set_max(modes[current_mode]->get_slider_max(current_slider_count));
+ alpha_slider->set_min(modes[current_mode]->get_slider_min(current_slider_count));
alpha_slider->set_step(step);
alpha_slider->set_value(modes[current_mode]->get_slider_value(current_slider_count));
}
@@ -768,9 +768,7 @@ void ColorPicker::_text_type_toggled() {
text_is_constructor = !text_is_constructor;
if (text_is_constructor) {
text_type->set_text("");
-#ifdef TOOLS_ENABLED
- text_type->set_button_icon(get_editor_theme_icon(SNAME("Script")));
-#endif
+ text_type->set_button_icon(theme_cache.color_script);
c_text->set_editable(false);
c_text->set_tooltip_text(RTR("Copy this constructor in a script."));
@@ -781,7 +779,7 @@ void ColorPicker::_text_type_toggled() {
c_text->set_editable(true);
c_text->set_tooltip_text(ETR("Enter a hex code (\"#ff0000\") or named color (\"red\")."));
}
- _update_color();
+ _update_text_value();
}
Color ColorPicker::get_pick_color() const {
@@ -1236,25 +1234,32 @@ bool ColorPicker::is_deferred_mode() const {
}
void ColorPicker::_update_text_value() {
- bool text_visible = true;
- if (text_is_constructor) {
+ bool is_rgb_valid = color.r <= 1 && color.g <= 1 && color.b <= 1 && color.r >= 0 && color.g >= 0 && color.b >= 0;
+ if (text_is_constructor || !is_rgb_valid) {
String t = "Color(" + String::num(color.r, 3) + ", " + String::num(color.g, 3) + ", " + String::num(color.b, 3);
if (edit_alpha && color.a < 1) {
t += ", " + String::num(color.a, 3) + ")";
} else {
t += ")";
}
+ text_type->set_text("");
+ text_type->set_button_icon(theme_cache.color_script);
+
+ if (!is_rgb_valid) {
+ text_type->set_disabled(true);
+ } else {
+ text_type->set_disabled(false);
+ }
c_text->set_text(t);
- }
+ c_text->set_editable(false);
+ } else {
+ text_type->set_text("#");
+ text_type->set_button_icon(nullptr);
+ text_type->set_disabled(false);
- if (color.r > 1 || color.g > 1 || color.b > 1 || color.r < 0 || color.g < 0 || color.b < 0) {
- text_visible = false;
- } else if (!text_is_constructor) {
c_text->set_text(color.to_html(edit_alpha && color.a < 1));
+ c_text->set_editable(true);
}
-
- text_type->set_visible(text_visible);
- c_text->set_visible(text_visible);
}
void ColorPicker::_sample_input(const Ref &p_event) {
@@ -2190,6 +2195,8 @@ void ColorPicker::_bind_methods() {
BIND_THEME_ITEM(Theme::DATA_TYPE_ICON, ColorPicker, picker_cursor_bg);
BIND_THEME_ITEM(Theme::DATA_TYPE_ICON, ColorPicker, color_hue);
+ BIND_THEME_ITEM(Theme::DATA_TYPE_ICON, ColorPicker, color_script);
+
BIND_THEME_ITEM_EXT(Theme::DATA_TYPE_STYLEBOX, ColorPicker, mode_button_normal, "tab_unselected", "TabContainer");
BIND_THEME_ITEM_EXT(Theme::DATA_TYPE_STYLEBOX, ColorPicker, mode_button_pressed, "tab_selected", "TabContainer");
BIND_THEME_ITEM_EXT(Theme::DATA_TYPE_STYLEBOX, ColorPicker, mode_button_hover, "tab_selected", "TabContainer");
@@ -2305,13 +2312,12 @@ ColorPicker::ColorPicker() {
text_type = memnew(Button);
hex_hbc->add_child(text_type);
+ text_type->set_icon_alignment(HORIZONTAL_ALIGNMENT_CENTER);
text_type->set_text("#");
text_type->set_tooltip_text(RTR("Switch between hexadecimal and code values."));
- if (Engine::get_singleton()->is_editor_hint()) {
- text_type->connect(SceneStringName(pressed), callable_mp(this, &ColorPicker::_text_type_toggled));
- } else {
+ text_type->connect(SceneStringName(pressed), callable_mp(this, &ColorPicker::_text_type_toggled));
+ if (!Engine::get_singleton()->is_editor_hint()) {
text_type->set_flat(true);
- text_type->set_mouse_filter(MOUSE_FILTER_IGNORE);
}
c_text = memnew(LineEdit);
diff --git a/scene/gui/color_picker.h b/scene/gui/color_picker.h
index cc2793b413e8..62ee4e5607c0 100644
--- a/scene/gui/color_picker.h
+++ b/scene/gui/color_picker.h
@@ -104,7 +104,7 @@ class ColorPicker : public VBoxContainer {
SHAPE_MAX
};
- static const int SLIDER_COUNT = 3;
+ static const int SLIDER_COUNT = 4;
private:
enum class MenuOption {
@@ -269,6 +269,8 @@ class ColorPicker : public VBoxContainer {
Ref picker_cursor_bg;
Ref color_hue;
+ Ref color_script;
+
/* Mode buttons */
Ref mode_button_normal;
Ref mode_button_pressed;
diff --git a/scene/theme/default_theme.cpp b/scene/theme/default_theme.cpp
index 5ae1e9baa37d..12a03d5a3e2e 100644
--- a/scene/theme/default_theme.cpp
+++ b/scene/theme/default_theme.cpp
@@ -1054,6 +1054,7 @@ void fill_default_theme(Ref &theme, const Ref &default_font, const
theme->set_icon("bar_arrow", "ColorPicker", icons["color_picker_bar_arrow"]);
theme->set_icon("picker_cursor", "ColorPicker", icons["color_picker_cursor"]);
theme->set_icon("picker_cursor_bg", "ColorPicker", icons["color_picker_cursor_bg"]);
+ theme->set_icon("color_script", "ColorPicker", icons["script"]);
{
const int precision = 7;
diff --git a/scene/theme/icons/script.svg b/scene/theme/icons/script.svg
new file mode 100644
index 000000000000..6e1d32731724
--- /dev/null
+++ b/scene/theme/icons/script.svg
@@ -0,0 +1 @@
+
\ No newline at end of file