2 * @defgroup Controlbar Controlbar
5 * This is a Controlbar. It can contain label and icon objects.
6 * In edit mode, you can change the location of items.
12 #include <Elementary.h>
16 #define EAPI __attribute__ ((visibility("default")))
19 #define ELM_MAX(v1, v2) (((v1) > (v2)) ? (v1) : (v2))
20 #define _EDJ(x) (Evas_Object *)elm_layout_edje_get(x)
26 typedef struct _Animation_Data Animation_Data;
28 struct _Animation_Data
41 void (*func) (void *data, Evas_Object * obj);
43 Ecore_Animator * timer;
46 // internal data structure of controlbar object
47 typedef struct _Widget_Data Widget_Data;
57 Evas_Object * selected_box;
59 Elm_Controlbar_Item * more_item;
60 Elm_Controlbar_Item * pre_item;
61 Elm_Controlbar_Item * cur_item;
62 Evas_Coord x, y, w, h;
71 Eina_List * visible_items;
73 void (*ani_func) (void *data, Evas_Object * obj, void *event_info);
75 Ecore_Timer *effect_timer;
76 Eina_Bool selected_animation;
79 const char *pressed_signal;
80 const char *selected_signal;
83 struct _Elm_Controlbar_Item
88 Evas_Object * base_item;
91 const char *icon_path;
93 void (*func) (void *data, Evas_Object * obj, void *event_info);
102 static const char *widtype = NULL;
104 static int _check_bar_item_number(Widget_Data *wd);
105 static void _select_box(Elm_Controlbar_Item * it);
106 static void _cancel_selected_box(Widget_Data *wd);
107 static Eina_Bool _press_box(Elm_Controlbar_Item * it);
109 ///////////////////////////////////////////////////////////////////
111 // Smart Object basic function
113 ////////////////////////////////////////////////////////////////////
116 _controlbar_move(void *data, Evas_Object * obj __UNUSED__)
119 Evas_Coord x, y, x_, y_, width;
121 wd = elm_widget_data_get((Evas_Object *) data);
123 evas_object_geometry_get(wd->edje, &x, &y, NULL, NULL);
126 evas_object_move(wd->edje, x, y);
127 evas_object_geometry_get(elm_layout_content_get(wd->edje, "bg_image"), NULL, NULL, &width, NULL);
128 evas_object_geometry_get(wd->parent, &x_, &y_, NULL, NULL);
131 case ELM_CONTROLBAR_MODE_LEFT:
132 evas_object_move(wd->view, x + width, y);
134 case ELM_CONTROLBAR_MODE_RIGHT:
136 evas_object_move(wd->view, x, y);
142 _controlbar_resize(void *data, Evas_Object * obj __UNUSED__)
145 Evas_Coord x, y, x_, y_, w, h, width, height;
147 wd = elm_widget_data_get((Evas_Object *) data);
149 evas_object_geometry_get(wd->edje, &x, &y, &w, &h);
152 evas_object_resize(wd->edje, w, h);
153 evas_object_geometry_get(elm_layout_content_get(wd->edje, "bg_image"), NULL, NULL, &width, &height);
154 evas_object_geometry_get(wd->parent, &x_, &y_, NULL, NULL);
157 case ELM_CONTROLBAR_MODE_LEFT:
158 case ELM_CONTROLBAR_MODE_RIGHT:
159 evas_object_resize(wd->view, w - width, h);
162 evas_object_resize(wd->view, w, h - height + 1);
168 _controlbar_object_move(void *data, Evas * e __UNUSED__, Evas_Object * obj,
169 void *event_info __UNUSED__)
171 _controlbar_move(data, obj);
175 _controlbar_object_resize(void *data, Evas * e __UNUSED__, Evas_Object * obj,
176 void *event_info __UNUSED__)
178 _controlbar_resize(data, obj);
182 _controlbar_object_show(void *data, Evas * e __UNUSED__, Evas_Object * obj __UNUSED__,
183 void *event_info __UNUSED__)
187 wd = elm_widget_data_get((Evas_Object *) data);
189 evas_object_show(wd->view);
190 evas_object_show(wd->edje);
191 evas_object_show(wd->box);
195 _controlbar_object_hide(void *data, Evas * e __UNUSED__, Evas_Object * obj __UNUSED__,
196 void *event_info __UNUSED__)
200 wd = elm_widget_data_get((Evas_Object *) data);
202 evas_object_hide(wd->view);
203 evas_object_hide(wd->edje);
204 evas_object_hide(wd->box);
206 _cancel_selected_box(wd);
210 _item_del(Elm_Controlbar_Item *it)
213 Widget_Data *wd = elm_widget_data_get(it->obj);
217 eina_stringshare_del(it->text);
219 eina_stringshare_del(it->icon_path);
221 evas_object_del(it->icon);
223 evas_object_del(it->base);
225 evas_object_del(it->base_item);
227 evas_object_del(it->view);
231 _del_hook(Evas_Object * obj)
233 Widget_Data * wd = elm_widget_data_get(obj);
234 Elm_Controlbar_Item * item;
237 EINA_LIST_FREE(wd->items, item)
245 evas_object_del(wd->bg);
250 evas_object_del(wd->box);
253 if (wd->selected_box)
255 evas_object_del(wd->selected_box);
256 wd->selected_box = NULL;
260 evas_object_del(wd->edje);
263 if (wd->effect_timer)
265 ecore_timer_del(wd->effect_timer);
266 wd->effect_timer = NULL;
270 if (wd->ad->timer) ecore_animator_del(wd->ad->timer);
271 wd->ad->timer = NULL;
277 evas_object_del(wd->view);
286 _theme_hook(Evas_Object * obj)
290 Elm_Controlbar_Item * item;
293 Widget_Data * wd = elm_widget_data_get(obj);
295 elm_layout_theme_set(wd->edje, "controlbar", "base",
296 elm_widget_style_get(obj));
297 elm_layout_theme_set(wd->bg, "controlbar", "background",
298 elm_widget_style_get(obj));
299 evas_object_color_get(wd->bg, &r, &g, &b, NULL);
300 evas_object_color_set(wd->bg, r, g, b, (int)(255 * wd->alpha / 100));
301 elm_layout_theme_set(wd->view, "controlbar", "view", elm_widget_style_get(obj));
302 elm_layout_theme_set(wd->selected_box, "controlbar", "item_bg_move", elm_widget_style_get(obj));
303 EINA_LIST_FOREACH(wd->items, l, item)
305 elm_layout_theme_set(item->base, "controlbar", "item_bg", elm_widget_style_get(obj));
309 //TODO: "These lines affects item after images. I don't know why it does this time Please check it by you!!"
310 // evas_object_smart_member_add(wd->view, obj);
311 // evas_object_smart_member_add(wd->selected_box, obj);
312 // evas_object_smart_member_add(wd->box, obj);
316 _disable_hook(Evas_Object * obj)
318 Widget_Data * wd = elm_widget_data_get(obj);
321 Elm_Controlbar_Item * item;
324 wd->disabled = elm_widget_disabled_get(obj);
326 EINA_LIST_FOREACH(wd->items, l, item)
329 disabled = wd->disabled;
331 disabled = item->disabled;
333 if (item->base_item) elm_widget_disabled_set(item->base_item, disabled);
338 _sub_del(void *data __UNUSED__, Evas_Object * obj, void *event_info)
340 Widget_Data *wd = elm_widget_data_get(obj);
341 Evas_Object *sub = event_info;
342 Evas_Object *content;
347 content = elm_layout_content_unset(wd->view, "elm.swallow.view");
348 evas_object_hide(content);
353 _sizing_eval(Evas_Object * obj)
355 Widget_Data * wd = elm_widget_data_get(obj);
357 _controlbar_move(obj, obj);
358 _controlbar_resize(obj, obj);
361 /////////////////////////////////////////////////////////////
363 // animation function
365 /////////////////////////////////////////////////////////////
368 _move_evas_object(void *data)
378 Animation_Data * ad = (Animation_Data *) data;
379 t = ELM_MAX(0.0, ecore_loop_time_get() - ad->start_time);
380 dx = ad->tx - ad->fx;
381 dy = ad->ty - ad->fy;
382 dw = ad->tw - ad->fw;
383 dh = ad->th - ad->fh;
386 x = (1 * sin((t / ad->time) * (M_PI / 2)) * dx);
387 y = (1 * sin((t / ad->time) * (M_PI / 2)) * dy);
388 w = (1 * sin((t / ad->time) * (M_PI / 2)) * dw);
389 h = (1 * sin((t / ad->time) * (M_PI / 2)) * dh);
402 if (x == dx && y == dy && w == dw && h == dh)
404 if (ad->timer) ecore_animator_del(ad->timer);
406 evas_object_move(ad->obj, px, py);
407 evas_object_resize(ad->obj, pw, ph);
408 evas_object_show(ad->obj);
409 if (ad->func != NULL)
410 ad->func(ad->data, ad->obj);
411 return ECORE_CALLBACK_CANCEL;
415 evas_object_move(ad->obj, px, py);
416 evas_object_resize(ad->obj, pw, ph);
417 evas_object_show(ad->obj);
419 return ECORE_CALLBACK_RENEW;
422 static Animation_Data*
423 _move_object_with_animation(Evas_Object * obj, Evas_Coord x, Evas_Coord y,
424 Evas_Coord w, Evas_Coord h, Evas_Coord x_,
425 Evas_Coord y_, Evas_Coord w_, Evas_Coord h_,
426 double time, Eina_Bool (*mv_func) (void *data),
427 void (*func) (void *data,
428 Evas_Object * obj), void *data)
430 Animation_Data * ad = (Animation_Data *) malloc(sizeof(Animation_Data));
440 ad->start_time = ecore_loop_time_get();
444 ad->timer = ecore_animator_add(mv_func, ad);
449 /////////////////////////////////////////////////////////////
453 /////////////////////////////////////////////////////////////
456 _sort_cb(const void *d1, const void *d2)
458 Elm_Controlbar_Item * item1, *item2;
459 item1 = (Elm_Controlbar_Item *) d1;
460 item2 = (Elm_Controlbar_Item *) d2;
461 if (item1->order <= 0) return 1;
462 if (item2->order <= 0) return -1;
463 return item1->order > item2->order ? 1 : -1;
466 ///////////////////////////////////////////////////////////////////
468 // basic utility function
470 ////////////////////////////////////////////////////////////////////
473 _check_item(Widget_Data *wd, Elm_Controlbar_Item *item)
476 Elm_Controlbar_Item *it;
478 if (!wd) return EINA_FALSE;
479 if (!wd->items) return EINA_FALSE;
481 EINA_LIST_FOREACH(wd->items, l, it)
482 if (it == item) return EINA_TRUE;
488 _check_background(Widget_Data *wd)
492 Elm_Controlbar_Item *it;
494 EINA_LIST_FOREACH(wd->items, l, it)
496 if (it->style == TABBAR)
498 if (wd->mode == ELM_CONTROLBAR_MODE_LEFT)
499 edje_object_signal_emit(_EDJ(wd->bg), "elm,state,tabbar_left", "elm");
500 else if (wd->mode == ELM_CONTROLBAR_MODE_RIGHT)
501 edje_object_signal_emit(_EDJ(wd->bg), "elm,state,tabbar_right", "elm");
503 edje_object_signal_emit(_EDJ(wd->bg), "elm,state,tabbar", "elm");
507 edje_object_signal_emit(_EDJ(wd->bg), "elm,state,toolbar", "elm");
511 _check_toolbar_line(Widget_Data *wd)
515 Elm_Controlbar_Item *it, *it2;
517 EINA_LIST_FOREACH(wd->items, l, it)
519 it2 = elm_controlbar_item_prev(it);
521 if (it->style != TOOLBAR || it2->style != TOOLBAR) continue;
525 edje_object_signal_emit(_EDJ(it2->base), "elm,state,right_line_hide", "elm");
526 edje_object_signal_emit(_EDJ(it->base), "elm,state,left_line_hide", "elm");
528 if ((it->icon || it->text) && (it2->icon || it2->text))
530 edje_object_signal_emit(_EDJ(it2->base), "elm,state,bottom_line_show", "elm");
531 edje_object_signal_emit(_EDJ(it->base), "elm,state,top_line_show", "elm");
535 edje_object_signal_emit(_EDJ(it2->base), "elm,state,bottom_line_hide", "elm");
536 edje_object_signal_emit(_EDJ(it->base), "elm,state,top_line_hide", "elm");
541 edje_object_signal_emit(_EDJ(it2->base), "elm,state,bottom_line_hide", "elm");
542 edje_object_signal_emit(_EDJ(it->base), "elm,state,top_line_hide", "elm");
544 if ((it->icon || it->text) && (it2->icon || it2->text))
546 edje_object_signal_emit(_EDJ(it2->base), "elm,state,right_line_show", "elm");
547 edje_object_signal_emit(_EDJ(it->base), "elm,state,left_line_show", "elm");
551 edje_object_signal_emit(_EDJ(it2->base), "elm,state,right_line_hide", "elm");
552 edje_object_signal_emit(_EDJ(it->base), "elm,state,left_line_hide", "elm");
559 _check_bar_item_number(Widget_Data *wd)
562 Elm_Controlbar_Item * item;
565 EINA_LIST_FOREACH(wd->items, l, item)
566 if (item->order > 0) num++;
572 _insert_item_in_bar(Elm_Controlbar_Item * it, int order)
575 Elm_Controlbar_Item * item;
576 Widget_Data * wd = elm_widget_data_get(it->obj);
579 if (order == 0) return;
581 EINA_LIST_FOREACH(wd->items, l, item)
583 if (item->order == order && item != it)
588 EINA_LIST_FOREACH(wd->items, l, item)
591 elm_table_unpack(wd->box, item->base);
593 EINA_LIST_FOREACH(wd->items, l, item)
597 if (item->order >= order)
600 elm_table_pack(wd->box, item->base, item->order - 1, 0, 1, 1);
602 elm_table_pack(wd->box, item->base, 0, item->order - 1, 1, 1);
603 evas_object_show(item->base);
609 elm_table_pack(wd->box, it->base, it->order - 1, 0, 1, 1);
611 elm_table_pack(wd->box, it->base, 0, it->order - 1, 1, 1);
612 evas_object_show(it->base);
616 _delete_item_in_bar(Elm_Controlbar_Item * it)
619 Elm_Controlbar_Item * item;
620 Widget_Data * wd = elm_widget_data_get(it->obj);
623 EINA_LIST_FOREACH(wd->items, l, item)
629 elm_table_unpack(wd->box, it->base);
630 evas_object_hide(it->base);
635 EINA_LIST_FOREACH(wd->items, l, item)
640 elm_table_unpack(wd->box, item->base);
642 elm_table_pack(wd->box, item->base, item->order - 1, 0, 1, 1);
644 elm_table_pack(wd->box, item->base, 0, item->order - 1, 1, 1);
651 _set_item_visible(Elm_Controlbar_Item *it, Eina_Bool visible)
653 Elm_Controlbar_Item *item;
654 Eina_Bool check = EINA_TRUE;
657 if (it->obj == NULL) return;
658 Widget_Data * wd = elm_widget_data_get(it->obj);
659 if (!wd || !wd->items) return;
660 if (it->order <= 0) check = EINA_FALSE;
661 if (check == visible) return;
664 item = elm_controlbar_last_item_get(it->obj);
665 while (!elm_controlbar_item_visible_get(item)){
666 item = elm_controlbar_item_prev(item);
668 _insert_item_in_bar(it, item->order + 1);
672 _delete_item_in_bar(it);
674 wd->items = eina_list_sort(wd->items, eina_list_count(wd->items), _sort_cb);
675 _sizing_eval(it->obj);
679 _hide_selected_box(void *data)
681 Evas_Object *selected_box = (Evas_Object *)data;
683 evas_object_move(selected_box, -999, -999);
684 evas_object_hide(selected_box);
686 return ECORE_CALLBACK_CANCEL;
690 _end_selected_box(void *data, Evas_Object *obj __UNUSED__)
692 Widget_Data * wd = (Widget_Data *)data;
694 if (_check_item(wd, wd->cur_item))
696 edje_object_signal_emit(_EDJ(wd->cur_item->base), wd->selected_signal, "elm");
700 if (wd->animating < 0)
702 printf("animation error\n");
706 ecore_idler_add(_hide_selected_box, wd->selected_box);
710 _move_selected_box(Widget_Data *wd, Elm_Controlbar_Item * fit, Elm_Controlbar_Item * tit)
712 Evas_Coord fx, fy, fw, fh, tx, ty, tw, th;
713 Evas_Object *from, *to;
715 if (fit->order <= 0 && wd->auto_align)
718 from = (Evas_Object *) edje_object_part_object_get(_EDJ(fit->base), "bg_img");
719 evas_object_geometry_get(from, &fx, &fy, &fw, &fh);
721 to = (Evas_Object *) edje_object_part_object_get(_EDJ(tit->base), "bg_img");
722 evas_object_geometry_get(to, &tx, &ty, &tw, &th);
724 if (_check_item(wd, wd->pre_item))
726 edje_object_signal_emit(_EDJ(wd->pre_item->base), "elm,state,unselected", "elm");
728 if (_check_item(wd, wd->cur_item))
729 edje_object_signal_emit(_EDJ(wd->cur_item->base), "elm,state,unselected", "elm");
734 if (wd->ad->timer) ecore_animator_del(wd->ad->timer);
735 wd->ad->timer = NULL;
739 wd->ad = _move_object_with_animation(wd->selected_box, fx, fy, fw, fh, tx, ty, tw, th,
740 0.3, _move_evas_object, _end_selected_box, wd);
744 _select_box(Elm_Controlbar_Item * it)
747 Widget_Data * wd = elm_widget_data_get(it->obj);
749 Elm_Controlbar_Item * item, *fit = NULL;
750 Evas_Object * content;
752 if (wd->animating) return;
756 if (it->style == TABBAR)
758 content = elm_layout_content_unset(wd->view, "elm.swallow.view");
759 if (content) evas_object_hide(content);
761 EINA_LIST_FOREACH(wd->items, l, item){
762 if (item->selected) {
766 item->selected = EINA_FALSE;
768 it->selected = EINA_TRUE;
770 if (fit != NULL && fit != it)
772 _move_selected_box(wd, fit, it);
776 edje_object_signal_emit(_EDJ(it->base), wd->selected_signal, "elm");
781 if (wd->more_item != it)
782 evas_object_smart_callback_call(it->obj, "view,change,before", it);
785 elm_layout_content_set(wd->view, "elm.swallow.view", it->view);
787 else if (it->style == TOOLBAR)
789 edje_object_signal_emit(_EDJ(it->base), "elm,state,text_unselected", "elm");
791 it->func(it->data, it->obj, it);
796 _cancel_selected_box(Widget_Data *wd)
799 Elm_Controlbar_Item * item;
801 EINA_LIST_FOREACH(wd->items, l, item)
803 if (item->style == TABBAR)
807 edje_object_signal_emit(_EDJ(item->base), wd->selected_signal, "elm");
811 edje_object_signal_emit(_EDJ(item->base), "elm,state,unselected", "elm");
814 else if (item->style == TOOLBAR)
816 edje_object_signal_emit(_EDJ(item->base), "elm,state,unselected", "elm");
822 _unpress_box_cb(void *data, Evas *evas __UNUSED__, Evas_Object *obj, void *event_info)
824 Widget_Data * wd = (Widget_Data *) data;
825 Evas_Event_Mouse_Up * ev = event_info;
826 Evas_Coord x, y, w, h;
828 evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_UP, _unpress_box_cb);
830 _cancel_selected_box(wd);
832 if (_check_item(wd, wd->pre_item))
834 evas_object_geometry_get(wd->pre_item->base, &x, &y, &w, &h);
835 if (ev->output.x > x && ev->output.x < x+w && ev->output.y > y && ev->output.y < y+h)
837 _select_box(wd->pre_item);
844 _press_box(Elm_Controlbar_Item * it)
846 Widget_Data * wd = elm_widget_data_get(it->obj);
849 Elm_Controlbar_Item * item;
851 if (wd->animating) return EINA_FALSE;
853 if (wd->disabled || it->disabled) return EINA_FALSE;
855 EINA_LIST_FOREACH(wd->items, l, item)
859 if (it->style == TABBAR)
861 edje_object_signal_emit(_EDJ(it->base), wd->pressed_signal, "elm");
863 else if (it->style == TOOLBAR)
865 edje_object_signal_emit(_EDJ(it->base), "elm,state,toolbar_pressed", "elm");
867 evas_object_event_callback_add(it->base, EVAS_CALLBACK_MOUSE_UP, _unpress_box_cb, (void *)wd);
881 _create_item_icon(Evas_Object *obj, Elm_Controlbar_Item * it, char *part)
885 icon = elm_icon_add(obj);
886 if (!elm_icon_standard_set(icon, it->icon_path))
888 elm_icon_file_set(icon, it->icon_path, NULL);
891 evas_object_size_hint_min_set(icon, 40, 40);
892 evas_object_size_hint_max_set(icon, 100, 100);
893 evas_object_show(icon);
895 elm_button_icon_set(obj, icon);
901 _create_item_layout(Evas_Object * parent, Elm_Controlbar_Item * it, Evas_Object **item, Evas_Object **icon)
905 obj = elm_layout_add(parent);
908 fprintf(stderr, "Cannot load bg edj\n");
911 elm_layout_theme_set(obj, "controlbar", "item_bg",
912 elm_widget_style_get(it->obj));
913 evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
914 evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, EVAS_HINT_FILL);
916 *item = elm_button_add(parent);
917 if (*item == NULL) return NULL;
918 elm_object_style_set(*item, "controlbar/vertical");
919 elm_layout_content_set(obj, "item", *item);
922 elm_button_label_set(*item, it->text);
924 *icon = _create_item_icon(*item, it, "elm.swallow.icon");
930 _bar_item_down_cb(void *data, Evas * evas __UNUSED__, Evas_Object * obj, void *event_info __UNUSED__)
932 Widget_Data * wd = (Widget_Data *) data;
934 Elm_Controlbar_Item * item;
935 if (wd->animating) return;
937 EINA_LIST_FOREACH(wd->items, l, item)
938 if (item->base == obj) break;
940 if (item == NULL) return;
945 static Elm_Controlbar_Item *
946 _create_tab_item(Evas_Object * obj, const char *icon_path, const char *label,
949 Elm_Controlbar_Item * it;
953 fprintf(stderr, "Invalid argument: controlbar object is NULL\n");
956 wd = elm_widget_data_get(obj);
959 fprintf(stderr, "Cannot get smart data\n");
962 it = ELM_NEW(Elm_Controlbar_Item);
963 if (!it) return NULL;
966 it->text = eina_stringshare_add(label);
967 it->icon_path = eina_stringshare_add(icon_path);
968 it->selected = EINA_FALSE;
972 it->base = _create_item_layout(wd->edje, it, &(it->base_item), &(it->icon));
973 evas_object_event_callback_add(it->base, EVAS_CALLBACK_MOUSE_DOWN,
974 _bar_item_down_cb, wd);
975 evas_object_show(it->base);
980 static Elm_Controlbar_Item *
981 _create_tool_item(Evas_Object * obj, const char *icon_path, const char *label,
982 void (*func) (void *data, Evas_Object * obj,
983 void *event_info), void *data)
986 Elm_Controlbar_Item * it;
990 fprintf(stderr, "Invalid argument: controlbar object is NULL\n");
993 wd = elm_widget_data_get(obj);
996 fprintf(stderr, "Cannot get smart data\n");
999 it = ELM_NEW(Elm_Controlbar_Item);
1004 it->text = eina_stringshare_add(label);
1005 it->icon_path = eina_stringshare_add(icon_path);
1006 it->selected = EINA_FALSE;
1010 it->style = TOOLBAR;
1011 it->base = _create_item_layout(wd->edje, it, &(it->base_item), &(it->icon));
1012 evas_object_event_callback_add(it->base, EVAS_CALLBACK_MOUSE_DOWN,
1013 _bar_item_down_cb, wd);
1014 evas_object_show(it->base);
1019 static Elm_Controlbar_Item *
1020 _create_object_item(Evas_Object * obj, Evas_Object * obj_item, const int sel)
1022 Elm_Controlbar_Item * it;
1026 fprintf(stderr, "Invalid argument: controlbar object is NULL\n");
1029 wd = elm_widget_data_get(obj);
1032 fprintf(stderr, "Cannot get smart data\n");
1035 it = ELM_NEW(Elm_Controlbar_Item);
1042 it->base = elm_layout_add(wd->edje);
1043 elm_layout_theme_set(it->base, "controlbar", "item_bg",
1044 elm_widget_style_get(it->obj));
1045 evas_object_size_hint_weight_set(it->base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1046 evas_object_size_hint_align_set(it->base, EVAS_HINT_FILL, EVAS_HINT_FILL);
1047 it->base_item = obj_item;
1048 elm_layout_content_set(it->base, "item", it->base_item);
1049 evas_object_show(it->base);
1054 _repack_items(Widget_Data *wd)
1057 Elm_Controlbar_Item * item;
1059 EINA_LIST_FOREACH(wd->items, l, item)
1061 if (item->order > 0)
1063 elm_table_unpack(wd->box, item->base);
1065 elm_table_pack(wd->box, item->base, item->order - 1, 0, item->sel, 1);
1067 elm_table_pack(wd->box, item->base, 0, item->order - 1, item->sel, 1);
1073 _set_items_position(Evas_Object * obj, Elm_Controlbar_Item * it,
1074 Elm_Controlbar_Item * mit, Eina_Bool bar)
1078 Elm_Controlbar_Item * item;
1079 int check = EINA_FALSE;
1084 fprintf(stderr, "Invalid argument: controlbar object is NULL\n");
1087 wd = elm_widget_data_get(obj);
1090 fprintf(stderr, "Cannot get smart data\n");
1094 EINA_LIST_FOREACH(wd->items, l, item)
1096 if (item == mit && item->order > 0)
1099 it->order = mit->order;
1103 if (item->order > 0)
1105 elm_table_unpack(wd->box, item->base);
1106 item->order += it->sel;
1108 elm_table_pack(wd->box, item->base, item->order - 1, 0, item->sel, 1);
1110 elm_table_pack(wd->box, item->base, 0, item->order - 1, item->sel, 1);
1113 if (item->order > 0) order += item->sel;
1127 elm_table_pack(wd->box, it->base, it->order - 1, 0, it->sel, 1);
1129 elm_table_pack(wd->box, it->base, 0, it->order - 1, it->sel, 1);
1132 evas_object_hide(it->base);
1136 _list_clicked(void *data, Evas_Object *obj, void *event_info __UNUSED__)
1138 Elm_Controlbar_Item *item = (Elm_Controlbar_Item *)data;
1139 Elm_Controlbar_Item *it;
1142 Evas_Object *content;
1143 Elm_List_Item *lit = (Elm_List_Item *) elm_list_selected_item_get(obj);
1146 elm_list_item_selected_set(lit, 0);
1150 wd = elm_widget_data_get(item->obj);
1152 EINA_LIST_FOREACH(wd->items, l, it)
1154 it->selected = EINA_FALSE;
1157 if (item->style == TABBAR)
1159 content = elm_layout_content_unset(wd->view, "elm.swallow.view");
1160 evas_object_hide(content);
1161 item->selected = EINA_TRUE;
1162 evas_object_smart_callback_call(item->obj, "view,change,before", item);
1163 elm_layout_content_set(wd->view, "elm.swallow.view", item->view);
1166 if (item->style == TOOLBAR && item->func)
1167 item->func(item->data, item->obj, item);
1170 static Evas_Object *
1171 _create_more_view(Widget_Data *wd)
1174 Elm_Controlbar_Item *item;
1178 list = elm_list_add( wd->object );
1179 elm_list_mode_set( list, ELM_LIST_COMPRESS );
1181 EINA_LIST_FOREACH(wd->items, l, item)
1183 if (item->order <= 0)
1186 if (item->icon_path)
1188 icon = _create_item_icon(list, item, NULL);
1189 evas_object_color_set(icon, 0, 0, 0, 255);
1191 elm_list_item_append(list, item->text, icon, NULL, _list_clicked, item);
1195 elm_list_go( list );
1200 static void _ctxpopup_cb(void *data, Evas_Object *obj, void *event_info)
1202 Elm_Controlbar_Item *it;
1204 Evas_Object *ctxpopup = obj;
1205 Widget_Data *wd = (Widget_Data *)data;
1207 EINA_LIST_FOREACH(wd->items, l, it)
1208 if (!strcmp(it->text, elm_ctxpopup_item_label_get((Elm_Ctxpopup_Item *) event_info))) break;
1211 it->func(it->data, it->obj, it);
1213 if (_check_item(wd, it)) evas_object_smart_callback_call(it->obj, "clicked", it);
1215 evas_object_del(ctxpopup);
1219 static void _ctxpopup_dismissed_cb(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
1221 Evas_Object *ctxpopup = obj;
1223 evas_object_del(ctxpopup);
1228 _create_more_func(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
1230 Evas_Object *ctxpopup;
1231 Elm_Controlbar_Item *item;
1234 Evas_Coord x, y, w, h;
1235 Widget_Data *wd = elm_widget_data_get(obj);
1238 ctxpopup = elm_ctxpopup_add(wd->parent);
1239 evas_object_smart_callback_add( ctxpopup, "dismissed", _ctxpopup_dismissed_cb, wd);
1241 EINA_LIST_FOREACH(wd->items, l, item)
1243 if (item->order <= 0)
1246 if (item->icon_path)
1248 icon = _create_item_icon(ctxpopup, item, NULL);
1249 evas_object_color_set(icon, 0, 0, 0, 255);
1251 elm_ctxpopup_item_append(ctxpopup, item->text, icon, _ctxpopup_cb, wd);
1255 evas_object_geometry_get(wd->more_item->base, &x, &y, &w, &h);
1256 evas_object_move(ctxpopup, x + w/2, y + h/2);
1258 evas_object_show(ctxpopup);
1261 static Elm_Controlbar_Item *
1262 _create_more_item(Widget_Data *wd, int style)
1264 Elm_Controlbar_Item * it;
1266 it = ELM_NEW(Elm_Controlbar_Item);
1267 if (!it) return NULL;
1268 it->obj = wd->object;
1269 it->text = eina_stringshare_add("more");
1270 it->icon_path = eina_stringshare_add(CONTROLBAR_SYSTEM_ICON_MORE);
1271 it->selected = EINA_FALSE;
1273 it->view = _create_more_view(wd);
1274 it->func = _create_more_func;
1276 it->base = _create_item_layout(wd->edje, it, &(it->base_item), &(it->icon));
1277 evas_object_event_callback_add(it->base, EVAS_CALLBACK_MOUSE_DOWN,
1278 _bar_item_down_cb, wd);
1279 evas_object_show(it->base);
1281 _set_items_position(it->obj, it, NULL, EINA_TRUE);
1282 wd->items = eina_list_append(wd->items, it);
1284 wd->items = eina_list_sort(wd->items, eina_list_count(wd->items), _sort_cb);
1289 ///////////////////////////////////////////////////////////////////
1293 ////////////////////////////////////////////////////////////////////
1296 * Add a new controlbar object
1298 * @param parent The parent object
1299 * @return The new object or NULL if it cannot be created
1301 * @ingroup Controlbar
1303 EAPI Evas_Object * elm_controlbar_add(Evas_Object * parent)
1305 if (parent == NULL) return NULL;
1306 Evas_Object * obj = NULL;
1307 Evas_Object * bg = NULL;
1308 Widget_Data * wd = NULL;
1309 Evas_Coord x, y, w, h;
1310 wd = ELM_NEW(Widget_Data);
1311 Evas *evas = evas_object_evas_get(parent);
1312 if (evas == NULL) return NULL;
1313 obj = elm_widget_add(evas);
1314 if (obj == NULL) return NULL;
1315 ELM_SET_WIDTYPE(widtype, "controlbar");
1316 elm_widget_type_set(obj, "controlbar");
1317 elm_widget_sub_object_add(parent, obj);
1318 elm_widget_data_set(obj, wd);
1319 elm_widget_del_hook_set(obj, _del_hook);
1320 elm_widget_can_focus_set(obj, EINA_FALSE);
1321 elm_widget_theme_hook_set(obj, _theme_hook);
1322 elm_widget_disable_hook_set(obj, _disable_hook);
1325 wd->parent = parent;
1326 evas_object_geometry_get(parent, &x, &y, &w, &h);
1332 wd->mode = ELM_CONTROLBAR_MODE_DEFAULT;
1336 wd->vertical = EINA_FALSE;
1337 wd->auto_align = EINA_FALSE;
1338 wd->selected_animation = EINA_FALSE;
1339 wd->pressed_signal = eina_stringshare_add("elm,state,pressed");
1340 wd->selected_signal = eina_stringshare_add("elm,state,selected");
1341 wd->view = elm_layout_add(wd->parent);
1342 elm_layout_theme_set(wd->view, "controlbar", "view", "default");
1343 if (wd->view == NULL)
1345 printf("Cannot load bg edj\n");
1348 evas_object_show(wd->view);
1350 /* load background edj */
1351 wd->edje = elm_layout_add(obj);
1352 elm_layout_theme_set(wd->edje, "controlbar", "base", "default");
1353 if (wd->edje == NULL)
1355 printf("Cannot load base edj\n");
1358 evas_object_show(wd->edje);
1360 wd->bg = elm_layout_add(wd->edje);
1361 elm_layout_theme_set(wd->bg, "controlbar", "background", "default");
1364 printf("Cannot load bg edj\n");
1367 elm_layout_content_set(wd->edje, "bg_image", wd->bg);
1370 evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_RESIZE,
1371 _controlbar_object_resize, obj);
1372 evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_MOVE,
1373 _controlbar_object_move, obj);
1374 evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_SHOW,
1375 _controlbar_object_show, obj);
1376 evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_HIDE,
1377 _controlbar_object_hide, obj);
1379 bg = elm_layout_content_get(wd->edje, "bg_image");
1380 evas_object_event_callback_add(bg, EVAS_CALLBACK_MOVE, _controlbar_object_move, obj);
1381 evas_object_event_callback_add(bg, EVAS_CALLBACK_RESIZE, _controlbar_object_resize, obj);
1383 wd->selected_box = elm_layout_add(wd->bg);
1384 elm_layout_theme_set(wd->selected_box, "controlbar", "item_bg_move", "default");
1385 evas_object_hide(wd->selected_box);
1388 wd->box = elm_table_add(wd->edje);
1389 elm_table_homogenous_set(wd->box, EINA_TRUE);
1390 evas_object_size_hint_weight_set(wd->box, EVAS_HINT_EXPAND,
1392 evas_object_size_hint_align_set(wd->box, EVAS_HINT_FILL, EVAS_HINT_FILL);
1393 elm_layout_content_set(wd->edje, "elm.swallow.items", wd->box);
1394 evas_object_show(wd->box);
1396 evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj);
1398 evas_object_smart_member_add(wd->view, obj);
1399 elm_widget_resize_object_set(obj, wd->edje);
1400 evas_object_smart_member_add(wd->selected_box, obj);
1401 evas_object_smart_member_add(wd->box, obj);
1409 * Append new tab item
1411 * @param obj The controlbar object
1412 * @param icon_path The icon path of item
1413 * @param label The label of item
1414 * @param view The view of item
1415 * @return The item of controlbar
1417 * @ingroup Controlbar
1419 EAPI Elm_Controlbar_Item * elm_controlbar_tab_item_append(Evas_Object * obj,
1426 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1427 Elm_Controlbar_Item * it;
1428 Elm_Controlbar_Item * lit;
1430 it = _create_tab_item(obj, icon_path, label, view);
1431 if (!it) return NULL;
1432 wd = elm_widget_data_get(obj);
1433 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1434 if (!wd->more_item) {
1435 lit = elm_controlbar_last_item_get(obj);
1436 _set_item_visible(lit, EINA_FALSE);
1437 _create_more_item(wd, TABBAR);
1439 _set_items_position(obj, it, NULL, EINA_FALSE);
1442 _set_items_position(obj, it, NULL, EINA_TRUE);
1444 wd->items = eina_list_append(wd->items, it);
1446 elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1448 _check_background(wd);
1454 * Prepend new tab item
1456 * @param obj The controlbar object
1457 * @param icon_path The icon path of item
1458 * @param label The label of item
1459 * @param view The view of item
1460 * @return The item of controlbar
1462 * @ingroup Controlbar
1464 EAPI Elm_Controlbar_Item * elm_controlbar_tab_item_prepend(Evas_Object *
1473 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1475 Elm_Controlbar_Item * it;
1476 Elm_Controlbar_Item * lit;
1477 Elm_Controlbar_Item * item;
1478 it = _create_tab_item(obj, icon_path, label, view);
1479 if (!it) return NULL;
1480 wd = elm_widget_data_get(obj);
1481 item = eina_list_data_get(wd->items);
1482 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1483 if (!wd->more_item) {
1484 lit = elm_controlbar_last_item_get(obj);
1485 _set_item_visible(lit, EINA_FALSE);
1486 _create_more_item(wd, TABBAR);
1488 lit = elm_controlbar_item_prev(wd->more_item);
1489 _set_item_visible(lit, EINA_FALSE);
1490 _set_items_position(obj, it, item, EINA_TRUE);
1493 _set_items_position(obj, it, item, EINA_TRUE);
1495 wd->items = eina_list_prepend(wd->items, it);
1497 elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1499 _check_background(wd);
1505 * Insert new tab item before given item
1507 * @param obj The controlbar object
1508 * @param before The given item
1509 * @param icon_path The icon path of item
1510 * @param label The label of item
1511 * @param view The view of item
1512 * @return The item of controlbar
1514 * @ingroup Controlbar
1516 EAPI Elm_Controlbar_Item *
1517 elm_controlbar_tab_item_insert_before(Evas_Object * obj,
1518 Elm_Controlbar_Item * before,
1519 const char *icon_path,
1520 const char *label, Evas_Object * view)
1522 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1524 Elm_Controlbar_Item * it;
1525 Elm_Controlbar_Item * lit;
1526 if (!before) return NULL;
1527 it = _create_tab_item(obj, icon_path, label, view);
1528 if (!it) return NULL;
1529 wd = elm_widget_data_get(obj);
1530 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1533 lit = elm_controlbar_last_item_get(obj);
1534 _set_item_visible(lit, EINA_FALSE);
1535 _create_more_item(wd, TABBAR);
1537 before = wd->more_item;
1538 if (before->order > 0)
1540 lit = elm_controlbar_item_prev(wd->more_item);
1541 _set_item_visible(lit, EINA_FALSE);
1542 _set_items_position(obj, it, before, EINA_TRUE);
1546 _set_items_position(obj, it, before, EINA_FALSE);
1550 _set_items_position(obj, it, before, EINA_TRUE);
1552 wd->items = eina_list_prepend_relative(wd->items, it, before);
1554 elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1556 _check_background(wd);
1562 * Insert new tab item after given item
1564 * @param obj The controlbar object
1565 * @param after The given item
1566 * @param icon_path The icon path of item
1567 * @param label The label of item
1568 * @param view The view of item
1569 * @return The item of controlbar
1571 * @ingroup Controlbar
1573 EAPI Elm_Controlbar_Item *
1574 elm_controlbar_tab_item_insert_after(Evas_Object * obj,
1575 Elm_Controlbar_Item * after,
1576 const char *icon_path, const char *label,
1579 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1581 Elm_Controlbar_Item * it;
1582 Elm_Controlbar_Item * lit;
1583 Elm_Controlbar_Item * item;
1584 if (!after) return NULL;
1585 it = _create_tab_item(obj, icon_path, label, view);
1586 if (!it) return NULL;
1587 wd = elm_widget_data_get(obj);
1588 item = elm_controlbar_item_next(after);
1589 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1592 lit = elm_controlbar_last_item_get(obj);
1593 _set_item_visible(lit, EINA_FALSE);
1594 _create_more_item(wd, TABBAR);
1596 lit = elm_controlbar_item_prev(wd->more_item);
1597 if (lit != after && item->order > 0)
1599 _set_item_visible(lit, EINA_FALSE);
1600 _set_items_position(obj, it, item, EINA_TRUE);
1604 _set_items_position(obj, it, NULL, EINA_FALSE);
1608 _set_items_position(obj, it, item, EINA_TRUE);
1610 wd->items = eina_list_append_relative(wd->items, it, after);
1612 elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1614 _check_background(wd);
1620 * Append new tool item
1622 * @param obj The controlbar object
1623 * @param icon_path The icon path of item
1624 * @param label The label of item
1625 * @param func Callback function of item
1626 * @param data The data of callback function
1627 * @return The item of controlbar
1629 * @ingroup Controlbar
1631 EAPI Elm_Controlbar_Item * elm_controlbar_tool_item_append(Evas_Object *
1646 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1647 Elm_Controlbar_Item * it;
1648 Elm_Controlbar_Item * lit;
1650 it = _create_tool_item(obj, icon_path, label, func, data);
1651 if (!it) return NULL;
1652 wd = elm_widget_data_get(obj);
1653 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1654 if (!wd->more_item) {
1655 lit = elm_controlbar_last_item_get(obj);
1656 _set_item_visible(lit, EINA_FALSE);
1657 _create_more_item(wd, TOOLBAR);
1659 _set_items_position(obj, it, NULL, EINA_FALSE);
1662 _set_items_position(obj, it, NULL, EINA_TRUE);
1664 wd->items = eina_list_append(wd->items, it);
1665 _check_toolbar_line(wd);
1671 * Prepend new tool item
1673 * @param obj The controlbar object
1674 * @param icon_path The icon path of item
1675 * @param label The label of item
1676 * @param func Callback function of item
1677 * @param data The data of callback function
1678 * @return The item of controlbar
1680 * @ingroup Controlbar
1682 EAPI Elm_Controlbar_Item * elm_controlbar_tool_item_prepend(Evas_Object *
1698 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1700 Elm_Controlbar_Item * it;
1701 Elm_Controlbar_Item * lit;
1702 Elm_Controlbar_Item * item;
1703 it = _create_tool_item(obj, icon_path, label, func, data);
1704 if (!it) return NULL;
1705 wd = elm_widget_data_get(obj);
1706 item = eina_list_data_get(wd->items);
1707 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1708 if (!wd->more_item) {
1709 lit = elm_controlbar_last_item_get(obj);
1710 _set_item_visible(lit, EINA_FALSE);
1711 _create_more_item(wd, TOOLBAR);
1713 lit = elm_controlbar_item_prev(wd->more_item);
1714 _set_item_visible(lit, EINA_FALSE);
1715 _set_items_position(obj, it, item, EINA_TRUE);
1718 _set_items_position(obj, it, item, EINA_TRUE);
1720 wd->items = eina_list_prepend(wd->items, it);
1721 _check_toolbar_line(wd);
1727 * Insert new tool item before given item
1729 * @param obj The controlbar object
1730 * @param before The given item
1731 * @param icon_path The icon path of item
1732 * @param label The label of item
1733 * @param func Callback function of item
1734 * @param data The data of callback function
1735 * @return The item of controlbar
1737 * @ingroup Controlbar
1739 EAPI Elm_Controlbar_Item *
1740 elm_controlbar_tool_item_insert_before(Evas_Object * obj,
1741 Elm_Controlbar_Item * before,
1742 const char *icon_path,
1744 void (*func) (void *data,
1749 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1751 Elm_Controlbar_Item * it;
1752 Elm_Controlbar_Item * lit;
1753 if (!before) return NULL;
1754 it = _create_tool_item(obj, icon_path, label, func, data);
1755 if (!it) return NULL;
1756 wd = elm_widget_data_get(obj);
1757 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1760 lit = elm_controlbar_last_item_get(obj);
1761 _set_item_visible(lit, EINA_FALSE);
1762 _create_more_item(wd, TOOLBAR);
1764 before = wd->more_item;
1765 if (before->order > 0)
1767 lit = elm_controlbar_item_prev(wd->more_item);
1768 _set_item_visible(lit, EINA_FALSE);
1769 _set_items_position(obj, it, before, EINA_TRUE);
1773 _set_items_position(obj, it, before, EINA_FALSE);
1777 _set_items_position(obj, it, before, EINA_TRUE);
1779 wd->items = eina_list_prepend_relative(wd->items, it, before);
1780 _check_toolbar_line(wd);
1786 * Insert new tool item after given item
1788 * @param obj The controlbar object
1789 * @param after The given item
1790 * @param icon_path The icon path of item
1791 * @param label The label of item
1792 * @param func Callback function of item
1793 * @param data The data of callback function
1794 * @return The item of controlbar
1796 * @ingroup Controlbar
1798 EAPI Elm_Controlbar_Item *
1799 elm_controlbar_tool_item_insert_after(Evas_Object * obj,
1800 Elm_Controlbar_Item * after,
1801 const char *icon_path,
1803 void (*func) (void *data,
1808 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1810 Elm_Controlbar_Item * it;
1811 Elm_Controlbar_Item * lit;
1812 Elm_Controlbar_Item * item;
1813 if (!after) return NULL;
1814 it = _create_tool_item(obj, icon_path, label, func, data);
1815 if (!it) return NULL;
1816 wd = elm_widget_data_get(obj);
1817 item = elm_controlbar_item_next(after);
1818 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1821 lit = elm_controlbar_last_item_get(obj);
1822 _set_item_visible(lit, EINA_FALSE);
1823 _create_more_item(wd, TOOLBAR);
1825 lit = elm_controlbar_item_prev(wd->more_item);
1826 if (lit != after && item->order > 0)
1828 _set_item_visible(lit, EINA_FALSE);
1829 _set_items_position(obj, it, item, EINA_TRUE);
1833 _set_items_position(obj, it, NULL, EINA_FALSE);
1837 _set_items_position(obj, it, item, EINA_TRUE);
1839 wd->items = eina_list_append_relative(wd->items, it, after);
1840 _check_toolbar_line(wd);
1846 * Append new object item
1848 * @param obj The controlbar object
1849 * @param obj_item The object of item
1850 * @param sel The number of sel occupied
1851 * @return The item of controlbar
1853 * @ingroup Controlbar
1855 EAPI Elm_Controlbar_Item * elm_controlbar_object_item_append(Evas_Object *
1861 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1863 Elm_Controlbar_Item * it;
1864 it = _create_object_item(obj, obj_item, sel);
1865 if (!it) return NULL;
1866 wd = elm_widget_data_get(obj);
1867 _set_items_position(obj, it, NULL, EINA_TRUE);
1868 wd->items = eina_list_append(wd->items, it);
1874 * Prepend new object item
1876 * @param obj The controlbar object
1877 * @param obj_item The object of item
1878 * @param sel The number of sel occupied
1879 * @return The item of controlbar
1881 * @ingroup Controlbar
1883 EAPI Elm_Controlbar_Item * elm_controlbar_object_item_prepend(Evas_Object *
1889 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1891 Elm_Controlbar_Item * it;
1892 Elm_Controlbar_Item * item;
1893 it = _create_object_item(obj, obj_item, sel);
1894 if (!it) return NULL;
1895 wd = elm_widget_data_get(obj);
1896 item = eina_list_data_get(wd->items);
1897 _set_items_position(obj, it, item, EINA_TRUE);
1898 wd->items = eina_list_prepend(wd->items, it);
1904 * Insert new object item before given item
1906 * @param obj The controlbar object
1907 * @param before The given item
1908 * @param obj_item The object of item
1909 * @param sel The number of sel occupied
1910 * @return The item of controlbar
1912 * @ingroup Controlbar
1914 EAPI Elm_Controlbar_Item *
1915 elm_controlbar_object_item_insert_before(Evas_Object * obj,
1916 Elm_Controlbar_Item * before,
1917 Evas_Object * obj_item, const int sel)
1919 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1921 Elm_Controlbar_Item * it;
1922 if (!before) return NULL;
1923 it = _create_object_item(obj, obj_item, sel);
1924 if (!it) return NULL;
1925 wd = elm_widget_data_get(obj);
1926 _set_items_position(obj, it, before, EINA_TRUE);
1927 wd->items = eina_list_prepend_relative(wd->items, it, before);
1933 * Insert new object item after given item
1935 * @param obj The controlbar object
1936 * @param after The given item
1937 * @param obj_item The object of item
1938 * @param sel The number of sel occupied
1939 * @return The item of controlbar
1941 * @ingroup Controlbar
1943 EAPI Elm_Controlbar_Item *
1944 elm_controlbar_object_item_insert_after(Evas_Object * obj,
1945 Elm_Controlbar_Item * after,
1946 Evas_Object * obj_item, const int sel)
1948 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1950 Elm_Controlbar_Item * it;
1951 Elm_Controlbar_Item * item;
1952 if (!after) return NULL;
1953 it = _create_object_item(obj, obj_item, sel);
1954 if (!it) return NULL;
1955 wd = elm_widget_data_get(obj);
1956 item = elm_controlbar_item_next(after);
1957 _set_items_position(obj, it, item, EINA_TRUE);
1958 wd->items = eina_list_append_relative(wd->items, it, after);
1964 * Get the object of the object item
1966 * @param it The item of controlbar
1967 * @return The object of the object item
1969 * @ingroup Controlbar
1972 elm_controlbar_object_item_object_get(Elm_Controlbar_Item * it)
1974 if (!it) return NULL;
1975 if (it->style != OBJECT) return NULL;
1976 if (!it->base_item) return NULL;
1977 return it->base_item;
1981 * Delete item from controlbar
1983 * @param it The item of controlbar
1985 * @ingroup Controlbar
1988 elm_controlbar_item_del(Elm_Controlbar_Item * it)
1995 Elm_Controlbar_Item * item;
2005 if (it->obj == NULL)
2007 printf("Invalid argument: controlbar object is NULL\n");
2010 wd = elm_widget_data_get(it->obj);
2013 printf("Cannot get smart data\n");
2021 elm_table_unpack(wd->box, it->base);
2023 EINA_LIST_FOREACH(wd->items, l, item)
2027 if (item->order > it->order)
2030 elm_table_unpack(wd->box, item->base);
2033 elm_table_pack(wd->box, item->base, item->order - 1, 0, item->sel, 1);
2035 elm_table_pack(wd->box, item->base, 0, item->order - 1, item->sel, 1);
2043 // delete item in list
2045 wd->items = eina_list_remove(wd->items, it);
2048 wd->num = wd->num - 1;
2053 * Select item in controlbar
2055 * @param it The item of controlbar
2057 * @ingroup Controlbar
2060 elm_controlbar_item_select(Elm_Controlbar_Item * it)
2063 if (it->obj == NULL) return;
2064 Widget_Data * wd = elm_widget_data_get(it->obj);
2065 if (wd == NULL) return;
2071 * Set the icon of item
2073 * @param it The item of controlbar
2074 * @param icon_path The icon path of the item
2075 * @return The icon object
2077 * @ingroup Controlbar
2080 elm_controlbar_item_icon_set(Elm_Controlbar_Item * it, const char *icon_path)
2083 if (it->style == OBJECT) return;
2086 eina_stringshare_del(it->icon_path);
2087 it->icon_path = NULL;
2091 evas_object_del(it->icon);
2094 if (icon_path != NULL)
2096 it->icon_path = eina_stringshare_add(icon_path);
2097 it->icon = _create_item_icon(it->base_item, it, "elm.swallow.icon");
2099 if (it->wd->disabled || it->disabled)
2100 elm_widget_disabled_set(it->base_item, EINA_TRUE);
2102 elm_widget_disabled_set(it->base_item, EINA_FALSE);
2106 * Get the icon of item
2108 * @param it The item of controlbar
2109 * @return The icon object
2111 * @ingroup Controlbar
2114 elm_controlbar_item_icon_get(Elm_Controlbar_Item * it)
2116 if (!it) return NULL;
2121 * Set the label of item
2123 * @param it The item of controlbar
2124 * @param label The label of item
2126 * @ingroup Controlbar
2129 elm_controlbar_item_label_set(Elm_Controlbar_Item * it, const char *label)
2132 if (it->style == OBJECT) return;
2135 eina_stringshare_del(it->text);
2140 it->text = eina_stringshare_add(label);
2141 elm_button_label_set(it->base_item, it->text);
2143 if (it->wd->disabled || it->disabled)
2144 elm_widget_disabled_set(it->base_item, EINA_TRUE);
2146 elm_widget_disabled_set(it->base_item, EINA_FALSE);
2150 * Get the label of item
2152 * @param it The item of controlbar
2153 * @return The label of item
2155 * @ingroup Controlbar
2158 elm_controlbar_item_label_get(Elm_Controlbar_Item * it)
2160 if (!it) return NULL;
2165 * Get the selected item
2167 * @param obj The controlbar object
2168 * @return The item of controlbar
2170 * @ingroup Controlbar
2172 EAPI Elm_Controlbar_Item * elm_controlbar_selected_item_get(Evas_Object *
2175 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
2178 Elm_Controlbar_Item * item;
2179 if (obj == NULL) return NULL;
2180 Widget_Data * wd = elm_widget_data_get(obj);
2181 if (!wd || !wd->items) return NULL;
2182 EINA_LIST_FOREACH(wd->items, l, item)
2184 if (item->selected) return item;
2190 * Get the first item
2192 * @param obj The controlbar object
2193 * @return The item of controlbar
2195 * @ingroup Controlbar
2197 EAPI Elm_Controlbar_Item * elm_controlbar_first_item_get(Evas_Object * obj)
2199 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
2200 Widget_Data * wd = elm_widget_data_get(obj);
2201 if (!wd || !wd->items) return NULL;
2202 return eina_list_data_get(wd->items);
2208 * @param obj The controlbar object
2209 * @return The item of controlbar
2211 * @ingroup Controlbar
2213 EAPI Elm_Controlbar_Item * elm_controlbar_last_item_get(Evas_Object * obj)
2215 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
2216 Widget_Data * wd = elm_widget_data_get(obj);
2217 if (!wd || !wd->items) return NULL;
2218 return eina_list_data_get(eina_list_last(wd->items));
2224 * @param obj The controlbar object
2225 * @return The list of the items
2227 * @ingroup Controlbar
2229 EAPI Eina_List * elm_controlbar_items_get(Evas_Object * obj)
2231 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
2232 Widget_Data * wd = elm_widget_data_get(obj);
2233 if (!wd || !wd->items) return NULL;
2238 * Get the previous item
2240 * @param it The item of controlbar
2241 * @return The previous item of the parameter item
2243 * @ingroup Controlbar
2245 EAPI Elm_Controlbar_Item * elm_controlbar_item_prev(Elm_Controlbar_Item *
2248 if (!it) return NULL;
2251 Elm_Controlbar_Item * item;
2252 if (it->obj == NULL) return NULL;
2253 Widget_Data * wd = elm_widget_data_get(it->obj);
2254 if (!wd || !wd->items) return NULL;
2255 EINA_LIST_FOREACH(wd->items, l, item)
2259 l = eina_list_prev(l);
2260 if (!l) return NULL;
2261 return eina_list_data_get(l);
2270 * @param obj The controlbar object
2271 * @return The next item of the parameter item
2273 * @ingroup Controlbar
2275 EAPI Elm_Controlbar_Item * elm_controlbar_item_next(Elm_Controlbar_Item *
2278 if (!it) return NULL;
2281 Elm_Controlbar_Item * item;
2282 if (it->obj == NULL) return NULL;
2283 Widget_Data * wd = elm_widget_data_get(it->obj);
2284 if (!wd || !wd->items) return NULL;
2285 EINA_LIST_FOREACH(wd->items, l, item)
2289 l = eina_list_next(l);
2290 if (!l) return NULL;
2291 return eina_list_data_get(l);
2298 * Set the visible status of item in bar
2300 * @param it The item of controlbar
2301 * @param bar EINA_TRUE or EINA_FALSE
2303 * @ingroup Controlbar
2306 elm_controlbar_item_visible_set(Elm_Controlbar_Item * it, Eina_Bool visible)
2309 if (it->obj == NULL) return;
2310 Widget_Data * wd = elm_widget_data_get(it->obj);
2313 if (!wd->auto_align)
2314 _set_item_visible(it, visible);
2318 * Get the result which or not item is visible in bar
2320 * @param it The item of controlbar
2321 * @return EINA_TRUE or EINA_FALSE
2323 * @ingroup Controlbar
2326 elm_controlbar_item_visible_get(Elm_Controlbar_Item * it)
2328 if (!it) return EINA_FALSE;
2329 if (it->obj == NULL) return EINA_FALSE;
2330 Widget_Data * wd = elm_widget_data_get(it->obj);
2331 if (!wd) return EINA_FALSE;
2332 if (it->order <= 0) return EINA_FALSE;
2338 elm_controlbar_item_disable_set(Elm_Controlbar_Item * it, Eina_Bool disable)
2340 elm_controlbar_item_disabled_set(it, disable);
2346 * @param it The item of controlbar
2347 * @param bar EINA_TRUE or EINA_FALSE
2349 * @ingroup Controlbar
2352 elm_controlbar_item_disabled_set(Elm_Controlbar_Item * it, Eina_Bool disabled)
2356 if (it->disabled == disabled) return;
2358 it->disabled = disabled;
2360 if (it->wd && it->wd->disabled) return;
2362 if (it->base_item) elm_widget_disabled_set(it->base_item, disabled);
2366 elm_controlbar_item_disable_get(Elm_Controlbar_Item * it)
2368 return elm_controlbar_item_disabled_get(it);
2374 * @param it The item of controlbar
2375 * @return EINA_TRUE or EINA_FALSE
2377 * @ingroup Controlbar
2380 elm_controlbar_item_disabled_get(Elm_Controlbar_Item * it)
2382 if (!it) return EINA_FALSE;
2384 return it->disabled;
2388 * Set the view of the item
2390 * @param it The item of controlbar
2391 * @param view The view for the item
2393 * @ingroup Controlbar
2396 elm_controlbar_item_view_set(Elm_Controlbar_Item *it, Evas_Object * view)
2399 if (it->view == view) return;
2401 evas_object_del(it->view);
2406 * Get the view of the item
2408 * @param it The item of controlbar
2409 * @return The view for the item
2411 * @ingroup Controlbar
2414 elm_controlbar_item_view_get(Elm_Controlbar_Item *it)
2416 if (!it) return NULL;
2422 * Unset the view of the item
2424 * @param it The item of controlbar
2425 * @return The view for the item
2427 * @ingroup Controlbar
2430 elm_controlbar_item_view_unset(Elm_Controlbar_Item *it)
2432 if (!it) return NULL;
2433 if (it->obj == NULL) return NULL;
2434 Widget_Data * wd = elm_widget_data_get(it->obj);
2435 if (!wd) return NULL;
2436 Evas_Object *content;
2438 if (it->view == elm_layout_content_get(wd->view, "elm.swallow.view"))
2440 content = elm_layout_content_unset(wd->view, "elm.swallow.view");
2441 if (content) evas_object_hide(content);
2452 * Set the mode of the controlbar
2454 * @param obj The object of the controlbar
2455 * @param mode The mode of the controlbar
2457 * @ingroup Controlbar
2460 elm_controlbar_mode_set(Evas_Object *obj, int mode)
2462 ELM_CHECK_WIDTYPE(obj, widtype);
2463 Widget_Data *wd = elm_widget_data_get(obj);
2466 fprintf(stderr, "Cannot get smart data\n");
2470 if (wd->mode == mode) return;
2476 case ELM_CONTROLBAR_MODE_DEFAULT:
2477 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,default", "elm");
2479 case ELM_CONTROLBAR_MODE_TRANSLUCENCE:
2480 elm_controlbar_alpha_set(obj, 85);
2482 case ELM_CONTROLBAR_MODE_TRANSPARENCY:
2483 elm_controlbar_alpha_set(obj, 0);
2485 case ELM_CONTROLBAR_MODE_LARGE:
2486 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,large", "elm");
2488 case ELM_CONTROLBAR_MODE_SMALL:
2489 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,small", "elm");
2491 case ELM_CONTROLBAR_MODE_LEFT:
2492 edje_object_signal_emit(_EDJ(wd->selected_box), "elm,state,left", "elm");
2493 wd->selected_signal = eina_stringshare_add("elm,state,selected_left");
2494 wd->pressed_signal = eina_stringshare_add("elm,state,pressed_left");
2495 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,left", "elm");
2496 _check_background(wd);
2499 case ELM_CONTROLBAR_MODE_RIGHT:
2500 edje_object_signal_emit(_EDJ(wd->selected_box), "elm,state,right", "elm");
2501 wd->selected_signal = eina_stringshare_add("elm,state,selected_right");
2502 wd->pressed_signal = eina_stringshare_add("elm,state,pressed_right");
2503 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,right", "elm");
2504 _check_background(wd);
2511 edje_object_signal_emit(_EDJ(wd->selected_box), "elm,state,default", "elm");
2512 wd->selected_signal = eina_stringshare_add("elm,state,selected");
2513 wd->pressed_signal = eina_stringshare_add("elm,state,pressed");
2514 _check_background(wd);
2519 * Set the alpha of the controlbar
2521 * @param obj The object of the controlbar
2522 * @param alpha The alpha value of the controlbar (0-100)
2524 * @ingroup Controlbar
2527 elm_controlbar_alpha_set(Evas_Object *obj, int alpha)
2529 ELM_CHECK_WIDTYPE(obj, widtype);
2531 Widget_Data *wd = elm_widget_data_get(obj);
2534 fprintf(stderr, "Cannot get smart data\n");
2538 if (alpha < 0) wd->alpha = 0;
2539 else if (alpha > 100) wd->alpha = 100;
2540 else wd->alpha = alpha;
2542 evas_object_color_get(wd->bg, &r, &g, &b, NULL);
2543 evas_object_color_set(wd->bg, r, g, b, (int)(255 * wd->alpha / 100));
2548 * Set auto-align mode of the controlbar(It's not prepared yet)
2549 * If you set the auto-align and add items more than 5,
2550 * the "more" item will be made and the items more than 5 will be unvisible.
2552 * @param obj The object of the controlbar
2553 * @param auto_align The dicision that the controlbar use the auto-align
2555 * @ingroup Controlbar
2558 elm_controlbar_item_auto_align_set(Evas_Object *obj, Eina_Bool auto_align)
2560 ELM_CHECK_WIDTYPE(obj, widtype);
2561 Widget_Data *wd = elm_widget_data_get(obj);
2562 Elm_Controlbar_Item *item;
2567 fprintf(stderr, "Cannot get smart data\n");
2571 if (wd->auto_align == auto_align) return;
2575 if (_check_bar_item_number(wd) >= 5 && !wd->more_item)
2578 EINA_LIST_FOREACH(wd->items, l, item)
2580 if (elm_controlbar_item_visible_get(item))
2583 _delete_item_in_bar(item);
2586 item = elm_controlbar_last_item_get(obj);
2587 while (!elm_controlbar_item_visible_get(item)){
2588 item = elm_controlbar_item_prev(item);
2590 _create_more_item(wd, item->style);
2598 if (wd->more_item->view)
2599 evas_object_del(wd->more_item->view);
2600 wd->items = eina_list_remove(wd->items, wd->more_item);
2601 eina_stringshare_del(wd->more_item->text);
2602 if (wd->more_item->icon)
2603 evas_object_del(wd->more_item->icon);
2604 if (wd->more_item->base)
2605 evas_object_del(wd->more_item->base);
2606 if (wd->more_item->base_item)
2607 evas_object_del(wd->more_item->base_item);
2608 free(wd->more_item);
2609 wd->more_item = NULL;
2611 // make all item is visible
2613 EINA_LIST_FOREACH(wd->items, l, item)
2615 if (!elm_controlbar_item_visible_get(item))
2616 _insert_item_in_bar(item, i);
2621 wd->auto_align = auto_align;
2626 * Set the vertical mode of the controlbar
2628 * @param obj The object of the controlbar
2629 * @param vertical The vertical mode of the controlbar (TRUE = vertical, FALSE = horizontal)
2631 * @ingroup Controlbar
2634 elm_controlbar_vertical_set(Evas_Object *obj, Eina_Bool vertical)
2636 ELM_CHECK_WIDTYPE(obj, widtype);
2637 Widget_Data *wd = elm_widget_data_get(obj);
2640 fprintf(stderr, "Cannot get smart data\n");
2644 if (wd->vertical == vertical) return;
2645 wd->vertical = vertical;
2647 if (_check_bar_item_number(wd) > 1)
2651 _check_toolbar_line(wd);
2655 * Get the button object of the item
2657 * @param it The item of controlbar
2658 * @return button object of the item
2660 * @ingroup Controlbar
2663 elm_controlbar_item_button_get(Elm_Controlbar_Item *it)
2665 if (!it) return NULL;
2666 if (it->style == OBJECT) return NULL;
2668 if (it->base_item) return it->base_item;
2674 elm_controlbar_animation_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, void *event_info), void *data)
2676 printf("\n==================================\n");
2677 printf("This API will be deleted : %s\n", __func__);
2678 printf("\n==================================\n");
2682 elm_controlbar_item_animation_set(Evas_Object *obj, Eina_Bool auto_animation, Eina_Bool selected_animation)
2684 printf("\n==================================\n");
2685 printf("This API will be deleted : %s\n", __func__);
2686 printf("\n==================================\n");
2691 init_animation(void *data)
2694 Elm_Controlbar_Item * item;
2695 Widget_Data * wd = (Widget_Data *)data;
2697 wd->visible_items = eina_list_free(wd->visible_items);
2698 EINA_LIST_FOREACH(wd->items, l, item)
2700 if (item->order > 0)
2702 wd->visible_items = eina_list_append(wd->visible_items, item->base_item);
2707 wd->ani_func(wd->ani_data, wd->object, wd->visible_items);
2709 return ECORE_CALLBACK_CANCEL;
2712 elm_controlbar_animation_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, void *event_info), void *data)
2714 printf("\n==================================\n");
2715 printf("%s\n", __func__);
2716 printf("==================================\n");
2717 printf("This API is just for test.\n");
2718 printf("Please don't use it!!\n");
2719 printf("Thank you.\n");
2720 printf("==================================\n");
2722 ELM_CHECK_WIDTYPE(obj, widtype);
2723 Widget_Data *wd = elm_widget_data_get(obj);
2726 fprintf(stderr, "Cannot get smart data\n");
2732 wd->init_animation = EINA_TRUE;
2734 wd->ani_func = func;
2735 wd->ani_data = data;
2737 ecore_idler_add(init_animation, wd);
2742 elm_controlbar_item_animation_set(Evas_Object *obj, Eina_Bool auto_animation, Eina_Bool selected_animation)
2744 printf("\n==================================\n");
2745 printf("%s\n", __func__);
2746 printf("==================================\n");
2747 printf("This API is just for test.\n");
2748 printf("Please don't use it!!\n");
2749 printf("Thank you.\n");
2750 printf("==================================\n");
2752 ELM_CHECK_WIDTYPE(obj, widtype);
2753 Widget_Data *wd = elm_widget_data_get(obj);
2756 fprintf(stderr, "Cannot get smart data\n");
2760 if (auto_animation && !wd->effect_timer)
2762 wd->effect_timer = ecore_timer_add(1.5, item_animation_effect, wd);
2766 if (wd->effect_timer) ecore_timer_del(wd->effect_timer);
2767 wd->effect_timer = NULL;
2770 wd->selected_animation = selected_animation;