mirror of
https://github.com/godotengine/godot.git
synced 2024-11-10 22:23:07 +00:00
Removed hardcoded shortcuts from /scene and converted to input actions
This removes hardcoded actions from things like LineEdit and TextEdit. Previously, things like copy, paste, etc were all hardcoded to Ctrl+C, Ctrl+V, etc. They could not be changed. This allows the possibility of them being changed, by making them use the action map. This has the added benefit of greatly simplifying the input handling logic in those controls. The logic which was previously in a huge and hard to follow switch statement has been extracted to individual methods.
This commit is contained in:
parent
074f53563d
commit
49714b0963
@ -443,6 +443,10 @@ const OrderedHashMap<String, List<Ref<InputEvent>>> &InputMap::get_builtins() {
|
||||
inputs.push_back(InputEventKey::create_reference(KEY_SPACE | KEY_MASK_CMD));
|
||||
default_builtin_cache.insert("ui_text_completion_query", inputs);
|
||||
|
||||
inputs = List<Ref<InputEvent>>();
|
||||
inputs.push_back(InputEventKey::create_reference(KEY_TAB));
|
||||
default_builtin_cache.insert("ui_text_completion_accept", inputs);
|
||||
|
||||
// Newlines
|
||||
inputs = List<Ref<InputEvent>>();
|
||||
inputs.push_back(InputEventKey::create_reference(KEY_ENTER));
|
||||
|
@ -6215,8 +6215,8 @@ EditorNode::EditorNode() {
|
||||
pm_export->connect("id_pressed", callable_mp(this, &EditorNode::_menu_option));
|
||||
|
||||
p->add_separator();
|
||||
p->add_shortcut(ED_SHORTCUT("editor/undo", TTR("Undo"), KEY_MASK_CMD + KEY_Z), EDIT_UNDO, true);
|
||||
p->add_shortcut(ED_SHORTCUT("editor/redo", TTR("Redo"), KEY_MASK_CMD + KEY_MASK_SHIFT + KEY_Z), EDIT_REDO, true);
|
||||
p->add_shortcut(ED_GET_SHORTCUT("ui_undo"), EDIT_UNDO, true);
|
||||
p->add_shortcut(ED_GET_SHORTCUT("ui_redo"), EDIT_REDO, true);
|
||||
|
||||
p->add_separator();
|
||||
p->add_shortcut(ED_SHORTCUT("editor/reload_saved_scene", TTR("Reload Saved Scene")), EDIT_RELOAD_SAVED_SCENE);
|
||||
|
@ -1066,7 +1066,7 @@ void ScriptTextEditor::_edit_option(int p_op) {
|
||||
return;
|
||||
}
|
||||
|
||||
tx->indent_left();
|
||||
tx->indent_selected_lines_left();
|
||||
} break;
|
||||
case EDIT_INDENT_RIGHT: {
|
||||
Ref<Script> scr = script;
|
||||
@ -1074,7 +1074,7 @@ void ScriptTextEditor::_edit_option(int p_op) {
|
||||
return;
|
||||
}
|
||||
|
||||
tx->indent_right();
|
||||
tx->indent_selected_lines_right();
|
||||
} break;
|
||||
case EDIT_DELETE_LINE: {
|
||||
code_editor->delete_lines();
|
||||
@ -1632,16 +1632,16 @@ void ScriptTextEditor::_color_changed(const Color &p_color) {
|
||||
|
||||
void ScriptTextEditor::_make_context_menu(bool p_selection, bool p_color, bool p_foldable, bool p_open_docs, bool p_goto_definition, Vector2 p_pos) {
|
||||
context_menu->clear();
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/undo"), EDIT_UNDO);
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/redo"), EDIT_REDO);
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("ui_undo"), EDIT_UNDO);
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("ui_redo"), EDIT_REDO);
|
||||
|
||||
context_menu->add_separator();
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/cut"), EDIT_CUT);
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/copy"), EDIT_COPY);
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/paste"), EDIT_PASTE);
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("ui_cut"), EDIT_CUT);
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("ui_copy"), EDIT_COPY);
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("ui_paste"), EDIT_PASTE);
|
||||
|
||||
context_menu->add_separator();
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/select_all"), EDIT_SELECT_ALL);
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("ui_text_select_all"), EDIT_SELECT_ALL);
|
||||
|
||||
context_menu->add_separator();
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/indent_left"), EDIT_INDENT_LEFT);
|
||||
@ -1743,14 +1743,14 @@ void ScriptTextEditor::_enable_code_editor() {
|
||||
search_menu->get_popup()->connect("id_pressed", callable_mp(this, &ScriptTextEditor::_edit_option));
|
||||
|
||||
edit_hb->add_child(edit_menu);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/undo"), EDIT_UNDO);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/redo"), EDIT_REDO);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_undo"), EDIT_UNDO);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_redo"), EDIT_REDO);
|
||||
edit_menu->get_popup()->add_separator();
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/cut"), EDIT_CUT);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/copy"), EDIT_COPY);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/paste"), EDIT_PASTE);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_cut"), EDIT_CUT);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_copy"), EDIT_COPY);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_paste"), EDIT_PASTE);
|
||||
edit_menu->get_popup()->add_separator();
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/select_all"), EDIT_SELECT_ALL);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_text_select_all"), EDIT_SELECT_ALL);
|
||||
edit_menu->get_popup()->add_separator();
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/move_up"), EDIT_MOVE_LINE_UP);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/move_down"), EDIT_MOVE_LINE_DOWN);
|
||||
@ -1763,7 +1763,7 @@ void ScriptTextEditor::_enable_code_editor() {
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/unfold_all_lines"), EDIT_UNFOLD_ALL_LINES);
|
||||
edit_menu->get_popup()->add_separator();
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/clone_down"), EDIT_CLONE_DOWN);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/complete_symbol"), EDIT_COMPLETE);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_text_completion_query"), EDIT_COMPLETE);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/evaluate_selection"), EDIT_EVALUATE);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/trim_trailing_whitespace"), EDIT_TRIM_TRAILING_WHITESAPCE);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/convert_indent_to_spaces"), EDIT_CONVERT_INDENT_TO_SPACES);
|
||||
@ -1915,12 +1915,6 @@ static ScriptEditorBase *create_editor(const RES &p_resource) {
|
||||
}
|
||||
|
||||
void ScriptTextEditor::register_editor() {
|
||||
ED_SHORTCUT("script_text_editor/undo", TTR("Undo"), KEY_MASK_CMD | KEY_Z);
|
||||
ED_SHORTCUT("script_text_editor/redo", TTR("Redo"), KEY_MASK_CMD | KEY_Y);
|
||||
ED_SHORTCUT("script_text_editor/cut", TTR("Cut"), KEY_MASK_CMD | KEY_X);
|
||||
ED_SHORTCUT("script_text_editor/copy", TTR("Copy"), KEY_MASK_CMD | KEY_C);
|
||||
ED_SHORTCUT("script_text_editor/paste", TTR("Paste"), KEY_MASK_CMD | KEY_V);
|
||||
ED_SHORTCUT("script_text_editor/select_all", TTR("Select All"), KEY_MASK_CMD | KEY_A);
|
||||
ED_SHORTCUT("script_text_editor/move_up", TTR("Move Up"), KEY_MASK_ALT | KEY_UP);
|
||||
ED_SHORTCUT("script_text_editor/move_down", TTR("Move Down"), KEY_MASK_ALT | KEY_DOWN);
|
||||
ED_SHORTCUT("script_text_editor/delete_line", TTR("Delete Line"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_K);
|
||||
@ -1936,10 +1930,8 @@ void ScriptTextEditor::register_editor() {
|
||||
ED_SHORTCUT("script_text_editor/unfold_all_lines", TTR("Unfold All Lines"), 0);
|
||||
#ifdef OSX_ENABLED
|
||||
ED_SHORTCUT("script_text_editor/clone_down", TTR("Clone Down"), KEY_MASK_SHIFT | KEY_MASK_CMD | KEY_C);
|
||||
ED_SHORTCUT("script_text_editor/complete_symbol", TTR("Complete Symbol"), KEY_MASK_CTRL | KEY_SPACE);
|
||||
#else
|
||||
ED_SHORTCUT("script_text_editor/clone_down", TTR("Clone Down"), KEY_MASK_CMD | KEY_D);
|
||||
ED_SHORTCUT("script_text_editor/complete_symbol", TTR("Complete Symbol"), KEY_MASK_CMD | KEY_SPACE);
|
||||
#endif
|
||||
ED_SHORTCUT("script_text_editor/evaluate_selection", TTR("Evaluate Selection"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_E);
|
||||
ED_SHORTCUT("script_text_editor/trim_trailing_whitespace", TTR("Trim Trailing Whitespace"), KEY_MASK_CMD | KEY_MASK_ALT | KEY_T);
|
||||
|
@ -282,7 +282,7 @@ void ShaderEditor::_menu_option(int p_option) {
|
||||
}
|
||||
|
||||
CodeEdit *tx = shader_editor->get_text_editor();
|
||||
tx->indent_left();
|
||||
tx->indent_selected_lines_left();
|
||||
|
||||
} break;
|
||||
case EDIT_INDENT_RIGHT: {
|
||||
@ -291,7 +291,7 @@ void ShaderEditor::_menu_option(int p_option) {
|
||||
}
|
||||
|
||||
CodeEdit *tx = shader_editor->get_text_editor();
|
||||
tx->indent_right();
|
||||
tx->indent_selected_lines_right();
|
||||
|
||||
} break;
|
||||
case EDIT_DELETE_LINE: {
|
||||
@ -533,15 +533,15 @@ void ShaderEditor::_bookmark_item_pressed(int p_idx) {
|
||||
void ShaderEditor::_make_context_menu(bool p_selection, Vector2 p_position) {
|
||||
context_menu->clear();
|
||||
if (p_selection) {
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/cut"), EDIT_CUT);
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/copy"), EDIT_COPY);
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("ui_cut"), EDIT_CUT);
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("ui_copy"), EDIT_COPY);
|
||||
}
|
||||
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/paste"), EDIT_PASTE);
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("ui_paste"), EDIT_PASTE);
|
||||
context_menu->add_separator();
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/select_all"), EDIT_SELECT_ALL);
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/undo"), EDIT_UNDO);
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/redo"), EDIT_REDO);
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("ui_text_select_all"), EDIT_SELECT_ALL);
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("ui_undo"), EDIT_UNDO);
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("ui_redo"), EDIT_REDO);
|
||||
|
||||
context_menu->add_separator();
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/indent_left"), EDIT_INDENT_LEFT);
|
||||
@ -585,14 +585,14 @@ ShaderEditor::ShaderEditor(EditorNode *p_node) {
|
||||
edit_menu->set_text(TTR("Edit"));
|
||||
edit_menu->set_switch_on_hover(true);
|
||||
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/undo"), EDIT_UNDO);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/redo"), EDIT_REDO);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_undo"), EDIT_UNDO);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_redo"), EDIT_REDO);
|
||||
edit_menu->get_popup()->add_separator();
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/cut"), EDIT_CUT);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/copy"), EDIT_COPY);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/paste"), EDIT_PASTE);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_cut"), EDIT_CUT);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_copy"), EDIT_COPY);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_paste"), EDIT_PASTE);
|
||||
edit_menu->get_popup()->add_separator();
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/select_all"), EDIT_SELECT_ALL);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_text_select_all"), EDIT_SELECT_ALL);
|
||||
edit_menu->get_popup()->add_separator();
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/move_up"), EDIT_MOVE_LINE_UP);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/move_down"), EDIT_MOVE_LINE_DOWN);
|
||||
@ -602,7 +602,7 @@ ShaderEditor::ShaderEditor(EditorNode *p_node) {
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/toggle_comment"), EDIT_TOGGLE_COMMENT);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/clone_down"), EDIT_CLONE_DOWN);
|
||||
edit_menu->get_popup()->add_separator();
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/complete_symbol"), EDIT_COMPLETE);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_text_completion_query"), EDIT_COMPLETE);
|
||||
edit_menu->get_popup()->connect("id_pressed", callable_mp(this, &ShaderEditor::_menu_option));
|
||||
|
||||
search_menu = memnew(MenuButton);
|
||||
|
@ -363,10 +363,10 @@ void TextEditor::_edit_option(int p_op) {
|
||||
code_editor->move_lines_down();
|
||||
} break;
|
||||
case EDIT_INDENT_LEFT: {
|
||||
tx->indent_left();
|
||||
tx->indent_selected_lines_left();
|
||||
} break;
|
||||
case EDIT_INDENT_RIGHT: {
|
||||
tx->indent_right();
|
||||
tx->indent_selected_lines_right();
|
||||
} break;
|
||||
case EDIT_DELETE_LINE: {
|
||||
code_editor->delete_lines();
|
||||
@ -514,15 +514,15 @@ void TextEditor::_text_edit_gui_input(const Ref<InputEvent> &ev) {
|
||||
void TextEditor::_make_context_menu(bool p_selection, bool p_can_fold, bool p_is_folded, Vector2 p_position) {
|
||||
context_menu->clear();
|
||||
if (p_selection) {
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/cut"), EDIT_CUT);
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/copy"), EDIT_COPY);
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("ui_cut"), EDIT_CUT);
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("ui_copy"), EDIT_COPY);
|
||||
}
|
||||
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/paste"), EDIT_PASTE);
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("ui_paste"), EDIT_PASTE);
|
||||
context_menu->add_separator();
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/select_all"), EDIT_SELECT_ALL);
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/undo"), EDIT_UNDO);
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/redo"), EDIT_REDO);
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("ui_text_select_all"), EDIT_SELECT_ALL);
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("ui_undo"), EDIT_UNDO);
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("ui_redo"), EDIT_REDO);
|
||||
context_menu->add_separator();
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/indent_left"), EDIT_INDENT_LEFT);
|
||||
context_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/indent_right"), EDIT_INDENT_RIGHT);
|
||||
@ -584,14 +584,14 @@ TextEditor::TextEditor() {
|
||||
edit_menu->set_switch_on_hover(true);
|
||||
edit_menu->get_popup()->connect("id_pressed", callable_mp(this, &TextEditor::_edit_option));
|
||||
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/undo"), EDIT_UNDO);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/redo"), EDIT_REDO);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_undo"), EDIT_UNDO);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("un_redo"), EDIT_REDO);
|
||||
edit_menu->get_popup()->add_separator();
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/cut"), EDIT_CUT);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/copy"), EDIT_COPY);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/paste"), EDIT_PASTE);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_cut"), EDIT_CUT);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_copy"), EDIT_COPY);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_paste"), EDIT_PASTE);
|
||||
edit_menu->get_popup()->add_separator();
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/select_all"), EDIT_SELECT_ALL);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_text_select_all"), EDIT_SELECT_ALL);
|
||||
edit_menu->get_popup()->add_separator();
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/move_up"), EDIT_MOVE_LINE_UP);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/move_down"), EDIT_MOVE_LINE_DOWN);
|
||||
|
@ -143,7 +143,7 @@ void EditorSettingsDialog::_unhandled_input(const Ref<InputEvent> &p_event) {
|
||||
if (k.is_valid() && k->is_pressed()) {
|
||||
bool handled = false;
|
||||
|
||||
if (ED_IS_SHORTCUT("editor/undo", p_event)) {
|
||||
if (ED_IS_SHORTCUT("ui_undo", p_event)) {
|
||||
String action = undo_redo->get_current_action_name();
|
||||
if (action != "") {
|
||||
EditorNode::get_log()->add_message("Undo: " + action, EditorLog::MSG_TYPE_EDITOR);
|
||||
@ -152,7 +152,7 @@ void EditorSettingsDialog::_unhandled_input(const Ref<InputEvent> &p_event) {
|
||||
handled = true;
|
||||
}
|
||||
|
||||
if (ED_IS_SHORTCUT("editor/redo", p_event)) {
|
||||
if (ED_IS_SHORTCUT("ui_redo", p_event)) {
|
||||
undo_redo->redo();
|
||||
String action = undo_redo->get_current_action_name();
|
||||
if (action != "") {
|
||||
|
@ -4274,13 +4274,13 @@ VisualScriptEditor::VisualScriptEditor() {
|
||||
edit_menu->set_shortcut_context(this);
|
||||
edit_menu->set_text(TTR("Edit"));
|
||||
edit_menu->set_switch_on_hover(true);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("visual_script_editor/delete_selected"), EDIT_DELETE_NODES);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_graph_delete"), EDIT_DELETE_NODES);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("visual_script_editor/toggle_breakpoint"), EDIT_TOGGLE_BREAKPOINT);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("visual_script_editor/find_node_type"), EDIT_FIND_NODE_TYPE);
|
||||
edit_menu->get_popup()->add_separator();
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("visual_script_editor/copy_nodes"), EDIT_COPY_NODES);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("visual_script_editor/cut_nodes"), EDIT_CUT_NODES);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("visual_script_editor/paste_nodes"), EDIT_PASTE_NODES);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_copy"), EDIT_COPY_NODES);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_cut"), EDIT_CUT_NODES);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_paste"), EDIT_PASTE_NODES);
|
||||
edit_menu->get_popup()->add_separator();
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("visual_script_editor/create_function"), EDIT_CREATE_FUNCTION);
|
||||
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("visual_script_editor/refresh_nodes"), REFRESH_GRAPH);
|
||||
@ -4520,12 +4520,8 @@ void VisualScriptEditor::free_clipboard() {
|
||||
static void register_editor_callback() {
|
||||
ScriptEditor::register_create_script_editor_function(create_editor);
|
||||
|
||||
ED_SHORTCUT("visual_script_editor/delete_selected", TTR("Delete Selected"), KEY_DELETE);
|
||||
ED_SHORTCUT("visual_script_editor/toggle_breakpoint", TTR("Toggle Breakpoint"), KEY_F9);
|
||||
ED_SHORTCUT("visual_script_editor/find_node_type", TTR("Find Node Type"), KEY_MASK_CMD + KEY_F);
|
||||
ED_SHORTCUT("visual_script_editor/copy_nodes", TTR("Copy Nodes"), KEY_MASK_CMD + KEY_C);
|
||||
ED_SHORTCUT("visual_script_editor/cut_nodes", TTR("Cut Nodes"), KEY_MASK_CMD + KEY_X);
|
||||
ED_SHORTCUT("visual_script_editor/paste_nodes", TTR("Paste Nodes"), KEY_MASK_CMD + KEY_V);
|
||||
ED_SHORTCUT("visual_script_editor/create_function", TTR("Make Function"), KEY_MASK_CMD + KEY_G);
|
||||
ED_SHORTCUT("visual_script_editor/refresh_nodes", TTR("Refresh Graph"), KEY_MASK_CMD + KEY_R);
|
||||
ED_SHORTCUT("visual_script_editor/edit_member", TTR("Edit Member"), KEY_MASK_CMD + KEY_E);
|
||||
|
@ -1330,25 +1330,17 @@ void GraphEdit::_gui_input(const Ref<InputEvent> &p_ev) {
|
||||
}
|
||||
}
|
||||
|
||||
Ref<InputEventKey> k = p_ev;
|
||||
|
||||
if (k.is_valid()) {
|
||||
if (k->get_keycode() == KEY_D && k->is_pressed() && k->get_command()) {
|
||||
if (p_ev->is_pressed()) {
|
||||
if (p_ev->is_action("ui_graph_duplicate")) {
|
||||
emit_signal("duplicate_nodes_request");
|
||||
accept_event();
|
||||
}
|
||||
|
||||
if (k->get_keycode() == KEY_C && k->is_pressed() && k->get_command()) {
|
||||
} else if (p_ev->is_action("ui_copy")) {
|
||||
emit_signal("copy_nodes_request");
|
||||
accept_event();
|
||||
}
|
||||
|
||||
if (k->get_keycode() == KEY_V && k->is_pressed() && k->get_command()) {
|
||||
} else if (p_ev->is_action("ui_paste")) {
|
||||
emit_signal("paste_nodes_request");
|
||||
accept_event();
|
||||
}
|
||||
|
||||
if (k->get_keycode() == KEY_DELETE && k->is_pressed()) {
|
||||
} else if (p_ev->is_action("ui_graph_delete")) {
|
||||
emit_signal("delete_nodes_request");
|
||||
accept_event();
|
||||
}
|
||||
|
@ -30,6 +30,7 @@
|
||||
|
||||
#include "line_edit.h"
|
||||
|
||||
#include "core/input/input_map.h"
|
||||
#include "core/object/message_queue.h"
|
||||
#include "core/os/keyboard.h"
|
||||
#include "core/os/os.h"
|
||||
@ -44,6 +45,175 @@
|
||||
#endif
|
||||
#include "scene/main/window.h"
|
||||
|
||||
void LineEdit::_swap_current_input_direction() {
|
||||
if (input_direction == TEXT_DIRECTION_LTR) {
|
||||
input_direction = TEXT_DIRECTION_RTL;
|
||||
} else {
|
||||
input_direction = TEXT_DIRECTION_LTR;
|
||||
}
|
||||
set_cursor_position(get_cursor_position());
|
||||
update();
|
||||
}
|
||||
|
||||
void LineEdit::_move_cursor_left(bool p_select, bool p_move_by_word) {
|
||||
if (selection.enabled && !p_select) {
|
||||
set_cursor_position(selection.begin);
|
||||
deselect();
|
||||
return;
|
||||
}
|
||||
|
||||
shift_selection_check_pre(p_select);
|
||||
|
||||
if (p_move_by_word) {
|
||||
int cc = cursor_pos;
|
||||
|
||||
Vector<Vector2i> words = TS->shaped_text_get_word_breaks(text_rid);
|
||||
for (int i = words.size() - 1; i >= 0; i--) {
|
||||
if (words[i].x < cc) {
|
||||
cc = words[i].x;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
set_cursor_position(cc);
|
||||
} else {
|
||||
if (mid_grapheme_caret_enabled) {
|
||||
set_cursor_position(get_cursor_position() - 1);
|
||||
} else {
|
||||
set_cursor_position(TS->shaped_text_prev_grapheme_pos(text_rid, get_cursor_position()));
|
||||
}
|
||||
}
|
||||
|
||||
shift_selection_check_post(p_select);
|
||||
}
|
||||
|
||||
void LineEdit::_move_cursor_right(bool p_select, bool p_move_by_word) {
|
||||
if (selection.enabled && !p_select) {
|
||||
set_cursor_position(selection.end);
|
||||
deselect();
|
||||
return;
|
||||
}
|
||||
|
||||
shift_selection_check_pre(p_select);
|
||||
|
||||
if (p_move_by_word) {
|
||||
int cc = cursor_pos;
|
||||
|
||||
Vector<Vector2i> words = TS->shaped_text_get_word_breaks(text_rid);
|
||||
for (int i = 0; i < words.size(); i++) {
|
||||
if (words[i].y > cc) {
|
||||
cc = words[i].y;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
set_cursor_position(cc);
|
||||
} else {
|
||||
if (mid_grapheme_caret_enabled) {
|
||||
set_cursor_position(get_cursor_position() + 1);
|
||||
} else {
|
||||
set_cursor_position(TS->shaped_text_next_grapheme_pos(text_rid, get_cursor_position()));
|
||||
}
|
||||
}
|
||||
|
||||
shift_selection_check_post(p_select);
|
||||
}
|
||||
|
||||
void LineEdit::_move_cursor_start(bool p_select) {
|
||||
shift_selection_check_pre(p_select);
|
||||
set_cursor_position(0);
|
||||
shift_selection_check_post(p_select);
|
||||
}
|
||||
|
||||
void LineEdit::_move_cursor_end(bool p_select) {
|
||||
shift_selection_check_pre(p_select);
|
||||
set_cursor_position(text.length());
|
||||
shift_selection_check_post(p_select);
|
||||
}
|
||||
|
||||
void LineEdit::_backspace(bool p_word, bool p_all_to_left) {
|
||||
if (!editable) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (p_all_to_left) {
|
||||
deselect();
|
||||
text = text.substr(0, cursor_pos);
|
||||
_text_changed();
|
||||
return;
|
||||
}
|
||||
|
||||
if (selection.enabled) {
|
||||
selection_delete();
|
||||
return;
|
||||
}
|
||||
|
||||
if (p_word) {
|
||||
int cc = cursor_pos;
|
||||
|
||||
Vector<Vector2i> words = TS->shaped_text_get_word_breaks(text_rid);
|
||||
for (int i = words.size() - 1; i >= 0; i--) {
|
||||
if (words[i].x < cc) {
|
||||
cc = words[i].x;
|
||||
}
|
||||
}
|
||||
|
||||
delete_text(cc, cursor_pos);
|
||||
|
||||
set_cursor_position(cc);
|
||||
} else {
|
||||
delete_char();
|
||||
}
|
||||
}
|
||||
|
||||
void LineEdit::_delete(bool p_word, bool p_all_to_right) {
|
||||
if (!editable) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (p_all_to_right) {
|
||||
deselect();
|
||||
text = text.substr(cursor_pos, text.length() - cursor_pos);
|
||||
_shape();
|
||||
set_cursor_position(0);
|
||||
_text_changed();
|
||||
return;
|
||||
}
|
||||
|
||||
if (selection.enabled) {
|
||||
selection_delete();
|
||||
return;
|
||||
}
|
||||
|
||||
int text_len = text.length();
|
||||
|
||||
if (cursor_pos == text_len) {
|
||||
return; // Nothing to do.
|
||||
}
|
||||
|
||||
if (p_word) {
|
||||
int cc = cursor_pos;
|
||||
Vector<Vector2i> words = TS->shaped_text_get_word_breaks(text_rid);
|
||||
for (int i = 0; i < words.size(); i++) {
|
||||
if (words[i].y > cc) {
|
||||
cc = words[i].y;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
delete_text(cursor_pos, cc);
|
||||
} else {
|
||||
if (mid_grapheme_caret_enabled) {
|
||||
set_cursor_position(cursor_pos + 1);
|
||||
delete_char();
|
||||
} else {
|
||||
int cc = cursor_pos;
|
||||
set_cursor_position(TS->shaped_text_next_grapheme_pos(text_rid, cursor_pos));
|
||||
delete_text(cc, cursor_pos);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LineEdit::_gui_input(Ref<InputEvent> p_event) {
|
||||
Ref<InputEventMouseButton> b = p_event;
|
||||
|
||||
@ -55,7 +225,7 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) {
|
||||
if (b->is_pressed() && b->get_button_index() == BUTTON_RIGHT && context_menu_enabled) {
|
||||
menu->set_position(get_screen_transform().xform(get_local_mouse_position()));
|
||||
menu->set_size(Vector2(1, 1));
|
||||
//menu->set_scale(get_global_transform().get_scale());
|
||||
_generate_context_menu();
|
||||
menu->popup();
|
||||
grab_focus();
|
||||
accept_event();
|
||||
@ -153,453 +323,163 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) {
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef APPLE_STYLE_KEYS
|
||||
if (k->get_control() && !k->get_shift() && !k->get_alt() && !k->get_command()) {
|
||||
uint32_t remap_key = KEY_UNKNOWN;
|
||||
switch (k->get_keycode()) {
|
||||
case KEY_F: {
|
||||
remap_key = KEY_RIGHT;
|
||||
} break;
|
||||
case KEY_B: {
|
||||
remap_key = KEY_LEFT;
|
||||
} break;
|
||||
case KEY_P: {
|
||||
remap_key = KEY_UP;
|
||||
} break;
|
||||
case KEY_N: {
|
||||
remap_key = KEY_DOWN;
|
||||
} break;
|
||||
case KEY_D: {
|
||||
remap_key = KEY_DELETE;
|
||||
} break;
|
||||
case KEY_H: {
|
||||
remap_key = KEY_BACKSPACE;
|
||||
} break;
|
||||
case KEY_A: {
|
||||
remap_key = KEY_HOME;
|
||||
} break;
|
||||
case KEY_E: {
|
||||
remap_key = KEY_END;
|
||||
} break;
|
||||
}
|
||||
|
||||
if (remap_key != KEY_UNKNOWN) {
|
||||
k->set_keycode(remap_key);
|
||||
k->set_control(false);
|
||||
if (context_menu_enabled) {
|
||||
if (k->is_action("ui_menu", true)) {
|
||||
Point2 pos = Point2(get_cursor_pixel_pos().x, (get_size().y + get_theme_font("font")->get_height(get_theme_font_size("font_size"))) / 2);
|
||||
menu->set_position(get_global_transform().xform(pos));
|
||||
menu->set_size(Vector2(1, 1));
|
||||
_generate_context_menu();
|
||||
menu->popup();
|
||||
menu->grab_focus();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
unsigned int code = k->get_keycode();
|
||||
// Default is ENTER, KP_ENTER. Cannot use ui_accept as default includes SPACE
|
||||
if (k->is_action("ui_text_newline", true)) {
|
||||
emit_signal("text_entered", text);
|
||||
if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_VIRTUAL_KEYBOARD) && virtual_keyboard_enabled) {
|
||||
DisplayServer::get_singleton()->virtual_keyboard_hide();
|
||||
}
|
||||
}
|
||||
|
||||
if (k->get_command() && is_shortcut_keys_enabled()) {
|
||||
bool handled = true;
|
||||
|
||||
switch (code) {
|
||||
case (KEY_QUOTELEFT): { // Swap current input direction (primary cursor)
|
||||
|
||||
if (input_direction == TEXT_DIRECTION_LTR) {
|
||||
input_direction = TEXT_DIRECTION_RTL;
|
||||
} else {
|
||||
input_direction = TEXT_DIRECTION_LTR;
|
||||
}
|
||||
set_cursor_position(get_cursor_position());
|
||||
update();
|
||||
|
||||
} break;
|
||||
|
||||
case (KEY_X): { // CUT.
|
||||
|
||||
if (editable) {
|
||||
cut_text();
|
||||
}
|
||||
|
||||
} break;
|
||||
|
||||
case (KEY_C): { // COPY.
|
||||
|
||||
copy_text();
|
||||
|
||||
} break;
|
||||
|
||||
case (KEY_Y): // PASTE (Yank for unix users).
|
||||
case (KEY_V): { // PASTE.
|
||||
|
||||
if (editable) {
|
||||
paste_text();
|
||||
}
|
||||
|
||||
} break;
|
||||
|
||||
case (KEY_Z): { // Undo/redo.
|
||||
if (editable) {
|
||||
if (k->get_shift()) {
|
||||
redo();
|
||||
} else {
|
||||
undo();
|
||||
}
|
||||
}
|
||||
} break;
|
||||
|
||||
case (KEY_U): { // Delete from start to cursor.
|
||||
|
||||
if (editable) {
|
||||
deselect();
|
||||
text = text.substr(cursor_pos, text.length() - cursor_pos);
|
||||
_shape();
|
||||
set_cursor_position(0);
|
||||
_text_changed();
|
||||
}
|
||||
|
||||
} break;
|
||||
|
||||
case (KEY_K): { // Delete from cursor_pos to end.
|
||||
|
||||
if (editable) {
|
||||
deselect();
|
||||
text = text.substr(0, cursor_pos);
|
||||
_text_changed();
|
||||
}
|
||||
|
||||
} break;
|
||||
case (KEY_A): { // Select all.
|
||||
select();
|
||||
|
||||
} break;
|
||||
#ifdef APPLE_STYLE_KEYS
|
||||
case (KEY_LEFT): { // Go to start of text - like HOME key.
|
||||
shift_selection_check_pre(k->get_shift());
|
||||
set_cursor_position(0);
|
||||
shift_selection_check_post(k->get_shift());
|
||||
} break;
|
||||
case (KEY_RIGHT): { // Go to end of text - like END key.
|
||||
shift_selection_check_pre(k->get_shift());
|
||||
set_cursor_position(text.length());
|
||||
shift_selection_check_post(k->get_shift());
|
||||
} break;
|
||||
case (KEY_BACKSPACE): {
|
||||
if (!editable)
|
||||
break;
|
||||
|
||||
// If selected, delete the selection
|
||||
if (selection.enabled) {
|
||||
selection_delete();
|
||||
break;
|
||||
}
|
||||
|
||||
// Otherwise delete from cursor to beginning of text edit
|
||||
int current_pos = get_cursor_position();
|
||||
if (current_pos != 0) {
|
||||
delete_text(0, current_pos);
|
||||
}
|
||||
} break;
|
||||
#endif
|
||||
default: {
|
||||
handled = false;
|
||||
}
|
||||
if (is_shortcut_keys_enabled()) {
|
||||
if (k->is_action("ui_copy", true)) {
|
||||
copy_text();
|
||||
accept_event();
|
||||
return;
|
||||
}
|
||||
|
||||
if (handled) {
|
||||
if (k->is_action("ui_text_select_all", true)) {
|
||||
select();
|
||||
accept_event();
|
||||
return;
|
||||
}
|
||||
|
||||
// Cut / Paste
|
||||
if (k->is_action("ui_cut", true)) {
|
||||
cut_text();
|
||||
accept_event();
|
||||
return;
|
||||
}
|
||||
|
||||
if (k->is_action("ui_paste", true)) {
|
||||
paste_text();
|
||||
accept_event();
|
||||
return;
|
||||
}
|
||||
|
||||
// Undo / Redo
|
||||
if (k->is_action("ui_undo", true)) {
|
||||
undo();
|
||||
accept_event();
|
||||
return;
|
||||
}
|
||||
|
||||
if (k->is_action("ui_redo", true)) {
|
||||
redo();
|
||||
accept_event();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
_reset_caret_blink_timer();
|
||||
if (!k->get_metakey()) {
|
||||
bool handled = true;
|
||||
switch (code) {
|
||||
case KEY_KP_ENTER:
|
||||
case KEY_ENTER: {
|
||||
emit_signal("text_entered", text);
|
||||
if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_VIRTUAL_KEYBOARD) && virtual_keyboard_enabled) {
|
||||
DisplayServer::get_singleton()->virtual_keyboard_hide();
|
||||
}
|
||||
|
||||
} break;
|
||||
|
||||
case KEY_BACKSPACE: {
|
||||
if (!editable) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (selection.enabled) {
|
||||
selection_delete();
|
||||
break;
|
||||
}
|
||||
|
||||
#ifdef APPLE_STYLE_KEYS
|
||||
if (k->get_alt()) {
|
||||
#else
|
||||
if (k->get_alt()) {
|
||||
handled = false;
|
||||
break;
|
||||
} else if (k->get_command()) {
|
||||
#endif
|
||||
int cc = cursor_pos;
|
||||
|
||||
Vector<Vector2i> words = TS->shaped_text_get_word_breaks(text_rid);
|
||||
for (int i = words.size() - 1; i >= 0; i--) {
|
||||
if (words[i].x < cc) {
|
||||
cc = words[i].x;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
delete_text(cc, cursor_pos);
|
||||
|
||||
set_cursor_position(cc);
|
||||
|
||||
} else {
|
||||
delete_char();
|
||||
}
|
||||
|
||||
} break;
|
||||
case KEY_KP_4: {
|
||||
if (k->get_unicode() != 0) {
|
||||
handled = false;
|
||||
break;
|
||||
}
|
||||
[[fallthrough]];
|
||||
}
|
||||
case KEY_LEFT: {
|
||||
#ifndef APPLE_STYLE_KEYS
|
||||
if (!k->get_alt()) {
|
||||
#endif
|
||||
if (selection.enabled && !k->get_shift()) {
|
||||
set_cursor_position(selection.begin);
|
||||
deselect();
|
||||
handled = true;
|
||||
break;
|
||||
}
|
||||
|
||||
shift_selection_check_pre(k->get_shift());
|
||||
#ifndef APPLE_STYLE_KEYS
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef APPLE_STYLE_KEYS
|
||||
if (k->get_command()) {
|
||||
set_cursor_position(0);
|
||||
} else if (k->get_alt()) {
|
||||
#else
|
||||
if (k->get_alt()) {
|
||||
handled = false;
|
||||
break;
|
||||
} else if (k->get_command()) {
|
||||
#endif
|
||||
int cc = cursor_pos;
|
||||
|
||||
Vector<Vector2i> words = TS->shaped_text_get_word_breaks(text_rid);
|
||||
for (int i = words.size() - 1; i >= 0; i--) {
|
||||
if (words[i].x < cc) {
|
||||
cc = words[i].x;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
set_cursor_position(cc);
|
||||
|
||||
} else {
|
||||
if (mid_grapheme_caret_enabled) {
|
||||
set_cursor_position(get_cursor_position() - 1);
|
||||
} else {
|
||||
set_cursor_position(TS->shaped_text_prev_grapheme_pos(text_rid, get_cursor_position()));
|
||||
}
|
||||
}
|
||||
|
||||
shift_selection_check_post(k->get_shift());
|
||||
|
||||
} break;
|
||||
case KEY_KP_6: {
|
||||
if (k->get_unicode() != 0) {
|
||||
handled = false;
|
||||
break;
|
||||
}
|
||||
[[fallthrough]];
|
||||
}
|
||||
case KEY_RIGHT: {
|
||||
#ifndef APPLE_STYLE_KEYS
|
||||
if (!k->get_alt()) {
|
||||
#endif
|
||||
if (selection.enabled && !k->get_shift()) {
|
||||
set_cursor_position(selection.end);
|
||||
deselect();
|
||||
handled = true;
|
||||
break;
|
||||
}
|
||||
|
||||
shift_selection_check_pre(k->get_shift());
|
||||
#ifndef APPLE_STYLE_KEYS
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef APPLE_STYLE_KEYS
|
||||
if (k->get_command()) {
|
||||
set_cursor_position(text.length());
|
||||
} else if (k->get_alt()) {
|
||||
#else
|
||||
if (k->get_alt()) {
|
||||
handled = false;
|
||||
break;
|
||||
} else if (k->get_command()) {
|
||||
#endif
|
||||
int cc = cursor_pos;
|
||||
|
||||
Vector<Vector2i> words = TS->shaped_text_get_word_breaks(text_rid);
|
||||
for (int i = 0; i < words.size(); i++) {
|
||||
if (words[i].y > cc) {
|
||||
cc = words[i].y;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
set_cursor_position(cc);
|
||||
|
||||
} else {
|
||||
if (mid_grapheme_caret_enabled) {
|
||||
set_cursor_position(get_cursor_position() + 1);
|
||||
} else {
|
||||
set_cursor_position(TS->shaped_text_next_grapheme_pos(text_rid, get_cursor_position()));
|
||||
}
|
||||
}
|
||||
|
||||
shift_selection_check_post(k->get_shift());
|
||||
|
||||
} break;
|
||||
case KEY_UP: {
|
||||
shift_selection_check_pre(k->get_shift());
|
||||
if (get_cursor_position() == 0) {
|
||||
handled = false;
|
||||
}
|
||||
set_cursor_position(0);
|
||||
shift_selection_check_post(k->get_shift());
|
||||
} break;
|
||||
case KEY_DOWN: {
|
||||
shift_selection_check_pre(k->get_shift());
|
||||
if (get_cursor_position() == text.length()) {
|
||||
handled = false;
|
||||
}
|
||||
set_cursor_position(text.length());
|
||||
shift_selection_check_post(k->get_shift());
|
||||
} break;
|
||||
case KEY_DELETE: {
|
||||
if (!editable) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (k->get_shift() && !k->get_command() && !k->get_alt()) {
|
||||
cut_text();
|
||||
break;
|
||||
}
|
||||
|
||||
if (selection.enabled) {
|
||||
selection_delete();
|
||||
break;
|
||||
}
|
||||
|
||||
int text_len = text.length();
|
||||
|
||||
if (cursor_pos == text_len) {
|
||||
break; // Nothing to do.
|
||||
}
|
||||
|
||||
#ifdef APPLE_STYLE_KEYS
|
||||
if (k->get_alt()) {
|
||||
#else
|
||||
if (k->get_alt()) {
|
||||
handled = false;
|
||||
break;
|
||||
} else if (k->get_command()) {
|
||||
#endif
|
||||
int cc = cursor_pos;
|
||||
|
||||
Vector<Vector2i> words = TS->shaped_text_get_word_breaks(text_rid);
|
||||
for (int i = 0; i < words.size(); i++) {
|
||||
if (words[i].y > cc) {
|
||||
cc = words[i].y;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
delete_text(cursor_pos, cc);
|
||||
|
||||
} else {
|
||||
if (mid_grapheme_caret_enabled) {
|
||||
set_cursor_position(cursor_pos + 1);
|
||||
delete_char();
|
||||
} else {
|
||||
int cc = cursor_pos;
|
||||
set_cursor_position(TS->shaped_text_next_grapheme_pos(text_rid, cursor_pos));
|
||||
delete_text(cc, cursor_pos);
|
||||
}
|
||||
}
|
||||
|
||||
} break;
|
||||
case KEY_KP_7: {
|
||||
if (k->get_unicode() != 0) {
|
||||
handled = false;
|
||||
break;
|
||||
}
|
||||
[[fallthrough]];
|
||||
}
|
||||
case KEY_HOME: {
|
||||
shift_selection_check_pre(k->get_shift());
|
||||
set_cursor_position(0);
|
||||
shift_selection_check_post(k->get_shift());
|
||||
} break;
|
||||
case KEY_KP_1: {
|
||||
if (k->get_unicode() != 0) {
|
||||
handled = false;
|
||||
break;
|
||||
}
|
||||
[[fallthrough]];
|
||||
}
|
||||
case KEY_END: {
|
||||
shift_selection_check_pre(k->get_shift());
|
||||
set_cursor_position(text.length());
|
||||
shift_selection_check_post(k->get_shift());
|
||||
} break;
|
||||
case KEY_MENU: {
|
||||
if (context_menu_enabled) {
|
||||
Point2 pos = Point2(get_cursor_pixel_pos().x, (get_size().y + get_theme_font("font")->get_height(get_theme_font_size("font_size"))) / 2);
|
||||
menu->set_position(get_global_transform().xform(pos));
|
||||
menu->set_size(Vector2(1, 1));
|
||||
//menu->set_scale(get_global_transform().get_scale());
|
||||
menu->popup();
|
||||
menu->grab_focus();
|
||||
}
|
||||
} break;
|
||||
|
||||
default: {
|
||||
handled = false;
|
||||
} break;
|
||||
}
|
||||
|
||||
if (handled) {
|
||||
accept_event();
|
||||
} else if (!k->get_command()) {
|
||||
if (k->get_unicode() >= 32 && k->get_keycode() != KEY_DELETE) {
|
||||
if (editable) {
|
||||
selection_delete();
|
||||
char32_t ucodestr[2] = { (char32_t)k->get_unicode(), 0 };
|
||||
int prev_len = text.length();
|
||||
append_at_cursor(ucodestr);
|
||||
if (text.length() != prev_len) {
|
||||
_text_changed();
|
||||
}
|
||||
accept_event();
|
||||
}
|
||||
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
update();
|
||||
// BACKSPACE
|
||||
if (k->is_action("ui_text_backspace_all_to_left", true)) {
|
||||
_backspace(false, true);
|
||||
accept_event();
|
||||
return;
|
||||
}
|
||||
if (k->is_action("ui_text_backspace_word", true)) {
|
||||
_backspace(true);
|
||||
accept_event();
|
||||
return;
|
||||
}
|
||||
if (k->is_action("ui_text_backspace", true)) {
|
||||
_backspace();
|
||||
accept_event();
|
||||
return;
|
||||
}
|
||||
|
||||
return;
|
||||
// DELETE
|
||||
if (k->is_action("ui_text_delete_all_to_right", true)) {
|
||||
_delete(false, true);
|
||||
accept_event();
|
||||
return;
|
||||
}
|
||||
if (k->is_action("ui_text_delete_word", true)) {
|
||||
_delete(true);
|
||||
accept_event();
|
||||
return;
|
||||
}
|
||||
if (k->is_action("ui_text_delete", true)) {
|
||||
_delete();
|
||||
accept_event();
|
||||
return;
|
||||
}
|
||||
|
||||
// Cursor Movement
|
||||
|
||||
k = k->duplicate();
|
||||
bool shift_pressed = k->get_shift();
|
||||
// Remove shift or else actions will not match. Use above variable for selection.
|
||||
k->set_shift(false);
|
||||
|
||||
if (k->is_action("ui_text_caret_word_left", true)) {
|
||||
_move_cursor_left(shift_pressed, true);
|
||||
accept_event();
|
||||
return;
|
||||
}
|
||||
if (k->is_action("ui_text_caret_left", true)) {
|
||||
_move_cursor_left(shift_pressed);
|
||||
accept_event();
|
||||
return;
|
||||
}
|
||||
if (k->is_action("ui_text_caret_word_right", true)) {
|
||||
_move_cursor_right(shift_pressed, true);
|
||||
accept_event();
|
||||
return;
|
||||
}
|
||||
if (k->is_action("ui_text_caret_right", true)) {
|
||||
_move_cursor_right(shift_pressed, false);
|
||||
accept_event();
|
||||
return;
|
||||
}
|
||||
|
||||
// Up = Home, Down = End
|
||||
if (k->is_action("ui_text_caret_up", true) || k->is_action("ui_text_caret_line_start", true) || k->is_action("ui_text_caret_page_up", true)) {
|
||||
_move_cursor_start(shift_pressed);
|
||||
accept_event();
|
||||
return;
|
||||
}
|
||||
if (k->is_action("ui_text_caret_down", true) || k->is_action("ui_text_caret_line_end", true) || k->is_action("ui_text_caret_page_down", true)) {
|
||||
_move_cursor_end(shift_pressed);
|
||||
accept_event();
|
||||
return;
|
||||
}
|
||||
|
||||
// Misc
|
||||
if (k->is_action("ui_swap_input_direction", true)) {
|
||||
_swap_current_input_direction();
|
||||
accept_event();
|
||||
return;
|
||||
}
|
||||
|
||||
_reset_caret_blink_timer();
|
||||
|
||||
// Allow unicode handling if:
|
||||
// * No Modifiers are pressed (except shift)
|
||||
bool allow_unicode_handling = !(k->get_command() || k->get_control() || k->get_alt() || k->get_metakey());
|
||||
|
||||
if (allow_unicode_handling && editable && k->get_unicode() >= 32) {
|
||||
// Handle Unicode (if no modifiers active)
|
||||
selection_delete();
|
||||
char32_t ucodestr[2] = { (char32_t)k->get_unicode(), 0 };
|
||||
int prev_len = text.length();
|
||||
append_at_cursor(ucodestr);
|
||||
if (text.length() != prev_len) {
|
||||
_text_changed();
|
||||
}
|
||||
accept_event();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1013,13 +893,17 @@ void LineEdit::copy_text() {
|
||||
}
|
||||
|
||||
void LineEdit::cut_text() {
|
||||
if (selection.enabled && !pass) {
|
||||
if (editable && selection.enabled && !pass) {
|
||||
DisplayServer::get_singleton()->clipboard_set(text.substr(selection.begin, selection.end - selection.begin));
|
||||
selection_delete();
|
||||
}
|
||||
}
|
||||
|
||||
void LineEdit::paste_text() {
|
||||
if (!editable) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Strip escape characters like \n and \t as they can't be displayed on LineEdit.
|
||||
String paste_buffer = DisplayServer::get_singleton()->clipboard_get().strip_escapes();
|
||||
|
||||
@ -1040,6 +924,10 @@ void LineEdit::paste_text() {
|
||||
}
|
||||
|
||||
void LineEdit::undo() {
|
||||
if (!editable) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (undo_stack_pos == nullptr) {
|
||||
if (undo_stack.size() <= 1) {
|
||||
return;
|
||||
@ -1059,6 +947,10 @@ void LineEdit::undo() {
|
||||
}
|
||||
|
||||
void LineEdit::redo() {
|
||||
if (!editable) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (undo_stack_pos == nullptr) {
|
||||
return;
|
||||
}
|
||||
@ -2060,25 +1952,50 @@ void LineEdit::_create_undo_state() {
|
||||
undo_stack.push_back(op);
|
||||
}
|
||||
|
||||
int LineEdit::_get_menu_action_accelerator(const String &p_action) {
|
||||
const List<Ref<InputEvent>> *events = InputMap::get_singleton()->action_get_events(p_action);
|
||||
if (!events) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Use first event in the list for the accelerator.
|
||||
const List<Ref<InputEvent>>::Element *first_event = events->front();
|
||||
if (!first_event) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
const Ref<InputEventKey> event = first_event->get();
|
||||
if (event.is_null()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Use physical keycode if non-zero
|
||||
if (event->get_physical_keycode() != 0) {
|
||||
return event->get_physical_keycode_with_modifiers();
|
||||
} else {
|
||||
return event->get_keycode_with_modifiers();
|
||||
}
|
||||
}
|
||||
|
||||
void LineEdit::_generate_context_menu() {
|
||||
// Reorganize context menu.
|
||||
menu->clear();
|
||||
if (editable) {
|
||||
menu->add_item(RTR("Cut"), MENU_CUT, is_shortcut_keys_enabled() ? KEY_MASK_CMD | KEY_X : 0);
|
||||
menu->add_item(RTR("Cut"), MENU_CUT, is_shortcut_keys_enabled() ? _get_menu_action_accelerator("ui_cut") : 0);
|
||||
}
|
||||
menu->add_item(RTR("Copy"), MENU_COPY, is_shortcut_keys_enabled() ? KEY_MASK_CMD | KEY_C : 0);
|
||||
menu->add_item(RTR("Copy"), MENU_COPY, is_shortcut_keys_enabled() ? _get_menu_action_accelerator("ui_copy") : 0);
|
||||
if (editable) {
|
||||
menu->add_item(RTR("Paste"), MENU_PASTE, is_shortcut_keys_enabled() ? KEY_MASK_CMD | KEY_V : 0);
|
||||
menu->add_item(RTR("Paste"), MENU_PASTE, is_shortcut_keys_enabled() ? _get_menu_action_accelerator("ui_paste") : 0);
|
||||
}
|
||||
menu->add_separator();
|
||||
if (is_selecting_enabled()) {
|
||||
menu->add_item(RTR("Select All"), MENU_SELECT_ALL, is_shortcut_keys_enabled() ? KEY_MASK_CMD | KEY_A : 0);
|
||||
menu->add_item(RTR("Select All"), MENU_SELECT_ALL, is_shortcut_keys_enabled() ? _get_menu_action_accelerator("ui_text_select_all") : 0);
|
||||
}
|
||||
if (editable) {
|
||||
menu->add_item(RTR("Clear"), MENU_CLEAR);
|
||||
menu->add_separator();
|
||||
menu->add_item(RTR("Undo"), MENU_UNDO, is_shortcut_keys_enabled() ? KEY_MASK_CMD | KEY_Z : 0);
|
||||
menu->add_item(RTR("Redo"), MENU_REDO, is_shortcut_keys_enabled() ? KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_Z : 0);
|
||||
menu->add_item(RTR("Undo"), MENU_UNDO, is_shortcut_keys_enabled() ? _get_menu_action_accelerator("ui_undo") : 0);
|
||||
menu->add_item(RTR("Redo"), MENU_REDO, is_shortcut_keys_enabled() ? _get_menu_action_accelerator("ui_redo") : 0);
|
||||
}
|
||||
menu->add_separator();
|
||||
menu->add_submenu_item(RTR("Text writing direction"), "DirMenu");
|
||||
|
@ -163,6 +163,7 @@ private:
|
||||
void _clear_redo();
|
||||
void _create_undo_state();
|
||||
|
||||
int _get_menu_action_accelerator(const String &p_action);
|
||||
void _generate_context_menu();
|
||||
|
||||
void _shape();
|
||||
@ -188,6 +189,14 @@ private:
|
||||
|
||||
void _editor_settings_changed();
|
||||
|
||||
void _swap_current_input_direction();
|
||||
void _move_cursor_left(bool p_select, bool p_move_by_word = false);
|
||||
void _move_cursor_right(bool p_select, bool p_move_by_word = false);
|
||||
void _move_cursor_start(bool p_select);
|
||||
void _move_cursor_end(bool p_select);
|
||||
void _backspace(bool p_word = false, bool p_all_to_left = false);
|
||||
void _delete(bool p_word = false, bool p_all_to_right = false);
|
||||
|
||||
void _gui_input(Ref<InputEvent> p_event);
|
||||
void _notification(int p_what);
|
||||
|
||||
|
@ -1575,53 +1575,36 @@ void RichTextLabel::_gui_input(Ref<InputEvent> p_event) {
|
||||
Ref<InputEventKey> k = p_event;
|
||||
|
||||
if (k.is_valid()) {
|
||||
if (k->is_pressed() && !k->get_alt() && !k->get_shift()) {
|
||||
if (k->is_pressed()) {
|
||||
bool handled = false;
|
||||
switch (k->get_keycode()) {
|
||||
case KEY_PAGEUP: {
|
||||
if (vscroll->is_visible_in_tree()) {
|
||||
vscroll->set_value(vscroll->get_value() - vscroll->get_page());
|
||||
handled = true;
|
||||
}
|
||||
} break;
|
||||
case KEY_PAGEDOWN: {
|
||||
if (vscroll->is_visible_in_tree()) {
|
||||
vscroll->set_value(vscroll->get_value() + vscroll->get_page());
|
||||
handled = true;
|
||||
}
|
||||
} break;
|
||||
case KEY_UP: {
|
||||
if (vscroll->is_visible_in_tree()) {
|
||||
vscroll->set_value(vscroll->get_value() - get_theme_font("normal_font")->get_height(get_theme_font_size("normal_font_size")));
|
||||
handled = true;
|
||||
}
|
||||
} break;
|
||||
case KEY_DOWN: {
|
||||
if (vscroll->is_visible_in_tree()) {
|
||||
vscroll->set_value(vscroll->get_value() + get_theme_font("normal_font")->get_height(get_theme_font_size("normal_font_size")));
|
||||
handled = true;
|
||||
}
|
||||
} break;
|
||||
case KEY_HOME: {
|
||||
if (vscroll->is_visible_in_tree()) {
|
||||
vscroll->set_value(0);
|
||||
handled = true;
|
||||
}
|
||||
} break;
|
||||
case KEY_END: {
|
||||
if (vscroll->is_visible_in_tree()) {
|
||||
vscroll->set_value(vscroll->get_max());
|
||||
handled = true;
|
||||
}
|
||||
} break;
|
||||
case KEY_INSERT:
|
||||
case KEY_C: {
|
||||
if (k->get_command()) {
|
||||
selection_copy();
|
||||
handled = true;
|
||||
}
|
||||
|
||||
} break;
|
||||
if (k->is_action("ui_pageup") && vscroll->is_visible_in_tree()) {
|
||||
vscroll->set_value(vscroll->get_value() - vscroll->get_page());
|
||||
handled = true;
|
||||
}
|
||||
if (k->is_action("ui_pagedown") && vscroll->is_visible_in_tree()) {
|
||||
vscroll->set_value(vscroll->get_value() + vscroll->get_page());
|
||||
handled = true;
|
||||
}
|
||||
if (k->is_action("ui_up") && vscroll->is_visible_in_tree()) {
|
||||
vscroll->set_value(vscroll->get_value() - get_theme_font("normal_font")->get_height(get_theme_font_size("normal_font_size")));
|
||||
handled = true;
|
||||
}
|
||||
if (k->is_action("ui_down") && vscroll->is_visible_in_tree()) {
|
||||
vscroll->set_value(vscroll->get_value() + get_theme_font("normal_font")->get_height(get_theme_font_size("normal_font_size")));
|
||||
handled = true;
|
||||
}
|
||||
if (k->is_action("ui_home") && vscroll->is_visible_in_tree()) {
|
||||
vscroll->set_value(0);
|
||||
handled = true;
|
||||
}
|
||||
if (k->is_action("ui_end") && vscroll->is_visible_in_tree()) {
|
||||
vscroll->set_value(vscroll->get_max());
|
||||
handled = true;
|
||||
}
|
||||
if (k->is_action("ui_copy")) {
|
||||
selection_copy();
|
||||
handled = true;
|
||||
}
|
||||
|
||||
if (handled) {
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -408,6 +408,7 @@ private:
|
||||
int _get_control_height() const;
|
||||
|
||||
Point2 _get_local_mouse_pos() const;
|
||||
int _get_menu_action_accelerator(const String &p_action);
|
||||
|
||||
void _reset_caret_blink_timer();
|
||||
void _toggle_draw_caret();
|
||||
@ -441,6 +442,26 @@ private:
|
||||
int _calculate_spaces_till_next_left_indent(int column);
|
||||
int _calculate_spaces_till_next_right_indent(int column);
|
||||
|
||||
// Methods used in shortcuts
|
||||
void _swap_current_input_direction();
|
||||
void _new_line(bool p_split_current = true, bool p_above = false);
|
||||
void _indent_right();
|
||||
void _indent_left();
|
||||
void _move_cursor_left(bool p_select, bool p_move_by_word = false);
|
||||
void _move_cursor_right(bool p_select, bool p_move_by_word = false);
|
||||
void _move_cursor_up(bool p_select);
|
||||
void _move_cursor_down(bool p_select);
|
||||
void _move_cursor_to_line_start(bool p_select);
|
||||
void _move_cursor_to_line_end(bool p_select);
|
||||
void _move_cursor_page_up(bool p_select);
|
||||
void _move_cursor_page_down(bool p_select);
|
||||
void _backspace(bool p_word = false, bool p_all_to_left = false);
|
||||
void _delete(bool p_word = false, bool p_all_to_right = false);
|
||||
void _delete_selection();
|
||||
void _move_cursor_document_start(bool p_select);
|
||||
void _move_cursor_document_end(bool p_select);
|
||||
void _handle_unicode_character(uint32_t unicode, bool p_had_selection, bool p_update_auto_complete);
|
||||
|
||||
protected:
|
||||
struct Cache {
|
||||
Ref<Texture2D> tab_icon;
|
||||
@ -639,8 +660,8 @@ public:
|
||||
int get_row_height() const;
|
||||
void backspace_at_cursor();
|
||||
|
||||
void indent_left();
|
||||
void indent_right();
|
||||
void indent_selected_lines_left();
|
||||
void indent_selected_lines_right();
|
||||
int get_indent_level(int p_line) const;
|
||||
bool is_line_comment(int p_line) const;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user