This commit is contained in:
Luo Zhihao 2024-11-21 05:12:20 +00:00 committed by GitHub
commit 8f409b1fc8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 47 additions and 28 deletions

View File

@ -210,26 +210,36 @@ void ColorModeHSV::slider_draw(int p_which) {
} }
String ColorModeRAW::get_slider_label(int idx) const { 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]; return labels[idx];
} }
float ColorModeRAW::get_slider_max(int idx) const { 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]; return slider_max[idx];
} }
float ColorModeRAW::get_slider_value(int idx) const { float ColorModeRAW::get_slider_value(int idx) const {
ERR_FAIL_INDEX_V_MSG(idx, 4, 0, "Couldn't get slider value."); ERR_FAIL_INDEX_V_MSG(idx, 5, 0, "Couldn't get slider value.");
return color_picker->get_pick_color().components[idx]; Color color = color_picker->get_pick_color();
float intensity = MAX(1, MAX(MAX(color.r, color.g), color.b));
if (idx == 3) {
return Math::log2(intensity);
} else if (idx == 4) {
return color.a;
} else {
return color.components[idx] / intensity;
}
} }
Color ColorModeRAW::get_color() const { Color ColorModeRAW::get_color() const {
Vector<float> values = color_picker->get_active_slider_values(); Vector<float> values = color_picker->get_active_slider_values();
Color color; Color color;
for (int i = 0; i < 4; i++) { float intensity = Math::pow(2, values[3]);
color.components[i] = values[i]; for (int i = 0; i < 3; i++) {
color.components[i] = values[i] * intensity;
} }
color.a = values[4];
return color; return color;
} }

View File

@ -105,11 +105,12 @@ public:
class ColorModeRAW : public ColorMode { class ColorModeRAW : public ColorMode {
public: public:
String labels[3] = { "R", "G", "B" }; String labels[4] = { "R", "G", "B", "I" };
float slider_max[4] = { 100, 100, 100, 1 }; float slider_max[5] = { 1, 1, 1, 5, 1 };
virtual String get_name() const override { return "RAW"; } 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_slider_step() const override { return 0.001; }
virtual float get_spinbox_arrow_step() const override { return 0.01; } virtual float get_spinbox_arrow_step() const override { return 0.01; }
virtual String get_slider_label(int idx) const override; virtual String get_slider_label(int idx) const override;

View File

@ -128,10 +128,8 @@ void ColorPicker::_notification(int p_what) {
_reset_sliders_theme(); _reset_sliders_theme();
if (Engine::get_singleton()->is_editor_hint()) {
// Adjust for the width of the "Script" icon. // Adjust for the width of the "Script" icon.
text_type->set_custom_minimum_size(Size2(28 * theme_cache.base_scale, 0)); text_type->set_custom_minimum_size(Size2(28 * theme_cache.base_scale, 0));
}
_update_presets(); _update_presets();
_update_recent_presets(); _update_recent_presets();
@ -579,7 +577,7 @@ void ColorPicker::_reset_sliders_theme() {
} }
void ColorPicker::_html_submitted(const String &p_html) { 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; return;
} }
@ -705,7 +703,9 @@ void ColorPicker::_text_type_toggled() {
if (text_is_constructor) { if (text_is_constructor) {
text_type->set_text(""); text_type->set_text("");
#ifdef TOOLS_ENABLED #ifdef TOOLS_ENABLED
if (Engine::get_singleton()->is_editor_hint()) {
text_type->set_button_icon(get_editor_theme_icon(SNAME("Script"))); text_type->set_button_icon(get_editor_theme_icon(SNAME("Script")));
}
#endif #endif
c_text->set_editable(false); c_text->set_editable(false);
@ -717,7 +717,7 @@ void ColorPicker::_text_type_toggled() {
c_text->set_editable(true); c_text->set_editable(true);
c_text->set_tooltip_text(ETR("Enter a hex code (\"#ff0000\") or named color (\"red\").")); 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 { Color ColorPicker::get_pick_color() const {
@ -1047,25 +1047,35 @@ bool ColorPicker::is_deferred_mode() const {
} }
void ColorPicker::_update_text_value() { void ColorPicker::_update_text_value() {
bool text_visible = true; 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) { 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); String t = "Color(" + String::num(color.r, 3) + ", " + String::num(color.g, 3) + ", " + String::num(color.b, 3);
if (edit_alpha && color.a < 1) { if (edit_alpha && color.a < 1) {
t += ", " + String::num(color.a, 3) + ")"; t += ", " + String::num(color.a, 3) + ")";
} else { } else {
t += ")"; t += ")";
} }
text_type->set_text("");
#ifdef TOOLS_ENABLED
if (Engine::get_singleton()->is_editor_hint()) {
text_type->set_button_icon(get_editor_theme_icon(SNAME("Script")));
}
#endif
if (!is_rgb_valid) {
text_type->set_disabled(true);
} else {
text_type->set_disabled(false);
}
c_text->set_text(t); 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_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<InputEvent> &p_event) { void ColorPicker::_sample_input(const Ref<InputEvent> &p_event) {
@ -1934,11 +1944,9 @@ ColorPicker::ColorPicker() {
hex_hbc->add_child(text_type); hex_hbc->add_child(text_type);
text_type->set_text("#"); text_type->set_text("#");
text_type->set_tooltip_text(RTR("Switch between hexadecimal and code values.")); 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)); text_type->connect(SceneStringName(pressed), callable_mp(this, &ColorPicker::_text_type_toggled));
} else { if (!Engine::get_singleton()->is_editor_hint()) {
text_type->set_flat(true); text_type->set_flat(true);
text_type->set_mouse_filter(MOUSE_FILTER_IGNORE);
} }
c_text = memnew(LineEdit); c_text = memnew(LineEdit);