|
@@ -211,86 +211,67 @@ void PopupMenu::_scroll(float p_factor, const Point2 &p_over) {
|
|
|
|
|
|
void PopupMenu::_gui_input(const Ref<InputEvent> &p_event) {
|
|
void PopupMenu::_gui_input(const Ref<InputEvent> &p_event) {
|
|
|
|
|
|
- Ref<InputEventKey> k = p_event;
|
|
|
|
-
|
|
|
|
- if (k.is_valid()) {
|
|
|
|
-
|
|
|
|
- if (!k->is_pressed())
|
|
|
|
- return;
|
|
|
|
-
|
|
|
|
- switch (k->get_scancode()) {
|
|
|
|
-
|
|
|
|
- case KEY_DOWN: {
|
|
|
|
-
|
|
|
|
- int search_from = mouse_over + 1;
|
|
|
|
- if (search_from >= items.size())
|
|
|
|
- search_from = 0;
|
|
|
|
-
|
|
|
|
- for (int i = search_from; i < items.size(); i++) {
|
|
|
|
|
|
+ if (p_event->is_action("ui_down") && p_event->is_pressed()) {
|
|
|
|
|
|
- if (i < 0 || i >= items.size())
|
|
|
|
- continue;
|
|
|
|
|
|
+ int search_from = mouse_over + 1;
|
|
|
|
+ if (search_from >= items.size())
|
|
|
|
+ search_from = 0;
|
|
|
|
|
|
- if (!items[i].separator && !items[i].disabled) {
|
|
|
|
|
|
+ for (int i = search_from; i < items.size(); i++) {
|
|
|
|
|
|
- mouse_over = i;
|
|
|
|
- update();
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- } break;
|
|
|
|
- case KEY_UP: {
|
|
|
|
-
|
|
|
|
- int search_from = mouse_over - 1;
|
|
|
|
- if (search_from < 0)
|
|
|
|
- search_from = items.size() - 1;
|
|
|
|
-
|
|
|
|
- for (int i = search_from; i >= 0; i--) {
|
|
|
|
-
|
|
|
|
- if (i < 0 || i >= items.size())
|
|
|
|
- continue;
|
|
|
|
-
|
|
|
|
- if (!items[i].separator && !items[i].disabled) {
|
|
|
|
|
|
+ if (i < 0 || i >= items.size())
|
|
|
|
+ continue;
|
|
|
|
|
|
- mouse_over = i;
|
|
|
|
- update();
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- } break;
|
|
|
|
|
|
+ if (!items[i].separator && !items[i].disabled) {
|
|
|
|
|
|
- case KEY_LEFT: {
|
|
|
|
|
|
+ mouse_over = i;
|
|
|
|
+ update();
|
|
|
|
+ accept_event();
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } else if (p_event->is_action("ui_up") && p_event->is_pressed()) {
|
|
|
|
|
|
- Node *n = get_parent();
|
|
|
|
- if (!n)
|
|
|
|
- break;
|
|
|
|
|
|
+ int search_from = mouse_over - 1;
|
|
|
|
+ if (search_from < 0)
|
|
|
|
+ search_from = items.size() - 1;
|
|
|
|
|
|
- PopupMenu *pm = Object::cast_to<PopupMenu>(n);
|
|
|
|
- if (!pm)
|
|
|
|
- break;
|
|
|
|
|
|
+ for (int i = search_from; i >= 0; i--) {
|
|
|
|
|
|
- hide();
|
|
|
|
- } break;
|
|
|
|
|
|
+ if (i < 0 || i >= items.size())
|
|
|
|
+ continue;
|
|
|
|
|
|
- case KEY_RIGHT: {
|
|
|
|
|
|
+ if (!items[i].separator && !items[i].disabled) {
|
|
|
|
|
|
- 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;
|
|
|
|
|
|
+ mouse_over = i;
|
|
|
|
+ update();
|
|
|
|
+ accept_event();
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } else if (p_event->is_action("ui_left") && p_event->is_pressed()) {
|
|
|
|
|
|
- case KEY_ENTER:
|
|
|
|
- case KEY_KP_ENTER: {
|
|
|
|
|
|
+ Node *n = get_parent();
|
|
|
|
+ if (n && Object::cast_to<PopupMenu>(n)) {
|
|
|
|
+ hide();
|
|
|
|
+ accept_event();
|
|
|
|
+ }
|
|
|
|
+ } else if (p_event->is_action("ui_right") && p_event->is_pressed()) {
|
|
|
|
|
|
- if (mouse_over >= 0 && mouse_over < items.size() && !items[mouse_over].separator) {
|
|
|
|
|
|
+ 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[mouse_over].submenu != "" && submenu_over != mouse_over) {
|
|
|
|
- _activate_submenu(mouse_over);
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
|
|
+ if (mouse_over >= 0 && mouse_over < items.size() && !items[mouse_over].separator) {
|
|
|
|
|
|
- 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();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|