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 evas_object_smart_member_add(wd->view, obj);
1412 elm_widget_resize_object_set(obj, wd->edje);
1420 * Append new tab item
1422 * @param obj The controlbar object
1423 * @param icon_path The icon path of item
1424 * @param label The label of item
1425 * @param view The view of item
1426 * @return The item of controlbar
1428 * @ingroup Controlbar
1430 EAPI Elm_Controlbar_Item * elm_controlbar_tab_item_append(Evas_Object * obj,
1437 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1438 Elm_Controlbar_Item * it;
1439 Elm_Controlbar_Item * lit;
1441 it = _create_tab_item(obj, icon_path, label, view);
1442 if (!it) return NULL;
1443 wd = elm_widget_data_get(obj);
1444 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1445 if (!wd->more_item) {
1446 lit = elm_controlbar_last_item_get(obj);
1447 _set_item_visible(lit, EINA_FALSE);
1448 _create_more_item(wd, TABBAR);
1450 _set_items_position(obj, it, NULL, EINA_FALSE);
1453 _set_items_position(obj, it, NULL, EINA_TRUE);
1455 wd->items = eina_list_append(wd->items, it);
1457 elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1459 _check_background(wd);
1465 * Prepend new tab item
1467 * @param obj The controlbar object
1468 * @param icon_path The icon path of item
1469 * @param label The label of item
1470 * @param view The view of item
1471 * @return The item of controlbar
1473 * @ingroup Controlbar
1475 EAPI Elm_Controlbar_Item * elm_controlbar_tab_item_prepend(Evas_Object *
1484 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1486 Elm_Controlbar_Item * it;
1487 Elm_Controlbar_Item * lit;
1488 Elm_Controlbar_Item * item;
1489 it = _create_tab_item(obj, icon_path, label, view);
1490 if (!it) return NULL;
1491 wd = elm_widget_data_get(obj);
1492 item = eina_list_data_get(wd->items);
1493 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1494 if (!wd->more_item) {
1495 lit = elm_controlbar_last_item_get(obj);
1496 _set_item_visible(lit, EINA_FALSE);
1497 _create_more_item(wd, TABBAR);
1499 lit = elm_controlbar_item_prev(wd->more_item);
1500 _set_item_visible(lit, EINA_FALSE);
1501 _set_items_position(obj, it, item, EINA_TRUE);
1504 _set_items_position(obj, it, item, EINA_TRUE);
1506 wd->items = eina_list_prepend(wd->items, it);
1508 elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1510 _check_background(wd);
1516 * Insert new tab item before given item
1518 * @param obj The controlbar object
1519 * @param before The given item
1520 * @param icon_path The icon path of item
1521 * @param label The label of item
1522 * @param view The view of item
1523 * @return The item of controlbar
1525 * @ingroup Controlbar
1527 EAPI Elm_Controlbar_Item *
1528 elm_controlbar_tab_item_insert_before(Evas_Object * obj,
1529 Elm_Controlbar_Item * before,
1530 const char *icon_path,
1531 const char *label, Evas_Object * view)
1533 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1535 Elm_Controlbar_Item * it;
1536 Elm_Controlbar_Item * lit;
1537 if (!before) return NULL;
1538 it = _create_tab_item(obj, icon_path, label, view);
1539 if (!it) return NULL;
1540 wd = elm_widget_data_get(obj);
1541 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1544 lit = elm_controlbar_last_item_get(obj);
1545 _set_item_visible(lit, EINA_FALSE);
1546 _create_more_item(wd, TABBAR);
1548 before = wd->more_item;
1549 if (before->order > 0)
1551 lit = elm_controlbar_item_prev(wd->more_item);
1552 _set_item_visible(lit, EINA_FALSE);
1553 _set_items_position(obj, it, before, EINA_TRUE);
1557 _set_items_position(obj, it, before, EINA_FALSE);
1561 _set_items_position(obj, it, before, EINA_TRUE);
1563 wd->items = eina_list_prepend_relative(wd->items, it, before);
1565 elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1567 _check_background(wd);
1573 * Insert new tab item after given item
1575 * @param obj The controlbar object
1576 * @param after The given item
1577 * @param icon_path The icon path of item
1578 * @param label The label of item
1579 * @param view The view of item
1580 * @return The item of controlbar
1582 * @ingroup Controlbar
1584 EAPI Elm_Controlbar_Item *
1585 elm_controlbar_tab_item_insert_after(Evas_Object * obj,
1586 Elm_Controlbar_Item * after,
1587 const char *icon_path, const char *label,
1590 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1592 Elm_Controlbar_Item * it;
1593 Elm_Controlbar_Item * lit;
1594 Elm_Controlbar_Item * item;
1595 if (!after) return NULL;
1596 it = _create_tab_item(obj, icon_path, label, view);
1597 if (!it) return NULL;
1598 wd = elm_widget_data_get(obj);
1599 item = elm_controlbar_item_next(after);
1600 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1603 lit = elm_controlbar_last_item_get(obj);
1604 _set_item_visible(lit, EINA_FALSE);
1605 _create_more_item(wd, TABBAR);
1607 lit = elm_controlbar_item_prev(wd->more_item);
1608 if (lit != after && item->order > 0)
1610 _set_item_visible(lit, EINA_FALSE);
1611 _set_items_position(obj, it, item, EINA_TRUE);
1615 _set_items_position(obj, it, NULL, EINA_FALSE);
1619 _set_items_position(obj, it, item, EINA_TRUE);
1621 wd->items = eina_list_append_relative(wd->items, it, after);
1623 elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1625 _check_background(wd);
1631 * Append new tool item
1633 * @param obj The controlbar object
1634 * @param icon_path The icon path of item
1635 * @param label The label of item
1636 * @param func Callback function of item
1637 * @param data The data of callback function
1638 * @return The item of controlbar
1640 * @ingroup Controlbar
1642 EAPI Elm_Controlbar_Item * elm_controlbar_tool_item_append(Evas_Object *
1657 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1658 Elm_Controlbar_Item * it;
1659 Elm_Controlbar_Item * lit;
1661 it = _create_tool_item(obj, icon_path, label, func, data);
1662 if (!it) return NULL;
1663 wd = elm_widget_data_get(obj);
1664 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1665 if (!wd->more_item) {
1666 lit = elm_controlbar_last_item_get(obj);
1667 _set_item_visible(lit, EINA_FALSE);
1668 _create_more_item(wd, TOOLBAR);
1670 _set_items_position(obj, it, NULL, EINA_FALSE);
1673 _set_items_position(obj, it, NULL, EINA_TRUE);
1675 wd->items = eina_list_append(wd->items, it);
1676 _check_toolbar_line(wd);
1682 * Prepend new tool item
1684 * @param obj The controlbar object
1685 * @param icon_path The icon path of item
1686 * @param label The label of item
1687 * @param func Callback function of item
1688 * @param data The data of callback function
1689 * @return The item of controlbar
1691 * @ingroup Controlbar
1693 EAPI Elm_Controlbar_Item * elm_controlbar_tool_item_prepend(Evas_Object *
1709 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1711 Elm_Controlbar_Item * it;
1712 Elm_Controlbar_Item * lit;
1713 Elm_Controlbar_Item * item;
1714 it = _create_tool_item(obj, icon_path, label, func, data);
1715 if (!it) return NULL;
1716 wd = elm_widget_data_get(obj);
1717 item = eina_list_data_get(wd->items);
1718 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1719 if (!wd->more_item) {
1720 lit = elm_controlbar_last_item_get(obj);
1721 _set_item_visible(lit, EINA_FALSE);
1722 _create_more_item(wd, TOOLBAR);
1724 lit = elm_controlbar_item_prev(wd->more_item);
1725 _set_item_visible(lit, EINA_FALSE);
1726 _set_items_position(obj, it, item, EINA_TRUE);
1729 _set_items_position(obj, it, item, EINA_TRUE);
1731 wd->items = eina_list_prepend(wd->items, it);
1732 _check_toolbar_line(wd);
1738 * Insert new tool item before given item
1740 * @param obj The controlbar object
1741 * @param before The given item
1742 * @param icon_path The icon path of item
1743 * @param label The label of item
1744 * @param func Callback function of item
1745 * @param data The data of callback function
1746 * @return The item of controlbar
1748 * @ingroup Controlbar
1750 EAPI Elm_Controlbar_Item *
1751 elm_controlbar_tool_item_insert_before(Evas_Object * obj,
1752 Elm_Controlbar_Item * before,
1753 const char *icon_path,
1755 void (*func) (void *data,
1760 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1762 Elm_Controlbar_Item * it;
1763 Elm_Controlbar_Item * lit;
1764 if (!before) return NULL;
1765 it = _create_tool_item(obj, icon_path, label, func, data);
1766 if (!it) return NULL;
1767 wd = elm_widget_data_get(obj);
1768 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1771 lit = elm_controlbar_last_item_get(obj);
1772 _set_item_visible(lit, EINA_FALSE);
1773 _create_more_item(wd, TOOLBAR);
1775 before = wd->more_item;
1776 if (before->order > 0)
1778 lit = elm_controlbar_item_prev(wd->more_item);
1779 _set_item_visible(lit, EINA_FALSE);
1780 _set_items_position(obj, it, before, EINA_TRUE);
1784 _set_items_position(obj, it, before, EINA_FALSE);
1788 _set_items_position(obj, it, before, EINA_TRUE);
1790 wd->items = eina_list_prepend_relative(wd->items, it, before);
1791 _check_toolbar_line(wd);
1797 * Insert new tool item after given item
1799 * @param obj The controlbar object
1800 * @param after The given item
1801 * @param icon_path The icon path of item
1802 * @param label The label of item
1803 * @param func Callback function of item
1804 * @param data The data of callback function
1805 * @return The item of controlbar
1807 * @ingroup Controlbar
1809 EAPI Elm_Controlbar_Item *
1810 elm_controlbar_tool_item_insert_after(Evas_Object * obj,
1811 Elm_Controlbar_Item * after,
1812 const char *icon_path,
1814 void (*func) (void *data,
1819 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1821 Elm_Controlbar_Item * it;
1822 Elm_Controlbar_Item * lit;
1823 Elm_Controlbar_Item * item;
1824 if (!after) return NULL;
1825 it = _create_tool_item(obj, icon_path, label, func, data);
1826 if (!it) return NULL;
1827 wd = elm_widget_data_get(obj);
1828 item = elm_controlbar_item_next(after);
1829 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1832 lit = elm_controlbar_last_item_get(obj);
1833 _set_item_visible(lit, EINA_FALSE);
1834 _create_more_item(wd, TOOLBAR);
1836 lit = elm_controlbar_item_prev(wd->more_item);
1837 if (lit != after && item->order > 0)
1839 _set_item_visible(lit, EINA_FALSE);
1840 _set_items_position(obj, it, item, EINA_TRUE);
1844 _set_items_position(obj, it, NULL, EINA_FALSE);
1848 _set_items_position(obj, it, item, EINA_TRUE);
1850 wd->items = eina_list_append_relative(wd->items, it, after);
1851 _check_toolbar_line(wd);
1857 * Append new object item
1859 * @param obj The controlbar object
1860 * @param obj_item The object of item
1861 * @param sel The number of sel occupied
1862 * @return The item of controlbar
1864 * @ingroup Controlbar
1866 EAPI Elm_Controlbar_Item * elm_controlbar_object_item_append(Evas_Object *
1872 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1874 Elm_Controlbar_Item * it;
1875 it = _create_object_item(obj, obj_item, sel);
1876 if (!it) return NULL;
1877 wd = elm_widget_data_get(obj);
1878 if (!wd) return NULL;
1879 _set_items_position(obj, it, NULL, EINA_TRUE);
1880 wd->items = eina_list_append(wd->items, it);
1886 * Prepend new object item
1888 * @param obj The controlbar object
1889 * @param obj_item The object of item
1890 * @param sel The number of sel occupied
1891 * @return The item of controlbar
1893 * @ingroup Controlbar
1895 EAPI Elm_Controlbar_Item * elm_controlbar_object_item_prepend(Evas_Object *
1901 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1903 Elm_Controlbar_Item * it;
1904 Elm_Controlbar_Item * item;
1905 it = _create_object_item(obj, obj_item, sel);
1906 if (!it) return NULL;
1907 wd = elm_widget_data_get(obj);
1908 if (!wd) return NULL;
1909 item = eina_list_data_get(wd->items);
1910 _set_items_position(obj, it, item, EINA_TRUE);
1911 wd->items = eina_list_prepend(wd->items, it);
1917 * Insert new object item before given item
1919 * @param obj The controlbar object
1920 * @param before The given item
1921 * @param obj_item The object of item
1922 * @param sel The number of sel occupied
1923 * @return The item of controlbar
1925 * @ingroup Controlbar
1927 EAPI Elm_Controlbar_Item *
1928 elm_controlbar_object_item_insert_before(Evas_Object * obj,
1929 Elm_Controlbar_Item * before,
1930 Evas_Object * obj_item, const int sel)
1932 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1934 Elm_Controlbar_Item * it;
1935 if (!before) return NULL;
1936 it = _create_object_item(obj, obj_item, sel);
1937 if (!it) return NULL;
1938 wd = elm_widget_data_get(obj);
1939 if (!wd) return NULL;
1940 _set_items_position(obj, it, before, EINA_TRUE);
1941 wd->items = eina_list_prepend_relative(wd->items, it, before);
1947 * Insert new object item after given item
1949 * @param obj The controlbar object
1950 * @param after The given item
1951 * @param obj_item The object of item
1952 * @param sel The number of sel occupied
1953 * @return The item of controlbar
1955 * @ingroup Controlbar
1957 EAPI Elm_Controlbar_Item *
1958 elm_controlbar_object_item_insert_after(Evas_Object * obj,
1959 Elm_Controlbar_Item * after,
1960 Evas_Object * obj_item, const int sel)
1962 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1964 Elm_Controlbar_Item * it;
1965 Elm_Controlbar_Item * item;
1966 if (!after) return NULL;
1967 it = _create_object_item(obj, obj_item, sel);
1968 if (!it) return NULL;
1969 wd = elm_widget_data_get(obj);
1970 if (!wd) return NULL;
1971 item = elm_controlbar_item_next(after);
1972 _set_items_position(obj, it, item, EINA_TRUE);
1973 wd->items = eina_list_append_relative(wd->items, it, after);
1979 * Get the object of the object item
1981 * @param it The item of controlbar
1982 * @return The object of the object item
1984 * @ingroup Controlbar
1987 elm_controlbar_object_item_object_get(const Elm_Controlbar_Item * it)
1989 if (!it) return NULL;
1990 if (it->style != OBJECT) return NULL;
1991 if (!it->base_item) return NULL;
1992 return it->base_item;
1996 * Delete item from controlbar
1998 * @param it The item of controlbar
2000 * @ingroup Controlbar
2003 elm_controlbar_item_del(Elm_Controlbar_Item * it)
2010 Elm_Controlbar_Item * item;
2020 if (it->obj == NULL)
2022 printf("Invalid argument: controlbar object is NULL\n");
2025 wd = elm_widget_data_get(it->obj);
2028 printf("Cannot get smart data\n");
2036 elm_table_unpack(wd->box, it->base);
2038 EINA_LIST_FOREACH(wd->items, l, item)
2042 if (item->order > it->order)
2045 elm_table_unpack(wd->box, item->base);
2048 elm_table_pack(wd->box, item->base, item->order - 1, 0, item->sel, 1);
2050 elm_table_pack(wd->box, item->base, 0, item->order - 1, item->sel, 1);
2058 // delete item in list
2060 wd->items = eina_list_remove(wd->items, it);
2063 wd->num = wd->num - 1;
2068 * Select item in controlbar
2070 * @param it The item of controlbar
2072 * @ingroup Controlbar
2075 elm_controlbar_item_select(Elm_Controlbar_Item * it)
2078 if (it->obj == NULL) return;
2079 Widget_Data * wd = elm_widget_data_get(it->obj);
2086 * Set the icon of item
2088 * @param it The item of controlbar
2089 * @param icon_path The icon path of the item
2090 * @return The icon object
2092 * @ingroup Controlbar
2095 elm_controlbar_item_icon_set(Elm_Controlbar_Item * it, const char *icon_path)
2098 if (it->style == OBJECT) return;
2101 eina_stringshare_del(it->icon_path);
2102 it->icon_path = NULL;
2106 evas_object_del(it->icon);
2109 if (icon_path != NULL)
2111 it->icon_path = eina_stringshare_add(icon_path);
2112 it->icon = _create_item_icon(it->base_item, it, "elm.swallow.icon");
2114 if (it->wd->disabled || it->disabled)
2115 elm_widget_disabled_set(it->base_item, EINA_TRUE);
2117 elm_widget_disabled_set(it->base_item, EINA_FALSE);
2121 * Get the icon of item
2123 * @param it The item of controlbar
2124 * @return The icon object
2126 * @ingroup Controlbar
2129 elm_controlbar_item_icon_get(const Elm_Controlbar_Item * it)
2131 if (!it) return NULL;
2136 * Set the label of item
2138 * @param it The item of controlbar
2139 * @param label The label of item
2141 * @ingroup Controlbar
2144 elm_controlbar_item_label_set(Elm_Controlbar_Item * it, const char *label)
2147 if (it->style == OBJECT) return;
2150 eina_stringshare_del(it->text);
2155 it->text = eina_stringshare_add(label);
2156 elm_button_label_set(it->base_item, it->text);
2158 if (it->wd->disabled || it->disabled)
2159 elm_widget_disabled_set(it->base_item, EINA_TRUE);
2161 elm_widget_disabled_set(it->base_item, EINA_FALSE);
2165 * Get the label of item
2167 * @param it The item of controlbar
2168 * @return The label of item
2170 * @ingroup Controlbar
2173 elm_controlbar_item_label_get(const Elm_Controlbar_Item * it)
2175 if (!it) return NULL;
2180 * Get the selected item
2182 * @param obj The controlbar object
2183 * @return The item of controlbar
2185 * @ingroup Controlbar
2187 EAPI Elm_Controlbar_Item * elm_controlbar_selected_item_get(const Evas_Object *
2190 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
2193 Elm_Controlbar_Item * item;
2194 if (obj == NULL) return NULL;
2195 Widget_Data * wd = elm_widget_data_get(obj);
2196 if (!wd || !wd->items) return NULL;
2197 EINA_LIST_FOREACH(wd->items, l, item)
2199 if (item->selected) return item;
2205 * Get the first item
2207 * @param obj The controlbar object
2208 * @return The item of controlbar
2210 * @ingroup Controlbar
2212 EAPI Elm_Controlbar_Item * elm_controlbar_first_item_get(const Evas_Object * obj)
2214 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
2215 Widget_Data * wd = elm_widget_data_get(obj);
2216 if (!wd || !wd->items) return NULL;
2217 return eina_list_data_get(wd->items);
2223 * @param obj The controlbar object
2224 * @return The item of controlbar
2226 * @ingroup Controlbar
2228 EAPI Elm_Controlbar_Item * elm_controlbar_last_item_get(const Evas_Object * obj)
2230 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
2231 Widget_Data * wd = elm_widget_data_get(obj);
2232 if (!wd || !wd->items) return NULL;
2233 return eina_list_data_get(eina_list_last(wd->items));
2239 * @param obj The controlbar object
2240 * @return The list of the items
2242 * @ingroup Controlbar
2244 EAPI const Eina_List * elm_controlbar_items_get(const Evas_Object * obj)
2246 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
2247 Widget_Data * wd = elm_widget_data_get(obj);
2248 if (!wd || !wd->items) return NULL;
2253 * Get the previous item
2255 * @param it The item of controlbar
2256 * @return The previous item of the parameter item
2258 * @ingroup Controlbar
2260 EAPI Elm_Controlbar_Item * elm_controlbar_item_prev(Elm_Controlbar_Item *
2263 if (!it) return NULL;
2266 Elm_Controlbar_Item * item;
2267 if (it->obj == NULL) return NULL;
2268 Widget_Data * wd = elm_widget_data_get(it->obj);
2269 if (!wd || !wd->items) return NULL;
2270 EINA_LIST_FOREACH(wd->items, l, item)
2274 l = eina_list_prev(l);
2275 if (!l) return NULL;
2276 return eina_list_data_get(l);
2285 * @param obj The controlbar object
2286 * @return The next item of the parameter item
2288 * @ingroup Controlbar
2290 EAPI Elm_Controlbar_Item * elm_controlbar_item_next(Elm_Controlbar_Item *
2293 if (!it) return NULL;
2296 Elm_Controlbar_Item * item;
2297 if (it->obj == NULL) return NULL;
2298 Widget_Data * wd = elm_widget_data_get(it->obj);
2299 if (!wd || !wd->items) return NULL;
2300 EINA_LIST_FOREACH(wd->items, l, item)
2304 l = eina_list_next(l);
2305 if (!l) return NULL;
2306 return eina_list_data_get(l);
2313 * Set the visible status of item in bar
2315 * @param it The item of controlbar
2316 * @param bar EINA_TRUE or EINA_FALSE
2318 * @ingroup Controlbar
2321 elm_controlbar_item_visible_set(Elm_Controlbar_Item * it, Eina_Bool visible)
2324 if (it->obj == NULL) return;
2325 Widget_Data * wd = elm_widget_data_get(it->obj);
2328 if (!wd->auto_align)
2329 _set_item_visible(it, visible);
2333 * Get the result which or not item is visible in bar
2335 * @param it The item of controlbar
2336 * @return EINA_TRUE or EINA_FALSE
2338 * @ingroup Controlbar
2341 elm_controlbar_item_visible_get(const Elm_Controlbar_Item * it)
2343 if (!it) return EINA_FALSE;
2344 if (it->obj == NULL) return EINA_FALSE;
2345 Widget_Data * wd = elm_widget_data_get(it->obj);
2346 if (!wd) return EINA_FALSE;
2347 if (it->order <= 0) return EINA_FALSE;
2355 * @param it The item of controlbar
2356 * @param bar EINA_TRUE or EINA_FALSE
2358 * @ingroup Controlbar
2361 elm_controlbar_item_disabled_set(Elm_Controlbar_Item * it, Eina_Bool disabled)
2365 if (it->disabled == disabled) return;
2367 it->disabled = disabled;
2369 if (it->wd && it->wd->disabled) return;
2371 if (it->base_item) elm_widget_disabled_set(it->base_item, disabled);
2377 * @param it The item of controlbar
2378 * @return EINA_TRUE or EINA_FALSE
2380 * @ingroup Controlbar
2383 elm_controlbar_item_disabled_get(const Elm_Controlbar_Item * it)
2385 if (!it) return EINA_FALSE;
2387 return it->disabled;
2391 * Set the view of the item
2393 * @param it The item of controlbar
2394 * @param view The view for the item
2396 * @ingroup Controlbar
2399 elm_controlbar_item_view_set(Elm_Controlbar_Item *it, Evas_Object * view)
2402 if (it->view == view) return;
2404 evas_object_del(it->view);
2409 * Get the view of the item
2411 * @param it The item of controlbar
2412 * @return The view for the item
2414 * @ingroup Controlbar
2417 elm_controlbar_item_view_get(const Elm_Controlbar_Item *it)
2419 if (!it) return NULL;
2425 * Unset the view of the item
2427 * @param it The item of controlbar
2428 * @return The view for the item
2430 * @ingroup Controlbar
2433 elm_controlbar_item_view_unset(Elm_Controlbar_Item *it)
2435 if (!it) return NULL;
2436 if (it->obj == NULL) return NULL;
2437 Widget_Data * wd = elm_widget_data_get(it->obj);
2438 if (!wd) return NULL;
2439 Evas_Object *content;
2441 if (it->view == elm_layout_content_get(wd->view, "elm.swallow.view"))
2443 content = elm_layout_content_unset(wd->view, "elm.swallow.view");
2444 if (content) evas_object_hide(content);
2455 * Set the mode of the controlbar
2457 * @param obj The object of the controlbar
2458 * @param mode The mode of the controlbar
2460 * @ingroup Controlbar
2463 elm_controlbar_mode_set(Evas_Object *obj, int mode)
2465 ELM_CHECK_WIDTYPE(obj, widtype);
2466 Widget_Data *wd = elm_widget_data_get(obj);
2469 fprintf(stderr, "Cannot get smart data\n");
2473 if (wd->mode == mode) return;
2479 case ELM_CONTROLBAR_MODE_DEFAULT:
2480 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,default", "elm");
2482 case ELM_CONTROLBAR_MODE_TRANSLUCENCE:
2483 elm_controlbar_alpha_set(obj, 85);
2485 case ELM_CONTROLBAR_MODE_TRANSPARENCY:
2486 elm_controlbar_alpha_set(obj, 0);
2488 case ELM_CONTROLBAR_MODE_LARGE:
2489 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,large", "elm");
2491 case ELM_CONTROLBAR_MODE_SMALL:
2492 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,small", "elm");
2494 case ELM_CONTROLBAR_MODE_LEFT:
2495 edje_object_signal_emit(_EDJ(wd->selected_box), "elm,state,left", "elm");
2496 wd->selected_signal = eina_stringshare_add("elm,state,selected_left");
2497 wd->pressed_signal = eina_stringshare_add("elm,state,pressed_left");
2498 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,left", "elm");
2499 _check_background(wd);
2502 case ELM_CONTROLBAR_MODE_RIGHT:
2503 edje_object_signal_emit(_EDJ(wd->selected_box), "elm,state,right", "elm");
2504 wd->selected_signal = eina_stringshare_add("elm,state,selected_right");
2505 wd->pressed_signal = eina_stringshare_add("elm,state,pressed_right");
2506 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,right", "elm");
2507 _check_background(wd);
2514 edje_object_signal_emit(_EDJ(wd->selected_box), "elm,state,default", "elm");
2515 wd->selected_signal = eina_stringshare_add("elm,state,selected");
2516 wd->pressed_signal = eina_stringshare_add("elm,state,pressed");
2517 _check_background(wd);
2522 * Set the alpha of the controlbar
2524 * @param obj The object of the controlbar
2525 * @param alpha The alpha value of the controlbar (0-100)
2527 * @ingroup Controlbar
2530 elm_controlbar_alpha_set(Evas_Object *obj, int alpha)
2532 ELM_CHECK_WIDTYPE(obj, widtype);
2534 Widget_Data *wd = elm_widget_data_get(obj);
2537 fprintf(stderr, "Cannot get smart data\n");
2541 if (alpha < 0) wd->alpha = 0;
2542 else if (alpha > 100) wd->alpha = 100;
2543 else wd->alpha = alpha;
2545 evas_object_color_get(wd->bg, &r, &g, &b, NULL);
2546 evas_object_color_set(wd->bg, r, g, b, (int)(255 * wd->alpha / 100));
2551 * Set auto-align mode of the controlbar(It's not prepared yet)
2552 * If you set the auto-align and add items more than 5,
2553 * the "more" item will be made and the items more than 5 will be unvisible.
2555 * @param obj The object of the controlbar
2556 * @param auto_align The dicision that the controlbar use the auto-align
2558 * @ingroup Controlbar
2561 elm_controlbar_item_auto_align_set(Evas_Object *obj, Eina_Bool auto_align)
2563 ELM_CHECK_WIDTYPE(obj, widtype);
2564 Widget_Data *wd = elm_widget_data_get(obj);
2565 Elm_Controlbar_Item *item;
2570 fprintf(stderr, "Cannot get smart data\n");
2574 if (wd->auto_align == auto_align) return;
2578 if (_check_bar_item_number(wd) >= 5 && !wd->more_item)
2581 EINA_LIST_FOREACH(wd->items, l, item)
2583 if (elm_controlbar_item_visible_get(item))
2586 _delete_item_in_bar(item);
2589 item = elm_controlbar_last_item_get(obj);
2590 while (!elm_controlbar_item_visible_get(item)){
2591 item = elm_controlbar_item_prev(item);
2593 _create_more_item(wd, item->style);
2601 if (wd->more_item->view)
2602 evas_object_del(wd->more_item->view);
2603 wd->items = eina_list_remove(wd->items, wd->more_item);
2604 eina_stringshare_del(wd->more_item->text);
2605 if (wd->more_item->icon)
2606 evas_object_del(wd->more_item->icon);
2607 if (wd->more_item->base)
2608 evas_object_del(wd->more_item->base);
2609 if (wd->more_item->base_item)
2610 evas_object_del(wd->more_item->base_item);
2611 free(wd->more_item);
2612 wd->more_item = NULL;
2614 // make all item is visible
2616 EINA_LIST_FOREACH(wd->items, l, item)
2618 if (!elm_controlbar_item_visible_get(item))
2619 _insert_item_in_bar(item, i);
2624 wd->auto_align = auto_align;
2629 * Set the vertical mode of the controlbar
2631 * @param obj The object of the controlbar
2632 * @param vertical The vertical mode of the controlbar (TRUE = vertical, FALSE = horizontal)
2634 * @ingroup Controlbar
2637 elm_controlbar_vertical_set(Evas_Object *obj, Eina_Bool vertical)
2639 ELM_CHECK_WIDTYPE(obj, widtype);
2640 Widget_Data *wd = elm_widget_data_get(obj);
2643 fprintf(stderr, "Cannot get smart data\n");
2647 if (wd->vertical == vertical) return;
2648 wd->vertical = vertical;
2650 if (_check_bar_item_number(wd) > 1)
2654 _check_toolbar_line(wd);
2658 * Get the button object of the item
2660 * @param it The item of controlbar
2661 * @return button object of the item
2663 * @ingroup Controlbar
2666 elm_controlbar_item_button_get(const Elm_Controlbar_Item *it)
2668 if (!it) return NULL;
2669 if (it->style == OBJECT) return NULL;
2671 if (it->base_item) return it->base_item;