Solve TouchScreenButtons issues

Fix touch button needing double tap after pause (applies to those not set to pass-by)
Fix error when a pressed TouchScreenButton with no associated action exits the tree
(with some refactoring of duplicate code)
This commit is contained in:
Pedro J. Estébanez 2017-02-04 16:57:11 +01:00
parent 86a04198d9
commit 49e7e2cd2a
2 changed files with 58 additions and 87 deletions

View file

@ -104,8 +104,12 @@ void TouchScreenButton::_notification(int p_what) {
} break;
case NOTIFICATION_EXIT_TREE: {
if (is_pressed())
Input::get_singleton()->action_release(action);
_release(true);
} 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;
}
}
}
@ -143,22 +147,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) {
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();
_release();
}
if ((p_event.type==InputEvent::SCREEN_TOUCH && p_event.screen_touch.pressed)|| p_event.type==InputEvent::SCREEN_DRAG) {
@ -184,44 +173,12 @@ void TouchScreenButton::_input(const InputEvent& p_event) {
if (touched) {
if (finger_pressed==-1) {
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);
_press(p_event.screen_touch.index);
}
update();
}
} else {
if (finger_pressed!=-1) {
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();
_release();
}
}
@ -239,7 +196,8 @@ void TouchScreenButton::_input(const InputEvent& p_event) {
if (!is_visible_in_tree())
return;
if (finger_pressed!=-1)
const bool can_press=finger_pressed==-1 || allow_repress;
if (!can_press)
return; //already fingering
Point2 coord = (get_global_transform_with_canvas()).affine_inverse().xform(Point2(p_event.screen_touch.x,p_event.screen_touch.y));
@ -258,12 +216,23 @@ void TouchScreenButton::_input(const InputEvent& p_event) {
}
if (touched) {
_press(p_event.screen_touch.index);
}
} else {
if (p_event.screen_touch.index==finger_pressed) {
_release();
}
}
}
}
}
void TouchScreenButton::_press(int p_finger_pressed) {
finger_pressed=p_finger_pressed;
allow_repress=false;
finger_pressed=p_event.screen_touch.index;
//emit change stuff
emit_signal("pressed");
if (action_id!=-1) {
Input::get_singleton()->action_press(action);
@ -274,16 +243,14 @@ void TouchScreenButton::_input(const InputEvent& p_event) {
ie.action.pressed=true;
get_tree()->input_event(ie);
}
emit_signal("pressed");
update();
}
} else {
void TouchScreenButton::_release(bool p_exiting_tree) {
if (p_event.screen_touch.index==finger_pressed) {
//untouch
emit_signal("released");
finger_pressed=-1;
if (action_id!=-1) {
@ -295,13 +262,12 @@ void TouchScreenButton::_input(const InputEvent& p_event) {
ie.action.pressed=false;
get_tree()->input_event(ie);
}
finger_pressed=-1;
if (!p_exiting_tree) {
emit_signal("released");
update();
}
}
}
}
}
Rect2 TouchScreenButton::get_item_rect() const {
@ -379,6 +345,7 @@ void TouchScreenButton::_bind_methods() {
TouchScreenButton::TouchScreenButton() {
finger_pressed=-1;
allow_repress=false;
action_id=-1;
passby_press=false;
visibility=VISIBILITY_ALWAYS;

View file

@ -51,12 +51,16 @@ private:
StringName action;
bool passby_press;
int finger_pressed;
bool allow_repress;
int action_id;
VisibilityMode visibility;
void _input(const InputEvent& p_Event);
void _press(int p_finger_pressed);
void _release(bool p_exiting_tree=false);
protected:
void _notification(int p_what);