void ProjectManager::_unhandled_input(const InputEvent& p_ev) { if (p_ev.type==InputEvent::KEY) { const InputEventKey &k = p_ev.key; if (!k.pressed) return; bool scancode_handled = true; switch (k.scancode) { case KEY_RETURN: { _open_project(); } break; case KEY_HOME: { for (int i=0; i<scroll_childs->get_child_count(); i++) { HBoxContainer *hb = scroll_childs->get_child(i)->cast_to<HBoxContainer>(); if (hb) { selected_list.clear(); selected_list.insert(hb->get_meta("name"), hb->get_meta("main_scene")); scroll->set_v_scroll(0); _update_project_buttons(); break; } } } break; case KEY_END: { for (int i=scroll_childs->get_child_count()-1; i>=0; i--) { HBoxContainer *hb = scroll_childs->get_child(i)->cast_to<HBoxContainer>(); if (hb) { selected_list.clear(); selected_list.insert(hb->get_meta("name"), hb->get_meta("main_scene")); scroll->set_v_scroll(scroll_childs->get_size().y); _update_project_buttons(); break; } } } break; case KEY_UP: { if (k.mod.shift) break; if (selected_list.size()) { bool found = false; for (int i=scroll_childs->get_child_count()-1; i>=0; i--) { HBoxContainer *hb = scroll_childs->get_child(i)->cast_to<HBoxContainer>(); if (!hb) continue; String current = hb->get_meta("name"); if (found) { selected_list.clear(); selected_list.insert(current, hb->get_meta("main_scene")); int offset_diff = scroll->get_v_scroll() - hb->get_pos().y; if (offset_diff > 0) scroll->set_v_scroll(scroll->get_v_scroll() - offset_diff); _update_project_buttons(); break; } else if (current==selected_list.back()->key()) { found = true; } } break; } // else fallthrough to key_down } case KEY_DOWN: { if (k.mod.shift) break; bool found = selected_list.empty(); for (int i=0; i<scroll_childs->get_child_count(); i++) { HBoxContainer *hb = scroll_childs->get_child(i)->cast_to<HBoxContainer>(); if (!hb) continue; String current = hb->get_meta("name"); if (found) { selected_list.clear(); selected_list.insert(current, hb->get_meta("main_scene")); int last_y_visible = scroll->get_v_scroll() + scroll->get_size().y; int offset_diff = (hb->get_pos().y + hb->get_size().y) - last_y_visible; if (offset_diff > 0) scroll->set_v_scroll(scroll->get_v_scroll() + offset_diff); _update_project_buttons(); break; } else if (current==selected_list.back()->key()) { found = true; } } } break; case KEY_F: { if (k.mod.command) this->project_filter->search_box->grab_focus(); else scancode_handled = false; } break; default: { scancode_handled = false; } break; } if (scancode_handled) { accept_event(); } } }
void BaseButton::_gui_input(InputEvent p_event) { if (status.disabled) // no interaction with disabled button return; switch (p_event.type) { case InputEvent::MOUSE_BUTTON: { const InputEventMouseButton &b = p_event.mouse_button; if (status.disabled || b.button_index != 1) return; if (status.pressing_button) break; if (action_mode == ACTION_MODE_BUTTON_PRESS) { if (b.pressed) { emit_signal("button_down"); if (!toggle_mode) { //mouse press attempt status.press_attempt = true; status.pressing_inside = true; pressed(); if (get_script_instance()) { Variant::CallError ce; get_script_instance()->call(SceneStringNames::get_singleton()->_pressed, NULL, 0, ce); } emit_signal("pressed"); _unpress_group(); } else { status.pressed = !status.pressed; pressed(); if (get_script_instance()) { Variant::CallError ce; get_script_instance()->call(SceneStringNames::get_singleton()->_pressed, NULL, 0, ce); } emit_signal("pressed"); _unpress_group(); toggled(status.pressed); emit_signal("toggled", status.pressed); } } else { emit_signal("button_up"); /* this is pointless if (status.press_attempt && status.pressing_inside) { //released(); emit_signal("released"); } */ status.press_attempt = false; } update(); break; } if (b.pressed) { status.press_attempt = true; status.pressing_inside = true; emit_signal("button_down"); } else { emit_signal("button_up"); if (status.press_attempt && status.pressing_inside) { if (!toggle_mode) { //mouse press attempt pressed(); if (get_script_instance()) { Variant::CallError ce; get_script_instance()->call(SceneStringNames::get_singleton()->_pressed, NULL, 0, ce); } emit_signal("pressed"); } else { status.pressed = !status.pressed; pressed(); emit_signal("pressed"); toggled(status.pressed); emit_signal("toggled", status.pressed); if (get_script_instance()) { get_script_instance()->call(SceneStringNames::get_singleton()->_toggled, status.pressed); } } _unpress_group(); } status.press_attempt = false; } update(); } break; case InputEvent::MOUSE_MOTION: { if (status.press_attempt && status.pressing_button == 0) { bool last_press_inside = status.pressing_inside; status.pressing_inside = has_point(Point2(p_event.mouse_motion.x, p_event.mouse_motion.y)); if (last_press_inside != status.pressing_inside) update(); } } break; case InputEvent::ACTION: case InputEvent::JOYPAD_BUTTON: case InputEvent::KEY: { if (p_event.is_echo()) { break; } if (status.disabled) { break; } if (status.press_attempt && status.pressing_button == 0) { break; } if (p_event.is_action("ui_accept")) { if (p_event.is_pressed()) { status.pressing_button++; status.press_attempt = true; status.pressing_inside = true; emit_signal("button_down"); } else if (status.press_attempt) { if (status.pressing_button) status.pressing_button--; if (status.pressing_button) break; status.press_attempt = false; status.pressing_inside = false; emit_signal("button_up"); if (!toggle_mode) { //mouse press attempt pressed(); emit_signal("pressed"); } else { status.pressed = !status.pressed; pressed(); emit_signal("pressed"); toggled(status.pressed); if (get_script_instance()) { get_script_instance()->call(SceneStringNames::get_singleton()->_toggled, status.pressed); } emit_signal("toggled", status.pressed); } _unpress_group(); } accept_event(); update(); } } } }
void BaseButton::_gui_input(Ref<InputEvent> p_event) { if (status.disabled) // no interaction with disabled button return; Ref<InputEventMouseButton> b = p_event; if (b.is_valid()) { if (status.disabled || ((1 << (b->get_button_index() - 1)) & button_mask) == 0) return; if (status.pressing_button) return; if (action_mode == ACTION_MODE_BUTTON_PRESS) { if (b->is_pressed()) { emit_signal("button_down"); if (!toggle_mode) { //mouse press attempt status.press_attempt = true; status.pressing_inside = true; pressed(); if (get_script_instance()) { Variant::CallError ce; get_script_instance()->call(SceneStringNames::get_singleton()->_pressed, NULL, 0, ce); } emit_signal("pressed"); _unpress_group(); } else { status.pressed = !status.pressed; pressed(); emit_signal("pressed"); _unpress_group(); toggled(status.pressed); if (get_script_instance()) { get_script_instance()->call(SceneStringNames::get_singleton()->_toggled, status.pressed); } emit_signal("toggled", status.pressed); } } else { emit_signal("button_up"); /* this is pointless if (status.press_attempt && status.pressing_inside) { //released(); emit_signal("released"); } */ status.press_attempt = false; } update(); return; } if (b->is_pressed()) { status.press_attempt = true; status.pressing_inside = true; emit_signal("button_down"); } else { emit_signal("button_up"); if (status.press_attempt && status.pressing_inside) { if (!toggle_mode) { //mouse press attempt pressed(); if (get_script_instance()) { Variant::CallError ce; get_script_instance()->call(SceneStringNames::get_singleton()->_pressed, NULL, 0, ce); } emit_signal("pressed"); } else { status.pressed = !status.pressed; pressed(); emit_signal("pressed"); toggled(status.pressed); if (get_script_instance()) { get_script_instance()->call(SceneStringNames::get_singleton()->_toggled, status.pressed); } emit_signal("toggled", status.pressed); } _unpress_group(); } status.press_attempt = false; } update(); } Ref<InputEventMouseMotion> mm = p_event; if (mm.is_valid()) { if (status.press_attempt && status.pressing_button == 0) { bool last_press_inside = status.pressing_inside; status.pressing_inside = has_point(mm->get_position()); if (last_press_inside != status.pressing_inside) update(); } } if (!mm.is_valid() && !b.is_valid()) { if (p_event->is_echo()) { return; } if (status.disabled) { return; } if (status.press_attempt && status.pressing_button == 0) { return; } if (p_event->is_action("ui_accept")) { if (p_event->is_pressed()) { status.pressing_button++; status.press_attempt = true; status.pressing_inside = true; emit_signal("button_down"); } else if (status.press_attempt) { if (status.pressing_button) status.pressing_button--; if (status.pressing_button) return; status.press_attempt = false; status.pressing_inside = false; emit_signal("button_up"); if (!toggle_mode) { //mouse press attempt pressed(); if (get_script_instance()) { Variant::CallError ce; get_script_instance()->call(SceneStringNames::get_singleton()->_pressed, NULL, 0, ce); } emit_signal("pressed"); } else { status.pressed = !status.pressed; pressed(); emit_signal("pressed"); toggled(status.pressed); if (get_script_instance()) { get_script_instance()->call(SceneStringNames::get_singleton()->_toggled, status.pressed); } emit_signal("toggled", status.pressed); } _unpress_group(); } accept_event(); update(); } } }
void ItemList::_gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseMotion> mm = p_event; if (defer_select_single >= 0 && mm.is_valid()) { defer_select_single = -1; return; } Ref<InputEventMouseButton> mb = p_event; if (defer_select_single >= 0 && mb.is_valid() && mb->get_button_index() == BUTTON_LEFT && !mb->is_pressed()) { select(defer_select_single, true); emit_signal("multi_selected", defer_select_single, true); defer_select_single = -1; return; } if (mb.is_valid() && (mb->get_button_index() == BUTTON_LEFT || (allow_rmb_select && mb->get_button_index() == BUTTON_RIGHT)) && mb->is_pressed()) { search_string = ""; //any mousepress cancels Vector2 pos = mb->get_position(); Ref<StyleBox> bg = get_stylebox("bg"); pos -= bg->get_offset(); pos.y += scroll_bar->get_value(); int closest = -1; for (int i = 0; i < items.size(); i++) { Rect2 rc = items[i].rect_cache; if (i % current_columns == current_columns - 1) { rc.size.width = get_size().width; //not right but works } if (rc.has_point(pos)) { closest = i; break; } } if (closest != -1) { int i = closest; if (select_mode == SELECT_MULTI && items[i].selected && mb->get_command()) { unselect(i); emit_signal("multi_selected", i, false); } else if (select_mode == SELECT_MULTI && mb->get_shift() && current >= 0 && current < items.size() && current != i) { int from = current; int to = i; if (i < current) { SWAP(from, to); } for (int j = from; j <= to; j++) { bool selected = !items[j].selected; select(j, false); if (selected) emit_signal("multi_selected", i, true); } if (mb->get_button_index() == BUTTON_RIGHT) { emit_signal("item_rmb_selected", i, get_local_mouse_position()); } } else { if (!mb->is_doubleclick() && !mb->get_command() && select_mode == SELECT_MULTI && items[i].selectable && !items[i].disabled && items[i].selected && mb->get_button_index() == BUTTON_LEFT) { defer_select_single = i; return; } if (items[i].selected && mb->get_button_index() == BUTTON_RIGHT) { emit_signal("item_rmb_selected", i, get_local_mouse_position()); } else { bool selected = !items[i].selected; select(i, select_mode == SELECT_SINGLE || !mb->get_command()); if (selected) { if (select_mode == SELECT_SINGLE) { emit_signal("item_selected", i); } else emit_signal("multi_selected", i, true); } if (mb->get_button_index() == BUTTON_RIGHT) { emit_signal("item_rmb_selected", i, get_local_mouse_position()); } else if (/*select_mode==SELECT_SINGLE &&*/ mb->is_doubleclick()) { emit_signal("item_activated", i); } } } return; } } if (mb.is_valid() && mb->get_button_index() == BUTTON_WHEEL_UP && mb->is_pressed()) { scroll_bar->set_value(scroll_bar->get_value() - scroll_bar->get_page() * mb->get_factor() / 8); } if (mb.is_valid() && mb->get_button_index() == BUTTON_WHEEL_DOWN && mb->is_pressed()) { scroll_bar->set_value(scroll_bar->get_value() + scroll_bar->get_page() * mb->get_factor() / 8); } if (p_event->is_pressed() && items.size() > 0) { if (p_event->is_action("ui_up")) { if (search_string != "") { uint64_t now = OS::get_singleton()->get_ticks_msec(); uint64_t diff = now - search_time_msec; if (diff < uint64_t(ProjectSettings::get_singleton()->get("gui/timers/incremental_search_max_interval_msec")) * 2) { for (int i = current - 1; i >= 0; i--) { if (items[i].text.begins_with(search_string)) { set_current(i); ensure_current_is_visible(); if (select_mode == SELECT_SINGLE) { emit_signal("item_selected", current); } break; } } accept_event(); return; } } if (current >= current_columns) { set_current(current - current_columns); ensure_current_is_visible(); if (select_mode == SELECT_SINGLE) { emit_signal("item_selected", current); } accept_event(); } } else if (p_event->is_action("ui_down")) { if (search_string != "") { uint64_t now = OS::get_singleton()->get_ticks_msec(); uint64_t diff = now - search_time_msec; if (diff < uint64_t(ProjectSettings::get_singleton()->get("gui/timers/incremental_search_max_interval_msec")) * 2) { for (int i = current + 1; i < items.size(); i++) { if (items[i].text.begins_with(search_string)) { set_current(i); ensure_current_is_visible(); if (select_mode == SELECT_SINGLE) { emit_signal("item_selected", current); } break; } } accept_event(); return; } } if (current < items.size() - current_columns) { set_current(current + current_columns); ensure_current_is_visible(); if (select_mode == SELECT_SINGLE) { emit_signal("item_selected", current); } accept_event(); } } else if (p_event->is_action("ui_page_up")) { search_string = ""; //any mousepress cancels for (int i = 4; i > 0; i--) { if (current - current_columns * i >= 0) { set_current(current - current_columns * i); ensure_current_is_visible(); if (select_mode == SELECT_SINGLE) { emit_signal("item_selected", current); } accept_event(); break; } } } else if (p_event->is_action("ui_page_down")) { search_string = ""; //any mousepress cancels for (int i = 4; i > 0; i--) { if (current + current_columns * i < items.size()) { set_current(current + current_columns * i); ensure_current_is_visible(); if (select_mode == SELECT_SINGLE) { emit_signal("item_selected", current); } accept_event(); break; } } } else if (p_event->is_action("ui_left")) { search_string = ""; //any mousepress cancels if (current % current_columns != 0) { set_current(current - 1); ensure_current_is_visible(); if (select_mode == SELECT_SINGLE) { emit_signal("item_selected", current); } accept_event(); } } else if (p_event->is_action("ui_right")) { search_string = ""; //any mousepress cancels if (current % current_columns != (current_columns - 1)) { set_current(current + 1); ensure_current_is_visible(); if (select_mode == SELECT_SINGLE) { emit_signal("item_selected", current); } accept_event(); } } else if (p_event->is_action("ui_cancel")) { search_string = ""; } else if (p_event->is_action("ui_select")) { if (select_mode == SELECT_MULTI && current >= 0 && current < items.size()) { if (items[current].selectable && !items[current].disabled && !items[current].selected) { select(current, false); emit_signal("multi_selected", current, true); } else if (items[current].selected) { unselect(current); emit_signal("multi_selected", current, false); } } } else if (p_event->is_action("ui_accept")) { search_string = ""; //any mousepress cance if (current >= 0 && current < items.size()) { emit_signal("item_activated", current); } } else { Ref<InputEventKey> k = p_event; if (k.is_valid() && k->get_unicode()) { uint64_t now = OS::get_singleton()->get_ticks_msec(); uint64_t diff = now - search_time_msec; uint64_t max_interval = uint64_t(GLOBAL_DEF("gui/timers/incremental_search_max_interval_msec", 2000)); search_time_msec = now; if (diff > max_interval) { search_string = ""; } search_string += String::chr(k->get_unicode()); for (int i = 0; i < items.size(); i++) { if (items[i].text.begins_with(search_string)) { set_current(i); ensure_current_is_visible(); if (select_mode == SELECT_SINGLE) { emit_signal("item_selected", current); } break; } } } } } }