[multibuttonentry] 1. add signals, 2. change of focusing elm_multibuttonen, 3. fix...
authorHyunsil Park <hyunsil.park@samsung.com>
Mon, 17 Jan 2011 10:39:41 +0000 (19:39 +0900)
committerHyunsil Park <hyunsil.park@samsung.com>
Mon, 17 Jan 2011 10:39:41 +0000 (19:39 +0900)
src/lib/Elementary.h.in
src/lib/elm_multibuttonentry.c

index 375f304..8e162f5 100644 (file)
@@ -3268,6 +3268,12 @@ extern "C" {
     * "expanded" - This signal is emitted when a multibuttonentry is expanded. 
     * "contracted" - This signal is emitted when a multibuttonentry is contracted. 
     * "contracted,state,changed" - This signal is emitted when the contracted state of multibuttonentry is changed. 
+    * "item,selected" - This signal is emitted when the selected item of multibuttonentry is changed. 
+    * "item,added" - This signal is emitted when a new multibuttonentry item is added.
+    * "item,deleted" - This signal is emitted when a multibuttonentry item is deleted.
+    * "item,clicked" - This signal is emitted when a multibuttonentry item is clicked. 
+    * "clicked" - This signal is emitted when a multibuttonentry is clicked. 
+    * "unfocused" - This signal is emitted when a multibuttonentry is unfocused. 
     */
    /* available styles:
     * default
index a60f0a0..9c8907c 100644 (file)
@@ -68,7 +68,7 @@ static void _changed_size_hint_cb(void *data, Evas *evas, Evas_Object *obj, void
 static void _resize_cb(void *data, Evas *evas, Evas_Object *obj, void *event);\r
 static void   _event_init(Evas_Object *obj);\r
 static void _contracted_state_set(Evas_Object *obj, int contracted);\r
-static void _view_update(Evas_Object *obj);\r
+static void _view_update(Evas_Object *obj, Eina_Bool focused);\r
 static void   _set_label(Evas_Object *obj, const char* str);\r
 static void _change_current_button_state(Evas_Object *obj, Multibuttonentry_Button_State state);\r
 static void   _change_current_button(Evas_Object *obj, Evas_Object *btn);\r
@@ -137,7 +137,20 @@ _on_focus_hook(void *data __UNUSED__, Evas_Object *obj)
 {\r
    Widget_Data *wd = elm_widget_data_get(obj);\r
    if (!wd) return;\r
-   _view_update(obj);\r
+\r
+   if (!elm_widget_focus_get(obj) && !(elm_widget_disabled_get(obj)))\r
+     {\r
+        _view_update(obj, EINA_FALSE);\r
+        evas_object_smart_callback_call(obj, "unfocused", NULL);\r
+     }\r
+}\r
+\r
+static void\r
+_signal_emit_hook(Evas_Object *obj, const char *emission, const char *source)\r
+{\r
+   Widget_Data *wd = elm_widget_data_get(obj);\r
+   if (!wd) return;\r
+   edje_object_signal_emit(wd->base, emission, source);\r
 }\r
 \r
 static void\r
@@ -159,6 +172,16 @@ _sizing_eval(Evas_Object *obj)
 }\r
 \r
 static void \r
+_signal_mouse_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)\r
+{\r
+   Widget_Data *wd = elm_widget_data_get(data);\r
+   if(!wd || !wd->base) return;\r
+\r
+   _view_update(data, EINA_TRUE);\r
+   evas_object_smart_callback_call(data, "clicked", NULL);\r
+}\r
+\r
+static void \r
 _changed_size_hint_cb(void *data, Evas *evas, Evas_Object *obj, void *event)\r
 {\r
    Evas_Object *eo = (Evas_Object *)data;\r
@@ -183,7 +206,7 @@ _resize_cb(void *data, Evas *evas, Evas_Object *obj, void *event)
    wd->w_box = w;\r
    wd->h_box = h;\r
 \r
-   _view_update(data);\r
+   //_view_update(data, EINA_FALSE);\r
 }\r
 \r
 static void\r
@@ -192,6 +215,12 @@ _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
+     {\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
+     }\r
+\r
    if (wd->box)\r
      {\r
         evas_object_event_callback_add(wd->box, EVAS_CALLBACK_RESIZE, _resize_cb, obj);\r
@@ -241,14 +270,15 @@ _contracted_state_set(Evas_Object *obj, int contracted)
         w = wd->w_box;\r
 \r
         // w -= w_rect\r
-        if (wd->rect) evas_object_geometry_get (wd->rect, NULL, NULL, &w_tmp, NULL);\r
+        if (wd->rect) evas_object_size_hint_min_get (wd->rect, &w_tmp, NULL);\r
         w -= w_tmp;\r
 \r
         // w -= w_label\r
-        if (wd->label) evas_object_geometry_get (wd->label, NULL, NULL, &w_tmp, NULL);\r
+        if (wd->label) evas_object_size_hint_min_get (wd->label, &w_tmp, NULL);\r
         w -= w_tmp;\r
 \r
-        // w -= w_btns      \r
+        // w -= w_btns \r
+        Eina_Bool on_contracted = EINA_FALSE;        \r
         item = NULL;\r
         int count = eina_list_count(wd->items);\r
         EINA_LIST_FOREACH(wd->items, l, item) \r
@@ -286,11 +316,23 @@ _contracted_state_set(Evas_Object *obj, int contracted)
                        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", wd->contracted);\r
+\r
                        break;\r
                     }\r
                }\r
           }\r
-\r
+        if(on_contracted == EINA_FALSE) // unset contracted mode\r
+          {\r
+             // pack entry\r
+             elm_box_pack_end(wd->box, wd->entry);\r
+             evas_object_show(wd->entry);\r
+             if(elm_widget_focus_get(obj))\r
+                elm_object_focus(wd->entry);\r
+             wd->contracted = 0;\r
+          }\r
      }\r
    else\r
      {\r
@@ -312,14 +354,16 @@ _contracted_state_set(Evas_Object *obj, int contracted)
         // pack entry\r
         elm_box_pack_end(wd->box, wd->entry);\r
         evas_object_show(wd->entry);\r
-     }\r
+        if(elm_widget_focus_get(obj))\r
+           elm_object_focus(wd->entry);\r
 \r
-   wd->contracted = contracted;\r
-   evas_object_smart_callback_call(obj, "contracted,state,changed", wd->contracted);\r
+        wd->contracted = contracted;\r
+        evas_object_smart_callback_call(obj, "contracted,state,changed", wd->contracted);\r
+     }\r
 }\r
 \r
 static void \r
-_view_update(Evas_Object *obj)\r
+_view_update(Evas_Object *obj, Eina_Bool focused)\r
 {   \r
    Widget_Data *wd = elm_widget_data_get(obj);   \r
    if (!wd || !wd->box || !wd->entry) return;\r
@@ -330,11 +374,36 @@ _view_update(Evas_Object *obj)
         _contracted_state_set(obj, 1);\r
      }\r
 \r
+   if (wd->contracted != 1)\r
+     {\r
+        if (wd->guidetext && !eina_list_count (wd->items) && !elm_widget_focus_get(obj) && !focused)\r
+          {\r
+             \r
+             elm_box_unpack(wd->box, wd->guidetext);\r
+             elm_box_unpack(wd->box, wd->entry);\r
+             evas_object_hide(wd->entry);\r
+             elm_box_pack_end(wd->box, wd->guidetext);                     \r
+             evas_object_show(wd->guidetext);\r
+          }\r
+        else\r
+          {\r
+             elm_box_unpack(wd->box, wd->entry);\r
+             elm_box_unpack(wd->box, wd->guidetext);\r
+             evas_object_hide(wd->guidetext);\r
+             elm_box_pack_end(wd->box, wd->entry);\r
+             evas_object_show(wd->entry);\r
+\r
+             if(elm_widget_focus_get(obj) || focused)\r
+                elm_object_focus(wd->entry);\r
+          }\r
+     }\r
+   \r
+#if 0\r
    if (wd->guidetext && (wd->contracted != 1))\r
      {\r
         if (!eina_list_count (wd->items))\r
           {\r
-             if (elm_widget_focus_get (obj))\r
+             if (elm_widget_focus_get (obj) || focused)\r
                {\r
                   elm_box_unpack(wd->box, wd->entry);\r
                   elm_box_unpack(wd->box, wd->guidetext);\r
@@ -343,6 +412,7 @@ _view_update(Evas_Object *obj)
                   elm_box_pack_end(wd->box, wd->entry);\r
                   evas_object_show(wd->entry);\r
                   \r
+                  elm_object_focus(wd->entry);\r
                   //elm_widget_focus_set(wd->entry, EINA_TRUE);   //FIXME\r
                }\r
              else\r
@@ -365,6 +435,7 @@ _view_update(Evas_Object *obj)
              evas_object_show(wd->entry);\r
           }\r
      }\r
+#endif\r
 }\r
 \r
 /*\r
@@ -407,7 +478,7 @@ _set_label(Evas_Object *obj, const char* str)
      }\r
 \r
    elm_label_label_set(wd->label, str);\r
-   _view_update(obj);\r
+   _view_update(obj, EINA_FALSE);\r
 }\r
 \r
 static void\r
@@ -426,7 +497,7 @@ _set_guidetext(Evas_Object *obj, const char* str)
      }\r
 \r
    if (wd->guidetext) edje_object_part_text_set (wd->guidetext, "elm.text", str);\r
-   _view_update(obj);\r
+   _view_update(obj, EINA_FALSE);\r
 }\r
 \r
 static void\r
@@ -449,7 +520,8 @@ _change_current_button_state(Evas_Object *obj, Multibuttonentry_Button_State sta
                 break;\r
              case MULTIBUTONENTRY_BUTTON_STATE_SELECTED:\r
                 edje_object_signal_emit(item->button, "focused", "");\r
-                evas_object_smart_callback_call(obj, "selected", item);\r
+                evas_object_smart_callback_call(obj, "selected", item); // will be removed!\r
+                evas_object_smart_callback_call(obj, "item,selected", item);\r
                 break;\r
              default:\r
                 edje_object_signal_emit(item->button, "default", "");\r
@@ -490,7 +562,8 @@ _button_clicked(void *data, Evas_Object *obj, const char *emission, const char *
 {\r
    Widget_Data *wd = elm_widget_data_get(data);\r
    static char str[MAX_STR];\r
-   if (!wd) return;\r
+   Elm_Multibuttonentry_Item *item = NULL;\r
+   if (!wd || wd->contracted) return;\r
 \r
    strncpy(str, elm_scrolled_entry_entry_get(wd->entry), MAX_STR);\r
    str[MAX_STR - 1]= 0;\r
@@ -499,6 +572,10 @@ _button_clicked(void *data, Evas_Object *obj, const char *emission, const char *
       _add_button(data, str);\r
 \r
    _change_current_button(data, obj);\r
+\r
+   if (wd->current)\r
+      if(item = eina_list_data_get(wd->current))\r
+         evas_object_smart_callback_call(data, "item,clicked", item);\r
 }\r
 \r
 static void\r
@@ -538,7 +615,8 @@ _del_button_item(Elm_Multibuttonentry_Item *item)
           {\r
              wd->items = eina_list_remove(wd->items, _item);\r
              elm_box_unpack(wd->box, _item->button);\r
-             evas_object_smart_callback_call(obj, "deleted", _item);\r
+             evas_object_smart_callback_call(obj, "deleted", _item); // will be removed!\r
+             evas_object_smart_callback_call(obj, "item,deleted", _item);\r
              _del_button_obj(obj, _item->button);\r
              free(_item);\r
              if (wd->current == l)   \r
@@ -581,12 +659,12 @@ _add_button_item(Evas_Object *obj, const char *str, Multibuttonentry_Pos pos, co
    Widget_Data *wd = elm_widget_data_get(obj);\r
    if (!wd || !wd->box || !wd->entry) return NULL;\r
 \r
-   if (wd->contracted == 1) return NULL;\r
+   //if (wd->contracted == 1) return NULL;\r
 \r
    // add button\r
    btn = edje_object_add(evas_object_evas_get(obj));\r
    _elm_theme_object_set(obj, btn, "multibuttonentry", "btn", elm_widget_style_get(obj));\r
-   edje_object_signal_callback_add(btn, "clicked", "elm", _button_clicked, obj);\r
+   edje_object_signal_callback_add(btn, "mouse,clicked,1", "*", _button_clicked, obj);\r
    evas_object_size_hint_weight_set(btn, 0.0, 0.0);\r
    evas_object_show(btn);\r
 \r
@@ -620,25 +698,27 @@ _add_button_item(Evas_Object *obj, const char *str, Multibuttonentry_Pos pos, co
           {\r
              case MULTIBUTONENTRY_POS_START:\r
                 wd->items = eina_list_prepend(wd->items, item);\r
-                _view_update(obj);\r
-                elm_box_pack_after(wd->box, btn, wd->label);\r
+                if(wd->label) elm_box_pack_after(wd->box, btn, wd->label);\r
+                else if(wd->rect) elm_box_pack_after(wd->box, btn, wd->rect);\r
+                else elm_box_pack_start(wd->box, btn);\r
+                _view_update(obj, EINA_FALSE);\r
                 break;\r
              case MULTIBUTONENTRY_POS_END:\r
                 wd->items = eina_list_append(wd->items, item);\r
-                _view_update(obj);\r
+                _view_update(obj, EINA_FALSE);\r
                 elm_box_pack_before(wd->box, btn, wd->entry);\r
                 break;\r
              case MULTIBUTONENTRY_POS_BEFORE:\r
                 if (reference)\r
                   {   \r
                      wd->items = eina_list_prepend_relative(wd->items, item, reference);\r
-                     _view_update(obj);\r
                      elm_box_pack_before(wd->box, btn, reference->button);\r
+                     _view_update(obj, EINA_FALSE);\r
                   }\r
                 else\r
                   {\r
                      wd->items = eina_list_append(wd->items, item);\r
-                     _view_update(obj);\r
+                     _view_update(obj, EINA_FALSE);\r
                      elm_box_pack_before(wd->box, btn, wd->entry);\r
                   }\r
                 break;\r
@@ -646,13 +726,12 @@ _add_button_item(Evas_Object *obj, const char *str, Multibuttonentry_Pos pos, co
                 if (reference)\r
                   {   \r
                      wd->items = eina_list_append_relative(wd->items, item, reference);\r
-                     _view_update(obj);\r
                      elm_box_pack_after(wd->box, btn, reference->button);\r
-                  }\r
+                     _view_update(obj, EINA_FALSE);                  }\r
                 else\r
                   {   \r
                      wd->items = eina_list_append(wd->items, item);\r
-                     _view_update(obj);\r
+                     _view_update(obj, EINA_FALSE);\r
                      elm_box_pack_before(wd->box, btn, wd->entry);\r
                   }\r
                 break;\r
@@ -670,7 +749,8 @@ _add_button_item(Evas_Object *obj, const char *str, Multibuttonentry_Pos pos, co
         elm_label_wrap_width_set(label, item->vw - 2*padding_outer - 2*padding_inner ); \r
      }\r
 \r
-   evas_object_smart_callback_call(obj, "added", item);\r
+   evas_object_smart_callback_call(obj, "added", item); // will be removed!\r
+   evas_object_smart_callback_call(obj, "item,added", item);\r
 \r
    return item;\r
 }\r
@@ -795,6 +875,7 @@ elm_multibuttonentry_add(Evas_Object *parent)
    elm_widget_del_hook_set(obj, _del_hook);\r
    elm_widget_theme_hook_set(obj, _theme_hook);\r
    elm_widget_on_focus_hook_set(obj, _on_focus_hook, NULL);\r
+   elm_widget_signal_emit_hook_set(obj, _signal_emit_hook);   \r
    \r
    wd->base = edje_object_add(e);\r
    _elm_theme_object_set(obj, wd->base, "multibuttonentry", "base", "default");\r
@@ -1143,6 +1224,9 @@ elm_multibuttonentry_items_del(Evas_Object *obj)
    Widget_Data *wd = elm_widget_data_get(obj);\r
    if (!wd) return;\r
    \r
+   if (wd->contracted == 1)\r
+      _contracted_state_set(obj, 0);\r
+      \r
    if (wd->items)\r
      {\r
         Elm_Multibuttonentry_Item *item;\r