Example #1
0
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();
		}
	}
}
Example #2
0
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();
			}
		}
	}
}
Example #3
0
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();
		}
	}
}
Example #4
0
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;
					}
				}
			}
		}
	}
}