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));
312 _disable_hook(Evas_Object * obj)
314 Widget_Data * wd = elm_widget_data_get(obj);
317 Elm_Controlbar_Item * item;
320 wd->disabled = elm_widget_disabled_get(obj);
322 EINA_LIST_FOREACH(wd->items, l, item)
325 disabled = wd->disabled;
327 disabled = item->disabled;
329 if (item->base_item) elm_widget_disabled_set(item->base_item, disabled);
334 _sub_del(void *data __UNUSED__, Evas_Object * obj, void *event_info)
336 Widget_Data *wd = elm_widget_data_get(obj);
337 Evas_Object *sub = event_info;
338 Evas_Object *content;
343 content = elm_layout_content_unset(wd->view, "elm.swallow.view");
344 evas_object_hide(content);
349 _sizing_eval(Evas_Object * obj)
351 Widget_Data * wd = elm_widget_data_get(obj);
353 _controlbar_move(obj, obj);
354 _controlbar_resize(obj, obj);
357 /////////////////////////////////////////////////////////////
359 // animation function
361 /////////////////////////////////////////////////////////////
364 _move_evas_object(void *data)
366 Evas_Object *bg_image;
367 double t, vx, vy, vw, vh;
373 Animation_Data * ad = (Animation_Data *) data;
374 bg_image = edje_object_part_object_get(_EDJ(ad->obj), "bg_image");
375 if (bg_image) evas_object_geometry_get(bg_image, &ox, &oy, &ow, &oh);
376 t = ELM_MAX(0.0, ecore_loop_time_get() - ad->start_time);
377 dx = ad->tx - ad->fx;
378 dy = ad->ty - ad->fy;
379 dw = ad->tw - ad->fw;
380 dh = ad->th - ad->fh;
383 x = (1 * sin((t / ad->time) * (M_PI / 2)) * dx);
384 y = (1 * sin((t / ad->time) * (M_PI / 2)) * dy);
385 w = (1 * sin((t / ad->time) * (M_PI / 2)) * dw);
386 h = (1 * sin((t / ad->time) * (M_PI / 2)) * dh);
403 vx = (double)(px - ox) / (double)(ow - pw);
407 vy = (double)(py - oy) / (double)(oh - ph);
408 vw = (double)pw / (double)ow;
409 vh = (double)ph / (double)oh;
411 if (x == dx && y == dy && w == dw && h == dh)
413 if (ad->timer) ecore_animator_del(ad->timer);
415 edje_object_part_drag_size_set(_EDJ(ad->obj), "elm.dragable.box", vw, vh);
416 edje_object_part_drag_value_set(_EDJ(ad->obj), "elm.dragable.box", vx, vy);
417 if (ad->func != NULL)
418 ad->func(ad->data, ad->obj);
419 return ECORE_CALLBACK_CANCEL;
423 edje_object_part_drag_size_set(_EDJ(ad->obj), "elm.dragable.box", vw, vh);
424 edje_object_part_drag_value_set(_EDJ(ad->obj), "elm.dragable.box", vx, vy);
426 return ECORE_CALLBACK_RENEW;
429 static Animation_Data*
430 _move_object_with_animation(Evas_Object * obj, Evas_Coord x, Evas_Coord y,
431 Evas_Coord w, Evas_Coord h, Evas_Coord x_,
432 Evas_Coord y_, Evas_Coord w_, Evas_Coord h_,
433 double time, Eina_Bool (*mv_func) (void *data),
434 void (*func) (void *data,
435 Evas_Object * obj), void *data)
437 Animation_Data * ad = (Animation_Data *) malloc(sizeof(Animation_Data));
438 if (!ad) return NULL;
448 ad->start_time = ecore_loop_time_get();
452 ad->timer = ecore_animator_add(mv_func, ad);
457 /////////////////////////////////////////////////////////////
461 /////////////////////////////////////////////////////////////
464 _sort_cb(const void *d1, const void *d2)
466 Elm_Controlbar_Item * item1, *item2;
467 item1 = (Elm_Controlbar_Item *) d1;
468 item2 = (Elm_Controlbar_Item *) d2;
469 if (item1->order <= 0) return 1;
470 if (item2->order <= 0) return -1;
471 return item1->order > item2->order ? 1 : -1;
474 ///////////////////////////////////////////////////////////////////
476 // basic utility function
478 ////////////////////////////////////////////////////////////////////
481 _check_item(Widget_Data *wd, Elm_Controlbar_Item *item)
484 Elm_Controlbar_Item *it;
486 if (!wd) return EINA_FALSE;
487 if (!wd->items) return EINA_FALSE;
489 EINA_LIST_FOREACH(wd->items, l, it)
490 if (it == item) return EINA_TRUE;
496 _check_background(Widget_Data *wd)
500 Elm_Controlbar_Item *it;
502 EINA_LIST_FOREACH(wd->items, l, it)
504 if (it->style == TABBAR)
506 if (wd->mode == ELM_CONTROLBAR_MODE_LEFT)
507 edje_object_signal_emit(_EDJ(wd->bg), "elm,state,tabbar_left", "elm");
508 else if (wd->mode == ELM_CONTROLBAR_MODE_RIGHT)
509 edje_object_signal_emit(_EDJ(wd->bg), "elm,state,tabbar_right", "elm");
511 edje_object_signal_emit(_EDJ(wd->bg), "elm,state,tabbar", "elm");
515 edje_object_signal_emit(_EDJ(wd->bg), "elm,state,toolbar", "elm");
519 _check_toolbar_line(Widget_Data *wd)
523 Elm_Controlbar_Item *it, *it2;
525 EINA_LIST_FOREACH(wd->items, l, it)
527 it2 = elm_controlbar_item_prev(it);
529 if (it->style != TOOLBAR || it2->style != TOOLBAR) continue;
533 edje_object_signal_emit(_EDJ(it2->base), "elm,state,right_line_hide", "elm");
534 edje_object_signal_emit(_EDJ(it->base), "elm,state,left_line_hide", "elm");
536 if ((it->icon || it->text) && (it2->icon || it2->text))
538 edje_object_signal_emit(_EDJ(it2->base), "elm,state,bottom_line_show", "elm");
539 edje_object_signal_emit(_EDJ(it->base), "elm,state,top_line_show", "elm");
543 edje_object_signal_emit(_EDJ(it2->base), "elm,state,bottom_line_hide", "elm");
544 edje_object_signal_emit(_EDJ(it->base), "elm,state,top_line_hide", "elm");
549 edje_object_signal_emit(_EDJ(it2->base), "elm,state,bottom_line_hide", "elm");
550 edje_object_signal_emit(_EDJ(it->base), "elm,state,top_line_hide", "elm");
552 if ((it->icon || it->text) && (it2->icon || it2->text))
554 edje_object_signal_emit(_EDJ(it2->base), "elm,state,right_line_show", "elm");
555 edje_object_signal_emit(_EDJ(it->base), "elm,state,left_line_show", "elm");
559 edje_object_signal_emit(_EDJ(it2->base), "elm,state,right_line_hide", "elm");
560 edje_object_signal_emit(_EDJ(it->base), "elm,state,left_line_hide", "elm");
567 _check_bar_item_number(Widget_Data *wd)
570 Elm_Controlbar_Item * item;
573 EINA_LIST_FOREACH(wd->items, l, item)
574 if (item->order > 0) num++;
580 _insert_item_in_bar(Elm_Controlbar_Item * it, int order)
583 Elm_Controlbar_Item * item;
584 Widget_Data * wd = elm_widget_data_get(it->obj);
585 if (!wd) return NULL;
588 if (order == 0) return;
590 EINA_LIST_FOREACH(wd->items, l, item)
592 if (item->order == order && item != it)
597 EINA_LIST_FOREACH(wd->items, l, item)
600 elm_table_unpack(wd->box, item->base);
602 EINA_LIST_FOREACH(wd->items, l, item)
606 if (item->order >= order)
609 elm_table_pack(wd->box, item->base, item->order - 1, 0, 1, 1);
611 elm_table_pack(wd->box, item->base, 0, item->order - 1, 1, 1);
612 evas_object_show(item->base);
618 elm_table_pack(wd->box, it->base, it->order - 1, 0, 1, 1);
620 elm_table_pack(wd->box, it->base, 0, it->order - 1, 1, 1);
621 evas_object_show(it->base);
625 _delete_item_in_bar(Elm_Controlbar_Item * it)
628 Elm_Controlbar_Item * item;
629 Widget_Data * wd = elm_widget_data_get(it->obj);
633 EINA_LIST_FOREACH(wd->items, l, item)
639 elm_table_unpack(wd->box, it->base);
640 evas_object_hide(it->base);
645 EINA_LIST_FOREACH(wd->items, l, item)
650 elm_table_unpack(wd->box, item->base);
652 elm_table_pack(wd->box, item->base, item->order - 1, 0, 1, 1);
654 elm_table_pack(wd->box, item->base, 0, item->order - 1, 1, 1);
661 _set_item_visible(Elm_Controlbar_Item *it, Eina_Bool visible)
663 Elm_Controlbar_Item *item;
664 Eina_Bool check = EINA_TRUE;
667 if (it->obj == NULL) return;
668 Widget_Data * wd = elm_widget_data_get(it->obj);
669 if (!wd || !wd->items) return;
670 if (it->order <= 0) check = EINA_FALSE;
671 if (check == visible) return;
674 item = elm_controlbar_last_item_get(it->obj);
676 while (!elm_controlbar_item_visible_get(item)){
677 item = elm_controlbar_item_prev(item);
679 _insert_item_in_bar(it, item->order + 1);
683 _delete_item_in_bar(it);
685 wd->items = eina_list_sort(wd->items, eina_list_count(wd->items), _sort_cb);
686 _sizing_eval(it->obj);
690 _hide_selected_box(void *data)
692 Evas_Object *base = (Evas_Object *)data;
694 edje_object_part_drag_size_set(_EDJ(base), "elm.dragable.box", 0.0, 0.0);
696 return ECORE_CALLBACK_CANCEL;
700 _end_selected_box(void *data, Evas_Object *obj __UNUSED__)
702 Widget_Data * wd = (Widget_Data *)data;
704 if (_check_item(wd, wd->cur_item))
706 edje_object_signal_emit(_EDJ(wd->cur_item->base), wd->selected_signal, "elm");
710 if (wd->animating < 0)
712 printf("animation error\n");
716 ecore_idler_add(_hide_selected_box, wd->edje);
720 _move_selected_box(Widget_Data *wd, Elm_Controlbar_Item * fit, Elm_Controlbar_Item * tit)
722 Evas_Coord fx, fy, fw, fh, tx, ty, tw, th;
723 Evas_Object *from, *to;
725 if (fit->order <= 0 && wd->auto_align)
728 from = (Evas_Object *) edje_object_part_object_get(_EDJ(fit->base), "bg_img");
729 evas_object_geometry_get(from, &fx, &fy, &fw, &fh);
731 to = (Evas_Object *) edje_object_part_object_get(_EDJ(tit->base), "bg_img");
732 evas_object_geometry_get(to, &tx, &ty, &tw, &th);
734 if (_check_item(wd, wd->pre_item))
736 edje_object_signal_emit(_EDJ(wd->pre_item->base), "elm,state,unselected", "elm");
738 if (_check_item(wd, wd->cur_item))
739 edje_object_signal_emit(_EDJ(wd->cur_item->base), "elm,state,unselected", "elm");
744 if (wd->ad->timer) ecore_animator_del(wd->ad->timer);
745 wd->ad->timer = NULL;
749 wd->ad = _move_object_with_animation(wd->edje, fx, fy, fw, fh, tx, ty, tw, th,
750 0.3, _move_evas_object, _end_selected_box, wd);
754 _select_box(Elm_Controlbar_Item * it)
757 Widget_Data * wd = elm_widget_data_get(it->obj);
760 Elm_Controlbar_Item * item, *fit = NULL;
761 Evas_Object * content;
763 if (wd->animating) return;
767 if (it->style == TABBAR)
769 content = elm_layout_content_unset(wd->view, "elm.swallow.view");
770 if (content) evas_object_hide(content);
772 EINA_LIST_FOREACH(wd->items, l, item){
773 if (item->selected) {
777 item->selected = EINA_FALSE;
779 it->selected = EINA_TRUE;
781 if (fit != NULL && fit != it)
783 _move_selected_box(wd, fit, it);
787 edje_object_signal_emit(_EDJ(it->base), wd->selected_signal, "elm");
792 if (wd->more_item != it)
793 evas_object_smart_callback_call(it->obj, "view,change,before", it);
796 elm_layout_content_set(wd->view, "elm.swallow.view", it->view);
798 else if (it->style == TOOLBAR)
800 edje_object_signal_emit(_EDJ(it->base), "elm,state,text_unselected", "elm");
802 it->func(it->data, it->obj, it);
807 _cancel_selected_box(Widget_Data *wd)
810 Elm_Controlbar_Item * item;
812 EINA_LIST_FOREACH(wd->items, l, item)
814 if (item->style == TABBAR)
818 edje_object_signal_emit(_EDJ(item->base), wd->selected_signal, "elm");
822 edje_object_signal_emit(_EDJ(item->base), "elm,state,unselected", "elm");
825 else if (item->style == TOOLBAR)
827 edje_object_signal_emit(_EDJ(item->base), "elm,state,unselected", "elm");
833 _unpress_box_cb(void *data, Evas *evas __UNUSED__, Evas_Object *obj, void *event_info)
835 Widget_Data * wd = (Widget_Data *) data;
836 Evas_Event_Mouse_Up * ev = event_info;
837 Evas_Coord x, y, w, h;
839 evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_UP, _unpress_box_cb);
841 _cancel_selected_box(wd);
843 if (_check_item(wd, wd->pre_item))
845 evas_object_geometry_get(wd->pre_item->base, &x, &y, &w, &h);
846 if (ev->output.x > x && ev->output.x < x+w && ev->output.y > y && ev->output.y < y+h)
848 _select_box(wd->pre_item);
855 _press_box(Elm_Controlbar_Item * it)
857 Widget_Data * wd = elm_widget_data_get(it->obj);
858 if (!wd) return EINA_FALSE;
861 Elm_Controlbar_Item * item;
863 if (wd->animating) return EINA_FALSE;
865 if (wd->disabled || it->disabled) return EINA_FALSE;
867 EINA_LIST_FOREACH(wd->items, l, item)
871 if (it->style == TABBAR)
873 edje_object_signal_emit(_EDJ(it->base), wd->pressed_signal, "elm");
875 else if (it->style == TOOLBAR)
877 edje_object_signal_emit(_EDJ(it->base), "elm,state,toolbar_pressed", "elm");
879 evas_object_event_callback_add(it->base, EVAS_CALLBACK_MOUSE_UP, _unpress_box_cb, (void *)wd);
893 _create_item_icon(Evas_Object *obj, Elm_Controlbar_Item * it, char *part)
897 icon = elm_icon_add(obj);
898 if (!elm_icon_standard_set(icon, it->icon_path))
900 elm_icon_file_set(icon, it->icon_path, NULL);
903 evas_object_size_hint_min_set(icon, 40, 40);
904 evas_object_size_hint_max_set(icon, 100, 100);
905 evas_object_show(icon);
907 elm_button_icon_set(obj, icon);
913 _create_item_layout(Evas_Object * parent, Elm_Controlbar_Item * it, Evas_Object **item, Evas_Object **icon)
917 obj = elm_layout_add(parent);
920 fprintf(stderr, "Cannot load bg edj\n");
923 elm_layout_theme_set(obj, "controlbar", "item_bg",
924 elm_widget_style_get(it->obj));
925 evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
926 evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, EVAS_HINT_FILL);
928 *item = elm_button_add(parent);
929 if (*item == NULL) return NULL;
930 elm_object_style_set(*item, "controlbar/vertical");
931 elm_layout_content_set(obj, "item", *item);
934 elm_button_label_set(*item, it->text);
936 *icon = _create_item_icon(*item, it, "elm.swallow.icon");
942 _bar_item_down_cb(void *data, Evas * evas __UNUSED__, Evas_Object * obj, void *event_info __UNUSED__)
944 Widget_Data * wd = (Widget_Data *) data;
946 Elm_Controlbar_Item * item;
947 if (wd->animating) return;
949 EINA_LIST_FOREACH(wd->items, l, item)
950 if (item->base == obj) break;
952 if (item == NULL) return;
957 static Elm_Controlbar_Item *
958 _create_tab_item(Evas_Object * obj, const char *icon_path, const char *label,
961 Elm_Controlbar_Item * it;
965 fprintf(stderr, "Invalid argument: controlbar object is NULL\n");
968 wd = elm_widget_data_get(obj);
971 fprintf(stderr, "Cannot get smart data\n");
974 it = ELM_NEW(Elm_Controlbar_Item);
975 if (!it) return NULL;
978 it->text = eina_stringshare_add(label);
979 it->icon_path = eina_stringshare_add(icon_path);
980 it->selected = EINA_FALSE;
984 it->base = _create_item_layout(wd->edje, it, &(it->base_item), &(it->icon));
985 evas_object_event_callback_add(it->base, EVAS_CALLBACK_MOUSE_DOWN,
986 _bar_item_down_cb, wd);
987 evas_object_show(it->base);
992 static Elm_Controlbar_Item *
993 _create_tool_item(Evas_Object * obj, const char *icon_path, const char *label,
994 void (*func) (void *data, Evas_Object * obj,
995 void *event_info), void *data)
998 Elm_Controlbar_Item * it;
1002 fprintf(stderr, "Invalid argument: controlbar object is NULL\n");
1005 wd = elm_widget_data_get(obj);
1008 fprintf(stderr, "Cannot get smart data\n");
1011 it = ELM_NEW(Elm_Controlbar_Item);
1016 it->text = eina_stringshare_add(label);
1017 it->icon_path = eina_stringshare_add(icon_path);
1018 it->selected = EINA_FALSE;
1022 it->style = TOOLBAR;
1023 it->base = _create_item_layout(wd->edje, it, &(it->base_item), &(it->icon));
1024 evas_object_event_callback_add(it->base, EVAS_CALLBACK_MOUSE_DOWN,
1025 _bar_item_down_cb, wd);
1026 evas_object_show(it->base);
1031 static Elm_Controlbar_Item *
1032 _create_object_item(Evas_Object * obj, Evas_Object * obj_item, const int sel)
1034 Elm_Controlbar_Item * it;
1038 fprintf(stderr, "Invalid argument: controlbar object is NULL\n");
1041 wd = elm_widget_data_get(obj);
1044 fprintf(stderr, "Cannot get smart data\n");
1047 it = ELM_NEW(Elm_Controlbar_Item);
1054 it->base = elm_layout_add(wd->edje);
1055 elm_layout_theme_set(it->base, "controlbar", "item_bg",
1056 elm_widget_style_get(it->obj));
1057 evas_object_size_hint_weight_set(it->base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1058 evas_object_size_hint_align_set(it->base, EVAS_HINT_FILL, EVAS_HINT_FILL);
1059 it->base_item = obj_item;
1060 elm_layout_content_set(it->base, "item", it->base_item);
1061 evas_object_show(it->base);
1066 _repack_items(Widget_Data *wd)
1069 Elm_Controlbar_Item * item;
1071 EINA_LIST_FOREACH(wd->items, l, item)
1073 if (item->order > 0)
1075 elm_table_unpack(wd->box, item->base);
1077 elm_table_pack(wd->box, item->base, item->order - 1, 0, item->sel, 1);
1079 elm_table_pack(wd->box, item->base, 0, item->order - 1, item->sel, 1);
1085 _set_items_position(Evas_Object * obj, Elm_Controlbar_Item * it,
1086 Elm_Controlbar_Item * mit, Eina_Bool bar)
1090 Elm_Controlbar_Item * item;
1091 int check = EINA_FALSE;
1096 fprintf(stderr, "Invalid argument: controlbar object is NULL\n");
1099 wd = elm_widget_data_get(obj);
1102 fprintf(stderr, "Cannot get smart data\n");
1106 EINA_LIST_FOREACH(wd->items, l, item)
1108 if (item == mit && item->order > 0)
1111 it->order = mit->order;
1115 if (item->order > 0)
1117 elm_table_unpack(wd->box, item->base);
1118 item->order += it->sel;
1120 elm_table_pack(wd->box, item->base, item->order - 1, 0, item->sel, 1);
1122 elm_table_pack(wd->box, item->base, 0, item->order - 1, item->sel, 1);
1125 if (item->order > 0) order += item->sel;
1139 elm_table_pack(wd->box, it->base, it->order - 1, 0, it->sel, 1);
1141 elm_table_pack(wd->box, it->base, 0, it->order - 1, it->sel, 1);
1144 evas_object_hide(it->base);
1148 _list_clicked(void *data, Evas_Object *obj, void *event_info __UNUSED__)
1150 Elm_Controlbar_Item *item = (Elm_Controlbar_Item *)data;
1151 Elm_Controlbar_Item *it;
1154 Evas_Object *content;
1155 Elm_List_Item *lit = (Elm_List_Item *) elm_list_selected_item_get(obj);
1158 elm_list_item_selected_set(lit, 0);
1162 wd = elm_widget_data_get(item->obj);
1165 EINA_LIST_FOREACH(wd->items, l, it)
1167 it->selected = EINA_FALSE;
1170 if (item->style == TABBAR)
1172 content = elm_layout_content_unset(wd->view, "elm.swallow.view");
1173 evas_object_hide(content);
1174 item->selected = EINA_TRUE;
1175 evas_object_smart_callback_call(item->obj, "view,change,before", item);
1176 elm_layout_content_set(wd->view, "elm.swallow.view", item->view);
1179 if (item->style == TOOLBAR && item->func)
1180 item->func(item->data, item->obj, item);
1183 static Evas_Object *
1184 _create_more_view(Widget_Data *wd)
1187 Elm_Controlbar_Item *item;
1191 list = elm_list_add( wd->object );
1192 elm_list_mode_set( list, ELM_LIST_COMPRESS );
1194 EINA_LIST_FOREACH(wd->items, l, item)
1196 if (item->order <= 0)
1199 if (item->icon_path)
1201 icon = _create_item_icon(list, item, NULL);
1202 evas_object_color_set(icon, 0, 0, 0, 255);
1204 elm_list_item_append(list, item->text, icon, NULL, _list_clicked, item);
1208 elm_list_go( list );
1213 static void _ctxpopup_cb(void *data, Evas_Object *obj, void *event_info)
1215 Elm_Controlbar_Item *it;
1217 Evas_Object *ctxpopup = obj;
1218 Widget_Data *wd = (Widget_Data *)data;
1220 EINA_LIST_FOREACH(wd->items, l, it)
1221 if (!strcmp(it->text, elm_ctxpopup_item_label_get((Elm_Ctxpopup_Item *) event_info))) break;
1224 it->func(it->data, it->obj, it);
1226 if (_check_item(wd, it)) evas_object_smart_callback_call(it->obj, "clicked", it);
1228 evas_object_del(ctxpopup);
1232 static void _ctxpopup_dismissed_cb(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
1234 Evas_Object *ctxpopup = obj;
1236 evas_object_del(ctxpopup);
1241 _create_more_func(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
1243 Evas_Object *ctxpopup;
1244 Elm_Controlbar_Item *item;
1247 Evas_Coord x, y, w, h;
1248 Widget_Data *wd = elm_widget_data_get(obj);
1251 ctxpopup = elm_ctxpopup_add(wd->parent);
1252 evas_object_smart_callback_add( ctxpopup, "dismissed", _ctxpopup_dismissed_cb, wd);
1254 EINA_LIST_FOREACH(wd->items, l, item)
1256 if (item->order <= 0)
1259 if (item->icon_path)
1261 icon = _create_item_icon(ctxpopup, item, NULL);
1262 evas_object_color_set(icon, 0, 0, 0, 255);
1264 elm_ctxpopup_item_append(ctxpopup, item->text, icon, _ctxpopup_cb, wd);
1268 evas_object_geometry_get(wd->more_item->base, &x, &y, &w, &h);
1269 evas_object_move(ctxpopup, x + w/2, y + h/2);
1271 evas_object_show(ctxpopup);
1274 static Elm_Controlbar_Item *
1275 _create_more_item(Widget_Data *wd, int style)
1277 Elm_Controlbar_Item * it;
1279 it = ELM_NEW(Elm_Controlbar_Item);
1280 if (!it) return NULL;
1281 it->obj = wd->object;
1282 it->text = eina_stringshare_add("more");
1283 it->icon_path = eina_stringshare_add(CONTROLBAR_SYSTEM_ICON_MORE);
1284 it->selected = EINA_FALSE;
1286 it->view = _create_more_view(wd);
1287 it->func = _create_more_func;
1289 it->base = _create_item_layout(wd->edje, it, &(it->base_item), &(it->icon));
1290 evas_object_event_callback_add(it->base, EVAS_CALLBACK_MOUSE_DOWN,
1291 _bar_item_down_cb, wd);
1292 evas_object_show(it->base);
1294 _set_items_position(it->obj, it, NULL, EINA_TRUE);
1295 wd->items = eina_list_append(wd->items, it);
1297 wd->items = eina_list_sort(wd->items, eina_list_count(wd->items), _sort_cb);
1302 ///////////////////////////////////////////////////////////////////
1306 ////////////////////////////////////////////////////////////////////
1309 * Add a new controlbar object
1311 * @param parent The parent object
1312 * @return The new object or NULL if it cannot be created
1314 * @ingroup Controlbar
1316 EAPI Evas_Object * elm_controlbar_add(Evas_Object * parent)
1318 if (parent == NULL) return NULL;
1319 Evas_Object * obj = NULL;
1320 Evas_Object * bg = NULL;
1321 Widget_Data * wd = NULL;
1322 Evas_Coord x, y, w, h;
1323 wd = ELM_NEW(Widget_Data);
1324 Evas *evas = evas_object_evas_get(parent);
1325 if (evas == NULL) return NULL;
1326 obj = elm_widget_add(evas);
1327 if (obj == NULL) return NULL;
1328 ELM_SET_WIDTYPE(widtype, "controlbar");
1329 elm_widget_type_set(obj, "controlbar");
1330 elm_widget_sub_object_add(parent, obj);
1331 elm_widget_data_set(obj, wd);
1332 elm_widget_del_hook_set(obj, _del_hook);
1333 elm_widget_can_focus_set(obj, EINA_FALSE);
1334 elm_widget_theme_hook_set(obj, _theme_hook);
1335 elm_widget_disable_hook_set(obj, _disable_hook);
1338 wd->parent = parent;
1339 evas_object_geometry_get(parent, &x, &y, &w, &h);
1345 wd->mode = ELM_CONTROLBAR_MODE_DEFAULT;
1349 wd->vertical = EINA_FALSE;
1350 wd->auto_align = EINA_FALSE;
1351 wd->selected_animation = EINA_FALSE;
1352 wd->pressed_signal = eina_stringshare_add("elm,state,pressed");
1353 wd->selected_signal = eina_stringshare_add("elm,state,selected");
1354 wd->view = elm_layout_add(wd->parent);
1355 elm_layout_theme_set(wd->view, "controlbar", "view", "default");
1356 if (wd->view == NULL)
1358 printf("Cannot load bg edj\n");
1361 evas_object_show(wd->view);
1363 /* load background edj */
1364 wd->edje = elm_layout_add(obj);
1365 elm_layout_theme_set(wd->edje, "controlbar", "base", "default");
1366 if (wd->edje == NULL)
1368 printf("Cannot load base edj\n");
1371 evas_object_show(wd->edje);
1373 wd->bg = elm_layout_add(wd->edje);
1374 elm_layout_theme_set(wd->bg, "controlbar", "background", "default");
1377 printf("Cannot load bg edj\n");
1380 elm_layout_content_set(wd->edje, "bg_image", wd->bg);
1383 evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_RESIZE,
1384 _controlbar_object_resize, obj);
1385 evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_MOVE,
1386 _controlbar_object_move, obj);
1387 evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_SHOW,
1388 _controlbar_object_show, obj);
1389 evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_HIDE,
1390 _controlbar_object_hide, obj);
1392 bg = elm_layout_content_get(wd->edje, "bg_image");
1393 evas_object_event_callback_add(bg, EVAS_CALLBACK_MOVE, _controlbar_object_move, obj);
1394 evas_object_event_callback_add(bg, EVAS_CALLBACK_RESIZE, _controlbar_object_resize, obj);
1396 wd->selected_box = elm_layout_add(wd->bg);
1397 elm_layout_theme_set(wd->selected_box, "controlbar", "item_bg_move", "default");
1398 evas_object_hide(wd->selected_box);
1401 wd->box = elm_table_add(wd->edje);
1402 elm_table_homogenous_set(wd->box, EINA_TRUE);
1403 evas_object_size_hint_weight_set(wd->box, EVAS_HINT_EXPAND,
1405 evas_object_size_hint_align_set(wd->box, EVAS_HINT_FILL, EVAS_HINT_FILL);
1406 elm_layout_content_set(wd->edje, "elm.swallow.items", wd->box);
1407 evas_object_show(wd->box);
1409 evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj);
1411 elm_widget_resize_object_set(obj, wd->edje);
1419 * Append new tab item
1421 * @param obj The controlbar object
1422 * @param icon_path The icon path of item
1423 * @param label The label of item
1424 * @param view The view of item
1425 * @return The item of controlbar
1427 * @ingroup Controlbar
1429 EAPI Elm_Controlbar_Item * elm_controlbar_tab_item_append(Evas_Object * obj,
1436 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1437 Elm_Controlbar_Item * it;
1438 Elm_Controlbar_Item * lit;
1440 it = _create_tab_item(obj, icon_path, label, view);
1441 if (!it) return NULL;
1442 wd = elm_widget_data_get(obj);
1443 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1444 if (!wd->more_item) {
1445 lit = elm_controlbar_last_item_get(obj);
1446 _set_item_visible(lit, EINA_FALSE);
1447 _create_more_item(wd, TABBAR);
1449 _set_items_position(obj, it, NULL, EINA_FALSE);
1452 _set_items_position(obj, it, NULL, EINA_TRUE);
1454 wd->items = eina_list_append(wd->items, it);
1456 elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1458 _check_background(wd);
1464 * Prepend new tab item
1466 * @param obj The controlbar object
1467 * @param icon_path The icon path of item
1468 * @param label The label of item
1469 * @param view The view of item
1470 * @return The item of controlbar
1472 * @ingroup Controlbar
1474 EAPI Elm_Controlbar_Item * elm_controlbar_tab_item_prepend(Evas_Object *
1483 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1485 Elm_Controlbar_Item * it;
1486 Elm_Controlbar_Item * lit;
1487 Elm_Controlbar_Item * item;
1488 it = _create_tab_item(obj, icon_path, label, view);
1489 if (!it) return NULL;
1490 wd = elm_widget_data_get(obj);
1491 item = eina_list_data_get(wd->items);
1492 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1493 if (!wd->more_item) {
1494 lit = elm_controlbar_last_item_get(obj);
1495 _set_item_visible(lit, EINA_FALSE);
1496 _create_more_item(wd, TABBAR);
1498 lit = elm_controlbar_item_prev(wd->more_item);
1499 _set_item_visible(lit, EINA_FALSE);
1500 _set_items_position(obj, it, item, EINA_TRUE);
1503 _set_items_position(obj, it, item, EINA_TRUE);
1505 wd->items = eina_list_prepend(wd->items, it);
1507 elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1509 _check_background(wd);
1515 * Insert new tab item before given item
1517 * @param obj The controlbar object
1518 * @param before The given item
1519 * @param icon_path The icon path of item
1520 * @param label The label of item
1521 * @param view The view of item
1522 * @return The item of controlbar
1524 * @ingroup Controlbar
1526 EAPI Elm_Controlbar_Item *
1527 elm_controlbar_tab_item_insert_before(Evas_Object * obj,
1528 Elm_Controlbar_Item * before,
1529 const char *icon_path,
1530 const char *label, Evas_Object * view)
1532 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1534 Elm_Controlbar_Item * it;
1535 Elm_Controlbar_Item * lit;
1536 if (!before) return NULL;
1537 it = _create_tab_item(obj, icon_path, label, view);
1538 if (!it) return NULL;
1539 wd = elm_widget_data_get(obj);
1540 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1543 lit = elm_controlbar_last_item_get(obj);
1544 _set_item_visible(lit, EINA_FALSE);
1545 _create_more_item(wd, TABBAR);
1547 before = wd->more_item;
1548 if (before->order > 0)
1550 lit = elm_controlbar_item_prev(wd->more_item);
1551 _set_item_visible(lit, EINA_FALSE);
1552 _set_items_position(obj, it, before, EINA_TRUE);
1556 _set_items_position(obj, it, before, EINA_FALSE);
1560 _set_items_position(obj, it, before, EINA_TRUE);
1562 wd->items = eina_list_prepend_relative(wd->items, it, before);
1564 elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1566 _check_background(wd);
1572 * Insert new tab item after given item
1574 * @param obj The controlbar object
1575 * @param after The given item
1576 * @param icon_path The icon path of item
1577 * @param label The label of item
1578 * @param view The view of item
1579 * @return The item of controlbar
1581 * @ingroup Controlbar
1583 EAPI Elm_Controlbar_Item *
1584 elm_controlbar_tab_item_insert_after(Evas_Object * obj,
1585 Elm_Controlbar_Item * after,
1586 const char *icon_path, const char *label,
1589 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1591 Elm_Controlbar_Item * it;
1592 Elm_Controlbar_Item * lit;
1593 Elm_Controlbar_Item * item;
1594 if (!after) return NULL;
1595 it = _create_tab_item(obj, icon_path, label, view);
1596 if (!it) return NULL;
1597 wd = elm_widget_data_get(obj);
1598 item = elm_controlbar_item_next(after);
1599 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1602 lit = elm_controlbar_last_item_get(obj);
1603 _set_item_visible(lit, EINA_FALSE);
1604 _create_more_item(wd, TABBAR);
1606 lit = elm_controlbar_item_prev(wd->more_item);
1607 if (lit != after && item->order > 0)
1609 _set_item_visible(lit, EINA_FALSE);
1610 _set_items_position(obj, it, item, EINA_TRUE);
1614 _set_items_position(obj, it, NULL, EINA_FALSE);
1618 _set_items_position(obj, it, item, EINA_TRUE);
1620 wd->items = eina_list_append_relative(wd->items, it, after);
1622 elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1624 _check_background(wd);
1630 * Append new tool item
1632 * @param obj The controlbar object
1633 * @param icon_path The icon path of item
1634 * @param label The label of item
1635 * @param func Callback function of item
1636 * @param data The data of callback function
1637 * @return The item of controlbar
1639 * @ingroup Controlbar
1641 EAPI Elm_Controlbar_Item * elm_controlbar_tool_item_append(Evas_Object *
1656 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1657 Elm_Controlbar_Item * it;
1658 Elm_Controlbar_Item * lit;
1660 it = _create_tool_item(obj, icon_path, label, func, data);
1661 if (!it) return NULL;
1662 wd = elm_widget_data_get(obj);
1663 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1664 if (!wd->more_item) {
1665 lit = elm_controlbar_last_item_get(obj);
1666 _set_item_visible(lit, EINA_FALSE);
1667 _create_more_item(wd, TOOLBAR);
1669 _set_items_position(obj, it, NULL, EINA_FALSE);
1672 _set_items_position(obj, it, NULL, EINA_TRUE);
1674 wd->items = eina_list_append(wd->items, it);
1675 _check_toolbar_line(wd);
1681 * Prepend new tool item
1683 * @param obj The controlbar object
1684 * @param icon_path The icon path of item
1685 * @param label The label of item
1686 * @param func Callback function of item
1687 * @param data The data of callback function
1688 * @return The item of controlbar
1690 * @ingroup Controlbar
1692 EAPI Elm_Controlbar_Item * elm_controlbar_tool_item_prepend(Evas_Object *
1708 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1710 Elm_Controlbar_Item * it;
1711 Elm_Controlbar_Item * lit;
1712 Elm_Controlbar_Item * item;
1713 it = _create_tool_item(obj, icon_path, label, func, data);
1714 if (!it) return NULL;
1715 wd = elm_widget_data_get(obj);
1716 item = eina_list_data_get(wd->items);
1717 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1718 if (!wd->more_item) {
1719 lit = elm_controlbar_last_item_get(obj);
1720 _set_item_visible(lit, EINA_FALSE);
1721 _create_more_item(wd, TOOLBAR);
1723 lit = elm_controlbar_item_prev(wd->more_item);
1724 _set_item_visible(lit, EINA_FALSE);
1725 _set_items_position(obj, it, item, EINA_TRUE);
1728 _set_items_position(obj, it, item, EINA_TRUE);
1730 wd->items = eina_list_prepend(wd->items, it);
1731 _check_toolbar_line(wd);
1737 * Insert new tool item before given item
1739 * @param obj The controlbar object
1740 * @param before The given item
1741 * @param icon_path The icon path of item
1742 * @param label The label of item
1743 * @param func Callback function of item
1744 * @param data The data of callback function
1745 * @return The item of controlbar
1747 * @ingroup Controlbar
1749 EAPI Elm_Controlbar_Item *
1750 elm_controlbar_tool_item_insert_before(Evas_Object * obj,
1751 Elm_Controlbar_Item * before,
1752 const char *icon_path,
1754 void (*func) (void *data,
1759 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1761 Elm_Controlbar_Item * it;
1762 Elm_Controlbar_Item * lit;
1763 if (!before) return NULL;
1764 it = _create_tool_item(obj, icon_path, label, func, data);
1765 if (!it) return NULL;
1766 wd = elm_widget_data_get(obj);
1767 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1770 lit = elm_controlbar_last_item_get(obj);
1771 _set_item_visible(lit, EINA_FALSE);
1772 _create_more_item(wd, TOOLBAR);
1774 before = wd->more_item;
1775 if (before->order > 0)
1777 lit = elm_controlbar_item_prev(wd->more_item);
1778 _set_item_visible(lit, EINA_FALSE);
1779 _set_items_position(obj, it, before, EINA_TRUE);
1783 _set_items_position(obj, it, before, EINA_FALSE);
1787 _set_items_position(obj, it, before, EINA_TRUE);
1789 wd->items = eina_list_prepend_relative(wd->items, it, before);
1790 _check_toolbar_line(wd);
1796 * Insert new tool item after given item
1798 * @param obj The controlbar object
1799 * @param after The given item
1800 * @param icon_path The icon path of item
1801 * @param label The label of item
1802 * @param func Callback function of item
1803 * @param data The data of callback function
1804 * @return The item of controlbar
1806 * @ingroup Controlbar
1808 EAPI Elm_Controlbar_Item *
1809 elm_controlbar_tool_item_insert_after(Evas_Object * obj,
1810 Elm_Controlbar_Item * after,
1811 const char *icon_path,
1813 void (*func) (void *data,
1818 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1820 Elm_Controlbar_Item * it;
1821 Elm_Controlbar_Item * lit;
1822 Elm_Controlbar_Item * item;
1823 if (!after) return NULL;
1824 it = _create_tool_item(obj, icon_path, label, func, data);
1825 if (!it) return NULL;
1826 wd = elm_widget_data_get(obj);
1827 item = elm_controlbar_item_next(after);
1828 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1831 lit = elm_controlbar_last_item_get(obj);
1832 _set_item_visible(lit, EINA_FALSE);
1833 _create_more_item(wd, TOOLBAR);
1835 lit = elm_controlbar_item_prev(wd->more_item);
1836 if (lit != after && item->order > 0)
1838 _set_item_visible(lit, EINA_FALSE);
1839 _set_items_position(obj, it, item, EINA_TRUE);
1843 _set_items_position(obj, it, NULL, EINA_FALSE);
1847 _set_items_position(obj, it, item, EINA_TRUE);
1849 wd->items = eina_list_append_relative(wd->items, it, after);
1850 _check_toolbar_line(wd);
1856 * Append new object item
1858 * @param obj The controlbar object
1859 * @param obj_item The object of item
1860 * @param sel The number of sel occupied
1861 * @return The item of controlbar
1863 * @ingroup Controlbar
1865 EAPI Elm_Controlbar_Item * elm_controlbar_object_item_append(Evas_Object *
1871 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1873 Elm_Controlbar_Item * it;
1874 it = _create_object_item(obj, obj_item, sel);
1875 if (!it) return NULL;
1876 wd = elm_widget_data_get(obj);
1877 if (!wd) return NULL;
1878 _set_items_position(obj, it, NULL, EINA_TRUE);
1879 wd->items = eina_list_append(wd->items, it);
1885 * Prepend new object item
1887 * @param obj The controlbar object
1888 * @param obj_item The object of item
1889 * @param sel The number of sel occupied
1890 * @return The item of controlbar
1892 * @ingroup Controlbar
1894 EAPI Elm_Controlbar_Item * elm_controlbar_object_item_prepend(Evas_Object *
1900 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1902 Elm_Controlbar_Item * it;
1903 Elm_Controlbar_Item * item;
1904 it = _create_object_item(obj, obj_item, sel);
1905 if (!it) return NULL;
1906 wd = elm_widget_data_get(obj);
1907 if (!wd) return NULL;
1908 item = eina_list_data_get(wd->items);
1909 _set_items_position(obj, it, item, EINA_TRUE);
1910 wd->items = eina_list_prepend(wd->items, it);
1916 * Insert new object item before given item
1918 * @param obj The controlbar object
1919 * @param before The given item
1920 * @param obj_item The object of item
1921 * @param sel The number of sel occupied
1922 * @return The item of controlbar
1924 * @ingroup Controlbar
1926 EAPI Elm_Controlbar_Item *
1927 elm_controlbar_object_item_insert_before(Evas_Object * obj,
1928 Elm_Controlbar_Item * before,
1929 Evas_Object * obj_item, const int sel)
1931 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1933 Elm_Controlbar_Item * it;
1934 if (!before) return NULL;
1935 it = _create_object_item(obj, obj_item, sel);
1936 if (!it) return NULL;
1937 wd = elm_widget_data_get(obj);
1938 if (!wd) return NULL;
1939 _set_items_position(obj, it, before, EINA_TRUE);
1940 wd->items = eina_list_prepend_relative(wd->items, it, before);
1946 * Insert new object item after given item
1948 * @param obj The controlbar object
1949 * @param after The given item
1950 * @param obj_item The object of item
1951 * @param sel The number of sel occupied
1952 * @return The item of controlbar
1954 * @ingroup Controlbar
1956 EAPI Elm_Controlbar_Item *
1957 elm_controlbar_object_item_insert_after(Evas_Object * obj,
1958 Elm_Controlbar_Item * after,
1959 Evas_Object * obj_item, const int sel)
1961 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1963 Elm_Controlbar_Item * it;
1964 Elm_Controlbar_Item * item;
1965 if (!after) return NULL;
1966 it = _create_object_item(obj, obj_item, sel);
1967 if (!it) return NULL;
1968 wd = elm_widget_data_get(obj);
1969 if (!wd) return NULL;
1970 item = elm_controlbar_item_next(after);
1971 _set_items_position(obj, it, item, EINA_TRUE);
1972 wd->items = eina_list_append_relative(wd->items, it, after);
1978 * Get the object of the object item
1980 * @param it The item of controlbar
1981 * @return The object of the object item
1983 * @ingroup Controlbar
1986 elm_controlbar_object_item_object_get(const Elm_Controlbar_Item * it)
1988 if (!it) return NULL;
1989 if (it->style != OBJECT) return NULL;
1990 if (!it->base_item) return NULL;
1991 return it->base_item;
1995 * Delete item from controlbar
1997 * @param it The item of controlbar
1999 * @ingroup Controlbar
2002 elm_controlbar_item_del(Elm_Controlbar_Item * it)
2009 Elm_Controlbar_Item * item;
2019 if (it->obj == NULL)
2021 printf("Invalid argument: controlbar object is NULL\n");
2024 wd = elm_widget_data_get(it->obj);
2027 printf("Cannot get smart data\n");
2035 elm_table_unpack(wd->box, it->base);
2037 EINA_LIST_FOREACH(wd->items, l, item)
2041 if (item->order > it->order)
2044 elm_table_unpack(wd->box, item->base);
2047 elm_table_pack(wd->box, item->base, item->order - 1, 0, item->sel, 1);
2049 elm_table_pack(wd->box, item->base, 0, item->order - 1, item->sel, 1);
2057 // delete item in list
2059 wd->items = eina_list_remove(wd->items, it);
2062 wd->num = wd->num - 1;
2067 * Select item in controlbar
2069 * @param it The item of controlbar
2071 * @ingroup Controlbar
2074 elm_controlbar_item_select(Elm_Controlbar_Item * it)
2077 if (it->obj == NULL) return;
2078 Widget_Data * wd = elm_widget_data_get(it->obj);
2085 * Set the icon of item
2087 * @param it The item of controlbar
2088 * @param icon_path The icon path of the item
2089 * @return The icon object
2091 * @ingroup Controlbar
2094 elm_controlbar_item_icon_set(Elm_Controlbar_Item * it, const char *icon_path)
2097 if (it->style == OBJECT) return;
2100 eina_stringshare_del(it->icon_path);
2101 it->icon_path = NULL;
2105 evas_object_del(it->icon);
2108 if (icon_path != NULL)
2110 it->icon_path = eina_stringshare_add(icon_path);
2111 it->icon = _create_item_icon(it->base_item, it, "elm.swallow.icon");
2113 if (it->wd->disabled || it->disabled)
2114 elm_widget_disabled_set(it->base_item, EINA_TRUE);
2116 elm_widget_disabled_set(it->base_item, EINA_FALSE);
2120 * Get the icon of item
2122 * @param it The item of controlbar
2123 * @return The icon object
2125 * @ingroup Controlbar
2128 elm_controlbar_item_icon_get(const Elm_Controlbar_Item * it)
2130 if (!it) return NULL;
2135 * Set the label of item
2137 * @param it The item of controlbar
2138 * @param label The label of item
2140 * @ingroup Controlbar
2143 elm_controlbar_item_label_set(Elm_Controlbar_Item * it, const char *label)
2146 if (it->style == OBJECT) return;
2149 eina_stringshare_del(it->text);
2154 it->text = eina_stringshare_add(label);
2155 elm_button_label_set(it->base_item, it->text);
2157 if (it->wd->disabled || it->disabled)
2158 elm_widget_disabled_set(it->base_item, EINA_TRUE);
2160 elm_widget_disabled_set(it->base_item, EINA_FALSE);
2164 * Get the label of item
2166 * @param it The item of controlbar
2167 * @return The label of item
2169 * @ingroup Controlbar
2172 elm_controlbar_item_label_get(const Elm_Controlbar_Item * it)
2174 if (!it) return NULL;
2179 * Get the selected item
2181 * @param obj The controlbar object
2182 * @return The item of controlbar
2184 * @ingroup Controlbar
2186 EAPI Elm_Controlbar_Item * elm_controlbar_selected_item_get(const Evas_Object *
2189 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
2192 Elm_Controlbar_Item * item;
2193 if (obj == NULL) return NULL;
2194 Widget_Data * wd = elm_widget_data_get(obj);
2195 if (!wd || !wd->items) return NULL;
2196 EINA_LIST_FOREACH(wd->items, l, item)
2198 if (item->selected) return item;
2204 * Get the first item
2206 * @param obj The controlbar object
2207 * @return The item of controlbar
2209 * @ingroup Controlbar
2211 EAPI Elm_Controlbar_Item * elm_controlbar_first_item_get(const Evas_Object * obj)
2213 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
2214 Widget_Data * wd = elm_widget_data_get(obj);
2215 if (!wd || !wd->items) return NULL;
2216 return eina_list_data_get(wd->items);
2222 * @param obj The controlbar object
2223 * @return The item of controlbar
2225 * @ingroup Controlbar
2227 EAPI Elm_Controlbar_Item * elm_controlbar_last_item_get(const Evas_Object * obj)
2229 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
2230 Widget_Data * wd = elm_widget_data_get(obj);
2231 if (!wd || !wd->items) return NULL;
2232 return eina_list_data_get(eina_list_last(wd->items));
2238 * @param obj The controlbar object
2239 * @return The list of the items
2241 * @ingroup Controlbar
2243 EAPI const Eina_List * elm_controlbar_items_get(const Evas_Object * obj)
2245 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
2246 Widget_Data * wd = elm_widget_data_get(obj);
2247 if (!wd || !wd->items) return NULL;
2252 * Get the previous item
2254 * @param it The item of controlbar
2255 * @return The previous item of the parameter item
2257 * @ingroup Controlbar
2259 EAPI Elm_Controlbar_Item * elm_controlbar_item_prev(Elm_Controlbar_Item *
2262 if (!it) return NULL;
2265 Elm_Controlbar_Item * item;
2266 if (it->obj == NULL) return NULL;
2267 Widget_Data * wd = elm_widget_data_get(it->obj);
2268 if (!wd || !wd->items) return NULL;
2269 EINA_LIST_FOREACH(wd->items, l, item)
2273 l = eina_list_prev(l);
2274 if (!l) return NULL;
2275 return eina_list_data_get(l);
2284 * @param obj The controlbar object
2285 * @return The next item of the parameter item
2287 * @ingroup Controlbar
2289 EAPI Elm_Controlbar_Item * elm_controlbar_item_next(Elm_Controlbar_Item *
2292 if (!it) return NULL;
2295 Elm_Controlbar_Item * item;
2296 if (it->obj == NULL) return NULL;
2297 Widget_Data * wd = elm_widget_data_get(it->obj);
2298 if (!wd || !wd->items) return NULL;
2299 EINA_LIST_FOREACH(wd->items, l, item)
2303 l = eina_list_next(l);
2304 if (!l) return NULL;
2305 return eina_list_data_get(l);
2312 * Set the visible status of item in bar
2314 * @param it The item of controlbar
2315 * @param bar EINA_TRUE or EINA_FALSE
2317 * @ingroup Controlbar
2320 elm_controlbar_item_visible_set(Elm_Controlbar_Item * it, Eina_Bool visible)
2323 if (it->obj == NULL) return;
2324 Widget_Data * wd = elm_widget_data_get(it->obj);
2327 if (!wd->auto_align)
2328 _set_item_visible(it, visible);
2332 * Get the result which or not item is visible in bar
2334 * @param it The item of controlbar
2335 * @return EINA_TRUE or EINA_FALSE
2337 * @ingroup Controlbar
2340 elm_controlbar_item_visible_get(const Elm_Controlbar_Item * it)
2342 if (!it) return EINA_FALSE;
2343 if (it->obj == NULL) return EINA_FALSE;
2344 Widget_Data * wd = elm_widget_data_get(it->obj);
2345 if (!wd) return EINA_FALSE;
2346 if (it->order <= 0) return EINA_FALSE;
2354 * @param it The item of controlbar
2355 * @param bar EINA_TRUE or EINA_FALSE
2357 * @ingroup Controlbar
2360 elm_controlbar_item_disabled_set(Elm_Controlbar_Item * it, Eina_Bool disabled)
2364 if (it->disabled == disabled) return;
2366 it->disabled = disabled;
2368 if (it->wd && it->wd->disabled) return;
2370 if (it->base_item) elm_widget_disabled_set(it->base_item, disabled);
2376 * @param it The item of controlbar
2377 * @return EINA_TRUE or EINA_FALSE
2379 * @ingroup Controlbar
2382 elm_controlbar_item_disabled_get(const Elm_Controlbar_Item * it)
2384 if (!it) return EINA_FALSE;
2386 return it->disabled;
2390 * Set the view of the item
2392 * @param it The item of controlbar
2393 * @param view The view for the item
2395 * @ingroup Controlbar
2398 elm_controlbar_item_view_set(Elm_Controlbar_Item *it, Evas_Object * view)
2401 if (it->view == view) return;
2403 evas_object_del(it->view);
2408 * Get the view of the item
2410 * @param it The item of controlbar
2411 * @return The view for the item
2413 * @ingroup Controlbar
2416 elm_controlbar_item_view_get(const Elm_Controlbar_Item *it)
2418 if (!it) return NULL;
2424 * Unset the view of the item
2426 * @param it The item of controlbar
2427 * @return The view for the item
2429 * @ingroup Controlbar
2432 elm_controlbar_item_view_unset(Elm_Controlbar_Item *it)
2434 if (!it) return NULL;
2435 if (it->obj == NULL) return NULL;
2436 Widget_Data * wd = elm_widget_data_get(it->obj);
2437 if (!wd) return NULL;
2438 Evas_Object *content;
2440 if (it->view == elm_layout_content_get(wd->view, "elm.swallow.view"))
2442 content = elm_layout_content_unset(wd->view, "elm.swallow.view");
2443 if (content) evas_object_hide(content);
2454 * Set the mode of the controlbar
2456 * @param obj The object of the controlbar
2457 * @param mode The mode of the controlbar
2459 * @ingroup Controlbar
2462 elm_controlbar_mode_set(Evas_Object *obj, int mode)
2464 ELM_CHECK_WIDTYPE(obj, widtype);
2465 Widget_Data *wd = elm_widget_data_get(obj);
2468 fprintf(stderr, "Cannot get smart data\n");
2472 if (wd->mode == mode) return;
2478 case ELM_CONTROLBAR_MODE_DEFAULT:
2479 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,default", "elm");
2481 case ELM_CONTROLBAR_MODE_TRANSLUCENCE:
2482 elm_controlbar_alpha_set(obj, 85);
2484 case ELM_CONTROLBAR_MODE_TRANSPARENCY:
2485 elm_controlbar_alpha_set(obj, 0);
2487 case ELM_CONTROLBAR_MODE_LARGE:
2488 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,large", "elm");
2490 case ELM_CONTROLBAR_MODE_SMALL:
2491 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,small", "elm");
2493 case ELM_CONTROLBAR_MODE_LEFT:
2494 edje_object_signal_emit(_EDJ(wd->selected_box), "elm,state,left", "elm");
2495 wd->selected_signal = eina_stringshare_add("elm,state,selected_left");
2496 wd->pressed_signal = eina_stringshare_add("elm,state,pressed_left");
2497 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,left", "elm");
2498 _check_background(wd);
2501 case ELM_CONTROLBAR_MODE_RIGHT:
2502 edje_object_signal_emit(_EDJ(wd->selected_box), "elm,state,right", "elm");
2503 wd->selected_signal = eina_stringshare_add("elm,state,selected_right");
2504 wd->pressed_signal = eina_stringshare_add("elm,state,pressed_right");
2505 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,right", "elm");
2506 _check_background(wd);
2513 edje_object_signal_emit(_EDJ(wd->selected_box), "elm,state,default", "elm");
2514 wd->selected_signal = eina_stringshare_add("elm,state,selected");
2515 wd->pressed_signal = eina_stringshare_add("elm,state,pressed");
2516 _check_background(wd);
2521 * Set the alpha of the controlbar
2523 * @param obj The object of the controlbar
2524 * @param alpha The alpha value of the controlbar (0-100)
2526 * @ingroup Controlbar
2529 elm_controlbar_alpha_set(Evas_Object *obj, int alpha)
2531 ELM_CHECK_WIDTYPE(obj, widtype);
2533 Widget_Data *wd = elm_widget_data_get(obj);
2536 fprintf(stderr, "Cannot get smart data\n");
2540 if (alpha < 0) wd->alpha = 0;
2541 else if (alpha > 100) wd->alpha = 100;
2542 else wd->alpha = alpha;
2544 evas_object_color_get(wd->bg, &r, &g, &b, NULL);
2545 evas_object_color_set(wd->bg, r, g, b, (int)(255 * wd->alpha / 100));
2550 * Set auto-align mode of the controlbar(It's not prepared yet)
2551 * If you set the auto-align and add items more than 5,
2552 * the "more" item will be made and the items more than 5 will be unvisible.
2554 * @param obj The object of the controlbar
2555 * @param auto_align The dicision that the controlbar use the auto-align
2557 * @ingroup Controlbar
2560 elm_controlbar_item_auto_align_set(Evas_Object *obj, Eina_Bool auto_align)
2562 ELM_CHECK_WIDTYPE(obj, widtype);
2563 Widget_Data *wd = elm_widget_data_get(obj);
2564 Elm_Controlbar_Item *item;
2569 fprintf(stderr, "Cannot get smart data\n");
2573 if (wd->auto_align == auto_align) return;
2577 if (_check_bar_item_number(wd) >= 5 && !wd->more_item)
2580 EINA_LIST_FOREACH(wd->items, l, item)
2582 if (elm_controlbar_item_visible_get(item))
2585 _delete_item_in_bar(item);
2588 item = elm_controlbar_last_item_get(obj);
2589 while (!elm_controlbar_item_visible_get(item)){
2590 item = elm_controlbar_item_prev(item);
2592 _create_more_item(wd, item->style);
2600 if (wd->more_item->view)
2601 evas_object_del(wd->more_item->view);
2602 wd->items = eina_list_remove(wd->items, wd->more_item);
2603 eina_stringshare_del(wd->more_item->text);
2604 if (wd->more_item->icon)
2605 evas_object_del(wd->more_item->icon);
2606 if (wd->more_item->base)
2607 evas_object_del(wd->more_item->base);
2608 if (wd->more_item->base_item)
2609 evas_object_del(wd->more_item->base_item);
2610 free(wd->more_item);
2611 wd->more_item = NULL;
2613 // make all item is visible
2615 EINA_LIST_FOREACH(wd->items, l, item)
2617 if (!elm_controlbar_item_visible_get(item))
2618 _insert_item_in_bar(item, i);
2623 wd->auto_align = auto_align;
2628 * Set the vertical mode of the controlbar
2630 * @param obj The object of the controlbar
2631 * @param vertical The vertical mode of the controlbar (TRUE = vertical, FALSE = horizontal)
2633 * @ingroup Controlbar
2636 elm_controlbar_vertical_set(Evas_Object *obj, Eina_Bool vertical)
2638 ELM_CHECK_WIDTYPE(obj, widtype);
2639 Widget_Data *wd = elm_widget_data_get(obj);
2642 fprintf(stderr, "Cannot get smart data\n");
2646 if (wd->vertical == vertical) return;
2647 wd->vertical = vertical;
2649 if (_check_bar_item_number(wd) > 1)
2653 _check_toolbar_line(wd);
2657 * Get the button object of the item
2659 * @param it The item of controlbar
2660 * @return button object of the item
2662 * @ingroup Controlbar
2665 elm_controlbar_item_button_get(const Elm_Controlbar_Item *it)
2667 if (!it) return NULL;
2668 if (it->style == OBJECT) return NULL;
2670 if (it->base_item) return it->base_item;