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));
431 if (!wd) return NULL;
441 ad->start_time = ecore_loop_time_get();
445 ad->timer = ecore_animator_add(mv_func, ad);
450 /////////////////////////////////////////////////////////////
454 /////////////////////////////////////////////////////////////
457 _sort_cb(const void *d1, const void *d2)
459 Elm_Controlbar_Item * item1, *item2;
460 item1 = (Elm_Controlbar_Item *) d1;
461 item2 = (Elm_Controlbar_Item *) d2;
462 if (item1->order <= 0) return 1;
463 if (item2->order <= 0) return -1;
464 return item1->order > item2->order ? 1 : -1;
467 ///////////////////////////////////////////////////////////////////
469 // basic utility function
471 ////////////////////////////////////////////////////////////////////
474 _check_item(Widget_Data *wd, Elm_Controlbar_Item *item)
477 Elm_Controlbar_Item *it;
479 if (!wd) return EINA_FALSE;
480 if (!wd->items) return EINA_FALSE;
482 EINA_LIST_FOREACH(wd->items, l, it)
483 if (it == item) return EINA_TRUE;
489 _check_background(Widget_Data *wd)
493 Elm_Controlbar_Item *it;
495 EINA_LIST_FOREACH(wd->items, l, it)
497 if (it->style == TABBAR)
499 if (wd->mode == ELM_CONTROLBAR_MODE_LEFT)
500 edje_object_signal_emit(_EDJ(wd->bg), "elm,state,tabbar_left", "elm");
501 else if (wd->mode == ELM_CONTROLBAR_MODE_RIGHT)
502 edje_object_signal_emit(_EDJ(wd->bg), "elm,state,tabbar_right", "elm");
504 edje_object_signal_emit(_EDJ(wd->bg), "elm,state,tabbar", "elm");
508 edje_object_signal_emit(_EDJ(wd->bg), "elm,state,toolbar", "elm");
512 _check_toolbar_line(Widget_Data *wd)
516 Elm_Controlbar_Item *it, *it2;
518 EINA_LIST_FOREACH(wd->items, l, it)
520 it2 = elm_controlbar_item_prev(it);
522 if (it->style != TOOLBAR || it2->style != TOOLBAR) continue;
526 edje_object_signal_emit(_EDJ(it2->base), "elm,state,right_line_hide", "elm");
527 edje_object_signal_emit(_EDJ(it->base), "elm,state,left_line_hide", "elm");
529 if ((it->icon || it->text) && (it2->icon || it2->text))
531 edje_object_signal_emit(_EDJ(it2->base), "elm,state,bottom_line_show", "elm");
532 edje_object_signal_emit(_EDJ(it->base), "elm,state,top_line_show", "elm");
536 edje_object_signal_emit(_EDJ(it2->base), "elm,state,bottom_line_hide", "elm");
537 edje_object_signal_emit(_EDJ(it->base), "elm,state,top_line_hide", "elm");
542 edje_object_signal_emit(_EDJ(it2->base), "elm,state,bottom_line_hide", "elm");
543 edje_object_signal_emit(_EDJ(it->base), "elm,state,top_line_hide", "elm");
545 if ((it->icon || it->text) && (it2->icon || it2->text))
547 edje_object_signal_emit(_EDJ(it2->base), "elm,state,right_line_show", "elm");
548 edje_object_signal_emit(_EDJ(it->base), "elm,state,left_line_show", "elm");
552 edje_object_signal_emit(_EDJ(it2->base), "elm,state,right_line_hide", "elm");
553 edje_object_signal_emit(_EDJ(it->base), "elm,state,left_line_hide", "elm");
560 _check_bar_item_number(Widget_Data *wd)
563 Elm_Controlbar_Item * item;
566 EINA_LIST_FOREACH(wd->items, l, item)
567 if (item->order > 0) num++;
573 _insert_item_in_bar(Elm_Controlbar_Item * it, int order)
576 Elm_Controlbar_Item * item;
577 Widget_Data * wd = elm_widget_data_get(it->obj);
578 if (!wd) return NULL;
581 if (order == 0) return;
583 EINA_LIST_FOREACH(wd->items, l, item)
585 if (item->order == order && item != it)
590 EINA_LIST_FOREACH(wd->items, l, item)
593 elm_table_unpack(wd->box, item->base);
595 EINA_LIST_FOREACH(wd->items, l, item)
599 if (item->order >= order)
602 elm_table_pack(wd->box, item->base, item->order - 1, 0, 1, 1);
604 elm_table_pack(wd->box, item->base, 0, item->order - 1, 1, 1);
605 evas_object_show(item->base);
611 elm_table_pack(wd->box, it->base, it->order - 1, 0, 1, 1);
613 elm_table_pack(wd->box, it->base, 0, it->order - 1, 1, 1);
614 evas_object_show(it->base);
618 _delete_item_in_bar(Elm_Controlbar_Item * it)
621 Elm_Controlbar_Item * item;
622 Widget_Data * wd = elm_widget_data_get(it->obj);
626 EINA_LIST_FOREACH(wd->items, l, item)
632 elm_table_unpack(wd->box, it->base);
633 evas_object_hide(it->base);
638 EINA_LIST_FOREACH(wd->items, l, item)
643 elm_table_unpack(wd->box, item->base);
645 elm_table_pack(wd->box, item->base, item->order - 1, 0, 1, 1);
647 elm_table_pack(wd->box, item->base, 0, item->order - 1, 1, 1);
654 _set_item_visible(Elm_Controlbar_Item *it, Eina_Bool visible)
656 Elm_Controlbar_Item *item;
657 Eina_Bool check = EINA_TRUE;
660 if (it->obj == NULL) return;
661 Widget_Data * wd = elm_widget_data_get(it->obj);
662 if (!wd || !wd->items) return;
663 if (it->order <= 0) check = EINA_FALSE;
664 if (check == visible) return;
667 item = elm_controlbar_last_item_get(it->obj);
669 while (!elm_controlbar_item_visible_get(item)){
670 item = elm_controlbar_item_prev(item);
672 _insert_item_in_bar(it, item->order + 1);
676 _delete_item_in_bar(it);
678 wd->items = eina_list_sort(wd->items, eina_list_count(wd->items), _sort_cb);
679 _sizing_eval(it->obj);
683 _hide_selected_box(void *data)
685 Evas_Object *selected_box = (Evas_Object *)data;
687 evas_object_move(selected_box, -999, -999);
688 evas_object_hide(selected_box);
690 return ECORE_CALLBACK_CANCEL;
694 _end_selected_box(void *data, Evas_Object *obj __UNUSED__)
696 Widget_Data * wd = (Widget_Data *)data;
698 if (_check_item(wd, wd->cur_item))
700 edje_object_signal_emit(_EDJ(wd->cur_item->base), wd->selected_signal, "elm");
704 if (wd->animating < 0)
706 printf("animation error\n");
710 ecore_idler_add(_hide_selected_box, wd->selected_box);
714 _move_selected_box(Widget_Data *wd, Elm_Controlbar_Item * fit, Elm_Controlbar_Item * tit)
716 Evas_Coord fx, fy, fw, fh, tx, ty, tw, th;
717 Evas_Object *from, *to;
719 if (fit->order <= 0 && wd->auto_align)
722 from = (Evas_Object *) edje_object_part_object_get(_EDJ(fit->base), "bg_img");
723 evas_object_geometry_get(from, &fx, &fy, &fw, &fh);
725 to = (Evas_Object *) edje_object_part_object_get(_EDJ(tit->base), "bg_img");
726 evas_object_geometry_get(to, &tx, &ty, &tw, &th);
728 if (_check_item(wd, wd->pre_item))
730 edje_object_signal_emit(_EDJ(wd->pre_item->base), "elm,state,unselected", "elm");
732 if (_check_item(wd, wd->cur_item))
733 edje_object_signal_emit(_EDJ(wd->cur_item->base), "elm,state,unselected", "elm");
738 if (wd->ad->timer) ecore_animator_del(wd->ad->timer);
739 wd->ad->timer = NULL;
743 wd->ad = _move_object_with_animation(wd->selected_box, fx, fy, fw, fh, tx, ty, tw, th,
744 0.3, _move_evas_object, _end_selected_box, wd);
748 _select_box(Elm_Controlbar_Item * it)
751 Widget_Data * wd = elm_widget_data_get(it->obj);
754 Elm_Controlbar_Item * item, *fit = NULL;
755 Evas_Object * content;
757 if (wd->animating) return;
761 if (it->style == TABBAR)
763 content = elm_layout_content_unset(wd->view, "elm.swallow.view");
764 if (content) evas_object_hide(content);
766 EINA_LIST_FOREACH(wd->items, l, item){
767 if (item->selected) {
771 item->selected = EINA_FALSE;
773 it->selected = EINA_TRUE;
775 if (fit != NULL && fit != it)
777 _move_selected_box(wd, fit, it);
781 edje_object_signal_emit(_EDJ(it->base), wd->selected_signal, "elm");
786 if (wd->more_item != it)
787 evas_object_smart_callback_call(it->obj, "view,change,before", it);
790 elm_layout_content_set(wd->view, "elm.swallow.view", it->view);
792 else if (it->style == TOOLBAR)
794 edje_object_signal_emit(_EDJ(it->base), "elm,state,text_unselected", "elm");
796 it->func(it->data, it->obj, it);
801 _cancel_selected_box(Widget_Data *wd)
804 Elm_Controlbar_Item * item;
806 EINA_LIST_FOREACH(wd->items, l, item)
808 if (item->style == TABBAR)
812 edje_object_signal_emit(_EDJ(item->base), wd->selected_signal, "elm");
816 edje_object_signal_emit(_EDJ(item->base), "elm,state,unselected", "elm");
819 else if (item->style == TOOLBAR)
821 edje_object_signal_emit(_EDJ(item->base), "elm,state,unselected", "elm");
827 _unpress_box_cb(void *data, Evas *evas __UNUSED__, Evas_Object *obj, void *event_info)
829 Widget_Data * wd = (Widget_Data *) data;
830 Evas_Event_Mouse_Up * ev = event_info;
831 Evas_Coord x, y, w, h;
833 evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_UP, _unpress_box_cb);
835 _cancel_selected_box(wd);
837 if (_check_item(wd, wd->pre_item))
839 evas_object_geometry_get(wd->pre_item->base, &x, &y, &w, &h);
840 if (ev->output.x > x && ev->output.x < x+w && ev->output.y > y && ev->output.y < y+h)
842 _select_box(wd->pre_item);
849 _press_box(Elm_Controlbar_Item * it)
851 Widget_Data * wd = elm_widget_data_get(it->obj);
852 if (!wd) return EINA_FALSE;
855 Elm_Controlbar_Item * item;
857 if (wd->animating) return EINA_FALSE;
859 if (wd->disabled || it->disabled) return EINA_FALSE;
861 EINA_LIST_FOREACH(wd->items, l, item)
865 if (it->style == TABBAR)
867 edje_object_signal_emit(_EDJ(it->base), wd->pressed_signal, "elm");
869 else if (it->style == TOOLBAR)
871 edje_object_signal_emit(_EDJ(it->base), "elm,state,toolbar_pressed", "elm");
873 evas_object_event_callback_add(it->base, EVAS_CALLBACK_MOUSE_UP, _unpress_box_cb, (void *)wd);
887 _create_item_icon(Evas_Object *obj, Elm_Controlbar_Item * it, char *part)
891 icon = elm_icon_add(obj);
892 if (!elm_icon_standard_set(icon, it->icon_path))
894 elm_icon_file_set(icon, it->icon_path, NULL);
897 evas_object_size_hint_min_set(icon, 40, 40);
898 evas_object_size_hint_max_set(icon, 100, 100);
899 evas_object_show(icon);
901 elm_button_icon_set(obj, icon);
907 _create_item_layout(Evas_Object * parent, Elm_Controlbar_Item * it, Evas_Object **item, Evas_Object **icon)
911 obj = elm_layout_add(parent);
914 fprintf(stderr, "Cannot load bg edj\n");
917 elm_layout_theme_set(obj, "controlbar", "item_bg",
918 elm_widget_style_get(it->obj));
919 evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
920 evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, EVAS_HINT_FILL);
922 *item = elm_button_add(parent);
923 if (*item == NULL) return NULL;
924 elm_object_style_set(*item, "controlbar/vertical");
925 elm_layout_content_set(obj, "item", *item);
928 elm_button_label_set(*item, it->text);
930 *icon = _create_item_icon(*item, it, "elm.swallow.icon");
936 _bar_item_down_cb(void *data, Evas * evas __UNUSED__, Evas_Object * obj, void *event_info __UNUSED__)
938 Widget_Data * wd = (Widget_Data *) data;
940 Elm_Controlbar_Item * item;
941 if (wd->animating) return;
943 EINA_LIST_FOREACH(wd->items, l, item)
944 if (item->base == obj) break;
946 if (item == NULL) return;
951 static Elm_Controlbar_Item *
952 _create_tab_item(Evas_Object * obj, const char *icon_path, const char *label,
955 Elm_Controlbar_Item * it;
959 fprintf(stderr, "Invalid argument: controlbar object is NULL\n");
962 wd = elm_widget_data_get(obj);
965 fprintf(stderr, "Cannot get smart data\n");
968 it = ELM_NEW(Elm_Controlbar_Item);
969 if (!it) return NULL;
972 it->text = eina_stringshare_add(label);
973 it->icon_path = eina_stringshare_add(icon_path);
974 it->selected = EINA_FALSE;
978 it->base = _create_item_layout(wd->edje, it, &(it->base_item), &(it->icon));
979 evas_object_event_callback_add(it->base, EVAS_CALLBACK_MOUSE_DOWN,
980 _bar_item_down_cb, wd);
981 evas_object_show(it->base);
986 static Elm_Controlbar_Item *
987 _create_tool_item(Evas_Object * obj, const char *icon_path, const char *label,
988 void (*func) (void *data, Evas_Object * obj,
989 void *event_info), void *data)
992 Elm_Controlbar_Item * it;
996 fprintf(stderr, "Invalid argument: controlbar object is NULL\n");
999 wd = elm_widget_data_get(obj);
1002 fprintf(stderr, "Cannot get smart data\n");
1005 it = ELM_NEW(Elm_Controlbar_Item);
1010 it->text = eina_stringshare_add(label);
1011 it->icon_path = eina_stringshare_add(icon_path);
1012 it->selected = EINA_FALSE;
1016 it->style = TOOLBAR;
1017 it->base = _create_item_layout(wd->edje, it, &(it->base_item), &(it->icon));
1018 evas_object_event_callback_add(it->base, EVAS_CALLBACK_MOUSE_DOWN,
1019 _bar_item_down_cb, wd);
1020 evas_object_show(it->base);
1025 static Elm_Controlbar_Item *
1026 _create_object_item(Evas_Object * obj, Evas_Object * obj_item, const int sel)
1028 Elm_Controlbar_Item * it;
1032 fprintf(stderr, "Invalid argument: controlbar object is NULL\n");
1035 wd = elm_widget_data_get(obj);
1038 fprintf(stderr, "Cannot get smart data\n");
1041 it = ELM_NEW(Elm_Controlbar_Item);
1048 it->base = elm_layout_add(wd->edje);
1049 elm_layout_theme_set(it->base, "controlbar", "item_bg",
1050 elm_widget_style_get(it->obj));
1051 evas_object_size_hint_weight_set(it->base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1052 evas_object_size_hint_align_set(it->base, EVAS_HINT_FILL, EVAS_HINT_FILL);
1053 it->base_item = obj_item;
1054 elm_layout_content_set(it->base, "item", it->base_item);
1055 evas_object_show(it->base);
1060 _repack_items(Widget_Data *wd)
1063 Elm_Controlbar_Item * item;
1065 EINA_LIST_FOREACH(wd->items, l, item)
1067 if (item->order > 0)
1069 elm_table_unpack(wd->box, item->base);
1071 elm_table_pack(wd->box, item->base, item->order - 1, 0, item->sel, 1);
1073 elm_table_pack(wd->box, item->base, 0, item->order - 1, item->sel, 1);
1079 _set_items_position(Evas_Object * obj, Elm_Controlbar_Item * it,
1080 Elm_Controlbar_Item * mit, Eina_Bool bar)
1084 Elm_Controlbar_Item * item;
1085 int check = EINA_FALSE;
1090 fprintf(stderr, "Invalid argument: controlbar object is NULL\n");
1093 wd = elm_widget_data_get(obj);
1096 fprintf(stderr, "Cannot get smart data\n");
1100 EINA_LIST_FOREACH(wd->items, l, item)
1102 if (item == mit && item->order > 0)
1105 it->order = mit->order;
1109 if (item->order > 0)
1111 elm_table_unpack(wd->box, item->base);
1112 item->order += it->sel;
1114 elm_table_pack(wd->box, item->base, item->order - 1, 0, item->sel, 1);
1116 elm_table_pack(wd->box, item->base, 0, item->order - 1, item->sel, 1);
1119 if (item->order > 0) order += item->sel;
1133 elm_table_pack(wd->box, it->base, it->order - 1, 0, it->sel, 1);
1135 elm_table_pack(wd->box, it->base, 0, it->order - 1, it->sel, 1);
1138 evas_object_hide(it->base);
1142 _list_clicked(void *data, Evas_Object *obj, void *event_info __UNUSED__)
1144 Elm_Controlbar_Item *item = (Elm_Controlbar_Item *)data;
1145 Elm_Controlbar_Item *it;
1148 Evas_Object *content;
1149 Elm_List_Item *lit = (Elm_List_Item *) elm_list_selected_item_get(obj);
1152 elm_list_item_selected_set(lit, 0);
1156 wd = elm_widget_data_get(item->obj);
1159 EINA_LIST_FOREACH(wd->items, l, it)
1161 it->selected = EINA_FALSE;
1164 if (item->style == TABBAR)
1166 content = elm_layout_content_unset(wd->view, "elm.swallow.view");
1167 evas_object_hide(content);
1168 item->selected = EINA_TRUE;
1169 evas_object_smart_callback_call(item->obj, "view,change,before", item);
1170 elm_layout_content_set(wd->view, "elm.swallow.view", item->view);
1173 if (item->style == TOOLBAR && item->func)
1174 item->func(item->data, item->obj, item);
1177 static Evas_Object *
1178 _create_more_view(Widget_Data *wd)
1181 Elm_Controlbar_Item *item;
1185 list = elm_list_add( wd->object );
1186 elm_list_mode_set( list, ELM_LIST_COMPRESS );
1188 EINA_LIST_FOREACH(wd->items, l, item)
1190 if (item->order <= 0)
1193 if (item->icon_path)
1195 icon = _create_item_icon(list, item, NULL);
1196 evas_object_color_set(icon, 0, 0, 0, 255);
1198 elm_list_item_append(list, item->text, icon, NULL, _list_clicked, item);
1202 elm_list_go( list );
1207 static void _ctxpopup_cb(void *data, Evas_Object *obj, void *event_info)
1209 Elm_Controlbar_Item *it;
1211 Evas_Object *ctxpopup = obj;
1212 Widget_Data *wd = (Widget_Data *)data;
1214 EINA_LIST_FOREACH(wd->items, l, it)
1215 if (!strcmp(it->text, elm_ctxpopup_item_label_get((Elm_Ctxpopup_Item *) event_info))) break;
1218 it->func(it->data, it->obj, it);
1220 if (_check_item(wd, it)) evas_object_smart_callback_call(it->obj, "clicked", it);
1222 evas_object_del(ctxpopup);
1226 static void _ctxpopup_dismissed_cb(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
1228 Evas_Object *ctxpopup = obj;
1230 evas_object_del(ctxpopup);
1235 _create_more_func(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
1237 Evas_Object *ctxpopup;
1238 Elm_Controlbar_Item *item;
1241 Evas_Coord x, y, w, h;
1242 Widget_Data *wd = elm_widget_data_get(obj);
1245 ctxpopup = elm_ctxpopup_add(wd->parent);
1246 evas_object_smart_callback_add( ctxpopup, "dismissed", _ctxpopup_dismissed_cb, wd);
1248 EINA_LIST_FOREACH(wd->items, l, item)
1250 if (item->order <= 0)
1253 if (item->icon_path)
1255 icon = _create_item_icon(ctxpopup, item, NULL);
1256 evas_object_color_set(icon, 0, 0, 0, 255);
1258 elm_ctxpopup_item_append(ctxpopup, item->text, icon, _ctxpopup_cb, wd);
1262 evas_object_geometry_get(wd->more_item->base, &x, &y, &w, &h);
1263 evas_object_move(ctxpopup, x + w/2, y + h/2);
1265 evas_object_show(ctxpopup);
1268 static Elm_Controlbar_Item *
1269 _create_more_item(Widget_Data *wd, int style)
1271 Elm_Controlbar_Item * it;
1273 it = ELM_NEW(Elm_Controlbar_Item);
1274 if (!it) return NULL;
1275 it->obj = wd->object;
1276 it->text = eina_stringshare_add("more");
1277 it->icon_path = eina_stringshare_add(CONTROLBAR_SYSTEM_ICON_MORE);
1278 it->selected = EINA_FALSE;
1280 it->view = _create_more_view(wd);
1281 it->func = _create_more_func;
1283 it->base = _create_item_layout(wd->edje, it, &(it->base_item), &(it->icon));
1284 evas_object_event_callback_add(it->base, EVAS_CALLBACK_MOUSE_DOWN,
1285 _bar_item_down_cb, wd);
1286 evas_object_show(it->base);
1288 _set_items_position(it->obj, it, NULL, EINA_TRUE);
1289 wd->items = eina_list_append(wd->items, it);
1291 wd->items = eina_list_sort(wd->items, eina_list_count(wd->items), _sort_cb);
1296 ///////////////////////////////////////////////////////////////////
1300 ////////////////////////////////////////////////////////////////////
1303 * Add a new controlbar object
1305 * @param parent The parent object
1306 * @return The new object or NULL if it cannot be created
1308 * @ingroup Controlbar
1310 EAPI Evas_Object * elm_controlbar_add(Evas_Object * parent)
1312 if (parent == NULL) return NULL;
1313 Evas_Object * obj = NULL;
1314 Evas_Object * bg = NULL;
1315 Widget_Data * wd = NULL;
1316 Evas_Coord x, y, w, h;
1317 wd = ELM_NEW(Widget_Data);
1318 Evas *evas = evas_object_evas_get(parent);
1319 if (evas == NULL) return NULL;
1320 obj = elm_widget_add(evas);
1321 if (obj == NULL) return NULL;
1322 ELM_SET_WIDTYPE(widtype, "controlbar");
1323 elm_widget_type_set(obj, "controlbar");
1324 elm_widget_sub_object_add(parent, obj);
1325 elm_widget_data_set(obj, wd);
1326 elm_widget_del_hook_set(obj, _del_hook);
1327 elm_widget_can_focus_set(obj, EINA_FALSE);
1328 elm_widget_theme_hook_set(obj, _theme_hook);
1329 elm_widget_disable_hook_set(obj, _disable_hook);
1332 wd->parent = parent;
1333 evas_object_geometry_get(parent, &x, &y, &w, &h);
1339 wd->mode = ELM_CONTROLBAR_MODE_DEFAULT;
1343 wd->vertical = EINA_FALSE;
1344 wd->auto_align = EINA_FALSE;
1345 wd->selected_animation = EINA_FALSE;
1346 wd->pressed_signal = eina_stringshare_add("elm,state,pressed");
1347 wd->selected_signal = eina_stringshare_add("elm,state,selected");
1348 wd->view = elm_layout_add(wd->parent);
1349 elm_layout_theme_set(wd->view, "controlbar", "view", "default");
1350 if (wd->view == NULL)
1352 printf("Cannot load bg edj\n");
1355 evas_object_show(wd->view);
1357 /* load background edj */
1358 wd->edje = elm_layout_add(obj);
1359 elm_layout_theme_set(wd->edje, "controlbar", "base", "default");
1360 if (wd->edje == NULL)
1362 printf("Cannot load base edj\n");
1365 evas_object_show(wd->edje);
1367 wd->bg = elm_layout_add(wd->edje);
1368 elm_layout_theme_set(wd->bg, "controlbar", "background", "default");
1371 printf("Cannot load bg edj\n");
1374 elm_layout_content_set(wd->edje, "bg_image", wd->bg);
1377 evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_RESIZE,
1378 _controlbar_object_resize, obj);
1379 evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_MOVE,
1380 _controlbar_object_move, obj);
1381 evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_SHOW,
1382 _controlbar_object_show, obj);
1383 evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_HIDE,
1384 _controlbar_object_hide, obj);
1386 bg = elm_layout_content_get(wd->edje, "bg_image");
1387 evas_object_event_callback_add(bg, EVAS_CALLBACK_MOVE, _controlbar_object_move, obj);
1388 evas_object_event_callback_add(bg, EVAS_CALLBACK_RESIZE, _controlbar_object_resize, obj);
1390 wd->selected_box = elm_layout_add(wd->bg);
1391 elm_layout_theme_set(wd->selected_box, "controlbar", "item_bg_move", "default");
1392 evas_object_hide(wd->selected_box);
1395 wd->box = elm_table_add(wd->edje);
1396 elm_table_homogenous_set(wd->box, EINA_TRUE);
1397 evas_object_size_hint_weight_set(wd->box, EVAS_HINT_EXPAND,
1399 evas_object_size_hint_align_set(wd->box, EVAS_HINT_FILL, EVAS_HINT_FILL);
1400 elm_layout_content_set(wd->edje, "elm.swallow.items", wd->box);
1401 evas_object_show(wd->box);
1403 evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj);
1405 evas_object_smart_member_add(wd->view, obj);
1406 elm_widget_resize_object_set(obj, wd->edje);
1407 evas_object_smart_member_add(wd->selected_box, obj);
1408 evas_object_smart_member_add(wd->box, obj);
1416 * Append new tab item
1418 * @param obj The controlbar object
1419 * @param icon_path The icon path of item
1420 * @param label The label of item
1421 * @param view The view of item
1422 * @return The item of controlbar
1424 * @ingroup Controlbar
1426 EAPI Elm_Controlbar_Item * elm_controlbar_tab_item_append(Evas_Object * obj,
1433 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1434 Elm_Controlbar_Item * it;
1435 Elm_Controlbar_Item * lit;
1437 it = _create_tab_item(obj, icon_path, label, view);
1438 if (!it) return NULL;
1439 wd = elm_widget_data_get(obj);
1440 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1441 if (!wd->more_item) {
1442 lit = elm_controlbar_last_item_get(obj);
1443 _set_item_visible(lit, EINA_FALSE);
1444 _create_more_item(wd, TABBAR);
1446 _set_items_position(obj, it, NULL, EINA_FALSE);
1449 _set_items_position(obj, it, NULL, EINA_TRUE);
1451 wd->items = eina_list_append(wd->items, it);
1453 elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1455 _check_background(wd);
1461 * Prepend new tab item
1463 * @param obj The controlbar object
1464 * @param icon_path The icon path of item
1465 * @param label The label of item
1466 * @param view The view of item
1467 * @return The item of controlbar
1469 * @ingroup Controlbar
1471 EAPI Elm_Controlbar_Item * elm_controlbar_tab_item_prepend(Evas_Object *
1480 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1482 Elm_Controlbar_Item * it;
1483 Elm_Controlbar_Item * lit;
1484 Elm_Controlbar_Item * item;
1485 it = _create_tab_item(obj, icon_path, label, view);
1486 if (!it) return NULL;
1487 wd = elm_widget_data_get(obj);
1488 item = eina_list_data_get(wd->items);
1489 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1490 if (!wd->more_item) {
1491 lit = elm_controlbar_last_item_get(obj);
1492 _set_item_visible(lit, EINA_FALSE);
1493 _create_more_item(wd, TABBAR);
1495 lit = elm_controlbar_item_prev(wd->more_item);
1496 _set_item_visible(lit, EINA_FALSE);
1497 _set_items_position(obj, it, item, EINA_TRUE);
1500 _set_items_position(obj, it, item, EINA_TRUE);
1502 wd->items = eina_list_prepend(wd->items, it);
1504 elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1506 _check_background(wd);
1512 * Insert new tab item before given item
1514 * @param obj The controlbar object
1515 * @param before The given item
1516 * @param icon_path The icon path of item
1517 * @param label The label of item
1518 * @param view The view of item
1519 * @return The item of controlbar
1521 * @ingroup Controlbar
1523 EAPI Elm_Controlbar_Item *
1524 elm_controlbar_tab_item_insert_before(Evas_Object * obj,
1525 Elm_Controlbar_Item * before,
1526 const char *icon_path,
1527 const char *label, Evas_Object * view)
1529 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1531 Elm_Controlbar_Item * it;
1532 Elm_Controlbar_Item * lit;
1533 if (!before) return NULL;
1534 it = _create_tab_item(obj, icon_path, label, view);
1535 if (!it) return NULL;
1536 wd = elm_widget_data_get(obj);
1537 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1540 lit = elm_controlbar_last_item_get(obj);
1541 _set_item_visible(lit, EINA_FALSE);
1542 _create_more_item(wd, TABBAR);
1544 before = wd->more_item;
1545 if (before->order > 0)
1547 lit = elm_controlbar_item_prev(wd->more_item);
1548 _set_item_visible(lit, EINA_FALSE);
1549 _set_items_position(obj, it, before, EINA_TRUE);
1553 _set_items_position(obj, it, before, EINA_FALSE);
1557 _set_items_position(obj, it, before, EINA_TRUE);
1559 wd->items = eina_list_prepend_relative(wd->items, it, before);
1561 elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1563 _check_background(wd);
1569 * Insert new tab item after given item
1571 * @param obj The controlbar object
1572 * @param after The given item
1573 * @param icon_path The icon path of item
1574 * @param label The label of item
1575 * @param view The view of item
1576 * @return The item of controlbar
1578 * @ingroup Controlbar
1580 EAPI Elm_Controlbar_Item *
1581 elm_controlbar_tab_item_insert_after(Evas_Object * obj,
1582 Elm_Controlbar_Item * after,
1583 const char *icon_path, const char *label,
1586 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1588 Elm_Controlbar_Item * it;
1589 Elm_Controlbar_Item * lit;
1590 Elm_Controlbar_Item * item;
1591 if (!after) return NULL;
1592 it = _create_tab_item(obj, icon_path, label, view);
1593 if (!it) return NULL;
1594 wd = elm_widget_data_get(obj);
1595 item = elm_controlbar_item_next(after);
1596 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1599 lit = elm_controlbar_last_item_get(obj);
1600 _set_item_visible(lit, EINA_FALSE);
1601 _create_more_item(wd, TABBAR);
1603 lit = elm_controlbar_item_prev(wd->more_item);
1604 if (lit != after && item->order > 0)
1606 _set_item_visible(lit, EINA_FALSE);
1607 _set_items_position(obj, it, item, EINA_TRUE);
1611 _set_items_position(obj, it, NULL, EINA_FALSE);
1615 _set_items_position(obj, it, item, EINA_TRUE);
1617 wd->items = eina_list_append_relative(wd->items, it, after);
1619 elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1621 _check_background(wd);
1627 * Append new tool item
1629 * @param obj The controlbar object
1630 * @param icon_path The icon path of item
1631 * @param label The label of item
1632 * @param func Callback function of item
1633 * @param data The data of callback function
1634 * @return The item of controlbar
1636 * @ingroup Controlbar
1638 EAPI Elm_Controlbar_Item * elm_controlbar_tool_item_append(Evas_Object *
1653 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1654 Elm_Controlbar_Item * it;
1655 Elm_Controlbar_Item * lit;
1657 it = _create_tool_item(obj, icon_path, label, func, data);
1658 if (!it) return NULL;
1659 wd = elm_widget_data_get(obj);
1660 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1661 if (!wd->more_item) {
1662 lit = elm_controlbar_last_item_get(obj);
1663 _set_item_visible(lit, EINA_FALSE);
1664 _create_more_item(wd, TOOLBAR);
1666 _set_items_position(obj, it, NULL, EINA_FALSE);
1669 _set_items_position(obj, it, NULL, EINA_TRUE);
1671 wd->items = eina_list_append(wd->items, it);
1672 _check_toolbar_line(wd);
1678 * Prepend new tool item
1680 * @param obj The controlbar object
1681 * @param icon_path The icon path of item
1682 * @param label The label of item
1683 * @param func Callback function of item
1684 * @param data The data of callback function
1685 * @return The item of controlbar
1687 * @ingroup Controlbar
1689 EAPI Elm_Controlbar_Item * elm_controlbar_tool_item_prepend(Evas_Object *
1705 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1707 Elm_Controlbar_Item * it;
1708 Elm_Controlbar_Item * lit;
1709 Elm_Controlbar_Item * item;
1710 it = _create_tool_item(obj, icon_path, label, func, data);
1711 if (!it) return NULL;
1712 wd = elm_widget_data_get(obj);
1713 item = eina_list_data_get(wd->items);
1714 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1715 if (!wd->more_item) {
1716 lit = elm_controlbar_last_item_get(obj);
1717 _set_item_visible(lit, EINA_FALSE);
1718 _create_more_item(wd, TOOLBAR);
1720 lit = elm_controlbar_item_prev(wd->more_item);
1721 _set_item_visible(lit, EINA_FALSE);
1722 _set_items_position(obj, it, item, EINA_TRUE);
1725 _set_items_position(obj, it, item, EINA_TRUE);
1727 wd->items = eina_list_prepend(wd->items, it);
1728 _check_toolbar_line(wd);
1734 * Insert new tool item before given item
1736 * @param obj The controlbar object
1737 * @param before The given item
1738 * @param icon_path The icon path of item
1739 * @param label The label of item
1740 * @param func Callback function of item
1741 * @param data The data of callback function
1742 * @return The item of controlbar
1744 * @ingroup Controlbar
1746 EAPI Elm_Controlbar_Item *
1747 elm_controlbar_tool_item_insert_before(Evas_Object * obj,
1748 Elm_Controlbar_Item * before,
1749 const char *icon_path,
1751 void (*func) (void *data,
1756 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1758 Elm_Controlbar_Item * it;
1759 Elm_Controlbar_Item * lit;
1760 if (!before) return NULL;
1761 it = _create_tool_item(obj, icon_path, label, func, data);
1762 if (!it) return NULL;
1763 wd = elm_widget_data_get(obj);
1764 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1767 lit = elm_controlbar_last_item_get(obj);
1768 _set_item_visible(lit, EINA_FALSE);
1769 _create_more_item(wd, TOOLBAR);
1771 before = wd->more_item;
1772 if (before->order > 0)
1774 lit = elm_controlbar_item_prev(wd->more_item);
1775 _set_item_visible(lit, EINA_FALSE);
1776 _set_items_position(obj, it, before, EINA_TRUE);
1780 _set_items_position(obj, it, before, EINA_FALSE);
1784 _set_items_position(obj, it, before, EINA_TRUE);
1786 wd->items = eina_list_prepend_relative(wd->items, it, before);
1787 _check_toolbar_line(wd);
1793 * Insert new tool item after given item
1795 * @param obj The controlbar object
1796 * @param after The given item
1797 * @param icon_path The icon path of item
1798 * @param label The label of item
1799 * @param func Callback function of item
1800 * @param data The data of callback function
1801 * @return The item of controlbar
1803 * @ingroup Controlbar
1805 EAPI Elm_Controlbar_Item *
1806 elm_controlbar_tool_item_insert_after(Evas_Object * obj,
1807 Elm_Controlbar_Item * after,
1808 const char *icon_path,
1810 void (*func) (void *data,
1815 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1817 Elm_Controlbar_Item * it;
1818 Elm_Controlbar_Item * lit;
1819 Elm_Controlbar_Item * item;
1820 if (!after) return NULL;
1821 it = _create_tool_item(obj, icon_path, label, func, data);
1822 if (!it) return NULL;
1823 wd = elm_widget_data_get(obj);
1824 item = elm_controlbar_item_next(after);
1825 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1828 lit = elm_controlbar_last_item_get(obj);
1829 _set_item_visible(lit, EINA_FALSE);
1830 _create_more_item(wd, TOOLBAR);
1832 lit = elm_controlbar_item_prev(wd->more_item);
1833 if (lit != after && item->order > 0)
1835 _set_item_visible(lit, EINA_FALSE);
1836 _set_items_position(obj, it, item, EINA_TRUE);
1840 _set_items_position(obj, it, NULL, EINA_FALSE);
1844 _set_items_position(obj, it, item, EINA_TRUE);
1846 wd->items = eina_list_append_relative(wd->items, it, after);
1847 _check_toolbar_line(wd);
1853 * Append new object item
1855 * @param obj The controlbar object
1856 * @param obj_item The object of item
1857 * @param sel The number of sel occupied
1858 * @return The item of controlbar
1860 * @ingroup Controlbar
1862 EAPI Elm_Controlbar_Item * elm_controlbar_object_item_append(Evas_Object *
1868 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1870 Elm_Controlbar_Item * it;
1871 it = _create_object_item(obj, obj_item, sel);
1872 if (!it) return NULL;
1873 wd = elm_widget_data_get(obj);
1874 if (!wd) return NULL;
1875 _set_items_position(obj, it, NULL, EINA_TRUE);
1876 wd->items = eina_list_append(wd->items, it);
1882 * Prepend new object item
1884 * @param obj The controlbar object
1885 * @param obj_item The object of item
1886 * @param sel The number of sel occupied
1887 * @return The item of controlbar
1889 * @ingroup Controlbar
1891 EAPI Elm_Controlbar_Item * elm_controlbar_object_item_prepend(Evas_Object *
1897 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1899 Elm_Controlbar_Item * it;
1900 Elm_Controlbar_Item * item;
1901 it = _create_object_item(obj, obj_item, sel);
1902 if (!it) return NULL;
1903 wd = elm_widget_data_get(obj);
1904 if (!wd) return NULL;
1905 item = eina_list_data_get(wd->items);
1906 _set_items_position(obj, it, item, EINA_TRUE);
1907 wd->items = eina_list_prepend(wd->items, it);
1913 * Insert new object item before given item
1915 * @param obj The controlbar object
1916 * @param before The given item
1917 * @param obj_item The object of item
1918 * @param sel The number of sel occupied
1919 * @return The item of controlbar
1921 * @ingroup Controlbar
1923 EAPI Elm_Controlbar_Item *
1924 elm_controlbar_object_item_insert_before(Evas_Object * obj,
1925 Elm_Controlbar_Item * before,
1926 Evas_Object * obj_item, const int sel)
1928 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1930 Elm_Controlbar_Item * it;
1931 if (!before) return NULL;
1932 it = _create_object_item(obj, obj_item, sel);
1933 if (!it) return NULL;
1934 wd = elm_widget_data_get(obj);
1935 if (!wd) return NULL;
1936 _set_items_position(obj, it, before, EINA_TRUE);
1937 wd->items = eina_list_prepend_relative(wd->items, it, before);
1943 * Insert new object item after given item
1945 * @param obj The controlbar object
1946 * @param after The given item
1947 * @param obj_item The object of item
1948 * @param sel The number of sel occupied
1949 * @return The item of controlbar
1951 * @ingroup Controlbar
1953 EAPI Elm_Controlbar_Item *
1954 elm_controlbar_object_item_insert_after(Evas_Object * obj,
1955 Elm_Controlbar_Item * after,
1956 Evas_Object * obj_item, const int sel)
1958 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1960 Elm_Controlbar_Item * it;
1961 Elm_Controlbar_Item * item;
1962 if (!after) return NULL;
1963 it = _create_object_item(obj, obj_item, sel);
1964 if (!it) return NULL;
1965 wd = elm_widget_data_get(obj);
1966 if (!wd) return NULL;
1967 item = elm_controlbar_item_next(after);
1968 _set_items_position(obj, it, item, EINA_TRUE);
1969 wd->items = eina_list_append_relative(wd->items, it, after);
1975 * Get the object of the object item
1977 * @param it The item of controlbar
1978 * @return The object of the object item
1980 * @ingroup Controlbar
1983 elm_controlbar_object_item_object_get(const Elm_Controlbar_Item * it)
1985 if (!it) return NULL;
1986 if (it->style != OBJECT) return NULL;
1987 if (!it->base_item) return NULL;
1988 return it->base_item;
1992 * Delete item from controlbar
1994 * @param it The item of controlbar
1996 * @ingroup Controlbar
1999 elm_controlbar_item_del(Elm_Controlbar_Item * it)
2006 Elm_Controlbar_Item * item;
2016 if (it->obj == NULL)
2018 printf("Invalid argument: controlbar object is NULL\n");
2021 wd = elm_widget_data_get(it->obj);
2024 printf("Cannot get smart data\n");
2032 elm_table_unpack(wd->box, it->base);
2034 EINA_LIST_FOREACH(wd->items, l, item)
2038 if (item->order > it->order)
2041 elm_table_unpack(wd->box, item->base);
2044 elm_table_pack(wd->box, item->base, item->order - 1, 0, item->sel, 1);
2046 elm_table_pack(wd->box, item->base, 0, item->order - 1, item->sel, 1);
2054 // delete item in list
2056 wd->items = eina_list_remove(wd->items, it);
2059 wd->num = wd->num - 1;
2064 * Select item in controlbar
2066 * @param it The item of controlbar
2068 * @ingroup Controlbar
2071 elm_controlbar_item_select(Elm_Controlbar_Item * it)
2074 if (it->obj == NULL) return;
2075 Widget_Data * wd = elm_widget_data_get(it->obj);
2082 * Set the icon of item
2084 * @param it The item of controlbar
2085 * @param icon_path The icon path of the item
2086 * @return The icon object
2088 * @ingroup Controlbar
2091 elm_controlbar_item_icon_set(Elm_Controlbar_Item * it, const char *icon_path)
2094 if (it->style == OBJECT) return;
2097 eina_stringshare_del(it->icon_path);
2098 it->icon_path = NULL;
2102 evas_object_del(it->icon);
2105 if (icon_path != NULL)
2107 it->icon_path = eina_stringshare_add(icon_path);
2108 it->icon = _create_item_icon(it->base_item, it, "elm.swallow.icon");
2110 if (it->wd->disabled || it->disabled)
2111 elm_widget_disabled_set(it->base_item, EINA_TRUE);
2113 elm_widget_disabled_set(it->base_item, EINA_FALSE);
2117 * Get the icon of item
2119 * @param it The item of controlbar
2120 * @return The icon object
2122 * @ingroup Controlbar
2125 elm_controlbar_item_icon_get(const Elm_Controlbar_Item * it)
2127 if (!it) return NULL;
2132 * Set the label of item
2134 * @param it The item of controlbar
2135 * @param label The label of item
2137 * @ingroup Controlbar
2140 elm_controlbar_item_label_set(Elm_Controlbar_Item * it, const char *label)
2143 if (it->style == OBJECT) return;
2146 eina_stringshare_del(it->text);
2151 it->text = eina_stringshare_add(label);
2152 elm_button_label_set(it->base_item, it->text);
2154 if (it->wd->disabled || it->disabled)
2155 elm_widget_disabled_set(it->base_item, EINA_TRUE);
2157 elm_widget_disabled_set(it->base_item, EINA_FALSE);
2161 * Get the label of item
2163 * @param it The item of controlbar
2164 * @return The label of item
2166 * @ingroup Controlbar
2169 elm_controlbar_item_label_get(const Elm_Controlbar_Item * it)
2171 if (!it) return NULL;
2176 * Get the selected item
2178 * @param obj The controlbar object
2179 * @return The item of controlbar
2181 * @ingroup Controlbar
2183 EAPI Elm_Controlbar_Item * elm_controlbar_selected_item_get(const Evas_Object *
2186 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
2189 Elm_Controlbar_Item * item;
2190 if (obj == NULL) return NULL;
2191 Widget_Data * wd = elm_widget_data_get(obj);
2192 if (!wd || !wd->items) return NULL;
2193 EINA_LIST_FOREACH(wd->items, l, item)
2195 if (item->selected) return item;
2201 * Get the first item
2203 * @param obj The controlbar object
2204 * @return The item of controlbar
2206 * @ingroup Controlbar
2208 EAPI Elm_Controlbar_Item * elm_controlbar_first_item_get(const Evas_Object * obj)
2210 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
2211 Widget_Data * wd = elm_widget_data_get(obj);
2212 if (!wd || !wd->items) return NULL;
2213 return eina_list_data_get(wd->items);
2219 * @param obj The controlbar object
2220 * @return The item of controlbar
2222 * @ingroup Controlbar
2224 EAPI Elm_Controlbar_Item * elm_controlbar_last_item_get(const Evas_Object * obj)
2226 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
2227 Widget_Data * wd = elm_widget_data_get(obj);
2228 if (!wd || !wd->items) return NULL;
2229 return eina_list_data_get(eina_list_last(wd->items));
2235 * @param obj The controlbar object
2236 * @return The list of the items
2238 * @ingroup Controlbar
2240 EAPI const Eina_List * elm_controlbar_items_get(const Evas_Object * obj)
2242 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
2243 Widget_Data * wd = elm_widget_data_get(obj);
2244 if (!wd || !wd->items) return NULL;
2249 * Get the previous item
2251 * @param it The item of controlbar
2252 * @return The previous item of the parameter item
2254 * @ingroup Controlbar
2256 EAPI Elm_Controlbar_Item * elm_controlbar_item_prev(Elm_Controlbar_Item *
2259 if (!it) return NULL;
2262 Elm_Controlbar_Item * item;
2263 if (it->obj == NULL) return NULL;
2264 Widget_Data * wd = elm_widget_data_get(it->obj);
2265 if (!wd || !wd->items) return NULL;
2266 EINA_LIST_FOREACH(wd->items, l, item)
2270 l = eina_list_prev(l);
2271 if (!l) return NULL;
2272 return eina_list_data_get(l);
2281 * @param obj The controlbar object
2282 * @return The next item of the parameter item
2284 * @ingroup Controlbar
2286 EAPI Elm_Controlbar_Item * elm_controlbar_item_next(Elm_Controlbar_Item *
2289 if (!it) return NULL;
2292 Elm_Controlbar_Item * item;
2293 if (it->obj == NULL) return NULL;
2294 Widget_Data * wd = elm_widget_data_get(it->obj);
2295 if (!wd || !wd->items) return NULL;
2296 EINA_LIST_FOREACH(wd->items, l, item)
2300 l = eina_list_next(l);
2301 if (!l) return NULL;
2302 return eina_list_data_get(l);
2309 * Set the visible status of item in bar
2311 * @param it The item of controlbar
2312 * @param bar EINA_TRUE or EINA_FALSE
2314 * @ingroup Controlbar
2317 elm_controlbar_item_visible_set(Elm_Controlbar_Item * it, Eina_Bool visible)
2320 if (it->obj == NULL) return;
2321 Widget_Data * wd = elm_widget_data_get(it->obj);
2324 if (!wd->auto_align)
2325 _set_item_visible(it, visible);
2329 * Get the result which or not item is visible in bar
2331 * @param it The item of controlbar
2332 * @return EINA_TRUE or EINA_FALSE
2334 * @ingroup Controlbar
2337 elm_controlbar_item_visible_get(const Elm_Controlbar_Item * it)
2339 if (!it) return EINA_FALSE;
2340 if (it->obj == NULL) return EINA_FALSE;
2341 Widget_Data * wd = elm_widget_data_get(it->obj);
2342 if (!wd) return EINA_FALSE;
2343 if (it->order <= 0) return EINA_FALSE;
2351 * @param it The item of controlbar
2352 * @param bar EINA_TRUE or EINA_FALSE
2354 * @ingroup Controlbar
2357 elm_controlbar_item_disabled_set(Elm_Controlbar_Item * it, Eina_Bool disabled)
2361 if (it->disabled == disabled) return;
2363 it->disabled = disabled;
2365 if (it->wd && it->wd->disabled) return;
2367 if (it->base_item) elm_widget_disabled_set(it->base_item, disabled);
2373 * @param it The item of controlbar
2374 * @return EINA_TRUE or EINA_FALSE
2376 * @ingroup Controlbar
2379 elm_controlbar_item_disabled_get(const Elm_Controlbar_Item * it)
2381 if (!it) return EINA_FALSE;
2383 return it->disabled;
2387 * Set the view of the item
2389 * @param it The item of controlbar
2390 * @param view The view for the item
2392 * @ingroup Controlbar
2395 elm_controlbar_item_view_set(Elm_Controlbar_Item *it, Evas_Object * view)
2398 if (it->view == view) return;
2400 evas_object_del(it->view);
2405 * Get the view of the item
2407 * @param it The item of controlbar
2408 * @return The view for the item
2410 * @ingroup Controlbar
2413 elm_controlbar_item_view_get(const Elm_Controlbar_Item *it)
2415 if (!it) return NULL;
2421 * Unset the view of the item
2423 * @param it The item of controlbar
2424 * @return The view for the item
2426 * @ingroup Controlbar
2429 elm_controlbar_item_view_unset(Elm_Controlbar_Item *it)
2431 if (!it) return NULL;
2432 if (it->obj == NULL) return NULL;
2433 Widget_Data * wd = elm_widget_data_get(it->obj);
2434 if (!wd) return NULL;
2435 Evas_Object *content;
2437 if (it->view == elm_layout_content_get(wd->view, "elm.swallow.view"))
2439 content = elm_layout_content_unset(wd->view, "elm.swallow.view");
2440 if (content) evas_object_hide(content);
2451 * Set the mode of the controlbar
2453 * @param obj The object of the controlbar
2454 * @param mode The mode of the controlbar
2456 * @ingroup Controlbar
2459 elm_controlbar_mode_set(Evas_Object *obj, int mode)
2461 ELM_CHECK_WIDTYPE(obj, widtype);
2462 Widget_Data *wd = elm_widget_data_get(obj);
2465 fprintf(stderr, "Cannot get smart data\n");
2469 if (wd->mode == mode) return;
2475 case ELM_CONTROLBAR_MODE_DEFAULT:
2476 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,default", "elm");
2478 case ELM_CONTROLBAR_MODE_TRANSLUCENCE:
2479 elm_controlbar_alpha_set(obj, 85);
2481 case ELM_CONTROLBAR_MODE_TRANSPARENCY:
2482 elm_controlbar_alpha_set(obj, 0);
2484 case ELM_CONTROLBAR_MODE_LARGE:
2485 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,large", "elm");
2487 case ELM_CONTROLBAR_MODE_SMALL:
2488 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,small", "elm");
2490 case ELM_CONTROLBAR_MODE_LEFT:
2491 edje_object_signal_emit(_EDJ(wd->selected_box), "elm,state,left", "elm");
2492 wd->selected_signal = eina_stringshare_add("elm,state,selected_left");
2493 wd->pressed_signal = eina_stringshare_add("elm,state,pressed_left");
2494 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,left", "elm");
2495 _check_background(wd);
2498 case ELM_CONTROLBAR_MODE_RIGHT:
2499 edje_object_signal_emit(_EDJ(wd->selected_box), "elm,state,right", "elm");
2500 wd->selected_signal = eina_stringshare_add("elm,state,selected_right");
2501 wd->pressed_signal = eina_stringshare_add("elm,state,pressed_right");
2502 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,right", "elm");
2503 _check_background(wd);
2510 edje_object_signal_emit(_EDJ(wd->selected_box), "elm,state,default", "elm");
2511 wd->selected_signal = eina_stringshare_add("elm,state,selected");
2512 wd->pressed_signal = eina_stringshare_add("elm,state,pressed");
2513 _check_background(wd);
2518 * Set the alpha of the controlbar
2520 * @param obj The object of the controlbar
2521 * @param alpha The alpha value of the controlbar (0-100)
2523 * @ingroup Controlbar
2526 elm_controlbar_alpha_set(Evas_Object *obj, int alpha)
2528 ELM_CHECK_WIDTYPE(obj, widtype);
2530 Widget_Data *wd = elm_widget_data_get(obj);
2533 fprintf(stderr, "Cannot get smart data\n");
2537 if (alpha < 0) wd->alpha = 0;
2538 else if (alpha > 100) wd->alpha = 100;
2539 else wd->alpha = alpha;
2541 evas_object_color_get(wd->bg, &r, &g, &b, NULL);
2542 evas_object_color_set(wd->bg, r, g, b, (int)(255 * wd->alpha / 100));
2547 * Set auto-align mode of the controlbar(It's not prepared yet)
2548 * If you set the auto-align and add items more than 5,
2549 * the "more" item will be made and the items more than 5 will be unvisible.
2551 * @param obj The object of the controlbar
2552 * @param auto_align The dicision that the controlbar use the auto-align
2554 * @ingroup Controlbar
2557 elm_controlbar_item_auto_align_set(Evas_Object *obj, Eina_Bool auto_align)
2559 ELM_CHECK_WIDTYPE(obj, widtype);
2560 Widget_Data *wd = elm_widget_data_get(obj);
2561 Elm_Controlbar_Item *item;
2566 fprintf(stderr, "Cannot get smart data\n");
2570 if (wd->auto_align == auto_align) return;
2574 if (_check_bar_item_number(wd) >= 5 && !wd->more_item)
2577 EINA_LIST_FOREACH(wd->items, l, item)
2579 if (elm_controlbar_item_visible_get(item))
2582 _delete_item_in_bar(item);
2585 item = elm_controlbar_last_item_get(obj);
2586 while (!elm_controlbar_item_visible_get(item)){
2587 item = elm_controlbar_item_prev(item);
2589 _create_more_item(wd, item->style);
2597 if (wd->more_item->view)
2598 evas_object_del(wd->more_item->view);
2599 wd->items = eina_list_remove(wd->items, wd->more_item);
2600 eina_stringshare_del(wd->more_item->text);
2601 if (wd->more_item->icon)
2602 evas_object_del(wd->more_item->icon);
2603 if (wd->more_item->base)
2604 evas_object_del(wd->more_item->base);
2605 if (wd->more_item->base_item)
2606 evas_object_del(wd->more_item->base_item);
2607 free(wd->more_item);
2608 wd->more_item = NULL;
2610 // make all item is visible
2612 EINA_LIST_FOREACH(wd->items, l, item)
2614 if (!elm_controlbar_item_visible_get(item))
2615 _insert_item_in_bar(item, i);
2620 wd->auto_align = auto_align;
2625 * Set the vertical mode of the controlbar
2627 * @param obj The object of the controlbar
2628 * @param vertical The vertical mode of the controlbar (TRUE = vertical, FALSE = horizontal)
2630 * @ingroup Controlbar
2633 elm_controlbar_vertical_set(Evas_Object *obj, Eina_Bool vertical)
2635 ELM_CHECK_WIDTYPE(obj, widtype);
2636 Widget_Data *wd = elm_widget_data_get(obj);
2639 fprintf(stderr, "Cannot get smart data\n");
2643 if (wd->vertical == vertical) return;
2644 wd->vertical = vertical;
2646 if (_check_bar_item_number(wd) > 1)
2650 _check_toolbar_line(wd);
2654 * Get the button object of the item
2656 * @param it The item of controlbar
2657 * @return button object of the item
2659 * @ingroup Controlbar
2662 elm_controlbar_item_button_get(const Elm_Controlbar_Item *it)
2664 if (!it) return NULL;
2665 if (it->style == OBJECT) return NULL;
2667 if (it->base_item) return it->base_item;