2 * @defgroup Controlbar Controlbar
5 * This is a Controlbar. It can contain label and icon objects.
6 * In edit mode, you can change the location of items.
12 #include <Elementary.h>
16 #define EAPI __attribute__ ((visibility("default")))
19 #define ELM_MAX(v1, v2) (((v1) > (v2)) ? (v1) : (v2))
20 #define _EDJ(x) (Evas_Object *)elm_layout_edje_get(x)
26 typedef struct _Animation_Data Animation_Data;
28 struct _Animation_Data
41 void (*func) (void *data, Evas_Object * obj);
43 Ecore_Animator * timer;
46 // internal data structure of controlbar object
47 typedef struct _Widget_Data Widget_Data;
57 Evas_Object * selected_box;
59 Elm_Controlbar_Item * more_item;
60 Elm_Controlbar_Item * pre_item;
61 Elm_Controlbar_Item * cur_item;
62 Evas_Coord x, y, w, h;
71 Eina_List * visible_items;
73 void (*ani_func) (void *data, Evas_Object * obj, void *event_info);
75 Ecore_Timer *effect_timer;
76 Eina_Bool selected_animation;
79 const char *pressed_signal;
80 const char *selected_signal;
83 struct _Elm_Controlbar_Item
88 Evas_Object * base_item;
91 const char *icon_path;
93 void (*func) (void *data, Evas_Object * obj, void *event_info);
102 static const char *widtype = NULL;
104 static int _check_bar_item_number(Widget_Data *wd);
105 static void _select_box(Elm_Controlbar_Item * it);
106 static void _cancel_selected_box(Widget_Data *wd);
107 static Eina_Bool _press_box(Elm_Controlbar_Item * it);
109 ///////////////////////////////////////////////////////////////////
111 // Smart Object basic function
113 ////////////////////////////////////////////////////////////////////
116 _controlbar_move(void *data, Evas_Object * obj __UNUSED__)
119 Evas_Coord x, y, x_, y_, width;
121 wd = elm_widget_data_get((Evas_Object *) data);
123 evas_object_geometry_get(wd->edje, &x, &y, NULL, NULL);
126 evas_object_move(wd->edje, x, y);
127 evas_object_geometry_get(elm_layout_content_get(wd->edje, "bg_image"), NULL, NULL, &width, NULL);
128 evas_object_geometry_get(wd->parent, &x_, &y_, NULL, NULL);
131 case ELM_CONTROLBAR_MODE_LEFT:
132 evas_object_move(wd->view, x + width, y);
134 case ELM_CONTROLBAR_MODE_RIGHT:
136 evas_object_move(wd->view, x, y);
142 _controlbar_resize(void *data, Evas_Object * obj __UNUSED__)
145 Evas_Coord x, y, x_, y_, w, h, width, height;
147 wd = elm_widget_data_get((Evas_Object *) data);
149 evas_object_geometry_get(wd->edje, &x, &y, &w, &h);
152 evas_object_resize(wd->edje, w, h);
153 evas_object_geometry_get(elm_layout_content_get(wd->edje, "bg_image"), NULL, NULL, &width, &height);
154 evas_object_geometry_get(wd->parent, &x_, &y_, NULL, NULL);
157 case ELM_CONTROLBAR_MODE_LEFT:
158 case ELM_CONTROLBAR_MODE_RIGHT:
159 evas_object_resize(wd->view, w - width, h);
162 evas_object_resize(wd->view, w, h - height + 1);
168 _controlbar_object_move(void *data, Evas * e __UNUSED__, Evas_Object * obj,
169 void *event_info __UNUSED__)
171 _controlbar_move(data, obj);
175 _controlbar_object_resize(void *data, Evas * e __UNUSED__, Evas_Object * obj,
176 void *event_info __UNUSED__)
178 _controlbar_resize(data, obj);
182 _controlbar_object_show(void *data, Evas * e __UNUSED__, Evas_Object * obj __UNUSED__,
183 void *event_info __UNUSED__)
187 wd = elm_widget_data_get((Evas_Object *) data);
189 evas_object_show(wd->view);
190 evas_object_show(wd->edje);
191 evas_object_show(wd->box);
195 _controlbar_object_hide(void *data, Evas * e __UNUSED__, Evas_Object * obj __UNUSED__,
196 void *event_info __UNUSED__)
200 wd = elm_widget_data_get((Evas_Object *) data);
202 evas_object_hide(wd->view);
203 evas_object_hide(wd->edje);
204 evas_object_hide(wd->box);
206 _cancel_selected_box(wd);
210 _item_del(Elm_Controlbar_Item *it)
213 Widget_Data *wd = elm_widget_data_get(it->obj);
217 eina_stringshare_del(it->text);
219 eina_stringshare_del(it->icon_path);
221 evas_object_del(it->icon);
223 evas_object_del(it->base);
225 evas_object_del(it->base_item);
227 evas_object_del(it->view);
231 _del_hook(Evas_Object * obj)
233 Widget_Data * wd = elm_widget_data_get(obj);
234 Elm_Controlbar_Item * item;
237 EINA_LIST_FREE(wd->items, item)
245 evas_object_del(wd->bg);
250 evas_object_del(wd->box);
253 if (wd->selected_box)
255 evas_object_del(wd->selected_box);
256 wd->selected_box = NULL;
260 evas_object_del(wd->edje);
263 if (wd->effect_timer)
265 ecore_timer_del(wd->effect_timer);
266 wd->effect_timer = NULL;
270 if (wd->ad->timer) ecore_animator_del(wd->ad->timer);
271 wd->ad->timer = NULL;
277 evas_object_del(wd->view);
286 _theme_hook(Evas_Object * obj)
290 Elm_Controlbar_Item * item;
293 Widget_Data * wd = elm_widget_data_get(obj);
295 elm_layout_theme_set(wd->edje, "controlbar", "base",
296 elm_widget_style_get(obj));
297 elm_layout_theme_set(wd->bg, "controlbar", "background",
298 elm_widget_style_get(obj));
299 evas_object_color_get(wd->bg, &r, &g, &b, NULL);
300 evas_object_color_set(wd->bg, r, g, b, (int)(255 * wd->alpha / 100));
301 elm_layout_theme_set(wd->view, "controlbar", "view", elm_widget_style_get(obj));
302 elm_layout_theme_set(wd->selected_box, "controlbar", "item_bg_move", elm_widget_style_get(obj));
303 EINA_LIST_FOREACH(wd->items, l, item)
305 elm_layout_theme_set(item->base, "controlbar", "item_bg", elm_widget_style_get(obj));
309 evas_object_smart_member_add(wd->view, obj);
310 evas_object_smart_member_add(wd->selected_box, obj);
311 evas_object_smart_member_add(wd->box, obj);
315 _disable_hook(Evas_Object * obj)
317 Widget_Data * wd = elm_widget_data_get(obj);
320 Elm_Controlbar_Item * item;
323 wd->disabled = elm_widget_disabled_get(obj);
325 EINA_LIST_FOREACH(wd->items, l, item)
328 disabled = wd->disabled;
330 disabled = item->disabled;
332 if (item->base_item) elm_widget_disabled_set(item->base_item, disabled);
337 _sub_del(void *data __UNUSED__, Evas_Object * obj, void *event_info)
339 Widget_Data *wd = elm_widget_data_get(obj);
340 Evas_Object *sub = event_info;
341 Evas_Object *content;
346 content = elm_layout_content_unset(wd->view, "elm.swallow.view");
347 evas_object_hide(content);
352 _sizing_eval(Evas_Object * obj)
354 Widget_Data * wd = elm_widget_data_get(obj);
356 _controlbar_move(obj, obj);
357 _controlbar_resize(obj, obj);
360 /////////////////////////////////////////////////////////////
362 // animation function
364 /////////////////////////////////////////////////////////////
367 _move_evas_object(void *data)
377 Animation_Data * ad = (Animation_Data *) data;
378 t = ELM_MAX(0.0, ecore_loop_time_get() - ad->start_time);
379 dx = ad->tx - ad->fx;
380 dy = ad->ty - ad->fy;
381 dw = ad->tw - ad->fw;
382 dh = ad->th - ad->fh;
385 x = (1 * sin((t / ad->time) * (M_PI / 2)) * dx);
386 y = (1 * sin((t / ad->time) * (M_PI / 2)) * dy);
387 w = (1 * sin((t / ad->time) * (M_PI / 2)) * dw);
388 h = (1 * sin((t / ad->time) * (M_PI / 2)) * dh);
401 if (x == dx && y == dy && w == dw && h == dh)
403 if (ad->timer) ecore_animator_del(ad->timer);
405 evas_object_move(ad->obj, px, py);
406 evas_object_resize(ad->obj, pw, ph);
407 evas_object_show(ad->obj);
408 if (ad->func != NULL)
409 ad->func(ad->data, ad->obj);
410 return ECORE_CALLBACK_CANCEL;
414 evas_object_move(ad->obj, px, py);
415 evas_object_resize(ad->obj, pw, ph);
416 evas_object_show(ad->obj);
418 return ECORE_CALLBACK_RENEW;
421 static Animation_Data*
422 _move_object_with_animation(Evas_Object * obj, Evas_Coord x, Evas_Coord y,
423 Evas_Coord w, Evas_Coord h, Evas_Coord x_,
424 Evas_Coord y_, Evas_Coord w_, Evas_Coord h_,
425 double time, Eina_Bool (*mv_func) (void *data),
426 void (*func) (void *data,
427 Evas_Object * obj), void *data)
429 Animation_Data * ad = (Animation_Data *) malloc(sizeof(Animation_Data));
439 ad->start_time = ecore_loop_time_get();
443 ad->timer = ecore_animator_add(mv_func, ad);
448 /////////////////////////////////////////////////////////////
452 /////////////////////////////////////////////////////////////
455 _sort_cb(const void *d1, const void *d2)
457 Elm_Controlbar_Item * item1, *item2;
458 item1 = (Elm_Controlbar_Item *) d1;
459 item2 = (Elm_Controlbar_Item *) d2;
460 if (item1->order <= 0) return 1;
461 if (item2->order <= 0) return -1;
462 return item1->order > item2->order ? 1 : -1;
465 ///////////////////////////////////////////////////////////////////
467 // basic utility function
469 ////////////////////////////////////////////////////////////////////
472 _check_item(Widget_Data *wd, Elm_Controlbar_Item *item)
475 Elm_Controlbar_Item *it;
477 if (!wd) return EINA_FALSE;
478 if (!wd->items) return EINA_FALSE;
480 EINA_LIST_FOREACH(wd->items, l, it)
481 if (it == item) return EINA_TRUE;
487 _check_background(Widget_Data *wd)
491 Elm_Controlbar_Item *it;
493 EINA_LIST_FOREACH(wd->items, l, it)
495 if (it->style == TABBAR)
497 if (wd->mode == ELM_CONTROLBAR_MODE_LEFT)
498 edje_object_signal_emit(_EDJ(wd->bg), "elm,state,tabbar_left", "elm");
499 else if (wd->mode == ELM_CONTROLBAR_MODE_RIGHT)
500 edje_object_signal_emit(_EDJ(wd->bg), "elm,state,tabbar_right", "elm");
502 edje_object_signal_emit(_EDJ(wd->bg), "elm,state,tabbar", "elm");
506 edje_object_signal_emit(_EDJ(wd->bg), "elm,state,toolbar", "elm");
510 _check_toolbar_line(Widget_Data *wd)
514 Elm_Controlbar_Item *it, *it2;
516 EINA_LIST_FOREACH(wd->items, l, it)
518 it2 = elm_controlbar_item_prev(it);
520 if (it->style != TOOLBAR || it2->style != TOOLBAR) continue;
524 edje_object_signal_emit(_EDJ(it2->base), "elm,state,right_line_hide", "elm");
525 edje_object_signal_emit(_EDJ(it->base), "elm,state,left_line_hide", "elm");
527 if ((it->icon || it->text) && (it2->icon || it2->text))
529 edje_object_signal_emit(_EDJ(it2->base), "elm,state,bottom_line_show", "elm");
530 edje_object_signal_emit(_EDJ(it->base), "elm,state,top_line_show", "elm");
534 edje_object_signal_emit(_EDJ(it2->base), "elm,state,bottom_line_hide", "elm");
535 edje_object_signal_emit(_EDJ(it->base), "elm,state,top_line_hide", "elm");
540 edje_object_signal_emit(_EDJ(it2->base), "elm,state,bottom_line_hide", "elm");
541 edje_object_signal_emit(_EDJ(it->base), "elm,state,top_line_hide", "elm");
543 if ((it->icon || it->text) && (it2->icon || it2->text))
545 edje_object_signal_emit(_EDJ(it2->base), "elm,state,right_line_show", "elm");
546 edje_object_signal_emit(_EDJ(it->base), "elm,state,left_line_show", "elm");
550 edje_object_signal_emit(_EDJ(it2->base), "elm,state,right_line_hide", "elm");
551 edje_object_signal_emit(_EDJ(it->base), "elm,state,left_line_hide", "elm");
558 _check_bar_item_number(Widget_Data *wd)
561 Elm_Controlbar_Item * item;
564 EINA_LIST_FOREACH(wd->items, l, item)
565 if (item->order > 0) num++;
571 _insert_item_in_bar(Elm_Controlbar_Item * it, int order)
574 Elm_Controlbar_Item * item;
575 Widget_Data * wd = elm_widget_data_get(it->obj);
578 if (order == 0) return;
580 EINA_LIST_FOREACH(wd->items, l, item)
582 if (item->order == order && item != it)
587 EINA_LIST_FOREACH(wd->items, l, item)
590 elm_table_unpack(wd->box, item->base);
592 EINA_LIST_FOREACH(wd->items, l, item)
596 if (item->order >= order)
599 elm_table_pack(wd->box, item->base, item->order - 1, 0, 1, 1);
601 elm_table_pack(wd->box, item->base, 0, item->order - 1, 1, 1);
602 evas_object_show(item->base);
608 elm_table_pack(wd->box, it->base, it->order - 1, 0, 1, 1);
610 elm_table_pack(wd->box, it->base, 0, it->order - 1, 1, 1);
611 evas_object_show(it->base);
615 _delete_item_in_bar(Elm_Controlbar_Item * it)
618 Elm_Controlbar_Item * item;
619 Widget_Data * wd = elm_widget_data_get(it->obj);
622 EINA_LIST_FOREACH(wd->items, l, item)
628 elm_table_unpack(wd->box, it->base);
629 evas_object_hide(it->base);
634 EINA_LIST_FOREACH(wd->items, l, item)
639 elm_table_unpack(wd->box, item->base);
641 elm_table_pack(wd->box, item->base, item->order - 1, 0, 1, 1);
643 elm_table_pack(wd->box, item->base, 0, item->order - 1, 1, 1);
650 _set_item_visible(Elm_Controlbar_Item *it, Eina_Bool visible)
652 Elm_Controlbar_Item *item;
653 Eina_Bool check = EINA_TRUE;
656 if (it->obj == NULL) return;
657 Widget_Data * wd = elm_widget_data_get(it->obj);
658 if (!wd || !wd->items) return;
659 if (it->order <= 0) check = EINA_FALSE;
660 if (check == visible) return;
663 item = elm_controlbar_last_item_get(it->obj);
664 while (!elm_controlbar_item_visible_get(item)){
665 item = elm_controlbar_item_prev(item);
667 _insert_item_in_bar(it, item->order + 1);
671 _delete_item_in_bar(it);
673 wd->items = eina_list_sort(wd->items, eina_list_count(wd->items), _sort_cb);
674 _sizing_eval(it->obj);
678 _hide_selected_box(void *data)
680 Evas_Object *selected_box = (Evas_Object *)data;
682 evas_object_move(selected_box, -999, -999);
683 evas_object_hide(selected_box);
685 return ECORE_CALLBACK_CANCEL;
689 _end_selected_box(void *data, Evas_Object *obj __UNUSED__)
691 Widget_Data * wd = (Widget_Data *)data;
693 if (_check_item(wd, wd->cur_item))
695 edje_object_signal_emit(_EDJ(wd->cur_item->base), wd->selected_signal, "elm");
699 if (wd->animating < 0)
701 printf("animation error\n");
705 ecore_idler_add(_hide_selected_box, wd->selected_box);
709 _move_selected_box(Widget_Data *wd, Elm_Controlbar_Item * fit, Elm_Controlbar_Item * tit)
711 Evas_Coord fx, fy, fw, fh, tx, ty, tw, th;
712 Evas_Object *from, *to;
714 if (fit->order <= 0 && wd->auto_align)
717 from = (Evas_Object *) edje_object_part_object_get(_EDJ(fit->base), "bg_img");
718 evas_object_geometry_get(from, &fx, &fy, &fw, &fh);
720 to = (Evas_Object *) edje_object_part_object_get(_EDJ(tit->base), "bg_img");
721 evas_object_geometry_get(to, &tx, &ty, &tw, &th);
723 if (_check_item(wd, wd->pre_item))
725 edje_object_signal_emit(_EDJ(wd->pre_item->base), "elm,state,unselected", "elm");
727 if (_check_item(wd, wd->cur_item))
728 edje_object_signal_emit(_EDJ(wd->cur_item->base), "elm,state,unselected", "elm");
733 if (wd->ad->timer) ecore_animator_del(wd->ad->timer);
734 wd->ad->timer = NULL;
738 wd->ad = _move_object_with_animation(wd->selected_box, fx, fy, fw, fh, tx, ty, tw, th,
739 0.3, _move_evas_object, _end_selected_box, wd);
743 _select_box(Elm_Controlbar_Item * it)
746 Widget_Data * wd = elm_widget_data_get(it->obj);
748 Elm_Controlbar_Item * item, *fit = NULL;
749 Evas_Object * content;
751 if (wd->animating) return;
755 if (it->style == TABBAR)
757 content = elm_layout_content_unset(wd->view, "elm.swallow.view");
758 if (content) evas_object_hide(content);
760 EINA_LIST_FOREACH(wd->items, l, item){
761 if (item->selected) {
765 item->selected = EINA_FALSE;
767 it->selected = EINA_TRUE;
769 if (fit != NULL && fit != it)
771 _move_selected_box(wd, fit, it);
775 edje_object_signal_emit(_EDJ(it->base), wd->selected_signal, "elm");
780 if (wd->more_item != it)
781 evas_object_smart_callback_call(it->obj, "view,change,before", it);
784 elm_layout_content_set(wd->view, "elm.swallow.view", it->view);
786 else if (it->style == TOOLBAR)
788 edje_object_signal_emit(_EDJ(it->base), "elm,state,text_unselected", "elm");
790 it->func(it->data, it->obj, it);
795 _cancel_selected_box(Widget_Data *wd)
798 Elm_Controlbar_Item * item;
800 EINA_LIST_FOREACH(wd->items, l, item)
802 if (item->style == TABBAR)
806 edje_object_signal_emit(_EDJ(item->base), wd->selected_signal, "elm");
810 edje_object_signal_emit(_EDJ(item->base), "elm,state,unselected", "elm");
813 else if (item->style == TOOLBAR)
815 edje_object_signal_emit(_EDJ(item->base), "elm,state,unselected", "elm");
821 _unpress_box_cb(void *data, Evas *evas __UNUSED__, Evas_Object *obj, void *event_info)
823 Widget_Data * wd = (Widget_Data *) data;
824 Evas_Event_Mouse_Up * ev = event_info;
825 Evas_Coord x, y, w, h;
827 evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_UP, _unpress_box_cb);
829 _cancel_selected_box(wd);
831 if (_check_item(wd, wd->pre_item))
833 evas_object_geometry_get(wd->pre_item->base, &x, &y, &w, &h);
834 if (ev->output.x > x && ev->output.x < x+w && ev->output.y > y && ev->output.y < y+h)
836 _select_box(wd->pre_item);
843 _press_box(Elm_Controlbar_Item * it)
845 Widget_Data * wd = elm_widget_data_get(it->obj);
848 Elm_Controlbar_Item * item;
850 if (wd->animating) return EINA_FALSE;
852 if (wd->disabled || it->disabled) return EINA_FALSE;
854 EINA_LIST_FOREACH(wd->items, l, item)
858 if (it->style == TABBAR)
860 edje_object_signal_emit(_EDJ(it->base), wd->pressed_signal, "elm");
862 else if (it->style == TOOLBAR)
864 edje_object_signal_emit(_EDJ(it->base), "elm,state,toolbar_pressed", "elm");
866 evas_object_event_callback_add(it->base, EVAS_CALLBACK_MOUSE_UP, _unpress_box_cb, (void *)wd);
880 _create_item_icon(Evas_Object *obj, Elm_Controlbar_Item * it, char *part)
884 icon = elm_icon_add(obj);
885 if (!elm_icon_standard_set(icon, it->icon_path))
887 elm_icon_file_set(icon, it->icon_path, NULL);
890 evas_object_size_hint_min_set(icon, 40, 40);
891 evas_object_size_hint_max_set(icon, 100, 100);
892 evas_object_show(icon);
894 elm_button_icon_set(obj, icon);
900 _create_item_layout(Evas_Object * parent, Elm_Controlbar_Item * it, Evas_Object **item, Evas_Object **icon)
904 obj = elm_layout_add(parent);
907 fprintf(stderr, "Cannot load bg edj\n");
910 elm_layout_theme_set(obj, "controlbar", "item_bg",
911 elm_widget_style_get(it->obj));
912 evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
913 evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, EVAS_HINT_FILL);
915 *item = elm_button_add(parent);
916 if (*item == NULL) return NULL;
917 elm_object_style_set(*item, "controlbar/vertical");
918 elm_layout_content_set(obj, "item", *item);
921 elm_button_label_set(*item, it->text);
923 *icon = _create_item_icon(*item, it, "elm.swallow.icon");
929 _bar_item_down_cb(void *data, Evas * evas __UNUSED__, Evas_Object * obj, void *event_info __UNUSED__)
931 Widget_Data * wd = (Widget_Data *) data;
933 Elm_Controlbar_Item * item;
934 if (wd->animating) return;
936 EINA_LIST_FOREACH(wd->items, l, item)
937 if (item->base == obj) break;
939 if (item == NULL) return;
944 static Elm_Controlbar_Item *
945 _create_tab_item(Evas_Object * obj, const char *icon_path, const char *label,
948 Elm_Controlbar_Item * it;
952 fprintf(stderr, "Invalid argument: controlbar object is NULL\n");
955 wd = elm_widget_data_get(obj);
958 fprintf(stderr, "Cannot get smart data\n");
961 it = ELM_NEW(Elm_Controlbar_Item);
962 if (!it) return NULL;
965 it->text = eina_stringshare_add(label);
966 it->icon_path = eina_stringshare_add(icon_path);
967 it->selected = EINA_FALSE;
971 it->base = _create_item_layout(wd->edje, it, &(it->base_item), &(it->icon));
972 evas_object_event_callback_add(it->base, EVAS_CALLBACK_MOUSE_DOWN,
973 _bar_item_down_cb, wd);
974 evas_object_show(it->base);
979 static Elm_Controlbar_Item *
980 _create_tool_item(Evas_Object * obj, const char *icon_path, const char *label,
981 void (*func) (void *data, Evas_Object * obj,
982 void *event_info), void *data)
985 Elm_Controlbar_Item * it;
989 fprintf(stderr, "Invalid argument: controlbar object is NULL\n");
992 wd = elm_widget_data_get(obj);
995 fprintf(stderr, "Cannot get smart data\n");
998 it = ELM_NEW(Elm_Controlbar_Item);
1003 it->text = eina_stringshare_add(label);
1004 it->icon_path = eina_stringshare_add(icon_path);
1005 it->selected = EINA_FALSE;
1009 it->style = TOOLBAR;
1010 it->base = _create_item_layout(wd->edje, it, &(it->base_item), &(it->icon));
1011 evas_object_event_callback_add(it->base, EVAS_CALLBACK_MOUSE_DOWN,
1012 _bar_item_down_cb, wd);
1013 evas_object_show(it->base);
1018 static Elm_Controlbar_Item *
1019 _create_object_item(Evas_Object * obj, Evas_Object * obj_item, const int sel)
1021 Elm_Controlbar_Item * it;
1025 fprintf(stderr, "Invalid argument: controlbar object is NULL\n");
1028 wd = elm_widget_data_get(obj);
1031 fprintf(stderr, "Cannot get smart data\n");
1034 it = ELM_NEW(Elm_Controlbar_Item);
1041 it->base = elm_layout_add(wd->edje);
1042 elm_layout_theme_set(it->base, "controlbar", "item_bg",
1043 elm_widget_style_get(it->obj));
1044 evas_object_size_hint_weight_set(it->base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1045 evas_object_size_hint_align_set(it->base, EVAS_HINT_FILL, EVAS_HINT_FILL);
1046 it->base_item = obj_item;
1047 elm_layout_content_set(it->base, "item", it->base_item);
1048 evas_object_show(it->base);
1053 _repack_items(Widget_Data *wd)
1056 Elm_Controlbar_Item * item;
1058 EINA_LIST_FOREACH(wd->items, l, item)
1060 if (item->order > 0)
1062 elm_table_unpack(wd->box, item->base);
1064 elm_table_pack(wd->box, item->base, item->order - 1, 0, item->sel, 1);
1066 elm_table_pack(wd->box, item->base, 0, item->order - 1, item->sel, 1);
1072 _set_items_position(Evas_Object * obj, Elm_Controlbar_Item * it,
1073 Elm_Controlbar_Item * mit, Eina_Bool bar)
1077 Elm_Controlbar_Item * item;
1078 int check = EINA_FALSE;
1083 fprintf(stderr, "Invalid argument: controlbar object is NULL\n");
1086 wd = elm_widget_data_get(obj);
1089 fprintf(stderr, "Cannot get smart data\n");
1093 EINA_LIST_FOREACH(wd->items, l, item)
1095 if (item == mit && item->order > 0)
1098 it->order = mit->order;
1102 if (item->order > 0)
1104 elm_table_unpack(wd->box, item->base);
1105 item->order += it->sel;
1107 elm_table_pack(wd->box, item->base, item->order - 1, 0, item->sel, 1);
1109 elm_table_pack(wd->box, item->base, 0, item->order - 1, item->sel, 1);
1112 if (item->order > 0) order += item->sel;
1126 elm_table_pack(wd->box, it->base, it->order - 1, 0, it->sel, 1);
1128 elm_table_pack(wd->box, it->base, 0, it->order - 1, it->sel, 1);
1131 evas_object_hide(it->base);
1135 _list_clicked(void *data, Evas_Object *obj, void *event_info __UNUSED__)
1137 Elm_Controlbar_Item *item = (Elm_Controlbar_Item *)data;
1138 Elm_Controlbar_Item *it;
1141 Evas_Object *content;
1142 Elm_List_Item *lit = (Elm_List_Item *) elm_list_selected_item_get(obj);
1145 elm_list_item_selected_set(lit, 0);
1149 wd = elm_widget_data_get(item->obj);
1151 EINA_LIST_FOREACH(wd->items, l, it)
1153 it->selected = EINA_FALSE;
1156 if (item->style == TABBAR)
1158 content = elm_layout_content_unset(wd->view, "elm.swallow.view");
1159 evas_object_hide(content);
1160 item->selected = EINA_TRUE;
1161 evas_object_smart_callback_call(item->obj, "view,change,before", item);
1162 elm_layout_content_set(wd->view, "elm.swallow.view", item->view);
1165 if (item->style == TOOLBAR && item->func)
1166 item->func(item->data, item->obj, item);
1169 static Evas_Object *
1170 _create_more_view(Widget_Data *wd)
1173 Elm_Controlbar_Item *item;
1177 list = elm_list_add( wd->object );
1178 elm_list_mode_set( list, ELM_LIST_COMPRESS );
1180 EINA_LIST_FOREACH(wd->items, l, item)
1182 if (item->order <= 0)
1185 if (item->icon_path)
1187 icon = _create_item_icon(list, item, NULL);
1188 evas_object_color_set(icon, 0, 0, 0, 255);
1190 elm_list_item_append(list, item->text, icon, NULL, _list_clicked, item);
1194 elm_list_go( list );
1199 static void _ctxpopup_cb(void *data, Evas_Object *obj, void *event_info)
1201 Elm_Controlbar_Item *it;
1203 Evas_Object *ctxpopup = obj;
1204 Widget_Data *wd = (Widget_Data *)data;
1206 EINA_LIST_FOREACH(wd->items, l, it)
1207 if (!strcmp(it->text, elm_ctxpopup_item_label_get((Elm_Ctxpopup_Item *) event_info))) break;
1210 it->func(it->data, it->obj, it);
1212 if (_check_item(wd, it)) evas_object_smart_callback_call(it->obj, "clicked", it);
1214 evas_object_del(ctxpopup);
1218 static void _ctxpopup_dismissed_cb(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
1220 Evas_Object *ctxpopup = obj;
1222 evas_object_del(ctxpopup);
1227 _create_more_func(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
1229 Evas_Object *ctxpopup;
1230 Elm_Controlbar_Item *item;
1233 Evas_Coord x, y, w, h;
1234 Widget_Data *wd = elm_widget_data_get(obj);
1237 ctxpopup = elm_ctxpopup_add(wd->parent);
1238 evas_object_smart_callback_add( ctxpopup, "dismissed", _ctxpopup_dismissed_cb, wd);
1240 EINA_LIST_FOREACH(wd->items, l, item)
1242 if (item->order <= 0)
1245 if (item->icon_path)
1247 icon = _create_item_icon(ctxpopup, item, NULL);
1248 evas_object_color_set(icon, 0, 0, 0, 255);
1250 elm_ctxpopup_item_append(ctxpopup, item->text, icon, _ctxpopup_cb, wd);
1254 evas_object_geometry_get(wd->more_item->base, &x, &y, &w, &h);
1255 evas_object_move(ctxpopup, x + w/2, y + h/2);
1257 evas_object_show(ctxpopup);
1260 static Elm_Controlbar_Item *
1261 _create_more_item(Widget_Data *wd, int style)
1263 Elm_Controlbar_Item * it;
1265 it = ELM_NEW(Elm_Controlbar_Item);
1266 if (!it) return NULL;
1267 it->obj = wd->object;
1268 it->text = eina_stringshare_add("more");
1269 it->icon_path = eina_stringshare_add(CONTROLBAR_SYSTEM_ICON_MORE);
1270 it->selected = EINA_FALSE;
1272 it->view = _create_more_view(wd);
1273 it->func = _create_more_func;
1275 it->base = _create_item_layout(wd->edje, it, &(it->base_item), &(it->icon));
1276 evas_object_event_callback_add(it->base, EVAS_CALLBACK_MOUSE_DOWN,
1277 _bar_item_down_cb, wd);
1278 evas_object_show(it->base);
1280 _set_items_position(it->obj, it, NULL, EINA_TRUE);
1281 wd->items = eina_list_append(wd->items, it);
1283 wd->items = eina_list_sort(wd->items, eina_list_count(wd->items), _sort_cb);
1288 ///////////////////////////////////////////////////////////////////
1292 ////////////////////////////////////////////////////////////////////
1295 * Add a new controlbar object
1297 * @param parent The parent object
1298 * @return The new object or NULL if it cannot be created
1300 * @ingroup Controlbar
1302 EAPI Evas_Object * elm_controlbar_add(Evas_Object * parent)
1304 if (parent == NULL) return NULL;
1305 Evas_Object * obj = NULL;
1306 Evas_Object * bg = NULL;
1307 Widget_Data * wd = NULL;
1308 Evas_Coord x, y, w, h;
1309 wd = ELM_NEW(Widget_Data);
1310 Evas *evas = evas_object_evas_get(parent);
1311 if (evas == NULL) return NULL;
1312 obj = elm_widget_add(evas);
1313 if (obj == NULL) return NULL;
1314 ELM_SET_WIDTYPE(widtype, "controlbar");
1315 elm_widget_type_set(obj, "controlbar");
1316 elm_widget_sub_object_add(parent, obj);
1317 elm_widget_data_set(obj, wd);
1318 elm_widget_del_hook_set(obj, _del_hook);
1319 elm_widget_can_focus_set(obj, EINA_FALSE);
1320 elm_widget_theme_hook_set(obj, _theme_hook);
1321 elm_widget_disable_hook_set(obj, _disable_hook);
1324 wd->parent = parent;
1325 evas_object_geometry_get(parent, &x, &y, &w, &h);
1331 wd->mode = ELM_CONTROLBAR_MODE_DEFAULT;
1335 wd->vertical = EINA_FALSE;
1336 wd->auto_align = EINA_FALSE;
1337 wd->selected_animation = EINA_FALSE;
1338 wd->pressed_signal = eina_stringshare_add("elm,state,pressed");
1339 wd->selected_signal = eina_stringshare_add("elm,state,selected");
1340 wd->view = elm_layout_add(wd->parent);
1341 elm_layout_theme_set(wd->view, "controlbar", "view", "default");
1342 if (wd->view == NULL)
1344 printf("Cannot load bg edj\n");
1347 evas_object_show(wd->view);
1349 /* load background edj */
1350 wd->edje = elm_layout_add(obj);
1351 elm_layout_theme_set(wd->edje, "controlbar", "base", "default");
1352 if (wd->edje == NULL)
1354 printf("Cannot load base edj\n");
1357 evas_object_show(wd->edje);
1359 wd->bg = elm_layout_add(wd->edje);
1360 elm_layout_theme_set(wd->bg, "controlbar", "background", "default");
1363 printf("Cannot load bg edj\n");
1366 elm_layout_content_set(wd->edje, "bg_image", wd->bg);
1369 evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_RESIZE,
1370 _controlbar_object_resize, obj);
1371 evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_MOVE,
1372 _controlbar_object_move, obj);
1373 evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_SHOW,
1374 _controlbar_object_show, obj);
1375 evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_HIDE,
1376 _controlbar_object_hide, obj);
1378 bg = elm_layout_content_get(wd->edje, "bg_image");
1379 evas_object_event_callback_add(bg, EVAS_CALLBACK_MOVE, _controlbar_object_move, obj);
1380 evas_object_event_callback_add(bg, EVAS_CALLBACK_RESIZE, _controlbar_object_resize, obj);
1382 wd->selected_box = elm_layout_add(wd->bg);
1383 elm_layout_theme_set(wd->selected_box, "controlbar", "item_bg_move", "default");
1384 evas_object_hide(wd->selected_box);
1387 wd->box = elm_table_add(wd->edje);
1388 elm_table_homogenous_set(wd->box, EINA_TRUE);
1389 evas_object_size_hint_weight_set(wd->box, EVAS_HINT_EXPAND,
1391 evas_object_size_hint_align_set(wd->box, EVAS_HINT_FILL, EVAS_HINT_FILL);
1392 elm_layout_content_set(wd->edje, "elm.swallow.items", wd->box);
1393 evas_object_show(wd->box);
1395 evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj);
1397 evas_object_smart_member_add(wd->view, obj);
1398 elm_widget_resize_object_set(obj, wd->edje);
1399 evas_object_smart_member_add(wd->selected_box, obj);
1400 evas_object_smart_member_add(wd->box, obj);
1408 * Append new tab item
1410 * @param obj The controlbar object
1411 * @param icon_path The icon path of item
1412 * @param label The label of item
1413 * @param view The view of item
1414 * @return The item of controlbar
1416 * @ingroup Controlbar
1418 EAPI Elm_Controlbar_Item * elm_controlbar_tab_item_append(Evas_Object * obj,
1425 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1426 Elm_Controlbar_Item * it;
1427 Elm_Controlbar_Item * lit;
1429 it = _create_tab_item(obj, icon_path, label, view);
1430 if (!it) return NULL;
1431 wd = elm_widget_data_get(obj);
1432 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1433 if (!wd->more_item) {
1434 lit = elm_controlbar_last_item_get(obj);
1435 _set_item_visible(lit, EINA_FALSE);
1436 _create_more_item(wd, TABBAR);
1438 _set_items_position(obj, it, NULL, EINA_FALSE);
1441 _set_items_position(obj, it, NULL, EINA_TRUE);
1443 wd->items = eina_list_append(wd->items, it);
1445 elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1447 _check_background(wd);
1453 * Prepend new tab item
1455 * @param obj The controlbar object
1456 * @param icon_path The icon path of item
1457 * @param label The label of item
1458 * @param view The view of item
1459 * @return The item of controlbar
1461 * @ingroup Controlbar
1463 EAPI Elm_Controlbar_Item * elm_controlbar_tab_item_prepend(Evas_Object *
1472 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1474 Elm_Controlbar_Item * it;
1475 Elm_Controlbar_Item * lit;
1476 Elm_Controlbar_Item * item;
1477 it = _create_tab_item(obj, icon_path, label, view);
1478 if (!it) return NULL;
1479 wd = elm_widget_data_get(obj);
1480 item = eina_list_data_get(wd->items);
1481 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1482 if (!wd->more_item) {
1483 lit = elm_controlbar_last_item_get(obj);
1484 _set_item_visible(lit, EINA_FALSE);
1485 _create_more_item(wd, TABBAR);
1487 lit = elm_controlbar_item_prev(wd->more_item);
1488 _set_item_visible(lit, EINA_FALSE);
1489 _set_items_position(obj, it, item, EINA_TRUE);
1492 _set_items_position(obj, it, item, EINA_TRUE);
1494 wd->items = eina_list_prepend(wd->items, it);
1496 elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1498 _check_background(wd);
1504 * Insert new tab item before given item
1506 * @param obj The controlbar object
1507 * @param before The given item
1508 * @param icon_path The icon path of item
1509 * @param label The label of item
1510 * @param view The view of item
1511 * @return The item of controlbar
1513 * @ingroup Controlbar
1515 EAPI Elm_Controlbar_Item *
1516 elm_controlbar_tab_item_insert_before(Evas_Object * obj,
1517 Elm_Controlbar_Item * before,
1518 const char *icon_path,
1519 const char *label, Evas_Object * view)
1521 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1523 Elm_Controlbar_Item * it;
1524 Elm_Controlbar_Item * lit;
1525 if (!before) return NULL;
1526 it = _create_tab_item(obj, icon_path, label, view);
1527 if (!it) return NULL;
1528 wd = elm_widget_data_get(obj);
1529 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1532 lit = elm_controlbar_last_item_get(obj);
1533 _set_item_visible(lit, EINA_FALSE);
1534 _create_more_item(wd, TABBAR);
1536 before = wd->more_item;
1537 if (before->order > 0)
1539 lit = elm_controlbar_item_prev(wd->more_item);
1540 _set_item_visible(lit, EINA_FALSE);
1541 _set_items_position(obj, it, before, EINA_TRUE);
1545 _set_items_position(obj, it, before, EINA_FALSE);
1549 _set_items_position(obj, it, before, EINA_TRUE);
1551 wd->items = eina_list_prepend_relative(wd->items, it, before);
1553 elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1555 _check_background(wd);
1561 * Insert new tab item after given item
1563 * @param obj The controlbar object
1564 * @param after The given item
1565 * @param icon_path The icon path of item
1566 * @param label The label of item
1567 * @param view The view of item
1568 * @return The item of controlbar
1570 * @ingroup Controlbar
1572 EAPI Elm_Controlbar_Item *
1573 elm_controlbar_tab_item_insert_after(Evas_Object * obj,
1574 Elm_Controlbar_Item * after,
1575 const char *icon_path, const char *label,
1578 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1580 Elm_Controlbar_Item * it;
1581 Elm_Controlbar_Item * lit;
1582 Elm_Controlbar_Item * item;
1583 if (!after) return NULL;
1584 it = _create_tab_item(obj, icon_path, label, view);
1585 if (!it) return NULL;
1586 wd = elm_widget_data_get(obj);
1587 item = elm_controlbar_item_next(after);
1588 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1591 lit = elm_controlbar_last_item_get(obj);
1592 _set_item_visible(lit, EINA_FALSE);
1593 _create_more_item(wd, TABBAR);
1595 lit = elm_controlbar_item_prev(wd->more_item);
1596 if (lit != after && item->order > 0)
1598 _set_item_visible(lit, EINA_FALSE);
1599 _set_items_position(obj, it, item, EINA_TRUE);
1603 _set_items_position(obj, it, NULL, EINA_FALSE);
1607 _set_items_position(obj, it, item, EINA_TRUE);
1609 wd->items = eina_list_append_relative(wd->items, it, after);
1611 elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1613 _check_background(wd);
1619 * Append new tool item
1621 * @param obj The controlbar object
1622 * @param icon_path The icon path of item
1623 * @param label The label of item
1624 * @param func Callback function of item
1625 * @param data The data of callback function
1626 * @return The item of controlbar
1628 * @ingroup Controlbar
1630 EAPI Elm_Controlbar_Item * elm_controlbar_tool_item_append(Evas_Object *
1645 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1646 Elm_Controlbar_Item * it;
1647 Elm_Controlbar_Item * lit;
1649 it = _create_tool_item(obj, icon_path, label, func, data);
1650 if (!it) return NULL;
1651 wd = elm_widget_data_get(obj);
1652 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1653 if (!wd->more_item) {
1654 lit = elm_controlbar_last_item_get(obj);
1655 _set_item_visible(lit, EINA_FALSE);
1656 _create_more_item(wd, TOOLBAR);
1658 _set_items_position(obj, it, NULL, EINA_FALSE);
1661 _set_items_position(obj, it, NULL, EINA_TRUE);
1663 wd->items = eina_list_append(wd->items, it);
1664 _check_toolbar_line(wd);
1670 * Prepend new tool item
1672 * @param obj The controlbar object
1673 * @param icon_path The icon path of item
1674 * @param label The label of item
1675 * @param func Callback function of item
1676 * @param data The data of callback function
1677 * @return The item of controlbar
1679 * @ingroup Controlbar
1681 EAPI Elm_Controlbar_Item * elm_controlbar_tool_item_prepend(Evas_Object *
1697 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1699 Elm_Controlbar_Item * it;
1700 Elm_Controlbar_Item * lit;
1701 Elm_Controlbar_Item * item;
1702 it = _create_tool_item(obj, icon_path, label, func, data);
1703 if (!it) return NULL;
1704 wd = elm_widget_data_get(obj);
1705 item = eina_list_data_get(wd->items);
1706 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1707 if (!wd->more_item) {
1708 lit = elm_controlbar_last_item_get(obj);
1709 _set_item_visible(lit, EINA_FALSE);
1710 _create_more_item(wd, TOOLBAR);
1712 lit = elm_controlbar_item_prev(wd->more_item);
1713 _set_item_visible(lit, EINA_FALSE);
1714 _set_items_position(obj, it, item, EINA_TRUE);
1717 _set_items_position(obj, it, item, EINA_TRUE);
1719 wd->items = eina_list_prepend(wd->items, it);
1720 _check_toolbar_line(wd);
1726 * Insert new tool item before given item
1728 * @param obj The controlbar object
1729 * @param before The given item
1730 * @param icon_path The icon path of item
1731 * @param label The label of item
1732 * @param func Callback function of item
1733 * @param data The data of callback function
1734 * @return The item of controlbar
1736 * @ingroup Controlbar
1738 EAPI Elm_Controlbar_Item *
1739 elm_controlbar_tool_item_insert_before(Evas_Object * obj,
1740 Elm_Controlbar_Item * before,
1741 const char *icon_path,
1743 void (*func) (void *data,
1748 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1750 Elm_Controlbar_Item * it;
1751 Elm_Controlbar_Item * lit;
1752 if (!before) return NULL;
1753 it = _create_tool_item(obj, icon_path, label, func, data);
1754 if (!it) return NULL;
1755 wd = elm_widget_data_get(obj);
1756 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1759 lit = elm_controlbar_last_item_get(obj);
1760 _set_item_visible(lit, EINA_FALSE);
1761 _create_more_item(wd, TOOLBAR);
1763 before = wd->more_item;
1764 if (before->order > 0)
1766 lit = elm_controlbar_item_prev(wd->more_item);
1767 _set_item_visible(lit, EINA_FALSE);
1768 _set_items_position(obj, it, before, EINA_TRUE);
1772 _set_items_position(obj, it, before, EINA_FALSE);
1776 _set_items_position(obj, it, before, EINA_TRUE);
1778 wd->items = eina_list_prepend_relative(wd->items, it, before);
1779 _check_toolbar_line(wd);
1785 * Insert new tool item after given item
1787 * @param obj The controlbar object
1788 * @param after The given item
1789 * @param icon_path The icon path of item
1790 * @param label The label of item
1791 * @param func Callback function of item
1792 * @param data The data of callback function
1793 * @return The item of controlbar
1795 * @ingroup Controlbar
1797 EAPI Elm_Controlbar_Item *
1798 elm_controlbar_tool_item_insert_after(Evas_Object * obj,
1799 Elm_Controlbar_Item * after,
1800 const char *icon_path,
1802 void (*func) (void *data,
1807 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1809 Elm_Controlbar_Item * it;
1810 Elm_Controlbar_Item * lit;
1811 Elm_Controlbar_Item * item;
1812 if (!after) return NULL;
1813 it = _create_tool_item(obj, icon_path, label, func, data);
1814 if (!it) return NULL;
1815 wd = elm_widget_data_get(obj);
1816 item = elm_controlbar_item_next(after);
1817 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1820 lit = elm_controlbar_last_item_get(obj);
1821 _set_item_visible(lit, EINA_FALSE);
1822 _create_more_item(wd, TOOLBAR);
1824 lit = elm_controlbar_item_prev(wd->more_item);
1825 if (lit != after && item->order > 0)
1827 _set_item_visible(lit, EINA_FALSE);
1828 _set_items_position(obj, it, item, EINA_TRUE);
1832 _set_items_position(obj, it, NULL, EINA_FALSE);
1836 _set_items_position(obj, it, item, EINA_TRUE);
1838 wd->items = eina_list_append_relative(wd->items, it, after);
1839 _check_toolbar_line(wd);
1845 * Append new object item
1847 * @param obj The controlbar object
1848 * @param obj_item The object of item
1849 * @param sel The number of sel occupied
1850 * @return The item of controlbar
1852 * @ingroup Controlbar
1854 EAPI Elm_Controlbar_Item * elm_controlbar_object_item_append(Evas_Object *
1860 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1862 Elm_Controlbar_Item * it;
1863 it = _create_object_item(obj, obj_item, sel);
1864 if (!it) return NULL;
1865 wd = elm_widget_data_get(obj);
1866 _set_items_position(obj, it, NULL, EINA_TRUE);
1867 wd->items = eina_list_append(wd->items, it);
1873 * Prepend new object item
1875 * @param obj The controlbar object
1876 * @param obj_item The object of item
1877 * @param sel The number of sel occupied
1878 * @return The item of controlbar
1880 * @ingroup Controlbar
1882 EAPI Elm_Controlbar_Item * elm_controlbar_object_item_prepend(Evas_Object *
1888 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1890 Elm_Controlbar_Item * it;
1891 Elm_Controlbar_Item * item;
1892 it = _create_object_item(obj, obj_item, sel);
1893 if (!it) return NULL;
1894 wd = elm_widget_data_get(obj);
1895 item = eina_list_data_get(wd->items);
1896 _set_items_position(obj, it, item, EINA_TRUE);
1897 wd->items = eina_list_prepend(wd->items, it);
1903 * Insert new object item before given item
1905 * @param obj The controlbar object
1906 * @param before The given item
1907 * @param obj_item The object of item
1908 * @param sel The number of sel occupied
1909 * @return The item of controlbar
1911 * @ingroup Controlbar
1913 EAPI Elm_Controlbar_Item *
1914 elm_controlbar_object_item_insert_before(Evas_Object * obj,
1915 Elm_Controlbar_Item * before,
1916 Evas_Object * obj_item, const int sel)
1918 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1920 Elm_Controlbar_Item * it;
1921 if (!before) return NULL;
1922 it = _create_object_item(obj, obj_item, sel);
1923 if (!it) return NULL;
1924 wd = elm_widget_data_get(obj);
1925 _set_items_position(obj, it, before, EINA_TRUE);
1926 wd->items = eina_list_prepend_relative(wd->items, it, before);
1932 * Insert new object item after given item
1934 * @param obj The controlbar object
1935 * @param after The given item
1936 * @param obj_item The object of item
1937 * @param sel The number of sel occupied
1938 * @return The item of controlbar
1940 * @ingroup Controlbar
1942 EAPI Elm_Controlbar_Item *
1943 elm_controlbar_object_item_insert_after(Evas_Object * obj,
1944 Elm_Controlbar_Item * after,
1945 Evas_Object * obj_item, const int sel)
1947 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1949 Elm_Controlbar_Item * it;
1950 Elm_Controlbar_Item * item;
1951 if (!after) return NULL;
1952 it = _create_object_item(obj, obj_item, sel);
1953 if (!it) return NULL;
1954 wd = elm_widget_data_get(obj);
1955 item = elm_controlbar_item_next(after);
1956 _set_items_position(obj, it, item, EINA_TRUE);
1957 wd->items = eina_list_append_relative(wd->items, it, after);
1963 * Get the object of the object item
1965 * @param it The item of controlbar
1966 * @return The object of the object item
1968 * @ingroup Controlbar
1971 elm_controlbar_object_item_object_get(Elm_Controlbar_Item * it)
1973 if (!it) return NULL;
1974 if (it->style != OBJECT) return NULL;
1975 if (!it->base_item) return NULL;
1976 return it->base_item;
1980 * Delete item from controlbar
1982 * @param it The item of controlbar
1984 * @ingroup Controlbar
1987 elm_controlbar_item_del(Elm_Controlbar_Item * it)
1994 Elm_Controlbar_Item * item;
2004 if (it->obj == NULL)
2006 printf("Invalid argument: controlbar object is NULL\n");
2009 wd = elm_widget_data_get(it->obj);
2012 printf("Cannot get smart data\n");
2020 elm_table_unpack(wd->box, it->base);
2022 EINA_LIST_FOREACH(wd->items, l, item)
2026 if (item->order > it->order)
2029 elm_table_unpack(wd->box, item->base);
2032 elm_table_pack(wd->box, item->base, item->order - 1, 0, item->sel, 1);
2034 elm_table_pack(wd->box, item->base, 0, item->order - 1, item->sel, 1);
2042 // delete item in list
2044 wd->items = eina_list_remove(wd->items, it);
2047 wd->num = wd->num - 1;
2052 * Select item in controlbar
2054 * @param it The item of controlbar
2056 * @ingroup Controlbar
2059 elm_controlbar_item_select(Elm_Controlbar_Item * it)
2062 if (it->obj == NULL) return;
2063 Widget_Data * wd = elm_widget_data_get(it->obj);
2064 if (wd == NULL) return;
2070 * Set the icon of item
2072 * @param it The item of controlbar
2073 * @param icon_path The icon path of the item
2074 * @return The icon object
2076 * @ingroup Controlbar
2079 elm_controlbar_item_icon_set(Elm_Controlbar_Item * it, const char *icon_path)
2082 if (it->style == OBJECT) return;
2085 eina_stringshare_del(it->icon_path);
2086 it->icon_path = NULL;
2090 evas_object_del(it->icon);
2093 if (icon_path != NULL)
2095 it->icon_path = eina_stringshare_add(icon_path);
2096 it->icon = _create_item_icon(it->base_item, it, "elm.swallow.icon");
2098 if (it->wd->disabled || it->disabled)
2099 elm_widget_disabled_set(it->base_item, EINA_TRUE);
2101 elm_widget_disabled_set(it->base_item, EINA_FALSE);
2105 * Get the icon of item
2107 * @param it The item of controlbar
2108 * @return The icon object
2110 * @ingroup Controlbar
2113 elm_controlbar_item_icon_get(Elm_Controlbar_Item * it)
2115 if (!it) return NULL;
2120 * Set the label of item
2122 * @param it The item of controlbar
2123 * @param label The label of item
2125 * @ingroup Controlbar
2128 elm_controlbar_item_label_set(Elm_Controlbar_Item * it, const char *label)
2131 if (it->style == OBJECT) return;
2134 eina_stringshare_del(it->text);
2139 it->text = eina_stringshare_add(label);
2140 elm_button_label_set(it->base_item, it->text);
2142 if (it->wd->disabled || it->disabled)
2143 elm_widget_disabled_set(it->base_item, EINA_TRUE);
2145 elm_widget_disabled_set(it->base_item, EINA_FALSE);
2149 * Get the label of item
2151 * @param it The item of controlbar
2152 * @return The label of item
2154 * @ingroup Controlbar
2157 elm_controlbar_item_label_get(Elm_Controlbar_Item * it)
2159 if (!it) return NULL;
2164 * Get the selected item
2166 * @param obj The controlbar object
2167 * @return The item of controlbar
2169 * @ingroup Controlbar
2171 EAPI Elm_Controlbar_Item * elm_controlbar_selected_item_get(Evas_Object *
2174 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
2177 Elm_Controlbar_Item * item;
2178 if (obj == NULL) return NULL;
2179 Widget_Data * wd = elm_widget_data_get(obj);
2180 if (!wd || !wd->items) return NULL;
2181 EINA_LIST_FOREACH(wd->items, l, item)
2183 if (item->selected) return item;
2189 * Get the first item
2191 * @param obj The controlbar object
2192 * @return The item of controlbar
2194 * @ingroup Controlbar
2196 EAPI Elm_Controlbar_Item * elm_controlbar_first_item_get(Evas_Object * obj)
2198 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
2199 Widget_Data * wd = elm_widget_data_get(obj);
2200 if (!wd || !wd->items) return NULL;
2201 return eina_list_data_get(wd->items);
2207 * @param obj The controlbar object
2208 * @return The item of controlbar
2210 * @ingroup Controlbar
2212 EAPI Elm_Controlbar_Item * elm_controlbar_last_item_get(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(eina_list_last(wd->items));
2223 * @param obj The controlbar object
2224 * @return The list of the items
2226 * @ingroup Controlbar
2228 EAPI Eina_List * elm_controlbar_items_get(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;
2237 * Get the previous item
2239 * @param it The item of controlbar
2240 * @return The previous item of the parameter item
2242 * @ingroup Controlbar
2244 EAPI Elm_Controlbar_Item * elm_controlbar_item_prev(Elm_Controlbar_Item *
2247 if (!it) return NULL;
2250 Elm_Controlbar_Item * item;
2251 if (it->obj == NULL) return NULL;
2252 Widget_Data * wd = elm_widget_data_get(it->obj);
2253 if (!wd || !wd->items) return NULL;
2254 EINA_LIST_FOREACH(wd->items, l, item)
2258 l = eina_list_prev(l);
2259 if (!l) return NULL;
2260 return eina_list_data_get(l);
2269 * @param obj The controlbar object
2270 * @return The next item of the parameter item
2272 * @ingroup Controlbar
2274 EAPI Elm_Controlbar_Item * elm_controlbar_item_next(Elm_Controlbar_Item *
2277 if (!it) return NULL;
2280 Elm_Controlbar_Item * item;
2281 if (it->obj == NULL) return NULL;
2282 Widget_Data * wd = elm_widget_data_get(it->obj);
2283 if (!wd || !wd->items) return NULL;
2284 EINA_LIST_FOREACH(wd->items, l, item)
2288 l = eina_list_next(l);
2289 if (!l) return NULL;
2290 return eina_list_data_get(l);
2297 * Set the visible status of item in bar
2299 * @param it The item of controlbar
2300 * @param bar EINA_TRUE or EINA_FALSE
2302 * @ingroup Controlbar
2305 elm_controlbar_item_visible_set(Elm_Controlbar_Item * it, Eina_Bool visible)
2308 if (it->obj == NULL) return;
2309 Widget_Data * wd = elm_widget_data_get(it->obj);
2312 if (!wd->auto_align)
2313 _set_item_visible(it, visible);
2317 * Get the result which or not item is visible in bar
2319 * @param it The item of controlbar
2320 * @return EINA_TRUE or EINA_FALSE
2322 * @ingroup Controlbar
2325 elm_controlbar_item_visible_get(Elm_Controlbar_Item * it)
2327 if (!it) return EINA_FALSE;
2328 if (it->obj == NULL) return EINA_FALSE;
2329 Widget_Data * wd = elm_widget_data_get(it->obj);
2330 if (!wd) return EINA_FALSE;
2331 if (it->order <= 0) return EINA_FALSE;
2337 elm_controlbar_item_disable_set(Elm_Controlbar_Item * it, Eina_Bool disable)
2339 elm_controlbar_item_disabled_set(it, disable);
2345 * @param it The item of controlbar
2346 * @param bar EINA_TRUE or EINA_FALSE
2348 * @ingroup Controlbar
2351 elm_controlbar_item_disabled_set(Elm_Controlbar_Item * it, Eina_Bool disabled)
2355 if (it->disabled == disabled) return;
2357 it->disabled = disabled;
2359 if (it->wd && it->wd->disabled) return;
2361 if (it->base_item) elm_widget_disabled_set(it->base_item, disabled);
2365 elm_controlbar_item_disable_get(Elm_Controlbar_Item * it)
2367 return elm_controlbar_item_disabled_get(it);
2373 * @param it The item of controlbar
2374 * @return EINA_TRUE or EINA_FALSE
2376 * @ingroup Controlbar
2379 elm_controlbar_item_disabled_get(Elm_Controlbar_Item * it)
2381 if (!it) return EINA_FALSE;
2383 return it->disabled;
2387 * Set the view of the item
2389 * @param it The item of controlbar
2390 * @param view The view for the item
2392 * @ingroup Controlbar
2395 elm_controlbar_item_view_set(Elm_Controlbar_Item *it, Evas_Object * view)
2398 if (it->view == view) return;
2400 evas_object_del(it->view);
2405 * Get the view of the item
2407 * @param it The item of controlbar
2408 * @return The view for the item
2410 * @ingroup Controlbar
2413 elm_controlbar_item_view_get(Elm_Controlbar_Item *it)
2415 if (!it) return NULL;
2421 * Unset the view of the item
2423 * @param it The item of controlbar
2424 * @return The view for the item
2426 * @ingroup Controlbar
2429 elm_controlbar_item_view_unset(Elm_Controlbar_Item *it)
2431 if (!it) return NULL;
2432 if (it->obj == NULL) return NULL;
2433 Widget_Data * wd = elm_widget_data_get(it->obj);
2434 if (!wd) return NULL;
2435 Evas_Object *content;
2437 if (it->view == elm_layout_content_get(wd->view, "elm.swallow.view"))
2439 content = elm_layout_content_unset(wd->view, "elm.swallow.view");
2440 if (content) evas_object_hide(content);
2451 * Set the mode of the controlbar
2453 * @param obj The object of the controlbar
2454 * @param mode The mode of the controlbar
2456 * @ingroup Controlbar
2459 elm_controlbar_mode_set(Evas_Object *obj, int mode)
2461 ELM_CHECK_WIDTYPE(obj, widtype);
2462 Widget_Data *wd = elm_widget_data_get(obj);
2465 fprintf(stderr, "Cannot get smart data\n");
2469 if (wd->mode == mode) return;
2475 case ELM_CONTROLBAR_MODE_DEFAULT:
2476 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,default", "elm");
2478 case ELM_CONTROLBAR_MODE_TRANSLUCENCE:
2479 elm_controlbar_alpha_set(obj, 85);
2481 case ELM_CONTROLBAR_MODE_TRANSPARENCY:
2482 elm_controlbar_alpha_set(obj, 0);
2484 case ELM_CONTROLBAR_MODE_LARGE:
2485 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,large", "elm");
2487 case ELM_CONTROLBAR_MODE_SMALL:
2488 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,small", "elm");
2490 case ELM_CONTROLBAR_MODE_LEFT:
2491 edje_object_signal_emit(_EDJ(wd->selected_box), "elm,state,left", "elm");
2492 wd->selected_signal = eina_stringshare_add("elm,state,selected_left");
2493 wd->pressed_signal = eina_stringshare_add("elm,state,pressed_left");
2494 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,left", "elm");
2495 _check_background(wd);
2498 case ELM_CONTROLBAR_MODE_RIGHT:
2499 edje_object_signal_emit(_EDJ(wd->selected_box), "elm,state,right", "elm");
2500 wd->selected_signal = eina_stringshare_add("elm,state,selected_right");
2501 wd->pressed_signal = eina_stringshare_add("elm,state,pressed_right");
2502 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,right", "elm");
2503 _check_background(wd);
2510 edje_object_signal_emit(_EDJ(wd->selected_box), "elm,state,default", "elm");
2511 wd->selected_signal = eina_stringshare_add("elm,state,selected");
2512 wd->pressed_signal = eina_stringshare_add("elm,state,pressed");
2513 _check_background(wd);
2518 * Set the alpha of the controlbar
2520 * @param obj The object of the controlbar
2521 * @param alpha The alpha value of the controlbar (0-100)
2523 * @ingroup Controlbar
2526 elm_controlbar_alpha_set(Evas_Object *obj, int alpha)
2528 ELM_CHECK_WIDTYPE(obj, widtype);
2530 Widget_Data *wd = elm_widget_data_get(obj);
2533 fprintf(stderr, "Cannot get smart data\n");
2537 if (alpha < 0) wd->alpha = 0;
2538 else if (alpha > 100) wd->alpha = 100;
2539 else wd->alpha = alpha;
2541 evas_object_color_get(wd->bg, &r, &g, &b, NULL);
2542 evas_object_color_set(wd->bg, r, g, b, (int)(255 * wd->alpha / 100));
2547 * Set auto-align mode of the controlbar(It's not prepared yet)
2548 * If you set the auto-align and add items more than 5,
2549 * the "more" item will be made and the items more than 5 will be unvisible.
2551 * @param obj The object of the controlbar
2552 * @param auto_align The dicision that the controlbar use the auto-align
2554 * @ingroup Controlbar
2557 elm_controlbar_item_auto_align_set(Evas_Object *obj, Eina_Bool auto_align)
2559 ELM_CHECK_WIDTYPE(obj, widtype);
2560 Widget_Data *wd = elm_widget_data_get(obj);
2561 Elm_Controlbar_Item *item;
2566 fprintf(stderr, "Cannot get smart data\n");
2570 if (wd->auto_align == auto_align) return;
2574 if (_check_bar_item_number(wd) >= 5 && !wd->more_item)
2577 EINA_LIST_FOREACH(wd->items, l, item)
2579 if (elm_controlbar_item_visible_get(item))
2582 _delete_item_in_bar(item);
2585 item = elm_controlbar_last_item_get(obj);
2586 while (!elm_controlbar_item_visible_get(item)){
2587 item = elm_controlbar_item_prev(item);
2589 _create_more_item(wd, item->style);
2597 if (wd->more_item->view)
2598 evas_object_del(wd->more_item->view);
2599 wd->items = eina_list_remove(wd->items, wd->more_item);
2600 eina_stringshare_del(wd->more_item->text);
2601 if (wd->more_item->icon)
2602 evas_object_del(wd->more_item->icon);
2603 if (wd->more_item->base)
2604 evas_object_del(wd->more_item->base);
2605 if (wd->more_item->base_item)
2606 evas_object_del(wd->more_item->base_item);
2607 free(wd->more_item);
2608 wd->more_item = NULL;
2610 // make all item is visible
2612 EINA_LIST_FOREACH(wd->items, l, item)
2614 if (!elm_controlbar_item_visible_get(item))
2615 _insert_item_in_bar(item, i);
2620 wd->auto_align = auto_align;
2625 * Set the vertical mode of the controlbar
2627 * @param obj The object of the controlbar
2628 * @param vertical The vertical mode of the controlbar (TRUE = vertical, FALSE = horizontal)
2630 * @ingroup Controlbar
2633 elm_controlbar_vertical_set(Evas_Object *obj, Eina_Bool vertical)
2635 ELM_CHECK_WIDTYPE(obj, widtype);
2636 Widget_Data *wd = elm_widget_data_get(obj);
2639 fprintf(stderr, "Cannot get smart data\n");
2643 if (wd->vertical == vertical) return;
2644 wd->vertical = vertical;
2646 if (_check_bar_item_number(wd) > 1)
2650 _check_toolbar_line(wd);
2654 * Get the button object of the item
2656 * @param it The item of controlbar
2657 * @return button object of the item
2659 * @ingroup Controlbar
2662 elm_controlbar_item_button_get(Elm_Controlbar_Item *it)
2664 if (!it) return NULL;
2665 if (it->style == OBJECT) return NULL;
2667 if (it->base_item) return it->base_item;
2673 elm_controlbar_animation_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, void *event_info), void *data)
2675 printf("\n==================================\n");
2676 printf("This API will be deleted : %s\n", __func__);
2677 printf("\n==================================\n");
2681 elm_controlbar_item_animation_set(Evas_Object *obj, Eina_Bool auto_animation, Eina_Bool selected_animation)
2683 printf("\n==================================\n");
2684 printf("This API will be deleted : %s\n", __func__);
2685 printf("\n==================================\n");
2690 init_animation(void *data)
2693 Elm_Controlbar_Item * item;
2694 Widget_Data * wd = (Widget_Data *)data;
2696 wd->visible_items = eina_list_free(wd->visible_items);
2697 EINA_LIST_FOREACH(wd->items, l, item)
2699 if (item->order > 0)
2701 wd->visible_items = eina_list_append(wd->visible_items, item->base_item);
2706 wd->ani_func(wd->ani_data, wd->object, wd->visible_items);
2708 return ECORE_CALLBACK_CANCEL;
2711 elm_controlbar_animation_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, void *event_info), void *data)
2713 printf("\n==================================\n");
2714 printf("%s\n", __func__);
2715 printf("==================================\n");
2716 printf("This API is just for test.\n");
2717 printf("Please don't use it!!\n");
2718 printf("Thank you.\n");
2719 printf("==================================\n");
2721 ELM_CHECK_WIDTYPE(obj, widtype);
2722 Widget_Data *wd = elm_widget_data_get(obj);
2725 fprintf(stderr, "Cannot get smart data\n");
2731 wd->init_animation = EINA_TRUE;
2733 wd->ani_func = func;
2734 wd->ani_data = data;
2736 ecore_idler_add(init_animation, wd);
2741 elm_controlbar_item_animation_set(Evas_Object *obj, Eina_Bool auto_animation, Eina_Bool selected_animation)
2743 printf("\n==================================\n");
2744 printf("%s\n", __func__);
2745 printf("==================================\n");
2746 printf("This API is just for test.\n");
2747 printf("Please don't use it!!\n");
2748 printf("Thank you.\n");
2749 printf("==================================\n");
2751 ELM_CHECK_WIDTYPE(obj, widtype);
2752 Widget_Data *wd = elm_widget_data_get(obj);
2755 fprintf(stderr, "Cannot get smart data\n");
2759 if (auto_animation && !wd->effect_timer)
2761 wd->effect_timer = ecore_timer_add(1.5, item_animation_effect, wd);
2765 if (wd->effect_timer) ecore_timer_del(wd->effect_timer);
2766 wd->effect_timer = NULL;
2769 wd->selected_animation = selected_animation;