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;
58 Elm_Controlbar_Item * more_item;
59 Elm_Controlbar_Item * pre_item;
60 Elm_Controlbar_Item * cur_item;
61 Evas_Coord x, y, w, h;
70 Eina_List * visible_items;
72 void (*ani_func) (void *data, Evas_Object * obj, void *event_info);
74 Ecore_Timer *effect_timer;
75 Eina_Bool selected_animation;
78 const char *pressed_signal;
79 const char *selected_signal;
82 struct _Elm_Controlbar_Item
87 Evas_Object * base_item;
90 const char *icon_path;
92 void (*func) (void *data, Evas_Object * obj, void *event_info);
101 static const char *widtype = NULL;
103 static void _sizing_eval(Evas_Object * obj);
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 void _check_toolbar_line(Widget_Data *wd);
108 static Eina_Bool _press_box(Elm_Controlbar_Item * it);
110 ///////////////////////////////////////////////////////////////////
112 // Smart Object basic function
114 ////////////////////////////////////////////////////////////////////
117 _controlbar_move(void *data, Evas_Object * obj __UNUSED__)
120 Evas_Coord x, y, x_, y_, width;
122 wd = elm_widget_data_get((Evas_Object *) data);
124 evas_object_geometry_get(wd->edje, &x, &y, NULL, NULL);
127 evas_object_move(wd->edje, x, y);
128 evas_object_geometry_get(elm_layout_content_get(wd->edje, "bg_image"), NULL, NULL, &width, NULL);
129 evas_object_geometry_get(wd->edje, &x_, &y_, NULL, NULL);
132 case ELM_CONTROLBAR_MODE_LEFT:
133 evas_object_move(wd->view, x + width, y);
135 case ELM_CONTROLBAR_MODE_RIGHT:
137 evas_object_move(wd->view, x, y);
143 _controlbar_resize(void *data, Evas_Object * obj __UNUSED__)
146 Evas_Coord x, y, x_, y_, w, h, width, height;
148 wd = elm_widget_data_get((Evas_Object *) data);
150 evas_object_geometry_get(wd->edje, &x, &y, &w, &h);
153 evas_object_resize(wd->edje, w, h);
154 evas_object_geometry_get(elm_layout_content_get(wd->edje, "bg_image"), NULL, NULL, &width, &height);
155 evas_object_geometry_get(wd->edje, &x_, &y_, NULL, NULL);
158 case ELM_CONTROLBAR_MODE_LEFT:
159 evas_object_move(wd->view, x + width, y);
160 case ELM_CONTROLBAR_MODE_RIGHT:
161 evas_object_resize(wd->view, w - width, h);
164 evas_object_resize(wd->view, w, h - height + 1);
165 evas_object_move(wd->view, x, y);
171 _controlbar_object_move(void *data, Evas * e __UNUSED__, Evas_Object * obj,
172 void *event_info __UNUSED__)
174 _controlbar_move(data, obj);
178 _controlbar_object_resize(void *data, Evas * e __UNUSED__, Evas_Object * obj,
179 void *event_info __UNUSED__)
181 _controlbar_resize(data, obj);
185 _controlbar_object_show(void *data, Evas * e __UNUSED__, Evas_Object * obj __UNUSED__,
186 void *event_info __UNUSED__)
190 wd = elm_widget_data_get((Evas_Object *) data);
192 evas_object_show(wd->view);
193 evas_object_show(wd->edje);
194 evas_object_show(wd->box);
198 _controlbar_object_hide(void *data, Evas * e __UNUSED__, Evas_Object * obj __UNUSED__,
199 void *event_info __UNUSED__)
203 wd = elm_widget_data_get((Evas_Object *) data);
205 evas_object_hide(wd->view);
206 evas_object_hide(wd->edje);
207 evas_object_hide(wd->box);
209 _cancel_selected_box(wd);
213 _item_del(Elm_Controlbar_Item *it)
216 Widget_Data *wd = elm_widget_data_get(it->obj);
220 eina_stringshare_del(it->text);
222 eina_stringshare_del(it->icon_path);
224 evas_object_del(it->icon);
226 evas_object_del(it->base);
228 evas_object_del(it->base_item);
230 evas_object_del(it->view);
234 _del_hook(Evas_Object * obj)
236 Widget_Data * wd = elm_widget_data_get(obj);
237 Elm_Controlbar_Item * item;
240 EINA_LIST_FREE(wd->items, item)
248 evas_object_del(wd->bg);
253 evas_object_del(wd->box);
258 evas_object_del(wd->edje);
261 if (wd->effect_timer)
263 ecore_timer_del(wd->effect_timer);
264 wd->effect_timer = NULL;
268 if (wd->ad->timer) ecore_animator_del(wd->ad->timer);
269 wd->ad->timer = NULL;
275 evas_object_del(wd->view);
284 _theme_hook(Evas_Object * obj)
288 Elm_Controlbar_Item * item;
291 Widget_Data * wd = elm_widget_data_get(obj);
293 elm_layout_theme_set(wd->edje, "controlbar", "base",
294 elm_widget_style_get(obj));
295 elm_layout_theme_set(wd->bg, "controlbar", "background",
296 elm_widget_style_get(obj));
297 evas_object_color_get(wd->bg, &r, &g, &b, NULL);
298 evas_object_color_set(wd->bg, r, g, b, (int)(255 * wd->alpha / 100));
299 elm_layout_theme_set(wd->view, "controlbar", "view", elm_widget_style_get(obj));
300 EINA_LIST_FOREACH(wd->items, l, item)
302 elm_layout_theme_set(item->base, "controlbar", "item_bg", elm_widget_style_get(obj));
306 elm_controlbar_mode_set(obj, wd->mode);
307 _check_toolbar_line(wd);
311 _disable_hook(Evas_Object * obj)
313 Widget_Data * wd = elm_widget_data_get(obj);
316 Elm_Controlbar_Item * item;
319 wd->disabled = elm_widget_disabled_get(obj);
321 EINA_LIST_FOREACH(wd->items, l, item)
324 disabled = wd->disabled;
326 disabled = item->disabled;
328 if (item->base_item) elm_widget_disabled_set(item->base_item, disabled);
333 _sub_del(void *data __UNUSED__, Evas_Object * obj, void *event_info)
335 Widget_Data *wd = elm_widget_data_get(obj);
336 Evas_Object *sub = event_info;
337 Evas_Object *content;
342 content = elm_layout_content_unset(wd->view, "elm.swallow.view");
343 evas_object_hide(content);
348 _sizing_eval(Evas_Object * obj)
350 Widget_Data * wd = elm_widget_data_get(obj);
352 _controlbar_move(obj, obj);
353 _controlbar_resize(obj, obj);
356 /////////////////////////////////////////////////////////////
358 // animation function
360 /////////////////////////////////////////////////////////////
363 _move_evas_object(void *data)
365 Evas_Object *bg_image;
366 double t, vx, vy, vw, vh;
372 Animation_Data * ad = (Animation_Data *) data;
373 bg_image = edje_object_part_object_get(_EDJ(ad->obj), "bg_image");
374 if (bg_image) evas_object_geometry_get(bg_image, &ox, &oy, &ow, &oh);
375 t = ELM_MAX(0.0, ecore_loop_time_get() - ad->start_time);
376 dx = ad->tx - ad->fx;
377 dy = ad->ty - ad->fy;
378 dw = ad->tw - ad->fw;
379 dh = ad->th - ad->fh;
382 x = (1 * sin((t / ad->time) * (M_PI / 2)) * dx);
383 y = (1 * sin((t / ad->time) * (M_PI / 2)) * dy);
384 w = (1 * sin((t / ad->time) * (M_PI / 2)) * dw);
385 h = (1 * sin((t / ad->time) * (M_PI / 2)) * dh);
402 vx = (double)(px - ox) / (double)(ow - pw);
406 vy = (double)(py - oy) / (double)(oh - ph);
407 vw = (double)pw / (double)ow;
408 vh = (double)ph / (double)oh;
410 if (x == dx && y == dy && w == dw && h == dh)
412 if (ad->timer) ecore_animator_del(ad->timer);
414 edje_object_part_drag_size_set(_EDJ(ad->obj), "elm.dragable.box", vw, vh);
415 edje_object_part_drag_value_set(_EDJ(ad->obj), "elm.dragable.box", vx, vy);
416 if (ad->func != NULL)
417 ad->func(ad->data, ad->obj);
418 return ECORE_CALLBACK_CANCEL;
422 edje_object_part_drag_size_set(_EDJ(ad->obj), "elm.dragable.box", vw, vh);
423 edje_object_part_drag_value_set(_EDJ(ad->obj), "elm.dragable.box", vx, vy);
425 return ECORE_CALLBACK_RENEW;
428 static Animation_Data*
429 _move_object_with_animation(Evas_Object * obj, Evas_Coord x, Evas_Coord y,
430 Evas_Coord w, Evas_Coord h, Evas_Coord x_,
431 Evas_Coord y_, Evas_Coord w_, Evas_Coord h_,
432 double time, Eina_Bool (*mv_func) (void *data),
433 void (*func) (void *data,
434 Evas_Object * obj), void *data)
436 Animation_Data * ad = (Animation_Data *) malloc(sizeof(Animation_Data));
437 if (!ad) return NULL;
447 ad->start_time = ecore_loop_time_get();
451 ad->timer = ecore_animator_add(mv_func, ad);
456 /////////////////////////////////////////////////////////////
460 /////////////////////////////////////////////////////////////
463 _sort_cb(const void *d1, const void *d2)
465 Elm_Controlbar_Item * item1, *item2;
466 item1 = (Elm_Controlbar_Item *) d1;
467 item2 = (Elm_Controlbar_Item *) d2;
468 if (item1->order <= 0) return 1;
469 if (item2->order <= 0) return -1;
470 return item1->order > item2->order ? 1 : -1;
473 ///////////////////////////////////////////////////////////////////
475 // basic utility function
477 ////////////////////////////////////////////////////////////////////
480 _check_item(Widget_Data *wd, Elm_Controlbar_Item *item)
483 Elm_Controlbar_Item *it;
485 if (!wd) return EINA_FALSE;
486 if (!wd->items) return EINA_FALSE;
488 EINA_LIST_FOREACH(wd->items, l, it)
489 if (it == item) return EINA_TRUE;
495 _check_background(Widget_Data *wd)
499 Elm_Controlbar_Item *it;
501 EINA_LIST_FOREACH(wd->items, l, it)
503 if (it->style == TABBAR)
505 if (wd->mode == ELM_CONTROLBAR_MODE_LEFT)
506 edje_object_signal_emit(_EDJ(wd->bg), "elm,state,tabbar_left", "elm");
507 else if (wd->mode == ELM_CONTROLBAR_MODE_RIGHT)
508 edje_object_signal_emit(_EDJ(wd->bg), "elm,state,tabbar_right", "elm");
510 edje_object_signal_emit(_EDJ(wd->bg), "elm,state,tabbar", "elm");
514 edje_object_signal_emit(_EDJ(wd->bg), "elm,state,toolbar", "elm");
518 _check_toolbar_line(Widget_Data *wd)
522 Elm_Controlbar_Item *it, *it2;
524 EINA_LIST_FOREACH(wd->items, l, it)
526 it2 = elm_controlbar_item_prev(it);
528 if (it->style != TOOLBAR || it2->style != TOOLBAR) continue;
532 edje_object_signal_emit(_EDJ(it2->base), "elm,state,right_line_hide", "elm");
533 edje_object_signal_emit(_EDJ(it->base), "elm,state,left_line_hide", "elm");
535 if ((it->icon || it->text) && (it2->icon || it2->text))
537 edje_object_signal_emit(_EDJ(it2->base), "elm,state,bottom_line_show", "elm");
538 edje_object_signal_emit(_EDJ(it->base), "elm,state,top_line_show", "elm");
542 edje_object_signal_emit(_EDJ(it2->base), "elm,state,bottom_line_hide", "elm");
543 edje_object_signal_emit(_EDJ(it->base), "elm,state,top_line_hide", "elm");
548 edje_object_signal_emit(_EDJ(it2->base), "elm,state,bottom_line_hide", "elm");
549 edje_object_signal_emit(_EDJ(it->base), "elm,state,top_line_hide", "elm");
551 if ((it->icon || it->text) && (it2->icon || it2->text))
553 edje_object_signal_emit(_EDJ(it2->base), "elm,state,right_line_show", "elm");
554 edje_object_signal_emit(_EDJ(it->base), "elm,state,left_line_show", "elm");
558 edje_object_signal_emit(_EDJ(it2->base), "elm,state,right_line_hide", "elm");
559 edje_object_signal_emit(_EDJ(it->base), "elm,state,left_line_hide", "elm");
566 _check_bar_item_number(Widget_Data *wd)
569 Elm_Controlbar_Item * item;
572 EINA_LIST_FOREACH(wd->items, l, item)
573 if (item->order > 0) num++;
579 _insert_item_in_bar(Elm_Controlbar_Item * it, int order)
582 Elm_Controlbar_Item * item;
583 Widget_Data * wd = elm_widget_data_get(it->obj);
584 if (!wd) return NULL;
587 if (order == 0) return;
589 EINA_LIST_FOREACH(wd->items, l, item)
591 if (item->order == order && item != it)
596 EINA_LIST_FOREACH(wd->items, l, item)
599 elm_table_unpack(wd->box, item->base);
601 EINA_LIST_FOREACH(wd->items, l, item)
605 if (item->order >= order)
608 elm_table_pack(wd->box, item->base, item->order - 1, 0, 1, 1);
610 elm_table_pack(wd->box, item->base, 0, item->order - 1, 1, 1);
611 evas_object_show(item->base);
617 elm_table_pack(wd->box, it->base, it->order - 1, 0, 1, 1);
619 elm_table_pack(wd->box, it->base, 0, it->order - 1, 1, 1);
620 evas_object_show(it->base);
624 _delete_item_in_bar(Elm_Controlbar_Item * it)
627 Elm_Controlbar_Item * item;
628 Widget_Data * wd = elm_widget_data_get(it->obj);
632 EINA_LIST_FOREACH(wd->items, l, item)
638 elm_table_unpack(wd->box, it->base);
639 evas_object_hide(it->base);
644 EINA_LIST_FOREACH(wd->items, l, item)
649 elm_table_unpack(wd->box, item->base);
651 elm_table_pack(wd->box, item->base, item->order - 1, 0, 1, 1);
653 elm_table_pack(wd->box, item->base, 0, item->order - 1, 1, 1);
660 _set_item_visible(Elm_Controlbar_Item *it, Eina_Bool visible)
662 Elm_Controlbar_Item *item;
663 Eina_Bool check = EINA_TRUE;
666 if (it->obj == NULL) return;
667 Widget_Data * wd = elm_widget_data_get(it->obj);
668 if (!wd || !wd->items) return;
669 if (it->order <= 0) check = EINA_FALSE;
670 if (check == visible) return;
673 item = elm_controlbar_last_item_get(it->obj);
675 while (!elm_controlbar_item_visible_get(item)){
676 item = elm_controlbar_item_prev(item);
678 _insert_item_in_bar(it, item->order + 1);
682 _delete_item_in_bar(it);
684 wd->items = eina_list_sort(wd->items, eina_list_count(wd->items), _sort_cb);
685 _sizing_eval(it->obj);
689 _hide_selected_box(void *data)
691 Evas_Object *base = (Evas_Object *)data;
693 edje_object_part_drag_size_set(_EDJ(base), "elm.dragable.box", 0.0, 0.0);
695 return ECORE_CALLBACK_CANCEL;
699 _end_selected_box(void *data, Evas_Object *obj __UNUSED__)
701 Widget_Data * wd = (Widget_Data *)data;
703 if (_check_item(wd, wd->cur_item))
705 edje_object_signal_emit(_EDJ(wd->cur_item->base), wd->selected_signal, "elm");
709 if (wd->animating < 0)
711 printf("animation error\n");
715 ecore_idler_add(_hide_selected_box, wd->edje);
719 _move_selected_box(Widget_Data *wd, Elm_Controlbar_Item * fit, Elm_Controlbar_Item * tit)
721 Evas_Coord fx, fy, fw, fh, tx, ty, tw, th;
722 Evas_Object *from, *to;
724 if (fit->order <= 0 && wd->auto_align)
727 from = (Evas_Object *) edje_object_part_object_get(_EDJ(fit->base), "bg_img");
728 evas_object_geometry_get(from, &fx, &fy, &fw, &fh);
730 to = (Evas_Object *) edje_object_part_object_get(_EDJ(tit->base), "bg_img");
731 evas_object_geometry_get(to, &tx, &ty, &tw, &th);
733 if (_check_item(wd, wd->pre_item))
735 edje_object_signal_emit(_EDJ(wd->pre_item->base), "elm,state,unselected", "elm");
737 if (_check_item(wd, wd->cur_item))
738 edje_object_signal_emit(_EDJ(wd->cur_item->base), "elm,state,unselected", "elm");
743 if (wd->ad->timer) ecore_animator_del(wd->ad->timer);
744 wd->ad->timer = NULL;
748 wd->ad = _move_object_with_animation(wd->edje, fx, fy, fw, fh, tx, ty, tw, th,
749 0.3, _move_evas_object, _end_selected_box, wd);
753 _select_box(Elm_Controlbar_Item * it)
756 Widget_Data * wd = elm_widget_data_get(it->obj);
759 Elm_Controlbar_Item * item, *fit = NULL;
760 Evas_Object * content;
762 if (wd->animating) return;
766 if (it->style == TABBAR)
768 content = elm_layout_content_unset(wd->view, "elm.swallow.view");
769 if (content) evas_object_hide(content);
771 EINA_LIST_FOREACH(wd->items, l, item){
772 if (item->selected) {
776 item->selected = EINA_FALSE;
778 it->selected = EINA_TRUE;
780 if (fit != NULL && fit != it)
782 _move_selected_box(wd, fit, it);
786 edje_object_signal_emit(_EDJ(it->base), wd->selected_signal, "elm");
791 if (wd->more_item != it)
792 evas_object_smart_callback_call(it->obj, "view,change,before", it);
795 elm_layout_content_set(wd->view, "elm.swallow.view", it->view);
797 else if (it->style == TOOLBAR)
799 edje_object_signal_emit(_EDJ(it->base), "elm,state,text_unselected", "elm");
801 it->func(it->data, it->obj, it);
806 _cancel_selected_box(Widget_Data *wd)
809 Elm_Controlbar_Item * item;
811 EINA_LIST_FOREACH(wd->items, l, item)
813 if (item->style == TABBAR)
817 edje_object_signal_emit(_EDJ(item->base), wd->selected_signal, "elm");
821 edje_object_signal_emit(_EDJ(item->base), "elm,state,unselected", "elm");
824 else if (item->style == TOOLBAR)
826 edje_object_signal_emit(_EDJ(item->base), "elm,state,unselected", "elm");
832 _unpress_box_cb(void *data, Evas *evas __UNUSED__, Evas_Object *obj, void *event_info)
834 Widget_Data * wd = (Widget_Data *) data;
835 Evas_Event_Mouse_Up * ev = event_info;
836 Evas_Coord x, y, w, h;
838 evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_UP, _unpress_box_cb);
840 _cancel_selected_box(wd);
842 if (_check_item(wd, wd->pre_item))
844 evas_object_geometry_get(wd->pre_item->base, &x, &y, &w, &h);
845 if (ev->output.x > x && ev->output.x < x+w && ev->output.y > y && ev->output.y < y+h)
847 _select_box(wd->pre_item);
854 _press_box(Elm_Controlbar_Item * it)
856 Widget_Data * wd = elm_widget_data_get(it->obj);
857 if (!wd) return EINA_FALSE;
860 Elm_Controlbar_Item * item;
862 if (wd->animating) return EINA_FALSE;
864 if (wd->disabled || it->disabled) return EINA_FALSE;
866 EINA_LIST_FOREACH(wd->items, l, item)
870 if (it->style == TABBAR)
872 edje_object_signal_emit(_EDJ(it->base), wd->pressed_signal, "elm");
874 else if (it->style == TOOLBAR)
876 edje_object_signal_emit(_EDJ(it->base), "elm,state,toolbar_pressed", "elm");
878 evas_object_event_callback_add(it->base, EVAS_CALLBACK_MOUSE_UP, _unpress_box_cb, (void *)wd);
892 _create_item_icon(Evas_Object *obj, Elm_Controlbar_Item * it, char *part)
896 icon = elm_icon_add(obj);
897 if (!elm_icon_standard_set(icon, it->icon_path))
899 elm_icon_file_set(icon, it->icon_path, NULL);
902 evas_object_size_hint_min_set(icon, 40, 40);
903 evas_object_size_hint_max_set(icon, 100, 100);
904 evas_object_show(icon);
906 elm_button_icon_set(obj, icon);
912 _create_item_layout(Evas_Object * parent, Elm_Controlbar_Item * it, Evas_Object **item, Evas_Object **icon)
916 obj = elm_layout_add(parent);
919 fprintf(stderr, "Cannot load bg edj\n");
922 elm_layout_theme_set(obj, "controlbar", "item_bg",
923 elm_widget_style_get(it->obj));
924 evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
925 evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, EVAS_HINT_FILL);
927 *item = elm_button_add(parent);
928 if (*item == NULL) return NULL;
929 elm_object_style_set(*item, "controlbar/vertical");
930 elm_layout_content_set(obj, "item", *item);
933 elm_object_text_set(*item, it->text);
935 *icon = _create_item_icon(*item, it, "elm.swallow.icon");
941 _bar_item_down_cb(void *data, Evas * evas __UNUSED__, Evas_Object * obj, void *event_info __UNUSED__)
943 Widget_Data * wd = (Widget_Data *) data;
945 Elm_Controlbar_Item * item;
946 if (wd->animating) return;
948 EINA_LIST_FOREACH(wd->items, l, item)
949 if (item->base == obj) break;
951 if (item == NULL) return;
956 static Elm_Controlbar_Item *
957 _create_tab_item(Evas_Object * obj, const char *icon_path, const char *label,
960 Elm_Controlbar_Item * it;
964 fprintf(stderr, "Invalid argument: controlbar object is NULL\n");
967 wd = elm_widget_data_get(obj);
970 fprintf(stderr, "Cannot get smart data\n");
973 it = ELM_NEW(Elm_Controlbar_Item);
974 if (!it) return NULL;
977 it->text = eina_stringshare_add(label);
978 it->icon_path = eina_stringshare_add(icon_path);
979 it->selected = EINA_FALSE;
983 it->base = _create_item_layout(wd->edje, it, &(it->base_item), &(it->icon));
984 evas_object_event_callback_add(it->base, EVAS_CALLBACK_MOUSE_DOWN,
985 _bar_item_down_cb, wd);
986 evas_object_show(it->base);
991 static Elm_Controlbar_Item *
992 _create_tool_item(Evas_Object * obj, const char *icon_path, const char *label,
993 void (*func) (void *data, Evas_Object * obj,
994 void *event_info), void *data)
997 Elm_Controlbar_Item * it;
1001 fprintf(stderr, "Invalid argument: controlbar object is NULL\n");
1004 wd = elm_widget_data_get(obj);
1007 fprintf(stderr, "Cannot get smart data\n");
1010 it = ELM_NEW(Elm_Controlbar_Item);
1015 it->text = eina_stringshare_add(label);
1016 it->icon_path = eina_stringshare_add(icon_path);
1017 it->selected = EINA_FALSE;
1021 it->style = TOOLBAR;
1022 it->base = _create_item_layout(wd->edje, it, &(it->base_item), &(it->icon));
1023 evas_object_event_callback_add(it->base, EVAS_CALLBACK_MOUSE_DOWN,
1024 _bar_item_down_cb, wd);
1025 evas_object_show(it->base);
1030 static Elm_Controlbar_Item *
1031 _create_object_item(Evas_Object * obj, Evas_Object * obj_item, const int sel)
1033 Elm_Controlbar_Item * it;
1037 fprintf(stderr, "Invalid argument: controlbar object is NULL\n");
1040 wd = elm_widget_data_get(obj);
1043 fprintf(stderr, "Cannot get smart data\n");
1046 it = ELM_NEW(Elm_Controlbar_Item);
1053 it->base = elm_layout_add(wd->edje);
1054 elm_layout_theme_set(it->base, "controlbar", "item_bg",
1055 elm_widget_style_get(it->obj));
1056 evas_object_size_hint_weight_set(it->base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1057 evas_object_size_hint_align_set(it->base, EVAS_HINT_FILL, EVAS_HINT_FILL);
1058 it->base_item = obj_item;
1059 elm_layout_content_set(it->base, "item", it->base_item);
1060 evas_object_show(it->base);
1065 _repack_items(Widget_Data *wd)
1068 Elm_Controlbar_Item * item;
1070 EINA_LIST_FOREACH(wd->items, l, item)
1072 if (item->order > 0)
1074 elm_table_unpack(wd->box, item->base);
1076 elm_table_pack(wd->box, item->base, item->order - 1, 0, item->sel, 1);
1078 elm_table_pack(wd->box, item->base, 0, item->order - 1, item->sel, 1);
1084 _set_items_position(Evas_Object * obj, Elm_Controlbar_Item * it,
1085 Elm_Controlbar_Item * mit, Eina_Bool bar)
1089 Elm_Controlbar_Item * item;
1090 int check = EINA_FALSE;
1095 fprintf(stderr, "Invalid argument: controlbar object is NULL\n");
1098 wd = elm_widget_data_get(obj);
1101 fprintf(stderr, "Cannot get smart data\n");
1105 EINA_LIST_FOREACH(wd->items, l, item)
1107 if (item == mit && item->order > 0)
1110 it->order = mit->order;
1114 if (item->order > 0)
1116 elm_table_unpack(wd->box, item->base);
1117 item->order += it->sel;
1119 elm_table_pack(wd->box, item->base, item->order - 1, 0, item->sel, 1);
1121 elm_table_pack(wd->box, item->base, 0, item->order - 1, item->sel, 1);
1124 if (item->order > 0) order += item->sel;
1138 elm_table_pack(wd->box, it->base, it->order - 1, 0, it->sel, 1);
1140 elm_table_pack(wd->box, it->base, 0, it->order - 1, it->sel, 1);
1143 evas_object_hide(it->base);
1147 _list_clicked(void *data, Evas_Object *obj, void *event_info __UNUSED__)
1149 Elm_Controlbar_Item *item = (Elm_Controlbar_Item *)data;
1150 Elm_Controlbar_Item *it;
1153 Evas_Object *content;
1154 Elm_List_Item *lit = (Elm_List_Item *) elm_list_selected_item_get(obj);
1157 elm_list_item_selected_set(lit, 0);
1161 wd = elm_widget_data_get(item->obj);
1164 EINA_LIST_FOREACH(wd->items, l, it)
1166 it->selected = EINA_FALSE;
1169 if (item->style == TABBAR)
1171 content = elm_layout_content_unset(wd->view, "elm.swallow.view");
1172 evas_object_hide(content);
1173 item->selected = EINA_TRUE;
1174 evas_object_smart_callback_call(item->obj, "view,change,before", item);
1175 elm_layout_content_set(wd->view, "elm.swallow.view", item->view);
1178 if (item->style == TOOLBAR && item->func)
1179 item->func(item->data, item->obj, item);
1182 static Evas_Object *
1183 _create_more_view(Widget_Data *wd)
1186 Elm_Controlbar_Item *item;
1190 list = elm_list_add( wd->object );
1191 elm_list_mode_set( list, ELM_LIST_COMPRESS );
1193 EINA_LIST_FOREACH(wd->items, l, item)
1195 if (item->order <= 0)
1198 if (item->icon_path)
1200 icon = _create_item_icon(list, item, NULL);
1201 evas_object_color_set(icon, 0, 0, 0, 255);
1203 elm_list_item_append(list, item->text, icon, NULL, _list_clicked, item);
1207 elm_list_go( list );
1212 static void _ctxpopup_cb(void *data, Evas_Object *obj, void *event_info)
1214 Elm_Controlbar_Item *it;
1216 Evas_Object *ctxpopup = obj;
1217 Widget_Data *wd = (Widget_Data *)data;
1219 EINA_LIST_FOREACH(wd->items, l, it)
1220 if (!strcmp(it->text, elm_ctxpopup_item_label_get((Elm_Ctxpopup_Item *) event_info))) break;
1223 it->func(it->data, it->obj, it);
1225 if (_check_item(wd, it)) evas_object_smart_callback_call(it->obj, "clicked", it);
1227 evas_object_del(ctxpopup);
1231 static void _ctxpopup_dismissed_cb(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
1233 Evas_Object *ctxpopup = obj;
1235 evas_object_del(ctxpopup);
1240 _create_more_func(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
1242 Evas_Object *ctxpopup;
1243 Elm_Controlbar_Item *item;
1246 Evas_Coord x, y, w, h;
1247 Widget_Data *wd = elm_widget_data_get(obj);
1250 ctxpopup = elm_ctxpopup_add(wd->parent);
1251 evas_object_smart_callback_add( ctxpopup, "dismissed", _ctxpopup_dismissed_cb, wd);
1253 EINA_LIST_FOREACH(wd->items, l, item)
1255 if (item->order <= 0)
1258 if (item->icon_path)
1260 icon = _create_item_icon(ctxpopup, item, NULL);
1261 evas_object_color_set(icon, 0, 0, 0, 255);
1263 elm_ctxpopup_item_append(ctxpopup, item->text, icon, _ctxpopup_cb, wd);
1267 evas_object_geometry_get(wd->more_item->base, &x, &y, &w, &h);
1268 evas_object_move(ctxpopup, x + w/2, y + h/2);
1270 evas_object_show(ctxpopup);
1273 static Elm_Controlbar_Item *
1274 _create_more_item(Widget_Data *wd, int style)
1276 Elm_Controlbar_Item * it;
1278 it = ELM_NEW(Elm_Controlbar_Item);
1279 if (!it) return NULL;
1280 it->obj = wd->object;
1281 it->text = eina_stringshare_add("more");
1282 it->icon_path = eina_stringshare_add(CONTROLBAR_SYSTEM_ICON_MORE);
1283 it->selected = EINA_FALSE;
1285 it->view = _create_more_view(wd);
1286 it->func = _create_more_func;
1288 it->base = _create_item_layout(wd->edje, it, &(it->base_item), &(it->icon));
1289 evas_object_event_callback_add(it->base, EVAS_CALLBACK_MOUSE_DOWN,
1290 _bar_item_down_cb, wd);
1291 evas_object_show(it->base);
1293 _set_items_position(it->obj, it, NULL, EINA_TRUE);
1294 wd->items = eina_list_append(wd->items, it);
1296 wd->items = eina_list_sort(wd->items, eina_list_count(wd->items), _sort_cb);
1301 ///////////////////////////////////////////////////////////////////
1305 ////////////////////////////////////////////////////////////////////
1308 * Add a new controlbar object
1310 * @param parent The parent object
1311 * @return The new object or NULL if it cannot be created
1313 * @ingroup Controlbar
1315 EAPI Evas_Object * elm_controlbar_add(Evas_Object * parent)
1317 if (parent == NULL) return NULL;
1318 Evas_Object * obj = NULL;
1319 Evas_Object * bg = NULL;
1320 Widget_Data * wd = NULL;
1321 Evas_Coord x, y, w, h;
1322 wd = ELM_NEW(Widget_Data);
1323 Evas *evas = evas_object_evas_get(parent);
1324 if (evas == NULL) return NULL;
1325 obj = elm_widget_add(evas);
1326 if (obj == NULL) return NULL;
1327 ELM_SET_WIDTYPE(widtype, "controlbar");
1328 elm_widget_type_set(obj, "controlbar");
1329 elm_widget_sub_object_add(parent, obj);
1330 elm_widget_data_set(obj, wd);
1331 elm_widget_del_hook_set(obj, _del_hook);
1332 elm_widget_can_focus_set(obj, EINA_FALSE);
1333 elm_widget_theme_hook_set(obj, _theme_hook);
1334 elm_widget_disable_hook_set(obj, _disable_hook);
1337 wd->parent = parent;
1338 evas_object_geometry_get(parent, &x, &y, &w, &h);
1344 wd->mode = ELM_CONTROLBAR_MODE_DEFAULT;
1348 wd->vertical = EINA_FALSE;
1349 wd->auto_align = EINA_FALSE;
1350 wd->selected_animation = EINA_FALSE;
1351 wd->pressed_signal = eina_stringshare_add("elm,state,pressed");
1352 wd->selected_signal = eina_stringshare_add("elm,state,selected");
1353 wd->view = elm_layout_add(wd->parent);
1354 elm_layout_theme_set(wd->view, "controlbar", "view", "default");
1355 if (wd->view == NULL)
1357 printf("Cannot load bg edj\n");
1360 evas_object_show(wd->view);
1362 /* load background edj */
1363 wd->edje = elm_layout_add(obj);
1364 elm_layout_theme_set(wd->edje, "controlbar", "base", "default");
1365 if (wd->edje == NULL)
1367 printf("Cannot load base edj\n");
1370 evas_object_show(wd->edje);
1372 wd->bg = elm_layout_add(wd->edje);
1373 elm_layout_theme_set(wd->bg, "controlbar", "background", "default");
1376 printf("Cannot load bg edj\n");
1379 elm_layout_content_set(wd->edje, "bg_image", wd->bg);
1382 evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_RESIZE,
1383 _controlbar_object_resize, obj);
1384 evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_MOVE,
1385 _controlbar_object_move, obj);
1386 evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_SHOW,
1387 _controlbar_object_show, obj);
1388 evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_HIDE,
1389 _controlbar_object_hide, obj);
1391 bg = elm_layout_content_get(wd->edje, "bg_image");
1392 evas_object_event_callback_add(bg, EVAS_CALLBACK_MOVE, _controlbar_object_move, obj);
1393 evas_object_event_callback_add(bg, EVAS_CALLBACK_RESIZE, _controlbar_object_resize, obj);
1396 wd->box = elm_table_add(wd->edje);
1397 elm_table_homogenous_set(wd->box, EINA_TRUE);
1398 evas_object_size_hint_weight_set(wd->box, EVAS_HINT_EXPAND,
1400 evas_object_size_hint_align_set(wd->box, EVAS_HINT_FILL, EVAS_HINT_FILL);
1401 elm_layout_content_set(wd->edje, "elm.swallow.items", wd->box);
1402 evas_object_show(wd->box);
1404 evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj);
1406 evas_object_smart_member_add(wd->view, obj);
1407 elm_widget_resize_object_set(obj, wd->edje);
1415 * Append new tab item
1417 * @param obj The controlbar object
1418 * @param icon_path The icon path of item
1419 * @param label The label of item
1420 * @param view The view of item
1421 * @return The item of controlbar
1423 * @ingroup Controlbar
1425 EAPI Elm_Controlbar_Item * elm_controlbar_tab_item_append(Evas_Object * obj,
1432 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1433 Elm_Controlbar_Item * it;
1434 Elm_Controlbar_Item * lit;
1436 it = _create_tab_item(obj, icon_path, label, view);
1437 if (!it) return NULL;
1438 wd = elm_widget_data_get(obj);
1439 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1440 if (!wd->more_item) {
1441 lit = elm_controlbar_last_item_get(obj);
1442 _set_item_visible(lit, EINA_FALSE);
1443 _create_more_item(wd, TABBAR);
1445 _set_items_position(obj, it, NULL, EINA_FALSE);
1448 _set_items_position(obj, it, NULL, EINA_TRUE);
1450 wd->items = eina_list_append(wd->items, it);
1452 elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1454 _check_background(wd);
1460 * Prepend new tab item
1462 * @param obj The controlbar object
1463 * @param icon_path The icon path of item
1464 * @param label The label of item
1465 * @param view The view of item
1466 * @return The item of controlbar
1468 * @ingroup Controlbar
1470 EAPI Elm_Controlbar_Item * elm_controlbar_tab_item_prepend(Evas_Object *
1479 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1481 Elm_Controlbar_Item * it;
1482 Elm_Controlbar_Item * lit;
1483 Elm_Controlbar_Item * item;
1484 it = _create_tab_item(obj, icon_path, label, view);
1485 if (!it) return NULL;
1486 wd = elm_widget_data_get(obj);
1487 item = eina_list_data_get(wd->items);
1488 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1489 if (!wd->more_item) {
1490 lit = elm_controlbar_last_item_get(obj);
1491 _set_item_visible(lit, EINA_FALSE);
1492 _create_more_item(wd, TABBAR);
1494 lit = elm_controlbar_item_prev(wd->more_item);
1495 _set_item_visible(lit, EINA_FALSE);
1496 _set_items_position(obj, it, item, EINA_TRUE);
1499 _set_items_position(obj, it, item, EINA_TRUE);
1501 wd->items = eina_list_prepend(wd->items, it);
1503 elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1505 _check_background(wd);
1511 * Insert new tab item before given item
1513 * @param obj The controlbar object
1514 * @param before The given item
1515 * @param icon_path The icon path of item
1516 * @param label The label of item
1517 * @param view The view of item
1518 * @return The item of controlbar
1520 * @ingroup Controlbar
1522 EAPI Elm_Controlbar_Item *
1523 elm_controlbar_tab_item_insert_before(Evas_Object * obj,
1524 Elm_Controlbar_Item * before,
1525 const char *icon_path,
1526 const char *label, Evas_Object * view)
1528 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1530 Elm_Controlbar_Item * it;
1531 Elm_Controlbar_Item * lit;
1532 if (!before) return NULL;
1533 it = _create_tab_item(obj, icon_path, label, view);
1534 if (!it) return NULL;
1535 wd = elm_widget_data_get(obj);
1536 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1539 lit = elm_controlbar_last_item_get(obj);
1540 _set_item_visible(lit, EINA_FALSE);
1541 _create_more_item(wd, TABBAR);
1543 before = wd->more_item;
1544 if (before->order > 0)
1546 lit = elm_controlbar_item_prev(wd->more_item);
1547 _set_item_visible(lit, EINA_FALSE);
1548 _set_items_position(obj, it, before, EINA_TRUE);
1552 _set_items_position(obj, it, before, EINA_FALSE);
1556 _set_items_position(obj, it, before, EINA_TRUE);
1558 wd->items = eina_list_prepend_relative(wd->items, it, before);
1560 elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1562 _check_background(wd);
1568 * Insert new tab item after given item
1570 * @param obj The controlbar object
1571 * @param after The given item
1572 * @param icon_path The icon path of item
1573 * @param label The label of item
1574 * @param view The view of item
1575 * @return The item of controlbar
1577 * @ingroup Controlbar
1579 EAPI Elm_Controlbar_Item *
1580 elm_controlbar_tab_item_insert_after(Evas_Object * obj,
1581 Elm_Controlbar_Item * after,
1582 const char *icon_path, const char *label,
1585 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1587 Elm_Controlbar_Item * it;
1588 Elm_Controlbar_Item * lit;
1589 Elm_Controlbar_Item * item;
1590 if (!after) return NULL;
1591 it = _create_tab_item(obj, icon_path, label, view);
1592 if (!it) return NULL;
1593 wd = elm_widget_data_get(obj);
1594 item = elm_controlbar_item_next(after);
1595 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1598 lit = elm_controlbar_last_item_get(obj);
1599 _set_item_visible(lit, EINA_FALSE);
1600 _create_more_item(wd, TABBAR);
1602 lit = elm_controlbar_item_prev(wd->more_item);
1603 if (lit != after && item->order > 0)
1605 _set_item_visible(lit, EINA_FALSE);
1606 _set_items_position(obj, it, item, EINA_TRUE);
1610 _set_items_position(obj, it, NULL, EINA_FALSE);
1614 _set_items_position(obj, it, item, EINA_TRUE);
1616 wd->items = eina_list_append_relative(wd->items, it, after);
1618 elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1620 _check_background(wd);
1626 * Append new tool item
1628 * @param obj The controlbar object
1629 * @param icon_path The icon path of item
1630 * @param label The label of item
1631 * @param func Callback function of item
1632 * @param data The data of callback function
1633 * @return The item of controlbar
1635 * @ingroup Controlbar
1637 EAPI Elm_Controlbar_Item * elm_controlbar_tool_item_append(Evas_Object *
1652 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1653 Elm_Controlbar_Item * it;
1654 Elm_Controlbar_Item * lit;
1656 it = _create_tool_item(obj, icon_path, label, func, data);
1657 if (!it) return NULL;
1658 wd = elm_widget_data_get(obj);
1659 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1660 if (!wd->more_item) {
1661 lit = elm_controlbar_last_item_get(obj);
1662 _set_item_visible(lit, EINA_FALSE);
1663 _create_more_item(wd, TOOLBAR);
1665 _set_items_position(obj, it, NULL, EINA_FALSE);
1668 _set_items_position(obj, it, NULL, EINA_TRUE);
1670 wd->items = eina_list_append(wd->items, it);
1671 _check_toolbar_line(wd);
1677 * Prepend new tool item
1679 * @param obj The controlbar object
1680 * @param icon_path The icon path of item
1681 * @param label The label of item
1682 * @param func Callback function of item
1683 * @param data The data of callback function
1684 * @return The item of controlbar
1686 * @ingroup Controlbar
1688 EAPI Elm_Controlbar_Item * elm_controlbar_tool_item_prepend(Evas_Object *
1704 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1706 Elm_Controlbar_Item * it;
1707 Elm_Controlbar_Item * lit;
1708 Elm_Controlbar_Item * item;
1709 it = _create_tool_item(obj, icon_path, label, func, data);
1710 if (!it) return NULL;
1711 wd = elm_widget_data_get(obj);
1712 item = eina_list_data_get(wd->items);
1713 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1714 if (!wd->more_item) {
1715 lit = elm_controlbar_last_item_get(obj);
1716 _set_item_visible(lit, EINA_FALSE);
1717 _create_more_item(wd, TOOLBAR);
1719 lit = elm_controlbar_item_prev(wd->more_item);
1720 _set_item_visible(lit, EINA_FALSE);
1721 _set_items_position(obj, it, item, EINA_TRUE);
1724 _set_items_position(obj, it, item, EINA_TRUE);
1726 wd->items = eina_list_prepend(wd->items, it);
1727 _check_toolbar_line(wd);
1733 * Insert new tool item before given item
1735 * @param obj The controlbar object
1736 * @param before The given item
1737 * @param icon_path The icon path of item
1738 * @param label The label of item
1739 * @param func Callback function of item
1740 * @param data The data of callback function
1741 * @return The item of controlbar
1743 * @ingroup Controlbar
1745 EAPI Elm_Controlbar_Item *
1746 elm_controlbar_tool_item_insert_before(Evas_Object * obj,
1747 Elm_Controlbar_Item * before,
1748 const char *icon_path,
1750 void (*func) (void *data,
1755 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1757 Elm_Controlbar_Item * it;
1758 Elm_Controlbar_Item * lit;
1759 if (!before) return NULL;
1760 it = _create_tool_item(obj, icon_path, label, func, data);
1761 if (!it) return NULL;
1762 wd = elm_widget_data_get(obj);
1763 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1766 lit = elm_controlbar_last_item_get(obj);
1767 _set_item_visible(lit, EINA_FALSE);
1768 _create_more_item(wd, TOOLBAR);
1770 before = wd->more_item;
1771 if (before->order > 0)
1773 lit = elm_controlbar_item_prev(wd->more_item);
1774 _set_item_visible(lit, EINA_FALSE);
1775 _set_items_position(obj, it, before, EINA_TRUE);
1779 _set_items_position(obj, it, before, EINA_FALSE);
1783 _set_items_position(obj, it, before, EINA_TRUE);
1785 wd->items = eina_list_prepend_relative(wd->items, it, before);
1786 _check_toolbar_line(wd);
1792 * Insert new tool item after given item
1794 * @param obj The controlbar object
1795 * @param after The given item
1796 * @param icon_path The icon path of item
1797 * @param label The label of item
1798 * @param func Callback function of item
1799 * @param data The data of callback function
1800 * @return The item of controlbar
1802 * @ingroup Controlbar
1804 EAPI Elm_Controlbar_Item *
1805 elm_controlbar_tool_item_insert_after(Evas_Object * obj,
1806 Elm_Controlbar_Item * after,
1807 const char *icon_path,
1809 void (*func) (void *data,
1814 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1816 Elm_Controlbar_Item * it;
1817 Elm_Controlbar_Item * lit;
1818 Elm_Controlbar_Item * item;
1819 if (!after) return NULL;
1820 it = _create_tool_item(obj, icon_path, label, func, data);
1821 if (!it) return NULL;
1822 wd = elm_widget_data_get(obj);
1823 item = elm_controlbar_item_next(after);
1824 if (_check_bar_item_number(wd) >= 5 && wd->auto_align){
1827 lit = elm_controlbar_last_item_get(obj);
1828 _set_item_visible(lit, EINA_FALSE);
1829 _create_more_item(wd, TOOLBAR);
1831 lit = elm_controlbar_item_prev(wd->more_item);
1832 if (lit != after && item->order > 0)
1834 _set_item_visible(lit, EINA_FALSE);
1835 _set_items_position(obj, it, item, EINA_TRUE);
1839 _set_items_position(obj, it, NULL, EINA_FALSE);
1843 _set_items_position(obj, it, item, EINA_TRUE);
1845 wd->items = eina_list_append_relative(wd->items, it, after);
1846 _check_toolbar_line(wd);
1852 * Append new object item
1854 * @param obj The controlbar object
1855 * @param obj_item The object of item
1856 * @param sel The number of sel occupied
1857 * @return The item of controlbar
1859 * @ingroup Controlbar
1861 EAPI Elm_Controlbar_Item * elm_controlbar_object_item_append(Evas_Object *
1867 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1869 Elm_Controlbar_Item * it;
1870 it = _create_object_item(obj, obj_item, sel);
1871 if (!it) return NULL;
1872 wd = elm_widget_data_get(obj);
1873 if (!wd) return NULL;
1874 _set_items_position(obj, it, NULL, EINA_TRUE);
1875 wd->items = eina_list_append(wd->items, it);
1881 * Prepend new object item
1883 * @param obj The controlbar object
1884 * @param obj_item The object of item
1885 * @param sel The number of sel occupied
1886 * @return The item of controlbar
1888 * @ingroup Controlbar
1890 EAPI Elm_Controlbar_Item * elm_controlbar_object_item_prepend(Evas_Object *
1896 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1898 Elm_Controlbar_Item * it;
1899 Elm_Controlbar_Item * item;
1900 it = _create_object_item(obj, obj_item, sel);
1901 if (!it) return NULL;
1902 wd = elm_widget_data_get(obj);
1903 if (!wd) return NULL;
1904 item = eina_list_data_get(wd->items);
1905 _set_items_position(obj, it, item, EINA_TRUE);
1906 wd->items = eina_list_prepend(wd->items, it);
1912 * Insert new object item before given item
1914 * @param obj The controlbar object
1915 * @param before The given item
1916 * @param obj_item The object of item
1917 * @param sel The number of sel occupied
1918 * @return The item of controlbar
1920 * @ingroup Controlbar
1922 EAPI Elm_Controlbar_Item *
1923 elm_controlbar_object_item_insert_before(Evas_Object * obj,
1924 Elm_Controlbar_Item * before,
1925 Evas_Object * obj_item, const int sel)
1927 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1929 Elm_Controlbar_Item * it;
1930 if (!before) return NULL;
1931 it = _create_object_item(obj, obj_item, sel);
1932 if (!it) return NULL;
1933 wd = elm_widget_data_get(obj);
1934 if (!wd) return NULL;
1935 _set_items_position(obj, it, before, EINA_TRUE);
1936 wd->items = eina_list_prepend_relative(wd->items, it, before);
1942 * Insert new object item after given item
1944 * @param obj The controlbar object
1945 * @param after The given item
1946 * @param obj_item The object of item
1947 * @param sel The number of sel occupied
1948 * @return The item of controlbar
1950 * @ingroup Controlbar
1952 EAPI Elm_Controlbar_Item *
1953 elm_controlbar_object_item_insert_after(Evas_Object * obj,
1954 Elm_Controlbar_Item * after,
1955 Evas_Object * obj_item, const int sel)
1957 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1959 Elm_Controlbar_Item * it;
1960 Elm_Controlbar_Item * item;
1961 if (!after) return NULL;
1962 it = _create_object_item(obj, obj_item, sel);
1963 if (!it) return NULL;
1964 wd = elm_widget_data_get(obj);
1965 if (!wd) return NULL;
1966 item = elm_controlbar_item_next(after);
1967 _set_items_position(obj, it, item, EINA_TRUE);
1968 wd->items = eina_list_append_relative(wd->items, it, after);
1974 * Get the object of the object item
1976 * @param it The item of controlbar
1977 * @return The object of the object item
1979 * @ingroup Controlbar
1982 elm_controlbar_object_item_object_get(const Elm_Controlbar_Item * it)
1984 if (!it) return NULL;
1985 if (it->style != OBJECT) return NULL;
1986 if (!it->base_item) return NULL;
1987 return it->base_item;
1991 * Delete item from controlbar
1993 * @param it The item of controlbar
1995 * @ingroup Controlbar
1998 elm_controlbar_item_del(Elm_Controlbar_Item * it)
2005 Elm_Controlbar_Item * item;
2015 if (it->obj == NULL)
2017 printf("Invalid argument: controlbar object is NULL\n");
2020 wd = elm_widget_data_get(it->obj);
2023 printf("Cannot get smart data\n");
2031 elm_table_unpack(wd->box, it->base);
2033 EINA_LIST_FOREACH(wd->items, l, item)
2037 if (item->order > it->order)
2040 elm_table_unpack(wd->box, item->base);
2043 elm_table_pack(wd->box, item->base, item->order - 1, 0, item->sel, 1);
2045 elm_table_pack(wd->box, item->base, 0, item->order - 1, item->sel, 1);
2053 // delete item in list
2055 wd->items = eina_list_remove(wd->items, it);
2058 wd->num = wd->num - 1;
2063 * Select item in controlbar
2065 * @param it The item of controlbar
2067 * @ingroup Controlbar
2070 elm_controlbar_item_select(Elm_Controlbar_Item * it)
2073 if (it->obj == NULL) return;
2074 Widget_Data * wd = elm_widget_data_get(it->obj);
2081 * Set the icon of item
2083 * @param it The item of controlbar
2084 * @param icon_path The icon path of the item
2085 * @return The icon object
2087 * @ingroup Controlbar
2090 elm_controlbar_item_icon_set(Elm_Controlbar_Item * it, const char *icon_path)
2093 if (it->style == OBJECT) return;
2096 eina_stringshare_del(it->icon_path);
2097 it->icon_path = NULL;
2101 evas_object_del(it->icon);
2104 if (icon_path != NULL)
2106 it->icon_path = eina_stringshare_add(icon_path);
2107 it->icon = _create_item_icon(it->base_item, it, "elm.swallow.icon");
2109 if (it->wd->disabled || it->disabled)
2110 elm_widget_disabled_set(it->base_item, EINA_TRUE);
2112 elm_widget_disabled_set(it->base_item, EINA_FALSE);
2116 * Get the icon of item
2118 * @param it The item of controlbar
2119 * @return The icon object
2121 * @ingroup Controlbar
2124 elm_controlbar_item_icon_get(const Elm_Controlbar_Item * it)
2126 if (!it) return NULL;
2131 * Set the label of item
2133 * @param it The item of controlbar
2134 * @param label The label of item
2136 * @ingroup Controlbar
2139 elm_controlbar_item_label_set(Elm_Controlbar_Item * it, const char *label)
2142 if (it->style == OBJECT) return;
2145 eina_stringshare_del(it->text);
2150 it->text = eina_stringshare_add(label);
2151 elm_object_text_set(it->base_item, it->text);
2153 if (it->wd->disabled || it->disabled)
2154 elm_widget_disabled_set(it->base_item, EINA_TRUE);
2156 elm_widget_disabled_set(it->base_item, EINA_FALSE);
2160 * Get the label of item
2162 * @param it The item of controlbar
2163 * @return The label of item
2165 * @ingroup Controlbar
2168 elm_controlbar_item_label_get(const Elm_Controlbar_Item * it)
2170 if (!it) return NULL;
2175 * Get the selected item
2177 * @param obj The controlbar object
2178 * @return The item of controlbar
2180 * @ingroup Controlbar
2182 EAPI Elm_Controlbar_Item * elm_controlbar_selected_item_get(const Evas_Object *
2185 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
2188 Elm_Controlbar_Item * item;
2189 if (obj == NULL) return NULL;
2190 Widget_Data * wd = elm_widget_data_get(obj);
2191 if (!wd || !wd->items) return NULL;
2192 EINA_LIST_FOREACH(wd->items, l, item)
2194 if (item->selected) return item;
2200 * Get the first item
2202 * @param obj The controlbar object
2203 * @return The item of controlbar
2205 * @ingroup Controlbar
2207 EAPI Elm_Controlbar_Item * elm_controlbar_first_item_get(const Evas_Object * obj)
2209 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
2210 Widget_Data * wd = elm_widget_data_get(obj);
2211 if (!wd || !wd->items) return NULL;
2212 return eina_list_data_get(wd->items);
2218 * @param obj The controlbar object
2219 * @return The item of controlbar
2221 * @ingroup Controlbar
2223 EAPI Elm_Controlbar_Item * elm_controlbar_last_item_get(const Evas_Object * obj)
2225 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
2226 Widget_Data * wd = elm_widget_data_get(obj);
2227 if (!wd || !wd->items) return NULL;
2228 return eina_list_data_get(eina_list_last(wd->items));
2234 * @param obj The controlbar object
2235 * @return The list of the items
2237 * @ingroup Controlbar
2239 EAPI const Eina_List * elm_controlbar_items_get(const Evas_Object * obj)
2241 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
2242 Widget_Data * wd = elm_widget_data_get(obj);
2243 if (!wd || !wd->items) return NULL;
2248 * Get the previous item
2250 * @param it The item of controlbar
2251 * @return The previous item of the parameter item
2253 * @ingroup Controlbar
2255 EAPI Elm_Controlbar_Item * elm_controlbar_item_prev(Elm_Controlbar_Item *
2258 if (!it) return NULL;
2261 Elm_Controlbar_Item * item;
2262 if (it->obj == NULL) return NULL;
2263 Widget_Data * wd = elm_widget_data_get(it->obj);
2264 if (!wd || !wd->items) return NULL;
2265 EINA_LIST_FOREACH(wd->items, l, item)
2269 l = eina_list_prev(l);
2270 if (!l) return NULL;
2271 return eina_list_data_get(l);
2280 * @param obj The controlbar object
2281 * @return The next item of the parameter item
2283 * @ingroup Controlbar
2285 EAPI Elm_Controlbar_Item * elm_controlbar_item_next(Elm_Controlbar_Item *
2288 if (!it) return NULL;
2291 Elm_Controlbar_Item * item;
2292 if (it->obj == NULL) return NULL;
2293 Widget_Data * wd = elm_widget_data_get(it->obj);
2294 if (!wd || !wd->items) return NULL;
2295 EINA_LIST_FOREACH(wd->items, l, item)
2299 l = eina_list_next(l);
2300 if (!l) return NULL;
2301 return eina_list_data_get(l);
2308 * Set the visible status of item in bar
2310 * @param it The item of controlbar
2311 * @param bar EINA_TRUE or EINA_FALSE
2313 * @ingroup Controlbar
2316 elm_controlbar_item_visible_set(Elm_Controlbar_Item * it, Eina_Bool visible)
2319 if (it->obj == NULL) return;
2320 Widget_Data * wd = elm_widget_data_get(it->obj);
2323 if (!wd->auto_align)
2324 _set_item_visible(it, visible);
2328 * Get the result which or not item is visible in bar
2330 * @param it The item of controlbar
2331 * @return EINA_TRUE or EINA_FALSE
2333 * @ingroup Controlbar
2336 elm_controlbar_item_visible_get(const Elm_Controlbar_Item * it)
2338 if (!it) return EINA_FALSE;
2339 if (it->obj == NULL) return EINA_FALSE;
2340 Widget_Data * wd = elm_widget_data_get(it->obj);
2341 if (!wd) return EINA_FALSE;
2342 if (it->order <= 0) return EINA_FALSE;
2350 * @param it The item of controlbar
2351 * @param bar EINA_TRUE or EINA_FALSE
2353 * @ingroup Controlbar
2356 elm_controlbar_item_disabled_set(Elm_Controlbar_Item * it, Eina_Bool disabled)
2360 if (it->disabled == disabled) return;
2362 it->disabled = disabled;
2364 if (it->wd && it->wd->disabled) return;
2366 if (it->base_item) elm_widget_disabled_set(it->base_item, disabled);
2372 * @param it The item of controlbar
2373 * @return EINA_TRUE or EINA_FALSE
2375 * @ingroup Controlbar
2378 elm_controlbar_item_disabled_get(const Elm_Controlbar_Item * it)
2380 if (!it) return EINA_FALSE;
2382 return it->disabled;
2386 * Set the view of the item
2388 * @param it The item of controlbar
2389 * @param view The view for the item
2391 * @ingroup Controlbar
2394 elm_controlbar_item_view_set(Elm_Controlbar_Item *it, Evas_Object * view)
2397 if (it->view == view) return;
2399 evas_object_del(it->view);
2404 * Get the view of the item
2406 * @param it The item of controlbar
2407 * @return The view for the item
2409 * @ingroup Controlbar
2412 elm_controlbar_item_view_get(const Elm_Controlbar_Item *it)
2414 if (!it) return NULL;
2420 * Unset the view of the item
2422 * @param it The item of controlbar
2423 * @return The view for the item
2425 * @ingroup Controlbar
2428 elm_controlbar_item_view_unset(Elm_Controlbar_Item *it)
2430 if (!it) return NULL;
2431 if (it->obj == NULL) return NULL;
2432 Widget_Data * wd = elm_widget_data_get(it->obj);
2433 if (!wd) return NULL;
2434 Evas_Object *content;
2436 if (it->view == elm_layout_content_get(wd->view, "elm.swallow.view"))
2438 content = elm_layout_content_unset(wd->view, "elm.swallow.view");
2439 if (content) evas_object_hide(content);
2450 * Set the mode of the controlbar
2452 * @param obj The object of the controlbar
2453 * @param mode The mode of the controlbar
2455 * @ingroup Controlbar
2458 elm_controlbar_mode_set(Evas_Object *obj, int mode)
2460 ELM_CHECK_WIDTYPE(obj, widtype);
2461 Widget_Data *wd = elm_widget_data_get(obj);
2464 fprintf(stderr, "Cannot get smart data\n");
2467 Evas_Object *selected_box;
2473 case ELM_CONTROLBAR_MODE_DEFAULT:
2474 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,default", "elm");
2476 case ELM_CONTROLBAR_MODE_TRANSLUCENCE:
2477 elm_controlbar_alpha_set(obj, 85);
2479 case ELM_CONTROLBAR_MODE_TRANSPARENCY:
2480 elm_controlbar_alpha_set(obj, 0);
2482 case ELM_CONTROLBAR_MODE_LARGE:
2483 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,large", "elm");
2485 case ELM_CONTROLBAR_MODE_SMALL:
2486 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,small", "elm");
2488 case ELM_CONTROLBAR_MODE_LEFT:
2489 selected_box = elm_layout_content_get(wd->edje, "elm.dragable.box");
2490 if (selected_box) edje_object_signal_emit(_EDJ(selected_box), "elm,state,left", "elm");
2491 wd->selected_signal = eina_stringshare_add("elm,state,selected_left");
2492 wd->pressed_signal = eina_stringshare_add("elm,state,pressed_left");
2493 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,left", "elm");
2494 _check_background(wd);
2497 case ELM_CONTROLBAR_MODE_RIGHT:
2498 selected_box = elm_layout_content_get(wd->edje, "elm.dragable.box");
2499 if (selected_box) edje_object_signal_emit(_EDJ(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);
2509 selected_box = elm_layout_content_get(wd->edje, "elm.dragable.box");
2510 if (selected_box) edje_object_signal_emit(_EDJ(selected_box), "elm,state,default", "elm");
2511 wd->selected_signal = eina_stringshare_add("elm,state,selected");
2512 wd->pressed_signal = eina_stringshare_add("elm,state,pressed");
2513 _check_background(wd);
2518 * Set the alpha of the controlbar
2520 * @param obj The object of the controlbar
2521 * @param alpha The alpha value of the controlbar (0-100)
2523 * @ingroup Controlbar
2526 elm_controlbar_alpha_set(Evas_Object *obj, int alpha)
2528 ELM_CHECK_WIDTYPE(obj, widtype);
2530 Widget_Data *wd = elm_widget_data_get(obj);
2533 fprintf(stderr, "Cannot get smart data\n");
2537 if (alpha < 0) wd->alpha = 0;
2538 else if (alpha > 100) wd->alpha = 100;
2539 else wd->alpha = alpha;
2541 evas_object_color_get(wd->bg, &r, &g, &b, NULL);
2542 evas_object_color_set(wd->bg, r, g, b, (int)(255 * wd->alpha / 100));
2547 * Set auto-align mode of the controlbar(It's not prepared yet)
2548 * If you set the auto-align and add items more than 5,
2549 * the "more" item will be made and the items more than 5 will be unvisible.
2551 * @param obj The object of the controlbar
2552 * @param auto_align The dicision that the controlbar use the auto-align
2554 * @ingroup Controlbar
2557 elm_controlbar_item_auto_align_set(Evas_Object *obj, Eina_Bool auto_align)
2559 ELM_CHECK_WIDTYPE(obj, widtype);
2560 Widget_Data *wd = elm_widget_data_get(obj);
2561 Elm_Controlbar_Item *item;
2566 fprintf(stderr, "Cannot get smart data\n");
2570 if (wd->auto_align == auto_align) return;
2574 if (_check_bar_item_number(wd) >= 5 && !wd->more_item)
2577 EINA_LIST_FOREACH(wd->items, l, item)
2579 if (elm_controlbar_item_visible_get(item))
2582 _delete_item_in_bar(item);
2585 item = elm_controlbar_last_item_get(obj);
2586 while (!elm_controlbar_item_visible_get(item)){
2587 item = elm_controlbar_item_prev(item);
2589 _create_more_item(wd, item->style);
2597 if (wd->more_item->view)
2598 evas_object_del(wd->more_item->view);
2599 wd->items = eina_list_remove(wd->items, wd->more_item);
2600 eina_stringshare_del(wd->more_item->text);
2601 if (wd->more_item->icon)
2602 evas_object_del(wd->more_item->icon);
2603 if (wd->more_item->base)
2604 evas_object_del(wd->more_item->base);
2605 if (wd->more_item->base_item)
2606 evas_object_del(wd->more_item->base_item);
2607 free(wd->more_item);
2608 wd->more_item = NULL;
2610 // make all item is visible
2612 EINA_LIST_FOREACH(wd->items, l, item)
2614 if (!elm_controlbar_item_visible_get(item))
2615 _insert_item_in_bar(item, i);
2620 wd->auto_align = auto_align;
2625 * Set the vertical mode of the controlbar
2627 * @param obj The object of the controlbar
2628 * @param vertical The vertical mode of the controlbar (TRUE = vertical, FALSE = horizontal)
2630 * @ingroup Controlbar
2633 elm_controlbar_vertical_set(Evas_Object *obj, Eina_Bool vertical)
2635 ELM_CHECK_WIDTYPE(obj, widtype);
2636 Widget_Data *wd = elm_widget_data_get(obj);
2639 fprintf(stderr, "Cannot get smart data\n");
2643 if (wd->vertical == vertical) return;
2644 wd->vertical = vertical;
2646 if (_check_bar_item_number(wd) > 1)
2650 _check_toolbar_line(wd);
2654 * Get the button object of the item
2656 * @param it The item of controlbar
2657 * @return button object of the item
2659 * @ingroup Controlbar
2662 elm_controlbar_item_button_get(const Elm_Controlbar_Item *it)
2664 if (!it) return NULL;
2665 if (it->style == OBJECT) return NULL;
2667 if (it->base_item) return it->base_item;