From 4a71483a65726e15c80f83cbf3cdc2d1491e69ca Mon Sep 17 00:00:00 2001 From: Fabio Alessandrelli Date: Sun, 31 Dec 2017 04:42:25 +0100 Subject: [PATCH 1/7] Popupmenu now uses UI actions instead of keys --- scene/gui/popup_menu.cpp | 113 ++++++++++++++++----------------------- 1 file changed, 47 insertions(+), 66 deletions(-) diff --git a/scene/gui/popup_menu.cpp b/scene/gui/popup_menu.cpp index 89000fcde10c..150f185f10c1 100644 --- a/scene/gui/popup_menu.cpp +++ b/scene/gui/popup_menu.cpp @@ -211,86 +211,67 @@ void PopupMenu::_scroll(float p_factor, const Point2 &p_over) { void PopupMenu::_gui_input(const Ref &p_event) { - Ref k = p_event; + if (p_event->is_action("ui_down") && p_event->is_pressed()) { - if (k.is_valid()) { + int search_from = mouse_over + 1; + if (search_from >= items.size()) + search_from = 0; - if (!k->is_pressed()) - return; + for (int i = search_from; i < items.size(); i++) { - switch (k->get_scancode()) { + if (i < 0 || i >= items.size()) + continue; - case KEY_DOWN: { + if (!items[i].separator && !items[i].disabled) { - int search_from = mouse_over + 1; - if (search_from >= items.size()) - search_from = 0; + mouse_over = i; + update(); + accept_event(); + break; + } + } + } else if (p_event->is_action("ui_up") && p_event->is_pressed()) { - for (int i = search_from; i < items.size(); i++) { + int search_from = mouse_over - 1; + if (search_from < 0) + search_from = items.size() - 1; - if (i < 0 || i >= items.size()) - continue; + for (int i = search_from; i >= 0; i--) { - if (!items[i].separator && !items[i].disabled) { + if (i < 0 || i >= items.size()) + continue; - mouse_over = i; - update(); - break; - } - } - } break; - case KEY_UP: { + if (!items[i].separator && !items[i].disabled) { - int search_from = mouse_over - 1; - if (search_from < 0) - search_from = items.size() - 1; + mouse_over = i; + update(); + accept_event(); + break; + } + } + } else if (p_event->is_action("ui_left") && p_event->is_pressed()) { - for (int i = search_from; i >= 0; i--) { + Node *n = get_parent(); + if (n && Object::cast_to(n)) { + hide(); + accept_event(); + } + } else if (p_event->is_action("ui_right") && p_event->is_pressed()) { - if (i < 0 || i >= items.size()) - continue; + if (mouse_over >= 0 && mouse_over < items.size() && !items[mouse_over].separator && items[mouse_over].submenu != "" && submenu_over != mouse_over) { + _activate_submenu(mouse_over); + accept_event(); + } + } else if (p_event->is_action("ui_accept") && p_event->is_pressed()) { - if (!items[i].separator && !items[i].disabled) { + if (mouse_over >= 0 && mouse_over < items.size() && !items[mouse_over].separator) { - mouse_over = i; - update(); - break; - } - } - } break; - - case KEY_LEFT: { - - Node *n = get_parent(); - if (!n) - break; - - PopupMenu *pm = Object::cast_to(n); - if (!pm) - break; - - hide(); - } break; - - case KEY_RIGHT: { - - if (mouse_over >= 0 && mouse_over < items.size() && !items[mouse_over].separator && items[mouse_over].submenu != "" && submenu_over != mouse_over) - _activate_submenu(mouse_over); - } break; - - case KEY_ENTER: - case KEY_KP_ENTER: { - - if (mouse_over >= 0 && mouse_over < items.size() && !items[mouse_over].separator) { - - if (items[mouse_over].submenu != "" && submenu_over != mouse_over) { - _activate_submenu(mouse_over); - break; - } - - activate_item(mouse_over); - } - } break; + if (items[mouse_over].submenu != "" && submenu_over != mouse_over) { + _activate_submenu(mouse_over); + } else { + activate_item(mouse_over); + } + accept_event(); } } From e3eb6869068edb2617a311f89e93b92a9aa5b905 Mon Sep 17 00:00:00 2001 From: Fabio Alessandrelli Date: Sun, 31 Dec 2017 05:56:17 +0100 Subject: [PATCH 2/7] Tree now uses UI actions instead of keys --- scene/gui/tree.cpp | 594 ++++++++++++++++++++++----------------------- scene/gui/tree.h | 4 + 2 files changed, 299 insertions(+), 299 deletions(-) diff --git a/scene/gui/tree.cpp b/scene/gui/tree.cpp index cdbdc9b0d7e3..f08726fab8f9 100644 --- a/scene/gui/tree.cpp +++ b/scene/gui/tree.cpp @@ -2061,11 +2061,298 @@ void Tree::popup_select(int p_option) { item_edited(popup_edited_item_col, popup_edited_item); } +void Tree::_go_left() { + if (selected_col == 0) { + if (selected_item->get_children() != NULL && !selected_item->is_collapsed()) { + selected_item->set_collapsed(true); + } else { + if (columns.size() == 1) { // goto parent with one column + TreeItem *parent = selected_item->get_parent(); + if (selected_item != get_root() && parent && parent->is_selectable(selected_col) && !(hide_root && parent == get_root())) { + select_single_item(parent, get_root(), selected_col); + } + } else if (selected_item->get_prev_visible()) { + selected_col = columns.size() - 1; + _go_up(); // go to upper column if possible + } + } + } else { + if (select_mode == SELECT_MULTI) { + selected_col--; + emit_signal("cell_selected"); + } else { + + selected_item->select(selected_col - 1); + } + } + update(); + accept_event(); + ensure_cursor_is_visible(); +} + +void Tree::_go_right() { + if (selected_col == (columns.size() - 1)) { + if (selected_item->get_children() != NULL && selected_item->is_collapsed()) { + selected_item->set_collapsed(false); + } else if (selected_item->get_next_visible()) { + selected_item->select(0); + _go_down(); + return; + } + } else { + if (select_mode == SELECT_MULTI) { + selected_col++; + emit_signal("cell_selected"); + } else { + + selected_item->select(selected_col + 1); + } + } + update(); + ensure_cursor_is_visible(); + accept_event(); +} + +void Tree::_go_up() { + TreeItem *prev = NULL; + if (!selected_item) { + prev = get_last_item(); + selected_col = 0; + } else { + + prev = selected_item->get_prev_visible(); + if (last_keypress != 0) { + //incr search next + int col; + prev = _search_item_text(prev, incr_search, &col, true, true); + if (!prev) { + accept_event(); + return; + } + } + } + + if (select_mode == SELECT_MULTI) { + + if (!prev) + return; + selected_item = prev; + emit_signal("cell_selected"); + update(); + } else { + + int col = selected_col < 0 ? 0 : selected_col; + while (prev && !prev->cells[col].selectable) + prev = prev->get_prev_visible(); + if (!prev) + return; // do nothing.. + prev->select(col); + } + + ensure_cursor_is_visible(); + accept_event(); +} + +void Tree::_go_down() { + TreeItem *next = NULL; + if (!selected_item) { + + next = hide_root ? root->get_next_visible() : root; + selected_item = 0; + } else { + + next = selected_item->get_next_visible(); + + if (last_keypress != 0) { + //incr search next + int col; + next = _search_item_text(next, incr_search, &col, true); + if (!next) { + accept_event(); + return; + } + } + } + + if (select_mode == SELECT_MULTI) { + + if (!next) { + return; + } + + selected_item = next; + emit_signal("cell_selected"); + update(); + } else { + + int col = selected_col < 0 ? 0 : selected_col; + + while (next && !next->cells[col].selectable) + next = next->get_next_visible(); + if (!next) { + return; // do nothing.. + } + next->select(col); + } + + ensure_cursor_is_visible(); + accept_event(); +} + void Tree::_gui_input(Ref p_event) { Ref k = p_event; - if (k.is_valid()) { + if (p_event->is_action("ui_right") && p_event->is_pressed()) { + + if (!cursor_can_exit_tree) accept_event(); + + if (!selected_item || select_mode == SELECT_ROW || selected_col > (columns.size() - 1)) { + return; + } + if (k.is_valid() && k->get_alt()) { + selected_item->set_collapsed(false); + TreeItem *next = selected_item->get_children(); + while (next && next != selected_item->next) { + next->set_collapsed(false); + next = next->get_next_visible(); + } + } else { + _go_right(); + } + } else if (p_event->is_action("ui_left") && p_event->is_pressed()) { + + if (!cursor_can_exit_tree) accept_event(); + + if (!selected_item || select_mode == SELECT_ROW || selected_col < 0) { + return; + } + + if (k.is_valid() && k->get_alt()) { + selected_item->set_collapsed(true); + TreeItem *next = selected_item->get_children(); + while (next && next != selected_item->next) { + next->set_collapsed(true); + next = next->get_next_visible(); + } + } else { + _go_left(); + } + + } else if (p_event->is_action("ui_up") && p_event->is_pressed()) { + + if (!cursor_can_exit_tree) accept_event(); + + _go_up(); + + } else if (p_event->is_action("ui_down") && p_event->is_pressed()) { + + if (!cursor_can_exit_tree) accept_event(); + + _go_down(); + + } else if (p_event->is_action("ui_page_down") && p_event->is_pressed()) { + + if (!cursor_can_exit_tree) accept_event(); + + TreeItem *next = NULL; + if (!selected_item) + return; + next = selected_item; + + for (int i = 0; i < 10; i++) { + + TreeItem *_n = next->get_next_visible(); + if (_n) { + next = _n; + } else { + + return; + } + } + if (next == selected_item) + return; + + if (select_mode == SELECT_MULTI) { + + selected_item = next; + emit_signal("cell_selected"); + update(); + } else { + + while (next && !next->cells[selected_col].selectable) + next = next->get_next_visible(); + if (!next) { + return; // do nothing.. + } + next->select(selected_col); + } + + ensure_cursor_is_visible(); + } else if (p_event->is_action("ui_page_up") && p_event->is_pressed()) { + + if (!cursor_can_exit_tree) accept_event(); + + TreeItem *prev = NULL; + if (!selected_item) + return; + prev = selected_item; + + for (int i = 0; i < 10; i++) { + + TreeItem *_n = prev->get_prev_visible(); + if (_n) { + prev = _n; + } else { + + return; + } + } + if (prev == selected_item) + return; + + if (select_mode == SELECT_MULTI) { + + selected_item = prev; + emit_signal("cell_selected"); + update(); + } else { + + while (prev && !prev->cells[selected_col].selectable) + prev = prev->get_prev_visible(); + if (!prev) { + return; // do nothing.. + } + prev->select(selected_col); + } + ensure_cursor_is_visible(); + } else if (p_event->is_action("ui_accept") && p_event->is_pressed()) { + + if (selected_item) { + //bring up editor if possible + if (!edit_selected()) { + emit_signal("item_activated"); + incr_search.clear(); + } + } + accept_event(); + } else if (p_event->is_action("ui_select") && p_event->is_pressed()) { + + if (select_mode == SELECT_MULTI) { + if (!selected_item) + return; + if (selected_item->is_selected(selected_col)) { + selected_item->deselect(selected_col); + emit_signal("multi_selected", selected_item, selected_col, false); + } else if (selected_item->is_selectable(selected_col)) { + selected_item->select(selected_col); + emit_signal("multi_selected", selected_item, selected_col, true); + } + } + accept_event(); + } + + if (k.is_valid()) { // Incremental search if (!k->is_pressed()) return; @@ -2077,306 +2364,15 @@ void Tree::_gui_input(Ref p_event) { if (hide_root && !root->get_next_visible()) return; - switch (k->get_scancode()) { -#define EXIT_BREAK \ - { \ - if (!cursor_can_exit_tree) accept_event(); \ - break; \ - } - case KEY_RIGHT: { - bool dobreak = true; + if (k->get_unicode() > 0) { - //TreeItem *next = NULL; - if (!selected_item) - break; - if (select_mode == SELECT_ROW) { - EXIT_BREAK; - } - if (selected_col > (columns.size() - 1)) { - EXIT_BREAK; - } - if (k->get_alt()) { - selected_item->set_collapsed(false); - TreeItem *next = selected_item->get_children(); - while (next && next != selected_item->next) { - next->set_collapsed(false); - next = next->get_next_visible(); - } - } else if (selected_col == (columns.size() - 1)) { - if (selected_item->get_children() != NULL && selected_item->is_collapsed()) { - selected_item->set_collapsed(false); - } else { - selected_col = 0; - dobreak = false; // fall through to key_down - } - } else { - if (select_mode == SELECT_MULTI) { - selected_col++; - emit_signal("cell_selected"); - } else { + _do_incr_search(String::chr(k->get_unicode())); + accept_event(); - selected_item->select(selected_col + 1); - } - } - update(); - ensure_cursor_is_visible(); - accept_event(); - if (dobreak) { - break; - } - } - case KEY_DOWN: { - - TreeItem *next = NULL; - if (!selected_item) { - - next = hide_root ? root->get_next_visible() : root; - selected_item = 0; - } else { - - next = selected_item->get_next_visible(); - - //if (diff < uint64_t(GLOBAL_DEF("gui/incr_search_max_interval_msec",2000))) { - if (last_keypress != 0) { - //incr search next - int col; - next = _search_item_text(next, incr_search, &col, true); - if (!next) { - accept_event(); - return; - } - } - } - - if (select_mode == SELECT_MULTI) { - - if (!next) - EXIT_BREAK; - - selected_item = next; - emit_signal("cell_selected"); - update(); - } else { - - int col = selected_col < 0 ? 0 : selected_col; - - while (next && !next->cells[col].selectable) - next = next->get_next_visible(); - if (!next) - EXIT_BREAK; // do nothing.. - next->select(col); - } - - ensure_cursor_is_visible(); - accept_event(); - - } break; - case KEY_LEFT: { - bool dobreak = true; - - //TreeItem *next = NULL; - if (!selected_item) - break; - if (select_mode == SELECT_ROW) { - EXIT_BREAK; - } - if (selected_col < 0) { - EXIT_BREAK; - } - if (k->get_alt()) { - selected_item->set_collapsed(true); - TreeItem *next = selected_item->get_children(); - while (next && next != selected_item->next) { - next->set_collapsed(true); - next = next->get_next_visible(); - } - } else if (selected_col == 0) { - if (selected_item->get_children() != NULL && !selected_item->is_collapsed()) { - selected_item->set_collapsed(true); - } else { - if (columns.size() == 1) { // goto parent with one column - TreeItem *parent = selected_item->get_parent(); - if (selected_item != get_root() && parent && parent->is_selectable(selected_col) && !(hide_root && parent == get_root())) { - select_single_item(parent, get_root(), selected_col); - } - } else { - selected_col = columns.size() - 1; - dobreak = false; // fall through to key_up - } - } - } else { - if (select_mode == SELECT_MULTI) { - selected_col--; - emit_signal("cell_selected"); - } else { - - selected_item->select(selected_col - 1); - } - } - update(); - accept_event(); - ensure_cursor_is_visible(); - - if (dobreak) { - break; - } - } - case KEY_UP: { - - TreeItem *prev = NULL; - if (!selected_item) { - prev = get_last_item(); - selected_col = 0; - } else { - - prev = selected_item->get_prev_visible(); - if (last_keypress != 0) { - //incr search next - int col; - prev = _search_item_text(prev, incr_search, &col, true, true); - if (!prev) { - accept_event(); - return; - } - } - } - - if (select_mode == SELECT_MULTI) { - - if (!prev) - break; - selected_item = prev; - emit_signal("cell_selected"); - update(); - } else { - - int col = selected_col < 0 ? 0 : selected_col; - while (prev && !prev->cells[col].selectable) - prev = prev->get_prev_visible(); - if (!prev) - break; // do nothing.. - prev->select(col); - } - - ensure_cursor_is_visible(); - accept_event(); - - } break; - case KEY_PAGEDOWN: { - - TreeItem *next = NULL; - if (!selected_item) - break; - next = selected_item; - - for (int i = 0; i < 10; i++) { - - TreeItem *_n = next->get_next_visible(); - if (_n) { - next = _n; - } else { - - break; - } - } - if (next == selected_item) - break; - - if (select_mode == SELECT_MULTI) { - - selected_item = next; - emit_signal("cell_selected"); - update(); - } else { - - while (next && !next->cells[selected_col].selectable) - next = next->get_next_visible(); - if (!next) - EXIT_BREAK; // do nothing.. - next->select(selected_col); - } - - ensure_cursor_is_visible(); - } break; - case KEY_PAGEUP: { - - TreeItem *prev = NULL; - if (!selected_item) - break; - prev = selected_item; - - for (int i = 0; i < 10; i++) { - - TreeItem *_n = prev->get_prev_visible(); - if (_n) { - prev = _n; - } else { - - break; - } - } - if (prev == selected_item) - break; - - if (select_mode == SELECT_MULTI) { - - selected_item = prev; - emit_signal("cell_selected"); - update(); - } else { - - while (prev && !prev->cells[selected_col].selectable) - prev = prev->get_prev_visible(); - if (!prev) - EXIT_BREAK; // do nothing.. - prev->select(selected_col); - } - - ensure_cursor_is_visible(); - - } break; - case KEY_F2: - case KEY_ENTER: - case KEY_KP_ENTER: { - - if (selected_item) { - //bring up editor if possible - if (!edit_selected()) { - emit_signal("item_activated"); - incr_search.clear(); - } - } - accept_event(); - - } break; - case KEY_SPACE: { - if (select_mode == SELECT_MULTI) { - if (!selected_item) - break; - if (selected_item->is_selected(selected_col)) { - selected_item->deselect(selected_col); - emit_signal("multi_selected", selected_item, selected_col, false); - } else if (selected_item->is_selectable(selected_col)) { - selected_item->select(selected_col); - emit_signal("multi_selected", selected_item, selected_col, true); - } - } - accept_event(); - - } break; - default: { - - if (k->get_unicode() > 0) { - - _do_incr_search(String::chr(k->get_unicode())); - accept_event(); - - return; - } else { - if (k->get_scancode() != KEY_SHIFT) - last_keypress = 0; - } - } break; + return; + } else { + if (k->get_scancode() != KEY_SHIFT) + last_keypress = 0; } } diff --git a/scene/gui/tree.h b/scene/gui/tree.h index 2a8546a7437f..5af66c5faa93 100644 --- a/scene/gui/tree.h +++ b/scene/gui/tree.h @@ -507,6 +507,10 @@ private: ValueEvaluator *evaluator; int _count_selected_items(TreeItem *p_from) const; + void _go_left(); + void _go_right(); + void _go_down(); + void _go_up(); protected: static void _bind_methods(); From e15fe296bdbcbab038fe0a918a3cb739826e8271 Mon Sep 17 00:00:00 2001 From: Fabio Alessandrelli Date: Fri, 12 Jan 2018 02:53:03 +0100 Subject: [PATCH 3/7] Line edit up/down focus pass through When line edit receive a up/down and the cursor is at beginning/end it will not set the input as handled --- scene/gui/line_edit.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scene/gui/line_edit.cpp b/scene/gui/line_edit.cpp index 03dc6686b8bd..5c0e8fefc706 100644 --- a/scene/gui/line_edit.cpp +++ b/scene/gui/line_edit.cpp @@ -373,12 +373,14 @@ void LineEdit::_gui_input(Ref p_event) { 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; From 59c23c136949afe6c08f601e30af8ae6d40e5949 Mon Sep 17 00:00:00 2001 From: Fabio Alessandrelli Date: Fri, 23 Feb 2018 12:10:23 +0100 Subject: [PATCH 4/7] Scrollbar now uses UI actions instead of keys --- scene/gui/scroll_bar.cpp | 57 ++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 31 deletions(-) diff --git a/scene/gui/scroll_bar.cpp b/scene/gui/scroll_bar.cpp index 95fcda2db33c..94e149c8a714 100644 --- a/scene/gui/scroll_bar.cpp +++ b/scene/gui/scroll_bar.cpp @@ -201,52 +201,47 @@ void ScrollBar::_gui_input(Ref p_event) { Ref k = p_event; - if (k.is_valid()) { + if (p_event->is_pressed()) { - if (!k->is_pressed()) - return; + if (p_event->is_action("ui_left")) { - switch (k->get_scancode()) { + if (orientation != HORIZONTAL) + return; + set_value(get_value() - (custom_step >= 0 ? custom_step : get_step())); - case KEY_LEFT: { + } else if (p_event->is_action("ui_right")) { - if (orientation != HORIZONTAL) - return; - set_value(get_value() - (custom_step >= 0 ? custom_step : get_step())); + if (orientation != HORIZONTAL) + return; + set_value(get_value() + (custom_step >= 0 ? custom_step : get_step())); - } break; - case KEY_RIGHT: { + } else if (p_event->is_action("ui_up")) { - if (orientation != HORIZONTAL) - return; - set_value(get_value() + (custom_step >= 0 ? custom_step : get_step())); + if (orientation != VERTICAL) + return; - } break; - case KEY_UP: { + set_value(get_value() - (custom_step >= 0 ? custom_step : get_step())); - if (orientation != VERTICAL) - return; + } else if (p_event->is_action("ui_down")) { - set_value(get_value() - (custom_step >= 0 ? custom_step : get_step())); + if (orientation != VERTICAL) + return; + set_value(get_value() + (custom_step >= 0 ? custom_step : get_step())); - } break; - case KEY_DOWN: { + } else if (k.is_valid()) { - if (orientation != VERTICAL) - return; - set_value(get_value() + (custom_step >= 0 ? custom_step : get_step())); + switch (k->get_scancode()) { + case KEY_HOME: { - } break; - case KEY_HOME: { + set_value(get_min()); - set_value(get_min()); + } break; + case KEY_END: { - } break; - case KEY_END: { + set_value(get_max()); - set_value(get_max()); - - } break; + } break; + } } } } From 90b94498443f72e9c6b17f922a2eba8ce3f04d6b Mon Sep 17 00:00:00 2001 From: Fabio Alessandrelli Date: Sat, 6 Jan 2018 07:50:15 +0100 Subject: [PATCH 5/7] Properly set input as handled when closing modal --- scene/main/viewport.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index 1ff1f4b6d80d..cb5a895574eb 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -2017,6 +2017,9 @@ void Viewport::_gui_input_event(Ref p_event) { top->notification(Control::NOTIFICATION_MODAL_CLOSE); top->_modal_stack_remove(); top->hide(); + // Close modal, set input as handled + get_tree()->set_input_as_handled(); + return; } } From ff122a7e1fe4e061e564978450ee8bf442247a36 Mon Sep 17 00:00:00 2001 From: Fabio Alessandrelli Date: Fri, 12 Jan 2018 02:53:35 +0100 Subject: [PATCH 6/7] Add item_focused signal to OptionButton And id_focused to Popupmenu. --- scene/gui/option_button.cpp | 7 +++++++ scene/gui/option_button.h | 1 + scene/gui/popup_menu.cpp | 3 +++ 3 files changed, 11 insertions(+) diff --git a/scene/gui/option_button.cpp b/scene/gui/option_button.cpp index 71c14810f6f1..6e53f11b991e 100644 --- a/scene/gui/option_button.cpp +++ b/scene/gui/option_button.cpp @@ -75,6 +75,10 @@ void OptionButton::_notification(int p_what) { } } +void OptionButton::_focused(int p_which) { + emit_signal("item_focused", p_which); +} + void OptionButton::_selected(int p_which) { int selid = -1; @@ -290,6 +294,7 @@ void OptionButton::get_translatable_strings(List *p_strings) const { void OptionButton::_bind_methods() { ClassDB::bind_method(D_METHOD("_selected"), &OptionButton::_selected); + ClassDB::bind_method(D_METHOD("_focused"), &OptionButton::_focused); ClassDB::bind_method(D_METHOD("add_item", "label", "id"), &OptionButton::add_item, DEFVAL(-1)); ClassDB::bind_method(D_METHOD("add_icon_item", "texture", "label", "id"), &OptionButton::add_icon_item); @@ -322,6 +327,7 @@ void OptionButton::_bind_methods() { // "selected" property must come after "items", otherwise GH-10213 occurs ADD_PROPERTY(PropertyInfo(Variant::INT, "selected"), "_select_int", "get_selected"); ADD_SIGNAL(MethodInfo("item_selected", PropertyInfo(Variant::INT, "ID"))); + ADD_SIGNAL(MethodInfo("item_focused", PropertyInfo(Variant::INT, "ID"))); } OptionButton::OptionButton() { @@ -336,6 +342,7 @@ OptionButton::OptionButton() { popup->set_as_toplevel(true); popup->set_pass_on_modal_close_click(false); popup->connect("id_pressed", this, "_selected"); + popup->connect("id_focused", this, "_focused"); } OptionButton::~OptionButton() { diff --git a/scene/gui/option_button.h b/scene/gui/option_button.h index f65fa1b63171..d5f866d806c2 100644 --- a/scene/gui/option_button.h +++ b/scene/gui/option_button.h @@ -43,6 +43,7 @@ class OptionButton : public Button { PopupMenu *popup; int current; + void _focused(int p_which); void _selected(int p_which); void _select(int p_which, bool p_emit = false); void _select_int(int p_which); diff --git a/scene/gui/popup_menu.cpp b/scene/gui/popup_menu.cpp index 150f185f10c1..747230e69ff9 100644 --- a/scene/gui/popup_menu.cpp +++ b/scene/gui/popup_menu.cpp @@ -225,6 +225,7 @@ void PopupMenu::_gui_input(const Ref &p_event) { if (!items[i].separator && !items[i].disabled) { mouse_over = i; + emit_signal("id_focused", i); update(); accept_event(); break; @@ -244,6 +245,7 @@ void PopupMenu::_gui_input(const Ref &p_event) { if (!items[i].separator && !items[i].disabled) { mouse_over = i; + emit_signal("id_focused", i); update(); accept_event(); break; @@ -1210,6 +1212,7 @@ void PopupMenu::_bind_methods() { ADD_PROPERTYNO(PropertyInfo(Variant::BOOL, "hide_on_state_item_selection"), "set_hide_on_state_item_selection", "is_hide_on_state_item_selection"); ADD_SIGNAL(MethodInfo("id_pressed", PropertyInfo(Variant::INT, "ID"))); + ADD_SIGNAL(MethodInfo("id_focused", PropertyInfo(Variant::INT, "ID"))); ADD_SIGNAL(MethodInfo("index_pressed", PropertyInfo(Variant::INT, "index"))); } From 920d2bfdfa582b81b0e47d8a0a5de5817289c6dc Mon Sep 17 00:00:00 2001 From: Fabio Alessandrelli Date: Fri, 23 Feb 2018 12:17:15 +0100 Subject: [PATCH 7/7] Add two new default actions ui_end, ui_home Used by Slider and Scrollbar --- core/input_map.cpp | 10 ++++++++++ core/project_settings.cpp | 14 ++++++++++++++ scene/gui/scroll_bar.cpp | 17 ++++------------- scene/gui/slider.cpp | 26 ++++++-------------------- 4 files changed, 34 insertions(+), 33 deletions(-) diff --git a/core/input_map.cpp b/core/input_map.cpp index a9ea1d9545f7..bd03d61196f3 100644 --- a/core/input_map.cpp +++ b/core/input_map.cpp @@ -282,6 +282,16 @@ void InputMap::load_default() { key->set_scancode(KEY_PAGEDOWN); action_add_event("ui_page_down", key); + add_action("ui_home"); + key.instance(); + key->set_scancode(KEY_HOME); + action_add_event("ui_home", key); + + add_action("ui_end"); + key.instance(); + key->set_scancode(KEY_END); + action_add_event("ui_end", key); + //set("display/window/handheld/orientation", "landscape"); } diff --git a/core/project_settings.cpp b/core/project_settings.cpp index 427fa77e6269..22cc592697c7 100644 --- a/core/project_settings.cpp +++ b/core/project_settings.cpp @@ -1027,6 +1027,20 @@ ProjectSettings::ProjectSettings() { GLOBAL_DEF("input/ui_page_down", va); input_presets.push_back("input/ui_page_down"); + va = Array(); + key.instance(); + key->set_scancode(KEY_HOME); + va.push_back(key); + GLOBAL_DEF("input/ui_home", va); + input_presets.push_back("input/ui_home"); + + va = Array(); + key.instance(); + key->set_scancode(KEY_END); + va.push_back(key); + GLOBAL_DEF("input/ui_end", va); + input_presets.push_back("input/ui_end"); + //GLOBAL_DEF("display/window/handheld/orientation", "landscape"); custom_prop_info["display/window/handheld/orientation"] = PropertyInfo(Variant::STRING, "display/window/handheld/orientation", PROPERTY_HINT_ENUM, "landscape,portrait,reverse_landscape,reverse_portrait,sensor_landscape,sensor_portrait,sensor"); diff --git a/scene/gui/scroll_bar.cpp b/scene/gui/scroll_bar.cpp index 94e149c8a714..e1cabd3f8895 100644 --- a/scene/gui/scroll_bar.cpp +++ b/scene/gui/scroll_bar.cpp @@ -199,8 +199,6 @@ void ScrollBar::_gui_input(Ref p_event) { } } - Ref k = p_event; - if (p_event->is_pressed()) { if (p_event->is_action("ui_left")) { @@ -228,20 +226,13 @@ void ScrollBar::_gui_input(Ref p_event) { return; set_value(get_value() + (custom_step >= 0 ? custom_step : get_step())); - } else if (k.is_valid()) { + } else if (p_event->is_action("ui_home")) { - switch (k->get_scancode()) { - case KEY_HOME: { + set_value(get_min()); - set_value(get_min()); + } else if (p_event->is_action("ui_end")) { - } break; - case KEY_END: { - - set_value(get_max()); - - } break; - } + set_value(get_max()); } } } diff --git a/scene/gui/slider.cpp b/scene/gui/slider.cpp index a7a1b499c3c1..46215c9277b2 100644 --- a/scene/gui/slider.cpp +++ b/scene/gui/slider.cpp @@ -118,28 +118,14 @@ void Slider::_gui_input(Ref p_event) { return; set_value(get_value() - (custom_step >= 0 ? custom_step : get_step())); accept_event(); + } else if (p_event->is_action("ui_home") && p_event->is_pressed()) { - } else { + set_value(get_min()); + accept_event(); + } else if (p_event->is_action("ui_end") && p_event->is_pressed()) { - Ref k = p_event; - - if (!k.is_valid() || !k->is_pressed()) - return; - - switch (k->get_scancode()) { - - case KEY_HOME: { - - set_value(get_min()); - accept_event(); - } break; - case KEY_END: { - - set_value(get_max()); - accept_event(); - - } break; - } + set_value(get_max()); + accept_event(); } } }