Merge branch 'upstream'
[framework/uifw/elementary.git] / src / lib / elm_bubble.c
index cbc2b45..2463f15 100644 (file)
@@ -3,13 +3,24 @@
 
 typedef struct _Widget_Data Widget_Data;
 
+#define SWEEP_SUPPORT 1
+
 struct _Widget_Data
 {
    Evas_Object *bbl;
    Evas_Object *content, *icon;
    const char *label, *info, *corner;
+#ifdef SWEEP_SUPPORT
+   Evas_Object *sweep;
+   Eina_Bool down:1;
+   Evas_Coord_Point down_point;
+#endif
 };
 
+#ifdef SWEEP_SUPPORT
+#define SWEEP_THRESHOLD        100
+#endif
+
 static const char *widtype = NULL;
 static void _del_hook(Evas_Object *obj);
 static void _mirrored_set(Evas_Object *obj, Eina_Bool rtl);
@@ -127,13 +138,40 @@ _sub_del(void *data __UNUSED__, Evas_Object *obj, void *event_info)
    _sizing_eval(obj);
 }
 
+#ifdef SWEEP_SUPPORT
+static void
+_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+{
+   Widget_Data *wd = elm_widget_data_get(data);
+   Evas_Event_Mouse_Down *ev = event_info;
+
+   wd->down = EINA_TRUE;
+   wd->down_point.x = ev->canvas.x;
+   wd->down_point.y = ev->canvas.y;
+}
+#endif
+
 static void
 _mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
 {
    Evas_Event_Mouse_Up *ev = event_info;
+   Widget_Data *wd = elm_widget_data_get(data);
+   if (!wd->down) return;
    if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
-     return;
-   evas_object_smart_callback_call(data, SIG_CLICKED, NULL);
+     {
+#ifdef SWEEP_SUPPORT 
+       if (ev->canvas.x - wd->down_point.x > SWEEP_THRESHOLD)
+         evas_object_smart_callback_call(data, "sweep,left,right", NULL);
+       else if (wd->down_point.x - ev->canvas.x > SWEEP_THRESHOLD)
+         evas_object_smart_callback_call(data, "sweep,right,left", NULL);
+
+       wd->down = EINA_FALSE;
+       wd->down_point.x = 0;
+       wd->down_point.y = 0;   
+#endif
+     }
+   else if (!wd->sweep)
+     evas_object_smart_callback_call(data, SIG_CLICKED, NULL);
 }
 
 EAPI Evas_Object *
@@ -162,6 +200,14 @@ elm_bubble_add(Evas_Object *parent)
    evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj);
    evas_object_event_callback_add(wd->bbl, EVAS_CALLBACK_MOUSE_UP,
                                   _mouse_up, obj);
+#ifdef SWEEP_SUPPORT
+   evas_object_event_callback_add(wd->bbl, EVAS_CALLBACK_MOUSE_DOWN,
+                                  _mouse_down, obj);
+
+   wd->down = EINA_FALSE;
+   wd->down_point.x = 0;
+   wd->down_point.y = 0;
+#endif
 
    evas_object_smart_callbacks_descriptions_set(obj, _signals);
    _mirrored_set(obj, elm_widget_mirrored_get(obj));
@@ -304,6 +350,38 @@ elm_bubble_icon_unset(Evas_Object *obj)
 }
 
 EAPI void
+elm_bubble_sweep_layout_set(Evas_Object *obj, Evas_Object *sweep)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype);
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (!wd) return;
+#ifdef SWEEP_SUPPORT
+   if (wd->sweep == sweep) return;
+   if (wd->sweep) evas_object_del(wd->sweep);
+   wd->sweep = sweep;
+   if (sweep)
+      edje_object_part_swallow(wd->bbl, "elm.swallow.sweep", sweep);
+#endif
+}
+
+EAPI Evas_Object *
+elm_bubble_sweep_layout_unset(Evas_Object *obj)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
+   Widget_Data *wd = elm_widget_data_get(obj);
+   Evas_Object *sweep = NULL;
+   if (!wd) return NULL;
+#ifdef SWEEP_SUPPORT
+   if (!wd->sweep) return NULL;
+   sweep = wd->sweep;
+   edje_object_part_unswallow(wd->bbl, sweep);
+   evas_object_hide(sweep);
+   wd->sweep = NULL;
+#endif
+   return sweep;
+}
+
+EAPI void
 elm_bubble_corner_set(Evas_Object *obj, const char *corner)
 {
    ELM_CHECK_WIDTYPE(obj, widtype);