add part closed_button for nbeat-theme
authordeasung.kim <deasung.kim@samsung.com>
Fri, 25 Mar 2011 01:37:06 +0000 (10:37 +0900)
committerdeasung.kim <deasung.kim@samsung.com>
Fri, 25 Mar 2011 01:37:06 +0000 (10:37 +0900)
src/lib/elm_multibuttonentry.c

index 95d142d..2982c6b 100644 (file)
@@ -28,8 +28,12 @@ typedef enum _Multibuttonentry_Button_State
    MULTIBUTONENTRY_BUTTON_STATE_NUM\r
 } Multibuttonentry_Button_State;\r
 \r
-struct _Multibuttonentry_Item\r
-   {\r
+typedef enum _MultiButtonEntry_Closed_Button_Type {\r
+   MULTIBUTTONENTRY_CLOSED_IMAGE,\r
+   MULTIBUTTONENTRY_CLOSED_LABEL\r
+} MultiButtonEntry_Closed_Button_Type;\r
+\r
+struct _Multibuttonentry_Item {\r
    Evas_Object *multibuttonentry;\r
    Evas_Object *button;\r
    Evas_Object *label;\r
@@ -39,8 +43,7 @@ struct _Multibuttonentry_Item
 };\r
 \r
 typedef struct _Widget_Data Widget_Data;\r
-struct _Widget_Data\r
-   {\r
+struct _Widget_Data {\r
    Evas_Object *base;\r
    Evas_Object *box;\r
    Evas_Object *rect;\r
@@ -49,9 +52,11 @@ struct _Widget_Data
    Evas_Object *guidetext;\r
    Evas_Object *end;   // used to represent the total number of invisible buttons\r
 \r
+   Evas_Object *rectForEnd;\r
+   MultiButtonEntry_Closed_Button_Type end_type;\r
+\r
    Eina_List *items;\r
    Eina_List *current;\r
-\r
    int n_str;\r
 \r
    Evas_Coord w_box, h_box;\r
@@ -104,6 +109,7 @@ _del_hook(Evas_Object *obj)
    if (wd->label) evas_object_del (wd->label);\r
    if (wd->guidetext) evas_object_del (wd->guidetext);\r
    if (wd->end) evas_object_del (wd->end);\r
+   if (wd->rectForEnd) evas_object_del(wd->rectForEnd);\r
 }\r
 \r
 static void\r
@@ -215,7 +221,7 @@ _event_init(Evas_Object *obj)
    Widget_Data *wd = elm_widget_data_get(obj);\r
    if (!wd || !wd->base)   return;\r
 \r
-   if(wd->base)\r
+   if (wd->base)\r
      {\r
         edje_object_signal_callback_add(wd->base, "mouse,clicked,1", "*", _signal_mouse_clicked, obj);\r
         edje_object_signal_callback_add(wd->base, "clicked", "*", _signal_mouse_clicked, obj);\r
@@ -243,36 +249,57 @@ _contracted_state_set(Evas_Object *obj, int contracted)
    if (contracted == 1)\r
      {\r
         Evas_Coord w=0, w_tmp=0;\r
+        Evas_Coord box_inner_item_width_padding = 0;\r
 \r
+        elm_box_padding_get(wd->box, &box_inner_item_width_padding, NULL);\r
         // unpack all items and entry\r
+        elm_box_unpack_all(wd->box);\r
         EINA_LIST_FOREACH(wd->items, l, item)\r
           {\r
              if (item)\r
                {\r
-                  elm_box_unpack(wd->box, item->button);\r
                   evas_object_hide(item->button);\r
                   item->visible = EINA_FALSE;\r
                }\r
           }\r
-        elm_box_unpack(wd->box, wd->entry);\r
         evas_object_hide(wd->entry);\r
 \r
 \r
         // pack buttons only 1line\r
         w = wd->w_box;\r
 \r
-        // w -= w_rect\r
-        if (wd->rect) evas_object_size_hint_min_get (wd->rect, &w_tmp, NULL);\r
-        w -= w_tmp;\r
+        if (wd->rect)\r
+          {\r
+             elm_box_pack_end(wd->box, wd->rect);\r
+             evas_object_size_hint_min_get(wd->rect, &w_tmp, NULL);\r
+             w -= w_tmp;\r
+             w -= box_inner_item_width_padding;\r
+          }\r
 \r
-        // w -= w_label\r
-        if (wd->label) evas_object_size_hint_min_get (wd->label, &w_tmp, NULL);\r
-        w -= w_tmp;\r
+        if (wd->label)\r
+          {\r
+             elm_box_pack_end(wd->box, wd->label);\r
+             evas_object_size_hint_min_get(wd->label, &w_tmp, NULL);\r
+             w -= w_tmp;\r
+             w -= box_inner_item_width_padding;\r
+          }\r
 \r
-        // w -= w_btns\r
         Eina_Bool on_contracted = EINA_FALSE;\r
         item = NULL;\r
         int count = eina_list_count(wd->items);\r
+        Evas_Coord button_min_width = 0;\r
+        /* Evas_Coord button_min_height = 0; */\r
+        if (wd->end_type == MULTIBUTTONENTRY_CLOSED_IMAGE)\r
+          {\r
+             const char *size_str;\r
+             size_str = edje_object_data_get(wd->end, "closed_button_width");\r
+             if(size_str) button_min_width = (Evas_Coord)atoi(size_str);\r
+             /* it use for later\r
+             size_str = edje_object_data_get(wd->end, "closed_button_height");\r
+             if(size_str) button_min_width = (Evas_Coord)atoi(size_str);\r
+              */\r
+          }\r
+\r
         EINA_LIST_FOREACH(wd->items, l, item)\r
           {\r
              if (item)\r
@@ -285,34 +312,71 @@ _contracted_state_set(Evas_Object *obj, int contracted)
                   item->visible = EINA_TRUE;\r
 \r
                   w -= item->vw;\r
+                  w -= box_inner_item_width_padding;\r
                   count--;\r
 \r
-                  if (count > 0)\r
+                  if (wd->end_type == MULTIBUTTONENTRY_CLOSED_LABEL)\r
                     {\r
-                       snprintf(buf, sizeof(buf), "... + %d", count);\r
-                       elm_label_label_set(wd->end, buf);\r
-                       evas_object_size_hint_min_get(wd->end, &w_label_count, NULL);\r
+                       if (count > 0)\r
+                         {\r
+                            snprintf(buf, sizeof(buf), "... + %d", count);\r
+                            elm_label_label_set(wd->end, buf);\r
+                            evas_object_size_hint_min_get(wd->end, &w_label_count, NULL);\r
+                         }\r
+\r
+                       if (w < 0 || w < w_label_count)\r
+                         {\r
+                            elm_box_unpack(wd->box, item->button);\r
+                            evas_object_hide(item->button);\r
+                            item->visible = EINA_FALSE;\r
+\r
+                            count++;\r
+                            snprintf(buf, sizeof(buf), "... + %d", count);\r
+                            elm_label_label_set(wd->end, buf);\r
+                            evas_object_size_hint_min_get(wd->end, &w_label_count, NULL);\r
+\r
+                            elm_box_pack_end(wd->box, wd->end);\r
+                            evas_object_show(wd->end);\r
+\r
+                            on_contracted = EINA_TRUE;\r
+                            wd->contracted = contracted;\r
+                            evas_object_smart_callback_call(obj, "contracted,state,changed", (void *)wd->contracted);\r
+                            break;\r
+                         }\r
                     }\r
-\r
-                  if (w < 0 || w < w_label_count)\r
+                  else if (wd->end_type == MULTIBUTTONENTRY_CLOSED_IMAGE)\r
                     {\r
-                       elm_box_unpack(wd->box, item->button);\r
-                       evas_object_hide(item->button);\r
-                       item->visible = EINA_FALSE;\r
-\r
-                       count++;\r
-                       snprintf(buf, sizeof(buf), "... + %d", count);\r
-                       elm_label_label_set(wd->end, buf);\r
-                       evas_object_size_hint_min_get(wd->end, &w_label_count, NULL);\r
-\r
-                       elm_box_pack_end(wd->box, wd->end);\r
-                       evas_object_show(wd->end);\r
-\r
-                       on_contracted = EINA_TRUE;\r
-                       wd->contracted = contracted;\r
-                       evas_object_smart_callback_call(obj, "contracted,state,changed", (void *)wd->contracted);\r
-\r
-                       break;\r
+                       if (w < button_min_width)\r
+                         {\r
+                            Evas_Coord rectSize;\r
+                            Evas_Coord closed_height = 0;\r
+                            const char *height_str = edje_object_data_get(wd->base, "closed_height");\r
+                            if(height_str) closed_height = (Evas_Coord)atoi(height_str);\r
+                            elm_box_unpack(wd->box, item->button);\r
+                            evas_object_hide(item->button);\r
+                            item->visible = EINA_FALSE;\r
+\r
+                            w += item->vw;\r
+                            rectSize = w - button_min_width;\r
+                            if (!wd->rectForEnd)\r
+                              {\r
+                                 Evas *e = evas_object_evas_get(obj);\r
+                                 wd->rectForEnd = evas_object_rectangle_add(e);\r
+                                 evas_object_color_set(wd->rectForEnd, 0, 0, 0, 0);\r
+                                 elm_widget_sub_object_add(obj, wd->rectForEnd);\r
+                              }\r
+                            evas_object_size_hint_min_set(wd->rectForEnd, rectSize, closed_height);\r
+                            elm_box_pack_end(wd->box, wd->rectForEnd);\r
+                            evas_object_show(wd->rectForEnd);\r
+\r
+                            elm_box_pack_end(wd->box, wd->end);\r
+                            evas_object_show(wd->end);\r
+\r
+                            on_contracted = EINA_TRUE;\r
+                            wd->contracted = contracted;\r
+                            evas_object_smart_callback_call(obj, "contracted,state,changed", (void *)wd->contracted);\r
+                            break;\r
+                         }\r
                     }\r
                }\r
           }\r
@@ -328,10 +392,25 @@ _contracted_state_set(Evas_Object *obj, int contracted)
      }\r
    else\r
      {\r
-        // unpack last label\r
-        elm_box_unpack(wd->box, wd->end);\r
+        // unpack all items and entry\r
+        elm_box_unpack_all(wd->box);\r
+        EINA_LIST_FOREACH(wd->items, l, item)\r
+          {\r
+             if (item)\r
+               {\r
+                  evas_object_hide(item->button);\r
+                  item->visible = EINA_FALSE;\r
+               }\r
+          }\r
         evas_object_hide(wd->end);\r
 \r
+        if (wd->rectForEnd) evas_object_hide(wd->rectForEnd);\r
+\r
+        // pack buttons only 1line\r
+\r
+        if (wd->rect) elm_box_pack_end(wd->box, wd->rect);\r
+        if (wd->label) elm_box_pack_end(wd->box, wd->label);\r
+\r
         // pack remain btns\r
         item = NULL;\r
         EINA_LIST_FOREACH(wd->items, l, item)\r
@@ -811,8 +890,30 @@ _view_init(Evas_Object *obj)
 \r
    if (!wd->end)\r
      {\r
-        if (! (wd->end = elm_label_add (obj))) return;\r
-        elm_object_style_set(wd->end, "extended/multibuttonentry_default");\r
+        const char *end_type = edje_object_data_get(wd->base, "closed_button_type");\r
+        if (!end_type || !strcmp(end_type, "label"))\r
+          {\r
+             if (! (wd->end = elm_label_add (obj))) return;\r
+             elm_object_style_set(wd->end, "extended/multibuttonentry_default");\r
+             wd->end_type = MULTIBUTTONENTRY_CLOSED_LABEL;\r
+          }\r
+        else\r
+          {\r
+             const char *size_str;\r
+             if (!(wd->end = edje_object_add(evas_object_evas_get(obj)))) return;\r
+             _elm_theme_object_set(obj, wd->end, "multibuttonentry", "closedbutton", elm_widget_style_get(obj));\r
+             Evas_Coord button_min_width = 0;\r
+             Evas_Coord button_min_height = 0;\r
+\r
+             size_str = edje_object_data_get(wd->end, "closed_button_width");\r
+             if(size_str) button_min_width = (Evas_Coord)atoi(size_str);\r
+             size_str = edje_object_data_get(wd->end, "closed_button_height");\r
+             if(size_str) button_min_height = (Evas_Coord)atoi(size_str);\r
+\r
+             wd->end_type = MULTIBUTTONENTRY_CLOSED_IMAGE;\r
+             evas_object_size_hint_min_set(wd->end, button_min_width, button_min_height);\r
+             elm_widget_sub_object_add(obj, wd->end);\r
+          }\r
      }\r
 }\r
 \r
@@ -853,6 +954,7 @@ elm_multibuttonentry_add(Evas_Object *parent)
    wd->contracted = 0;\r
    wd->focused = EINA_FALSE;\r
    wd->n_str = 0;\r
+   wd->rectForEnd = NULL;\r
 \r
    _view_init(obj);\r
    _event_init(obj);\r