コード例 #1
0
ファイル: base_button.cpp プロジェクト: Ranakhamis/godot
void BaseButton::set_pressed(bool p_pressed) {

	if (!toggle_mode)
		return;
	if (status.pressed == p_pressed)
		return;
	_change_notify("pressed");
	status.pressed = p_pressed;

	if (p_pressed) {
		_unpress_group();
	}
	update();
}
コード例 #2
0
ファイル: base_button.cpp プロジェクト: Ranakhamis/godot
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 || b->get_button_index() != 1)
			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();
		}
	}
}
コード例 #3
0
ファイル: base_button.cpp プロジェクト: MattUV/godot
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();
			}
		}
	}
}