efl/gesture: rework gesture_recognizer::add to be a 'type' property

this simplifies (and optimizes) a bunch of code by letting gesture recognizers
return directly the type of gesture they recognize for use internally

ref T8503

Reviewed-by: Marcel Hollerbach <mail@marcel-hollerbach.de>
Differential Revision: https://phab.enlightenment.org/D11267
This commit is contained in:
Mike Blumenkrantz 2020-01-31 10:44:23 -05:00 committed by Marcel Hollerbach
parent 23f772b434
commit 28b7ea6f0c
22 changed files with 100 additions and 73 deletions

View File

@ -36,6 +36,63 @@ static Efl_Canvas_Gesture *
_get_state(Efl_Canvas_Gesture_Manager_Data *pd, Eo *target,
Efl_Canvas_Gesture_Recognizer *recognizer, const Efl_Event_Description *type);
static const Efl_Event_Description *
_gesture_recognizer_event_type_get(const Efl_Canvas_Gesture_Recognizer *recognizer)
{
Efl_Canvas_Gesture_Recognizer_Type type = efl_gesture_recognizer_type_get(recognizer);
switch (type)
{
case EFL_GESTURE_RECOGNIZER_TYPE_TAP:
return EFL_EVENT_GESTURE_TAP;
case EFL_GESTURE_RECOGNIZER_TYPE_DOUBLETAP:
return EFL_EVENT_GESTURE_DOUBLE_TAP;
case EFL_GESTURE_RECOGNIZER_TYPE_TRIPLETAP:
return EFL_EVENT_GESTURE_TRIPLE_TAP;
case EFL_GESTURE_RECOGNIZER_TYPE_LONGTAP:
return EFL_EVENT_GESTURE_LONG_TAP;
case EFL_GESTURE_RECOGNIZER_TYPE_MOMENTUM:
return EFL_EVENT_GESTURE_MOMENTUM;
case EFL_GESTURE_RECOGNIZER_TYPE_FLICK:
return EFL_EVENT_GESTURE_FLICK;
case EFL_GESTURE_RECOGNIZER_TYPE_ZOOM:
return EFL_EVENT_GESTURE_ZOOM;
case EFL_GESTURE_RECOGNIZER_TYPE_CUSTOM:
return EFL_EVENT_GESTURE_CUSTOM;
default: break;
}
return NULL;
}
static const Efl_Class *
_gesture_recognizer_class_type_get(const Efl_Canvas_Gesture_Recognizer *recognizer)
{
Efl_Canvas_Gesture_Recognizer_Type type = efl_gesture_recognizer_type_get(recognizer);
switch (type)
{
case EFL_GESTURE_RECOGNIZER_TYPE_TAP:
return EFL_CANVAS_GESTURE_TAP_CLASS;
case EFL_GESTURE_RECOGNIZER_TYPE_DOUBLETAP:
return EFL_CANVAS_GESTURE_DOUBLE_TAP_CLASS;
case EFL_GESTURE_RECOGNIZER_TYPE_TRIPLETAP:
return EFL_CANVAS_GESTURE_TRIPLE_TAP_CLASS;
case EFL_GESTURE_RECOGNIZER_TYPE_LONGTAP:
return EFL_CANVAS_GESTURE_LONG_TAP_CLASS;
case EFL_GESTURE_RECOGNIZER_TYPE_MOMENTUM:
return EFL_CANVAS_GESTURE_MOMENTUM_CLASS;
case EFL_GESTURE_RECOGNIZER_TYPE_FLICK:
return EFL_CANVAS_GESTURE_FLICK_CLASS;
case EFL_GESTURE_RECOGNIZER_TYPE_ZOOM:
return EFL_CANVAS_GESTURE_ZOOM_CLASS;
case EFL_GESTURE_RECOGNIZER_TYPE_CUSTOM:
return EFL_CANVAS_GESTURE_CUSTOM_CLASS;
default: break;
}
return NULL;
}
static void
_cleanup_object(Eina_Array *arr)
{
@ -335,13 +392,7 @@ EOLIAN static void
_efl_canvas_gesture_manager_recognizer_register(Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Manager_Data *pd,
Efl_Canvas_Gesture_Recognizer *recognizer)
{
Efl_Canvas_Gesture *dummy = efl_gesture_recognizer_add(recognizer, NULL);
if (!dummy)
return;
const Efl_Event_Description *type = _efl_gesture_type_get(dummy);
efl_del(dummy);
const Efl_Event_Description *type = _gesture_recognizer_event_type_get(recognizer);
//Add the recognizer to the m_recognizers
if (type == EFL_EVENT_GESTURE_CUSTOM)
{
@ -363,16 +414,11 @@ _efl_canvas_gesture_manager_recognizer_unregister(Eo *obj EINA_UNUSED, Efl_Canva
Eina_List *l, *l_next;
Object_Gesture *object_gesture;
const Efl_Event_Description *type;
Efl_Canvas_Gesture *dummy;
if (!recognizer) return;
//Find the type of the recognizer
dummy = efl_gesture_recognizer_add(recognizer, 0);
if (!dummy) return;
type = _efl_gesture_type_get(dummy);
efl_del(dummy);
type = _gesture_recognizer_event_type_get(recognizer);
//Check if its already registered
if (type == EFL_EVENT_GESTURE_CUSTOM)
{
@ -457,7 +503,7 @@ _get_state(Efl_Canvas_Gesture_Manager_Data *pd,
}
}
gesture = efl_gesture_recognizer_add(recognizer, target);
gesture = efl_add(_gesture_recognizer_class_type_get(recognizer), recognizer);
if (!gesture)
return 0;
@ -497,16 +543,11 @@ EOLIAN static void
_efl_canvas_gesture_manager_recognizer_cleanup(Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Manager_Data *pd, const Efl_Canvas_Gesture_Recognizer *recognizer, const Eo *target)
{
const Efl_Event_Description *type;
Efl_Canvas_Gesture *dummy;
EINA_SAFETY_ON_NULL_RETURN(recognizer);
//Find the type of the recognizer
dummy = efl_gesture_recognizer_add((void*)recognizer, 0);
EINA_SAFETY_ON_NULL_RETURN(dummy);
type = _efl_gesture_type_get(dummy);
efl_del(dummy);
type = _gesture_recognizer_event_type_get(recognizer);
_cleanup_cached_gestures(pd, target, type, recognizer);
eina_hash_del(pd->m_object_events, &recognizer, NULL);
_cleanup_object(pd->m_gestures_to_delete);

View File

@ -13,12 +13,12 @@ abstract @beta Efl.Canvas.Gesture_Recognizer extends Efl.Object
]]
c_prefix: efl_gesture_recognizer;
methods {
add @pure_virtual {
[[This function is called to create a new @Efl.Canvas.Gesture object for the given target.]]
params {
@in target: Efl.Object; [[The target canvas object.]]
@property type @pure_virtual {
[[This property returns the type of gesture recognized by this recognizer.]]
get {}
values {
type: Efl.Canvas.Gesture_Recognizer_Type; [[The gesture type to recognize.]]
}
return: Efl.Canvas.Gesture; [[Returns the gesture object that will be used to track this gesture.]]
}
recognize @pure_virtual {
[[Analyzes the given $event and the current state of the $gesture object to see if the state

View File

@ -2,6 +2,11 @@
#define MY_CLASS EFL_CANVAS_GESTURE_RECOGNIZER_CUSTOM_CLASS
EOLIAN static Efl_Canvas_Gesture_Recognizer_Type
_efl_canvas_gesture_recognizer_custom_efl_canvas_gesture_recognizer_type_get(const Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Recognizer_Custom_Data *pd EINA_UNUSED)
{
return EFL_GESTURE_RECOGNIZER_TYPE_CUSTOM;
}
EOLIAN static Eo *
_efl_canvas_gesture_recognizer_custom_efl_object_finalize(Eo *obj, Efl_Canvas_Gesture_Recognizer_Custom_Data *pd)

View File

@ -19,5 +19,6 @@ abstract @beta Efl.Canvas.Gesture_Recognizer_Custom extends Efl.Canvas.Gesture_R
implements {
Efl.Object.destructor;
Efl.Object.finalize;
Efl.Canvas.Gesture_Recognizer.type { get; }
}
}

View File

@ -4,10 +4,10 @@
#define TAP_TIME_OUT 0.33
EOLIAN static Efl_Canvas_Gesture *
_efl_canvas_gesture_recognizer_double_tap_efl_canvas_gesture_recognizer_add(Eo *obj, Efl_Canvas_Gesture_Recognizer_Double_Tap_Data *pd EINA_UNUSED, Efl_Object *target EINA_UNUSED)
EOLIAN static Efl_Canvas_Gesture_Recognizer_Type
_efl_canvas_gesture_recognizer_double_tap_efl_canvas_gesture_recognizer_type_get(const Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Recognizer_Double_Tap_Data *pd EINA_UNUSED)
{
return efl_add(EFL_CANVAS_GESTURE_DOUBLE_TAP_CLASS, obj);
return EFL_GESTURE_RECOGNIZER_TYPE_DOUBLETAP;
}
EOLIAN static void

View File

@ -19,7 +19,7 @@ class @beta Efl.Canvas.Gesture_Recognizer_Double_Tap extends Efl.Canvas.Gesture_
}
implements {
Efl.Object.destructor;
Efl.Canvas.Gesture_Recognizer.add;
Efl.Canvas.Gesture_Recognizer.type { get; }
Efl.Canvas.Gesture_Recognizer.recognize;
}
}

View File

@ -22,10 +22,10 @@ _reset_recognizer(Efl_Canvas_Gesture_Recognizer_Flick_Data *pd)
pd->touched = EINA_FALSE;
}
EOLIAN static Efl_Canvas_Gesture *
_efl_canvas_gesture_recognizer_flick_efl_canvas_gesture_recognizer_add(Eo *obj, Efl_Canvas_Gesture_Recognizer_Flick_Data *pd EINA_UNUSED, Efl_Object *target EINA_UNUSED)
EOLIAN static Efl_Canvas_Gesture_Recognizer_Type
_efl_canvas_gesture_recognizer_flick_efl_canvas_gesture_recognizer_type_get(const Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Recognizer_Flick_Data *pd EINA_UNUSED)
{
return efl_add(EFL_CANVAS_GESTURE_FLICK_CLASS, obj);
return EFL_GESTURE_RECOGNIZER_TYPE_FLICK;
}
static void

View File

@ -6,7 +6,7 @@ class @beta Efl.Canvas.Gesture_Recognizer_Flick extends Efl.Canvas.Gesture_Recog
]]
c_prefix: efl_gesture_recognizer_flick;
implements {
Efl.Canvas.Gesture_Recognizer.add;
Efl.Canvas.Gesture_Recognizer.type { get; }
Efl.Canvas.Gesture_Recognizer.recognize;
}
}

View File

@ -4,12 +4,10 @@
#define EFL_GESTURE_LONG_TAP_TIME_OUT 1.2
EOLIAN static Efl_Canvas_Gesture *
_efl_canvas_gesture_recognizer_long_tap_efl_canvas_gesture_recognizer_add(Eo *obj,
Efl_Canvas_Gesture_Recognizer_Long_Tap_Data *pd EINA_UNUSED,
Efl_Object *target EINA_UNUSED)
EOLIAN static Efl_Canvas_Gesture_Recognizer_Type
_efl_canvas_gesture_recognizer_long_tap_efl_canvas_gesture_recognizer_type_get(const Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Recognizer_Long_Tap_Data *pd EINA_UNUSED)
{
return efl_add(EFL_CANVAS_GESTURE_LONG_TAP_CLASS, obj);
return EFL_GESTURE_RECOGNIZER_TYPE_LONGTAP;
}
EOLIAN static void

View File

@ -19,7 +19,7 @@ class @beta Efl.Canvas.Gesture_Recognizer_Long_Tap extends Efl.Canvas.Gesture_Re
}
implements {
Efl.Object.destructor;
Efl.Canvas.Gesture_Recognizer.add;
Efl.Canvas.Gesture_Recognizer.type { get; }
Efl.Canvas.Gesture_Recognizer.recognize;
Efl.Canvas.Gesture_Recognizer.reset;
}

View File

@ -7,10 +7,10 @@
#define THUMBSCROLL_MOMENTUM_THRESHOLD 100.0
#define EFL_GESTURE_MINIMUM_MOMENTUM 0.001
EOLIAN static Efl_Canvas_Gesture *
_efl_canvas_gesture_recognizer_momentum_efl_canvas_gesture_recognizer_add(Eo *obj, Efl_Canvas_Gesture_Recognizer_Momentum_Data *pd EINA_UNUSED, Efl_Object *target EINA_UNUSED)
EOLIAN static Efl_Canvas_Gesture_Recognizer_Type
_efl_canvas_gesture_recognizer_momentum_efl_canvas_gesture_recognizer_type_get(const Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Recognizer_Momentum_Data *pd EINA_UNUSED)
{
return efl_add(EFL_CANVAS_GESTURE_MOMENTUM_CLASS, obj);
return EFL_GESTURE_RECOGNIZER_TYPE_MOMENTUM;
}
static void

View File

@ -6,7 +6,7 @@ class @beta Efl.Canvas.Gesture_Recognizer_Momentum extends Efl.Canvas.Gesture_Re
]]
c_prefix: efl_gesture_recognizer_momentum;
implements {
Efl.Canvas.Gesture_Recognizer.add;
Efl.Canvas.Gesture_Recognizer.type { get; }
Efl.Canvas.Gesture_Recognizer.recognize;
}
}

View File

@ -6,12 +6,10 @@
// may using dobule tap timeout value?
#define EFL_GESTURE_RECOGNIZER_TYPE_TAP_TIME_OUT 0.33
EOLIAN static Efl_Canvas_Gesture *
_efl_canvas_gesture_recognizer_tap_efl_canvas_gesture_recognizer_add(Eo *obj,
Efl_Canvas_Gesture_Recognizer_Tap_Data *pd EINA_UNUSED,
Efl_Object *target EINA_UNUSED)
EOLIAN static Efl_Canvas_Gesture_Recognizer_Type
_efl_canvas_gesture_recognizer_tap_efl_canvas_gesture_recognizer_type_get(const Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Recognizer_Tap_Data *pd EINA_UNUSED)
{
return efl_add(EFL_CANVAS_GESTURE_TAP_CLASS, obj);
return EFL_GESTURE_RECOGNIZER_TYPE_TAP;
}
static Eina_Bool

View File

@ -6,7 +6,7 @@ class @beta Efl.Canvas.Gesture_Recognizer_Tap extends Efl.Canvas.Gesture_Recogni
]]
c_prefix: efl_gesture_recognizer_tap;
implements {
Efl.Canvas.Gesture_Recognizer.add;
Efl.Canvas.Gesture_Recognizer.type { get; }
Efl.Canvas.Gesture_Recognizer.recognize;
}
}

View File

@ -4,10 +4,10 @@
#define TAP_TIME_OUT 0.33
EOLIAN static Efl_Canvas_Gesture *
_efl_canvas_gesture_recognizer_triple_tap_efl_canvas_gesture_recognizer_add(Eo *obj, Efl_Canvas_Gesture_Recognizer_Triple_Tap_Data *pd EINA_UNUSED, Efl_Object *target EINA_UNUSED)
EOLIAN static Efl_Canvas_Gesture_Recognizer_Type
_efl_canvas_gesture_recognizer_triple_tap_efl_canvas_gesture_recognizer_type_get(const Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Recognizer_Triple_Tap_Data *pd EINA_UNUSED)
{
return efl_add(EFL_CANVAS_GESTURE_TRIPLE_TAP_CLASS, obj);
return EFL_GESTURE_RECOGNIZER_TYPE_TRIPLETAP;
}
EOLIAN static void

View File

@ -19,7 +19,7 @@ class @beta Efl.Canvas.Gesture_Recognizer_Triple_Tap extends Efl.Canvas.Gesture_
}
implements {
Efl.Object.destructor;
Efl.Canvas.Gesture_Recognizer.add;
Efl.Canvas.Gesture_Recognizer.type { get; }
Efl.Canvas.Gesture_Recognizer.recognize;
}
}

View File

@ -125,12 +125,10 @@ _zoom_compute(Efl_Canvas_Gesture_Recognizer_Zoom_Data *pd,
return rt;
}
EOLIAN static Efl_Canvas_Gesture *
_efl_canvas_gesture_recognizer_zoom_efl_canvas_gesture_recognizer_add(Eo *obj,
Efl_Canvas_Gesture_Recognizer_Zoom_Data *pd EINA_UNUSED,
Efl_Object *target EINA_UNUSED)
EOLIAN static Efl_Canvas_Gesture_Recognizer_Type
_efl_canvas_gesture_recognizer_zoom_efl_canvas_gesture_recognizer_type_get(const Eo *obj EINA_UNUSED, Efl_Canvas_Gesture_Recognizer_Zoom_Data *pd EINA_UNUSED)
{
return efl_add(EFL_CANVAS_GESTURE_ZOOM_CLASS, obj);
return EFL_GESTURE_RECOGNIZER_TYPE_ZOOM;
}
EOLIAN static Efl_Canvas_Gesture_Recognizer_Result

View File

@ -6,7 +6,7 @@ class @beta Efl.Canvas.Gesture_Recognizer_Zoom extends Efl.Canvas.Gesture_Recogn
]]
c_prefix: efl_gesture_recognizer_zoom;
implements {
Efl.Canvas.Gesture_Recognizer.add;
Efl.Canvas.Gesture_Recognizer.type { get; }
Efl.Canvas.Gesture_Recognizer.recognize;
}
}

View File

@ -14,12 +14,6 @@ _custom_recognizer_efl_object_finalize(Eo *obj, Custom_Recognizer_Data *pd EINA_
return efl_finalize(efl_super(obj, MY_CLASS));
}
EOLIAN static Efl_Canvas_Gesture *
_custom_recognizer_efl_canvas_gesture_recognizer_add(Eo *obj, Custom_Recognizer_Data *pd EINA_UNUSED, Efl_Object *target EINA_UNUSED)
{
return efl_add(EFL_CANVAS_GESTURE_CUSTOM_CLASS, obj);
}
EOLIAN static Efl_Canvas_Gesture_Recognizer_Result
_custom_recognizer_efl_canvas_gesture_recognizer_recognize(Eo *obj EINA_UNUSED, Custom_Recognizer_Data *pd EINA_UNUSED,
Efl_Canvas_Gesture *gesture EINA_UNUSED, Efl_Object *watched EINA_UNUSED,

View File

@ -5,7 +5,6 @@ class @beta Custom_Recognizer extends Efl.Canvas.Gesture_Recognizer_Custom
c_prefix: custom_recognizer;
implements {
Efl.Object.finalize;
Efl.Canvas.Gesture_Recognizer.add;
Efl.Canvas.Gesture_Recognizer.recognize;
}
}

View File

@ -13,12 +13,6 @@ _custom_recognizer2_efl_object_finalize(Eo *obj, Custom_Recognizer2_Data *pd EIN
return efl_finalize(efl_super(obj, MY_CLASS));
}
EOLIAN static Efl_Canvas_Gesture *
_custom_recognizer2_efl_canvas_gesture_recognizer_add(Eo *obj, Custom_Recognizer2_Data *pd EINA_UNUSED, Efl_Object *target EINA_UNUSED)
{
return efl_add(EFL_CANVAS_GESTURE_CUSTOM_CLASS, obj);
}
EOLIAN static Efl_Canvas_Gesture_Recognizer_Result
_custom_recognizer2_efl_canvas_gesture_recognizer_recognize(Eo *obj EINA_UNUSED, Custom_Recognizer2_Data *pd EINA_UNUSED,
Efl_Canvas_Gesture *gesture EINA_UNUSED, Efl_Object *watched EINA_UNUSED,

View File

@ -5,7 +5,6 @@ class @beta Custom_Recognizer2 extends Efl.Canvas.Gesture_Recognizer_Custom
c_prefix: custom_recognizer2;
implements {
Efl.Object.finalize;
Efl.Canvas.Gesture_Recognizer.add;
Efl.Canvas.Gesture_Recognizer.recognize;
}
}