Merge "naviframe - eina_list -> eina_inlist + theme_hook"
authorChunEon Park <chuneon.park@samsung.com>
Mon, 17 Oct 2011 23:59:14 +0000 (08:59 +0900)
committerGerrit Code Review <git@Maetan>
Mon, 17 Oct 2011 23:59:14 +0000 (08:59 +0900)
src/lib/elc_naviframe.c

index ad0c40e..5be6505 100644 (file)
@@ -8,7 +8,7 @@ typedef struct _Elm_Naviframe_Text_Item_Pair Elm_Naviframe_Text_Item_Pair;
 
 struct _Widget_Data
 {
-   Eina_List    *stack;
+   Eina_Inlist  *stack;
    Evas_Object  *base;
    Evas_Object  *rect;
    Eina_Bool     preserve: 1;
@@ -18,6 +18,7 @@ struct _Widget_Data
 
 struct _Elm_Naviframe_Content_Item_Pair
 {
+   EINA_INLIST;
    const char *part;
    Evas_Object *content;
    Elm_Naviframe_Item *it;
@@ -25,6 +26,7 @@ struct _Elm_Naviframe_Content_Item_Pair
 
 struct _Elm_Naviframe_Text_Item_Pair
 {
+   EINA_INLIST;
    const char *part;
    const char *text;
 };
@@ -32,8 +34,9 @@ struct _Elm_Naviframe_Text_Item_Pair
 struct _Elm_Naviframe_Item
 {
    Elm_Widget_Item    base;
-   Eina_List         *content_list;
-   Eina_List         *text_list;
+   EINA_INLIST;
+   Eina_Inlist       *content_list;
+   Eina_Inlist       *text_list;
    Evas_Object       *content;
    Evas_Object       *title_prev_btn;
    Evas_Object       *title_next_btn;
@@ -75,6 +78,7 @@ static Evas_Object *_item_content_unset_hook(Elm_Object_Item *it,
 static void _item_signal_emit_hook(Elm_Object_Item *it,
                                    const char *emission,
                                    const char *source);
+static void _item_title_visible_update(Elm_Naviframe_Item *navi_it);
 static void _sizing_eval(Evas_Object *obj);
 static void _item_sizing_eval(Elm_Naviframe_Item *it);
 static void _move(void *data, Evas *e, Evas_Object *obj, void *event_info);
@@ -134,24 +138,42 @@ static void
 _del_hook(Evas_Object *obj)
 {
    Widget_Data *wd;
-   Eina_List *list;
    Elm_Naviframe_Item *it;
 
    wd = elm_widget_data_get(obj);
    if (!wd) return;
 
-   EINA_LIST_REVERSE_FOREACH(wd->stack, list, it)
+   EINA_INLIST_REVERSE_FOREACH(wd->stack, it)
      _item_del(it);
-   eina_list_free(wd->stack);
    free(wd);
 }
 
 static void
 _theme_hook(Evas_Object *obj)
 {
-   //FIXME:
+   Widget_Data *wd;
+   Elm_Naviframe_Item *it;
+
+   wd  = elm_widget_data_get(obj);
+   if (!wd) return;
+
+   _elm_theme_object_set(obj,
+                         wd->base,
+                         "naviframe",
+                         "base",
+                         elm_widget_style_get(obj));
+
+   EINA_INLIST_FOREACH(wd->stack, it)
+     {
+        elm_naviframe_item_style_set(ELM_CAST(it), it->style);
+        _item_title_visible_update(it);
+     }
+
    _elm_widget_mirrored_reload(obj);
    _mirrored_set(obj, elm_widget_mirrored_get(obj));
+
+   evas_object_hide(wd->rect);
+
 }
 
 static void _emit_hook(Evas_Object *obj,
@@ -176,13 +198,12 @@ static void
 _mirrored_set(Evas_Object *obj, Eina_Bool rtl)
 {
    Widget_Data *wd;
-   Eina_List *l;
    Elm_Naviframe_Item *it;
 
    wd  = elm_widget_data_get(obj);
    if (!wd) return;
 
-   EINA_LIST_FOREACH(wd->stack, l, it)
+   EINA_INLIST_FOREACH(wd->stack, it)
      edje_object_mirrored_set(it->base.view, rtl);
    edje_object_mirrored_set(wd->base, rtl);
 }
@@ -194,7 +215,6 @@ _item_text_set_hook(Elm_Object_Item *it,
 {
    ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
 
-   Eina_List *l = NULL;
    Elm_Naviframe_Text_Item_Pair *pair = NULL;
    Elm_Naviframe_Item *navi_it = ELM_CAST(it);
    char buf[1024];
@@ -204,7 +224,7 @@ _item_text_set_hook(Elm_Object_Item *it,
    else
      snprintf(buf, sizeof(buf), "%s", part);
 
-   EINA_LIST_FOREACH(navi_it->text_list, l, pair)
+   EINA_INLIST_FOREACH(navi_it->text_list, pair)
      if (!strcmp(buf, pair->part)) break;
 
    if (!pair)
@@ -217,7 +237,8 @@ _item_text_set_hook(Elm_Object_Item *it,
              return;
           }
         eina_stringshare_replace(&pair->part, buf);
-        navi_it->text_list = eina_list_append(navi_it->text_list, pair);
+        navi_it->text_list = eina_inlist_append(navi_it->text_list,
+                                                EINA_INLIST_GET(pair));
      }
 
    eina_stringshare_replace(&pair->text, label);
@@ -241,7 +262,6 @@ static const char *
 _item_text_get_hook(const Elm_Object_Item *it, const char *part)
 {
    ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
-   Eina_List *l = NULL;
    Elm_Naviframe_Text_Item_Pair *pair = NULL;
    Elm_Naviframe_Item *navi_it = ELM_CAST(it);
    char buf[1024];
@@ -251,7 +271,7 @@ _item_text_get_hook(const Elm_Object_Item *it, const char *part)
    else
      snprintf(buf, sizeof(buf), "%s", part);
 
-   EINA_LIST_FOREACH(navi_it->text_list, l, pair)
+   EINA_INLIST_FOREACH(navi_it->text_list, pair)
      {
         if (!strcmp(buf, pair->part))
           return pair->text;
@@ -294,7 +314,6 @@ static Evas_Object *
 _item_content_get_hook(const Elm_Object_Item *it, const char *part)
 {
    ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
-   Eina_List *l = NULL;
    Elm_Naviframe_Content_Item_Pair *pair = NULL;
    Elm_Naviframe_Item *navi_it = ELM_CAST(it);
 
@@ -307,7 +326,7 @@ _item_content_get_hook(const Elm_Object_Item *it, const char *part)
      return navi_it->title_next_btn;
 
    //common parts
-   EINA_LIST_FOREACH(navi_it->content_list, l, pair)
+   EINA_INLIST_FOREACH(navi_it->content_list, pair)
      {
         if (!strcmp(part, pair->part))
           return pair->content;
@@ -319,7 +338,6 @@ static Evas_Object *
 _item_content_unset_hook(Elm_Object_Item *it, const char *part)
 {
    ELM_OBJ_ITEM_CHECK_OR_RETURN(it, NULL);
-   Eina_List *l = NULL;
    Elm_Naviframe_Content_Item_Pair *pair = NULL;
    Elm_Naviframe_Item *navi_it = ELM_CAST(it);
    Evas_Object *content = NULL;
@@ -338,14 +356,14 @@ _item_content_unset_hook(Elm_Object_Item *it, const char *part)
      }
 
    //common parts
-   EINA_LIST_FOREACH(navi_it->content_list, l, pair)
+   EINA_INLIST_FOREACH(navi_it->content_list, pair)
      {
         if (!strcmp(part, pair->part))
           {
              content = pair->content;
              eina_stringshare_del(pair->part);
-             navi_it->content_list = eina_list_remove(navi_it->content_list,
-                                                      pair);
+             navi_it->content_list = eina_inlist_remove(navi_it->content_list,
+                                                        EINA_INLIST_GET(pair));
              free(pair);
              break;
           }
@@ -376,18 +394,23 @@ _item_signal_emit_hook(Elm_Object_Item *it,
 }
 
 static void
+_item_title_visible_update(Elm_Naviframe_Item *navi_it)
+{
+   if (navi_it->title_visible)
+     edje_object_signal_emit(navi_it->base.view, "elm,state,title,show", "elm");
+   else
+     edje_object_signal_emit(navi_it->base.view, "elm,state,title,hide", "elm");
+}
+
+static void
 _sizing_eval(Evas_Object *obj)
 {
    Widget_Data *wd;
-   Eina_List *list;
    Elm_Naviframe_Item *it;
    wd  = elm_widget_data_get(obj);
    if (!wd) return;
 
-   list = eina_list_last(wd->stack);
-   if (!list) return;
-
-   EINA_LIST_FOREACH(wd->stack, list, it)
+   EINA_INLIST_FOREACH(wd->stack, it)
      _item_sizing_eval(it);
 }
 
@@ -492,7 +515,8 @@ _title_content_del(void *data,
    Elm_Naviframe_Item *it = pair->it;
    snprintf(buf, sizeof(buf), "elm,state,%s,hide", pair->part);
    edje_object_signal_emit(it->base.view, buf, "elm");
-   it->content_list = eina_list_remove(it->content_list, pair);
+   it->content_list = eina_inlist_remove(it->content_list,
+                                         EINA_INLIST_GET(pair));
    eina_stringshare_del(pair->part);
    free(pair);
 }
@@ -537,10 +561,9 @@ _title_content_set(Elm_Naviframe_Item *it,
                    const char *part,
                    Evas_Object *content)
 {
-   Eina_List *l = NULL;
    char buf[1024];
 
-   EINA_LIST_FOREACH(it->content_list, l, pair)
+   EINA_INLIST_FOREACH(it->content_list, pair)
      if (!strcmp(part, pair->part)) break;
 
    if (!pair)
@@ -553,7 +576,8 @@ _title_content_set(Elm_Naviframe_Item *it,
           }
         pair->it = it;
         eina_stringshare_replace(&pair->part, part);
-        it->content_list = eina_list_append(it->content_list, pair);
+        it->content_list = eina_inlist_append(it->content_list,
+                                              EINA_INLIST_GET(pair));
      }
 
    if ((pair->content) && (pair->content != content))
@@ -649,7 +673,6 @@ static void
 _item_del(Elm_Naviframe_Item *it)
 {
    Widget_Data *wd;
-   Eina_List *l;
    Elm_Naviframe_Content_Item_Pair *content_pair;
    Elm_Naviframe_Text_Item_Pair *text_pair;
 
@@ -665,25 +688,29 @@ _item_del(Elm_Naviframe_Item *it)
    if ((it->content) && (!wd->preserve))
      evas_object_del(it->content);
 
-   EINA_LIST_FOREACH(it->content_list, l, content_pair)
+   EINA_INLIST_REVERSE_FOREACH(it->content_list, content_pair)
      {
-        evas_object_event_callback_del(content_pair->content, EVAS_CALLBACK_DEL, _title_content_del);
+        evas_object_event_callback_del(content_pair->content,
+                                       EVAS_CALLBACK_DEL,
+                                       _title_content_del);
         evas_object_del(content_pair->content);
         eina_stringshare_del(content_pair->part);
+        it->content_list =
+           eina_inlist_remove(it->content_list,
+                              EINA_INLIST_GET(content_pair));
         free(content_pair);
      }
 
-   EINA_LIST_FOREACH(it->text_list, l, text_pair)
+   EINA_INLIST_REVERSE_FOREACH(it->text_list, text_pair)
      {
         eina_stringshare_del(text_pair->part);
         eina_stringshare_del(text_pair->text);
+        it->text_list = eina_inlist_remove(it->text_list,
+                                           EINA_INLIST_GET(text_pair));
         free(text_pair);
      }
 
-   eina_list_free(it->content_list);
-   eina_list_free(it->text_list);
-
-   wd->stack = eina_list_remove(wd->stack, it);
+   wd->stack = eina_inlist_remove(wd->stack, EINA_INLIST_GET(it));
 
    elm_widget_item_del(it);
 }
@@ -854,7 +881,7 @@ elm_naviframe_item_push(Evas_Object *obj,
    _item_text_set_hook(ELM_CAST(it), "elm.text.title", title_label);
 
    //title buttons
-   if ((!prev_btn) && wd->auto_pushed && eina_list_count(wd->stack))
+   if ((!prev_btn) && wd->auto_pushed && eina_inlist_count(wd->stack))
      {
         prev_btn = _back_btn_new(obj);
         _title_prev_btn_set(it, prev_btn, EINA_TRUE);
@@ -886,7 +913,7 @@ elm_naviframe_item_push(Evas_Object *obj,
                                 "elm");
      }
    it->title_visible = EINA_TRUE;
-   wd->stack = eina_list_append(wd->stack, it);
+   wd->stack = eina_inlist_append(wd->stack, EINA_INLIST_GET(it));
    return ELM_CAST(it);
 }
 
@@ -894,7 +921,7 @@ EAPI Evas_Object *
 elm_naviframe_item_pop(Evas_Object *obj)
 {
    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
-   Elm_Naviframe_Item *it, *prev_it;
+   Elm_Naviframe_Item *it, *prev_it = NULL;
    Widget_Data *wd;
    Evas_Object *content = NULL;
 
@@ -903,12 +930,12 @@ elm_naviframe_item_pop(Evas_Object *obj)
 
    it = ELM_CAST(elm_naviframe_top_item_get(obj));
    if (!it) return NULL;
-   wd->stack = eina_list_remove(wd->stack, it);
-
    if (wd->preserve)
      content = it->content;
 
-   prev_it = ELM_CAST(elm_naviframe_top_item_get(obj));
+   if (wd->stack->last->prev)
+     prev_it = EINA_INLIST_CONTAINER_GET(wd->stack->last->prev,
+                                         Elm_Naviframe_Item);
    if (prev_it)
      {
         if (wd->freeze_events)
@@ -936,17 +963,18 @@ elm_naviframe_item_pop_to(Elm_Object_Item *it)
    ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
    Elm_Naviframe_Item *navi_it = ELM_CAST(it);
    Widget_Data *wd = elm_widget_data_get(navi_it->base.widget);
-   Eina_List *l, *prev_l;
+   Eina_Inlist *l, *prev_l;
 
    if (it == elm_naviframe_top_item_get(navi_it->base.widget)) return;
 
-   l = eina_list_last(wd->stack)->prev;
+   l = wd->stack->last->prev;
 
    while(l)
      {
-        if (l->data == it) break;
+        if (ELM_CAST(EINA_INLIST_CONTAINER_GET(l, Elm_Naviframe_Item)) == it)
+          break;
         prev_l = l->prev;
-        _item_del(l->data);
+        _item_del(EINA_INLIST_CONTAINER_GET(l, Elm_Naviframe_Item));
         l = prev_l;
      }
    elm_naviframe_item_pop(navi_it->base.widget);
@@ -961,7 +989,7 @@ elm_naviframe_item_del(Elm_Object_Item *it)
    if (it == elm_naviframe_top_item_get(navi_it->base.widget))
      {
         _item_del(navi_it);
-        navi_it = ELM_CAST(eina_list_last(wd->stack)->data);
+        navi_it = ELM_CAST(EINA_INLIST_CONTAINER_GET(wd->stack->last, Elm_Naviframe_Item));
         evas_object_show(navi_it->base.view);
         evas_object_raise(navi_it->base.view);
         edje_object_signal_emit(navi_it->base.view, "elm,state,visible", "elm");
@@ -994,7 +1022,8 @@ elm_naviframe_top_item_get(const Evas_Object *obj)
    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
    Widget_Data *wd = elm_widget_data_get(obj);
    if ((!wd) || (!wd->stack)) return NULL;
-   return eina_list_last(wd->stack)->data;
+   return ELM_CAST(EINA_INLIST_CONTAINER_GET(wd->stack->last,
+                                             Elm_Naviframe_Item));
 }
 
 EAPI Elm_Object_Item*
@@ -1003,7 +1032,8 @@ elm_naviframe_bottom_item_get(const Evas_Object *obj)
    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
    Widget_Data *wd = elm_widget_data_get(obj);
    if ((!wd) || (!wd->stack)) return NULL;
-   return wd->stack->data;
+   return ELM_CAST(EINA_INLIST_CONTAINER_GET(wd->stack,
+                                             Elm_Naviframe_Item));
 }
 
 EAPI void
@@ -1011,7 +1041,6 @@ elm_naviframe_item_style_set(Elm_Object_Item *it, const char *item_style)
 {
    ELM_OBJ_ITEM_CHECK_OR_RETURN(it);
    Elm_Naviframe_Item *navi_it = ELM_CAST(it);
-   Eina_List *l;
    Elm_Naviframe_Content_Item_Pair *content_pair;
    Elm_Naviframe_Text_Item_Pair *text_pair;
    Widget_Data *wd;
@@ -1031,10 +1060,10 @@ elm_naviframe_item_style_set(Elm_Object_Item *it, const char *item_style)
                          buf,
                          elm_widget_style_get(navi_it->base.widget));
    //recover item
-   EINA_LIST_FOREACH(navi_it->text_list, l, text_pair)
+   EINA_INLIST_FOREACH(navi_it->text_list, text_pair)
      _item_text_set_hook(it, text_pair->part, text_pair->text);
 
-   EINA_LIST_FOREACH(navi_it->content_list, l, content_pair)
+   EINA_INLIST_FOREACH(navi_it->content_list, content_pair)
      _item_content_set_hook(it, content_pair->part, content_pair->content);
 
    //content
@@ -1089,12 +1118,8 @@ elm_naviframe_item_title_visible_set(Elm_Object_Item *it, Eina_Bool visible)
    visible = !!visible;
    if (navi_it->title_visible == visible) return;
 
-   if (visible)
-     edje_object_signal_emit(navi_it->base.view, "elm,state,title,show", "elm");
-   else
-     edje_object_signal_emit(navi_it->base.view, "elm,state,title,hide", "elm");
-
    navi_it->title_visible = visible;
+   _item_title_visible_update(navi_it);
 }
 
 EAPI Eina_Bool