Merge pull request #63907 from heppocogne/Fix-code-editor-colorpicker
Fix code editor's ColorPicker issue
This commit is contained in:
commit
9e4d378b39
1 changed files with 59 additions and 17 deletions
|
@ -1820,31 +1820,73 @@ void ScriptTextEditor::_text_edit_gui_input(const Ref<InputEvent> &ev) {
|
||||||
color_position.x = row;
|
color_position.x = row;
|
||||||
color_position.y = col;
|
color_position.y = col;
|
||||||
|
|
||||||
int begin = 0;
|
int begin = -1;
|
||||||
int end = 0;
|
int end = -1;
|
||||||
bool valid = false;
|
enum EXPRESSION_PATTERNS {
|
||||||
|
NOT_PARSED,
|
||||||
|
RGBA_PARAMETER, // Color(float,float,float) or Color(float,float,float,float)
|
||||||
|
COLOR_NAME, // Color.COLOR_NAME
|
||||||
|
} expression_pattern = NOT_PARSED;
|
||||||
|
|
||||||
for (int i = col; i < line.length(); i++) {
|
for (int i = col; i < line.length(); i++) {
|
||||||
if (line[i] == '(') {
|
if (line[i] == '(') {
|
||||||
|
if (expression_pattern == NOT_PARSED) {
|
||||||
begin = i;
|
begin = i;
|
||||||
continue;
|
expression_pattern = RGBA_PARAMETER;
|
||||||
} else if (line[i] == ')') {
|
} else {
|
||||||
|
// Method call or '(' appearing twice.
|
||||||
|
expression_pattern = NOT_PARSED;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (expression_pattern == RGBA_PARAMETER && line[i] == ')' && end < 0) {
|
||||||
end = i + 1;
|
end = i + 1;
|
||||||
valid = true;
|
|
||||||
|
break;
|
||||||
|
} else if (expression_pattern == NOT_PARSED && line[i] == '.') {
|
||||||
|
begin = i;
|
||||||
|
expression_pattern = COLOR_NAME;
|
||||||
|
} else if (expression_pattern == COLOR_NAME && end < 0 && (line[i] == ' ' || line[i] == '\t')) {
|
||||||
|
// Including '.' and spaces.
|
||||||
|
continue;
|
||||||
|
} else if (expression_pattern == COLOR_NAME && !(line[i] == '_' || ('A' <= line[i] && line[i] <= 'Z'))) {
|
||||||
|
end = i;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (valid) {
|
|
||||||
|
switch (expression_pattern) {
|
||||||
|
case RGBA_PARAMETER: {
|
||||||
color_args = line.substr(begin, end - begin);
|
color_args = line.substr(begin, end - begin);
|
||||||
String stripped = color_args.replace(" ", "").replace("(", "").replace(")", "");
|
String stripped = color_args.replace(" ", "").replace("\t", "").replace("(", "").replace(")", "");
|
||||||
PackedFloat64Array color = stripped.split_floats(",");
|
PackedFloat64Array color = stripped.split_floats(",");
|
||||||
if (color.size() > 2) {
|
if (color.size() > 2) {
|
||||||
float alpha = color.size() > 3 ? color[3] : 1.0f;
|
float alpha = color.size() > 3 ? color[3] : 1.0f;
|
||||||
color_picker->set_pick_color(Color(color[0], color[1], color[2], alpha));
|
color_picker->set_pick_color(Color(color[0], color[1], color[2], alpha));
|
||||||
}
|
}
|
||||||
color_panel->set_position(get_screen_position() + local_pos);
|
} break;
|
||||||
|
case COLOR_NAME: {
|
||||||
|
if (end < 0) {
|
||||||
|
end = line.length();
|
||||||
|
}
|
||||||
|
color_args = line.substr(begin, end - begin);
|
||||||
|
const String color_name = color_args.replace(" ", "").replace("\t", "").replace(".", "");
|
||||||
|
const int color_index = Color::find_named_color(color_name);
|
||||||
|
if (0 <= color_index) {
|
||||||
|
const Color color_constant = Color::get_named_color(color_index);
|
||||||
|
color_picker->set_pick_color(color_constant);
|
||||||
} else {
|
} else {
|
||||||
has_color = false;
|
has_color = false;
|
||||||
}
|
}
|
||||||
|
} break;
|
||||||
|
default:
|
||||||
|
has_color = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (has_color) {
|
||||||
|
color_panel->set_position(get_screen_position() + local_pos);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
_make_context_menu(tx->has_selection(), has_color, foldable, open_docs, goto_definition, local_pos);
|
_make_context_menu(tx->has_selection(), has_color, foldable, open_docs, goto_definition, local_pos);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue