Merge pull request #7722 from RandomShaper/improve-touch-button

Fix touch button issues
This commit is contained in:
Rémi Verschelde 2017-02-12 23:12:18 +01:00 committed by GitHub
commit 53b7bbfcce
2 changed files with 58 additions and 87 deletions

View File

@ -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;

View File

@ -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);