Merge pull request #7722 from RandomShaper/improve-touch-button
Fix touch button issues
This commit is contained in:
commit
53b7bbfcce
|
@ -145,8 +145,12 @@ void TouchScreenButton::_notification(int p_what) {
|
||||||
} break;
|
} break;
|
||||||
case NOTIFICATION_EXIT_TREE: {
|
case NOTIFICATION_EXIT_TREE: {
|
||||||
if (is_pressed())
|
if (is_pressed())
|
||||||
Input::get_singleton()->action_release(action);
|
_release(true);
|
||||||
} break;
|
} break;
|
||||||
|
case NOTIFICATION_PAUSED: {
|
||||||
|
// So the button can be pressed again even though the release gets unhandled because of coming during pause
|
||||||
|
allow_repress=true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -184,22 +188,7 @@ void TouchScreenButton::_input(const InputEvent& p_event) {
|
||||||
|
|
||||||
if (p_event.type==InputEvent::SCREEN_TOUCH && !p_event.screen_touch.pressed && finger_pressed==p_event.screen_touch.index) {
|
if (p_event.type==InputEvent::SCREEN_TOUCH && !p_event.screen_touch.pressed && finger_pressed==p_event.screen_touch.index) {
|
||||||
|
|
||||||
emit_signal("released");
|
_release();
|
||||||
|
|
||||||
if (action_id!=-1) {
|
|
||||||
|
|
||||||
Input::get_singleton()->action_release(action);
|
|
||||||
InputEvent ie;
|
|
||||||
ie.type=InputEvent::ACTION;
|
|
||||||
ie.ID=0;
|
|
||||||
ie.action.action=action_id;
|
|
||||||
ie.action.pressed=false;
|
|
||||||
get_tree()->input_event(ie);
|
|
||||||
}
|
|
||||||
finger_pressed=-1;
|
|
||||||
|
|
||||||
update();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((p_event.type==InputEvent::SCREEN_TOUCH && p_event.screen_touch.pressed)|| p_event.type==InputEvent::SCREEN_DRAG) {
|
if ((p_event.type==InputEvent::SCREEN_TOUCH && p_event.screen_touch.pressed)|| p_event.type==InputEvent::SCREEN_DRAG) {
|
||||||
|
@ -225,44 +214,12 @@ void TouchScreenButton::_input(const InputEvent& p_event) {
|
||||||
|
|
||||||
|
|
||||||
if (touched) {
|
if (touched) {
|
||||||
|
|
||||||
if (finger_pressed==-1) {
|
if (finger_pressed==-1) {
|
||||||
finger_pressed=p_event.screen_touch.index;
|
_press(p_event.screen_touch.index);
|
||||||
//emit change stuff
|
|
||||||
emit_signal("pressed");
|
|
||||||
if (action_id!=-1) {
|
|
||||||
|
|
||||||
Input::get_singleton()->action_press(action);
|
|
||||||
InputEvent ie;
|
|
||||||
ie.type=InputEvent::ACTION;
|
|
||||||
ie.ID=0;
|
|
||||||
ie.action.action=action_id;
|
|
||||||
ie.action.pressed=true;
|
|
||||||
get_tree()->input_event(ie);
|
|
||||||
}
|
|
||||||
|
|
||||||
update();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
if (finger_pressed!=-1) {
|
if (finger_pressed!=-1) {
|
||||||
|
_release();
|
||||||
emit_signal("released");
|
|
||||||
|
|
||||||
if (action_id!=-1) {
|
|
||||||
|
|
||||||
Input::get_singleton()->action_release(action);
|
|
||||||
InputEvent ie;
|
|
||||||
ie.type=InputEvent::ACTION;
|
|
||||||
ie.ID=0;
|
|
||||||
ie.action.action=action_id;
|
|
||||||
ie.action.pressed=false;
|
|
||||||
get_tree()->input_event(ie);
|
|
||||||
}
|
|
||||||
finger_pressed=-1;
|
|
||||||
|
|
||||||
update();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -280,7 +237,8 @@ void TouchScreenButton::_input(const InputEvent& p_event) {
|
||||||
if (!is_visible_in_tree())
|
if (!is_visible_in_tree())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (finger_pressed!=-1)
|
const bool can_press=finger_pressed==-1 || allow_repress;
|
||||||
|
if (!can_press)
|
||||||
return; //already fingering
|
return; //already fingering
|
||||||
|
|
||||||
Point2 coord = (get_global_transform_with_canvas()).affine_inverse().xform(Point2(p_event.screen_touch.x,p_event.screen_touch.y));
|
Point2 coord = (get_global_transform_with_canvas()).affine_inverse().xform(Point2(p_event.screen_touch.x,p_event.screen_touch.y));
|
||||||
|
@ -311,51 +269,59 @@ void TouchScreenButton::_input(const InputEvent& p_event) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (touched) {
|
if (touched) {
|
||||||
|
_press(p_event.screen_touch.index);
|
||||||
finger_pressed=p_event.screen_touch.index;
|
|
||||||
//emit change stuff
|
|
||||||
emit_signal("pressed");
|
|
||||||
if (action_id!=-1) {
|
|
||||||
|
|
||||||
Input::get_singleton()->action_press(action);
|
|
||||||
InputEvent ie;
|
|
||||||
ie.type=InputEvent::ACTION;
|
|
||||||
ie.ID=0;
|
|
||||||
ie.action.action=action_id;
|
|
||||||
ie.action.pressed=true;
|
|
||||||
get_tree()->input_event(ie);
|
|
||||||
}
|
|
||||||
update();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
|
||||||
if (p_event.screen_touch.index==finger_pressed) {
|
if (p_event.screen_touch.index==finger_pressed) {
|
||||||
//untouch
|
_release();
|
||||||
|
|
||||||
emit_signal("released");
|
|
||||||
|
|
||||||
if (action_id!=-1) {
|
|
||||||
|
|
||||||
Input::get_singleton()->action_release(action);
|
|
||||||
InputEvent ie;
|
|
||||||
ie.type=InputEvent::ACTION;
|
|
||||||
ie.ID=0;
|
|
||||||
ie.action.action=action_id;
|
|
||||||
ie.action.pressed=false;
|
|
||||||
get_tree()->input_event(ie);
|
|
||||||
}
|
|
||||||
finger_pressed=-1;
|
|
||||||
update();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TouchScreenButton::_press(int p_finger_pressed) {
|
||||||
|
|
||||||
|
finger_pressed=p_finger_pressed;
|
||||||
|
allow_repress=false;
|
||||||
|
|
||||||
|
if (action_id!=-1) {
|
||||||
|
|
||||||
|
Input::get_singleton()->action_press(action);
|
||||||
|
InputEvent ie;
|
||||||
|
ie.type=InputEvent::ACTION;
|
||||||
|
ie.ID=0;
|
||||||
|
ie.action.action=action_id;
|
||||||
|
ie.action.pressed=true;
|
||||||
|
get_tree()->input_event(ie);
|
||||||
|
}
|
||||||
|
|
||||||
|
emit_signal("pressed");
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TouchScreenButton::_release(bool p_exiting_tree) {
|
||||||
|
|
||||||
|
finger_pressed=-1;
|
||||||
|
|
||||||
|
if (action_id!=-1) {
|
||||||
|
|
||||||
|
Input::get_singleton()->action_release(action);
|
||||||
|
InputEvent ie;
|
||||||
|
ie.type=InputEvent::ACTION;
|
||||||
|
ie.ID=0;
|
||||||
|
ie.action.action=action_id;
|
||||||
|
ie.action.pressed=false;
|
||||||
|
get_tree()->input_event(ie);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!p_exiting_tree) {
|
||||||
|
emit_signal("released");
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Rect2 TouchScreenButton::get_item_rect() const {
|
Rect2 TouchScreenButton::get_item_rect() const {
|
||||||
|
|
||||||
if (texture.is_null())
|
if (texture.is_null())
|
||||||
|
@ -440,6 +406,7 @@ void TouchScreenButton::_bind_methods() {
|
||||||
TouchScreenButton::TouchScreenButton() {
|
TouchScreenButton::TouchScreenButton() {
|
||||||
|
|
||||||
finger_pressed=-1;
|
finger_pressed=-1;
|
||||||
|
allow_repress=false;
|
||||||
action_id=-1;
|
action_id=-1;
|
||||||
passby_press=false;
|
passby_press=false;
|
||||||
visibility=VISIBILITY_ALWAYS;
|
visibility=VISIBILITY_ALWAYS;
|
||||||
|
|
|
@ -56,12 +56,16 @@ private:
|
||||||
StringName action;
|
StringName action;
|
||||||
bool passby_press;
|
bool passby_press;
|
||||||
int finger_pressed;
|
int finger_pressed;
|
||||||
|
bool allow_repress;
|
||||||
int action_id;
|
int action_id;
|
||||||
|
|
||||||
VisibilityMode visibility;
|
VisibilityMode visibility;
|
||||||
|
|
||||||
void _input(const InputEvent& p_Event);
|
void _input(const InputEvent& p_Event);
|
||||||
|
|
||||||
|
void _press(int p_finger_pressed);
|
||||||
|
void _release(bool p_exiting_tree=false);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
void _notification(int p_what);
|
void _notification(int p_what);
|
||||||
|
|
Loading…
Reference in New Issue