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(); }
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(); } } }
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(); } } } }