[access][gengrid] add activate callback
[framework/uifw/elementary.git] / src / lib / elm_gengrid.c
index bef3260..62e9989 100644 (file)
@@ -52,6 +52,8 @@ static const char SIG_MOVED[] = "moved";
 static const char SIG_INDEX_UPDATE[] = "index,update";
 static const char SIG_HIGHLIGHTED[] = "highlighted";
 static const char SIG_UNHIGHLIGHTED[] = "unhighlighted";
+static const char SIG_LANG_CHANGED[] = "language,changed";
+
 static const Evas_Smart_Cb_Description _smart_callbacks[] = {
    {SIG_ACTIVATED, ""},
    {SIG_CLICKED_DOUBLE, ""},
@@ -79,6 +81,7 @@ static const Evas_Smart_Cb_Description _smart_callbacks[] = {
    {SIG_MOVED, ""},
    {SIG_HIGHLIGHTED, ""},
    {SIG_UNHIGHLIGHTED, ""},
+   {SIG_LANG_CHANGED, ""},
    {NULL, NULL}
 };
 
@@ -105,6 +108,14 @@ _elm_gengrid_pan_smart_pos_min_get(const Evas_Object *obj,
                                    Evas_Coord *x,
                                    Evas_Coord *y);
 
+static Eina_Bool
+_elm_gengrid_smart_translate(Evas_Object *obj)
+{
+   evas_object_smart_callback_call(obj, SIG_LANG_CHANGED, NULL);
+
+   return EINA_TRUE;
+}
+
 static void
 _item_show_region(void *data)
 {
@@ -113,6 +124,9 @@ _item_show_region(void *data)
    Evas_Coord vw = 0, vh = 0;
    Elm_Gen_Item *it;
 
+#if GENGRID_FX_SUPPORT
+   if (sd->fx_first_captured) return;
+#endif
    evas_object_geometry_get(sd->pan_obj, NULL, NULL, &cvw, &cvh);
 
    if ((cvw != 0) && (cvh != 0))
@@ -735,6 +749,18 @@ _access_on_highlight_cb(void *data)
 }
 
 static void
+_access_activate_cb(void *data __UNUSED__,
+                    Evas_Object *part_obj __UNUSED__,
+                    Elm_Object_Item *item)
+{
+   Elm_Gen_Item *it = (Elm_Gen_Item *)item;
+   ELM_GENGRID_ITEM_CHECK_OR_RETURN(it);
+
+   _item_highlight(it);
+   it->sel_cb(it);
+}
+
+static void
 _access_widget_item_register(Elm_Gen_Item *it)
 {
    Elm_Access_Info *ai;
@@ -747,6 +773,7 @@ _access_widget_item_register(Elm_Gen_Item *it)
    _elm_access_callback_set(ai, ELM_ACCESS_INFO, _access_info_cb, it);
    _elm_access_callback_set(ai, ELM_ACCESS_STATE, _access_state_cb, it);
    _elm_access_on_highlight_hook_set(ai, _access_on_highlight_cb, it);
+   _elm_access_activate_callback_set(ai, _access_activate_cb, it);
 }
 
 static void
@@ -992,6 +1019,9 @@ _item_place(Elm_Gen_Item *it,
 
    it->x = cx;
    it->y = cy;
+   if (wsd->horizontal) it->position = cx;
+   else it->position = cy;
+
    evas_object_geometry_get(wsd->pan_obj, &ox, &oy, &vw, &vh);
 
    /* Preload rows/columns at each side of the Gengrid */
@@ -1505,6 +1535,7 @@ _elm_gengrid_pan_smart_set_user(Elm_Gengrid_Pan_Smart_Class *sc)
    ELM_PAN_CLASS(sc)->pos_min_get = _elm_gengrid_pan_smart_pos_min_get;
    ELM_PAN_CLASS(sc)->content_size_get =
      _elm_gengrid_pan_smart_content_size_get;
+
 }
 
 static Eina_Bool
@@ -2055,8 +2086,12 @@ _elm_gengrid_item_del_serious(Elm_Gen_Item *it)
    if ((!GG_IT(it)->wsd->fx_mode) || (GG_IT(it)->wsd->gengrid_clearing))
 #endif
      {
-        _elm_gengrid_item_del_common(it);
+        GG_IT(it)->wsd->items = eina_inlist_remove
+           (GG_IT(it)->wsd->items, EINA_INLIST_GET(it));
+
      }
+
+   _elm_gengrid_item_del_common(it);
    free(it->item);
    it->item = NULL;
 }
@@ -2188,12 +2223,19 @@ _item_del_pre_fx_process(Elm_Gen_Item *it)
    if (!eina_list_data_find(GG_IT(it)->wsd->pending_del_items, it))
      GG_IT(it)->wsd->pending_del_items = eina_list_append(GG_IT(it)->wsd->pending_del_items, it);
 
-   evas_event_freeze(evas_object_evas_get(obj));
-   GG_IT(it)->wsd->selected = eina_list_remove(GG_IT(it)->wsd->selected, it);
+   evas_object_event_callback_del_full
+      (VIEW(it), EVAS_CALLBACK_MOUSE_DOWN, _item_mouse_down_cb, it);
+   evas_object_event_callback_del_full
+      (VIEW(it), EVAS_CALLBACK_MOUSE_UP, _item_mouse_up_cb, it);
+   evas_object_event_callback_del_full
+      (VIEW(it), EVAS_CALLBACK_MOUSE_MOVE, _item_mouse_move_cb, it);
 
-   _elm_gengrid_item_del_common(it);
-   evas_event_thaw(evas_object_evas_get(obj));
-   evas_event_thaw_eval(evas_object_evas_get(obj));
+   GG_IT(it)->wsd->items = eina_inlist_remove
+      (GG_IT(it)->wsd->items, EINA_INLIST_GET(it));
+
+   if (GG_IT(it)->wsd->calc_job) ecore_job_del(GG_IT(it)->wsd->calc_job);
+   GG_IT(it)->wsd->calc_job =
+      ecore_job_add(GG_IT(it)->wsd->calc_cb, GG_IT(it)->wsd);
 }
 #endif
 
@@ -2273,11 +2315,13 @@ _elm_gengrid_clear(Evas_Object *obj,
 
    EINA_LIST_FREE(sd->capture_before_items, pi)
      {
+        if (pi->proxy) evas_object_smart_member_del(pi->proxy);
         if (pi->proxy) evas_object_del(pi->proxy);
         free(pi);
      }
    EINA_LIST_FREE(sd->capture_after_items, pi)
      {
+        if (pi->proxy) evas_object_smart_member_del(pi->proxy);
         if (pi->proxy) evas_object_del(pi->proxy);
         free(pi);
      }
@@ -2287,7 +2331,10 @@ _elm_gengrid_clear(Evas_Object *obj,
         free(fi);
      }
    EINA_LIST_FREE (sd->pending_unrealized_items, it)
-      _elm_gengrid_item_unrealize(it, EINA_FALSE);
+     {
+        if ((it) && (GG_IT(it))) GG_IT(it)->has_proxy_it = EINA_FALSE;
+        _elm_gengrid_item_unrealize(it, EINA_FALSE);
+     }
    EINA_LIST_FREE (sd->pending_del_items, it)
      {
         _item_del(it);
@@ -2617,6 +2664,7 @@ _elm_gengrid_smart_set_user(Elm_Gengrid_Smart_Class *sc)
    /* not a 'focus chain manager' */
    ELM_WIDGET_CLASS(sc)->focus_next = NULL;
    ELM_WIDGET_CLASS(sc)->focus_direction = NULL;
+   ELM_WIDGET_CLASS(sc)->translate = _elm_gengrid_smart_translate;
 
    ELM_LAYOUT_CLASS(sc)->sizing_eval = _elm_gengrid_smart_sizing_eval;
 
@@ -3744,9 +3792,14 @@ _elm_gengrid_proxy_item_new(const Elm_Object_Item *item)
 
    pi->proxy = evas_object_image_filled_add
       (evas_object_evas_get(ELM_WIDGET_DATA(GG_IT(it)->wsd)->obj));
-   if (!pi->proxy) return EINA_FALSE;
+   if (!pi->proxy)
+     {
+        free(pi);
+        return NULL;
+     }
    evas_object_clip_set(pi->proxy, evas_object_clip_get(GG_IT(it)->wsd->pan_obj));
-
+   evas_object_smart_member_add(pi->proxy, GG_IT(it)->wsd->pan_obj);
+   evas_object_hide(pi->proxy);
    evas_object_image_source_set(pi->proxy, VIEW(it));
 
    GG_IT(it)->has_proxy_it = EINA_TRUE;
@@ -3789,6 +3842,7 @@ _elm_gengrid_fx_capture(Evas_Object *obj, int level)
         sd->fx_first_captured = EINA_TRUE;
         EINA_LIST_FREE(sd->capture_before_items, pi)
           {
+             if (pi->proxy) evas_object_smart_member_del(pi->proxy);
              if (pi->proxy) evas_object_del(pi->proxy);
              free(pi);
           }
@@ -3797,6 +3851,7 @@ _elm_gengrid_fx_capture(Evas_Object *obj, int level)
      {
         EINA_LIST_FREE(sd->capture_after_items, pi)
           {
+             if (pi->proxy) evas_object_smart_member_del(pi->proxy);
              if (pi->proxy) evas_object_del(pi->proxy);
              free(pi);
           }
@@ -3926,9 +3981,12 @@ static void
 _item_fx_done(Elm_Transit_Effect *data, Elm_Transit *transit __UNUSED__)
 {
    Elm_Gen_FX_Item *fx_done_it = data;
-   Elm_Gengrid_Smart_Data *sd = GG_IT(fx_done_it->it)->wsd;
+   Elm_Gengrid_Smart_Data *sd;
 
-   if ((!fx_done_it) || (!fx_done_it->it) || (!sd)) return;
+   if ((!fx_done_it) || (!fx_done_it->it)) return;
+
+   sd = GG_IT(fx_done_it->it)->wsd;
+   if (!sd) return;
 
    evas_object_image_source_visible_set(fx_done_it->proxy, EINA_TRUE);
    evas_object_lower(fx_done_it->proxy);
@@ -3944,9 +4002,14 @@ _item_fx_del_cb(void *data, Elm_Transit *transit __UNUSED__)
 {
    Elm_Gen_FX_Item *fx_done_it = data;
    Elm_Gen_Item *it = NULL;
-   Elm_Gengrid_Smart_Data *sd = GG_IT(fx_done_it->it)->wsd;
+   Proxy_Item *pi = NULL;
+   Eina_List *l;
+   Elm_Gengrid_Smart_Data *sd;
+
+   if ((!fx_done_it) || (!fx_done_it->it)) return;
 
-   if ((!fx_done_it) || (!fx_done_it->it) || (!sd)) return;
+   sd = GG_IT(fx_done_it->it)->wsd;
+   if (!sd) return;
 
    sd->fx_items = eina_list_remove(sd->fx_items, fx_done_it);
    free(fx_done_it);
@@ -3964,6 +4027,10 @@ _item_fx_del_cb(void *data, Elm_Transit *transit __UNUSED__)
              _item_del(it);
              _elm_widget_item_free((Elm_Widget_Item *)it);
           }
+        EINA_LIST_FOREACH(sd->capture_before_items, l, pi)
+           evas_object_hide(pi->proxy);
+        EINA_LIST_FOREACH(sd->capture_after_items, l, pi)
+           evas_object_hide(pi->proxy);
 
         sd->fx_playing = EINA_FALSE;
         sd->fx_first_captured = EINA_FALSE;