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 = 0.0, vx = 0.0, vy = 0.0, vw = 0.0, vh = 0.0;
367 int dx = 0 , dy = 0, dw = 0, dh = 0;
368 int px = 0, py = 0, pw = 0, ph = 0;
369 int ox = 0, oy = 0, ow = 0, oh = 0;
370 int x = 0, y = 0, w = 0, h = 0;
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);
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;
1218 Widget_Data *wd = (Widget_Data *)data;
1220 EINA_LIST_FOREACH(wd->items, l, it)
1222 label = elm_ctxpopup_item_label_get((Elm_Object_Item *) event_info);
1223 if ((label) && (!strcmp(it->text, label))) break;
1227 it->func(it->data, it->obj, it);
1229 if (_check_item(wd, it)) evas_object_smart_callback_call(it->obj, "clicked", it);
1231 evas_object_del(ctxpopup);
1235 static void _ctxpopup_dismissed_cb(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
1237 Evas_Object *ctxpopup = obj;
1239 evas_object_del(ctxpopup);
1244 _create_more_func(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
1246 Evas_Object *ctxpopup;
1247 Elm_Controlbar_Item *item;
1250 Evas_Coord x, y, w, h;
1251 Widget_Data *wd = elm_widget_data_get(obj);
1254 ctxpopup = elm_ctxpopup_add(wd->parent);
1255 evas_object_smart_callback_add( ctxpopup, "dismissed", _ctxpopup_dismissed_cb, wd);
1257 EINA_LIST_FOREACH(wd->items, l, item)
1259 if (item->order <= 0)
1262 if (item->icon_path)
1264 icon = _create_item_icon(ctxpopup, item, NULL);
1265 evas_object_color_set(icon, 0, 0, 0, 255);
1267 elm_ctxpopup_item_append(ctxpopup, item->text, icon, _ctxpopup_cb, wd);
1271 evas_object_geometry_get(wd->more_item->base, &x, &y, &w, &h);
1272 evas_object_move(ctxpopup, x + w/2, y + h/2);
1274 evas_object_show(ctxpopup);
1277 static Elm_Controlbar_Item *
1278 _create_more_item(Widget_Data *wd, int style)
1280 Elm_Controlbar_Item * it;
1282 it = ELM_NEW(Elm_Controlbar_Item);
1283 if (!it) return NULL;
1284 it->obj = wd->object;
1285 it->text = eina_stringshare_add("more");
1286 it->icon_path = eina_stringshare_add(CONTROLBAR_SYSTEM_ICON_MORE);
1287 it->selected = EINA_FALSE;
1289 it->view = _create_more_view(wd);
1290 it->func = _create_more_func;
1292 it->base = _create_item_layout(wd->edje, it, &(it->base_item), &(it->icon));
1293 evas_object_event_callback_add(it->base, EVAS_CALLBACK_MOUSE_DOWN,
1294 _bar_item_down_cb, wd);
1295 evas_object_show(it->base);
1297 _set_items_position(it->obj, it, NULL, EINA_TRUE);
1298 wd->items = eina_list_append(wd->items, it);
1300 wd->items = eina_list_sort(wd->items, eina_list_count(wd->items), _sort_cb);
1305 ///////////////////////////////////////////////////////////////////
1309 ////////////////////////////////////////////////////////////////////
1312 * Add a new controlbar object
1314 * @param parent The parent object
1315 * @return The new object or NULL if it cannot be created
1317 * @ingroup Controlbar
1319 EAPI Evas_Object * elm_controlbar_add(Evas_Object * parent)
1321 if (parent == NULL) return NULL;
1322 Evas_Object * obj = NULL;
1323 Evas_Object * bg = NULL;
1324 Widget_Data * wd = NULL;
1325 Evas_Coord x, y, w, h;
1327 ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL);
1328 ELM_SET_WIDTYPE(widtype, "controlbar");
1329 elm_widget_type_set(obj, "controlbar");
1330 elm_widget_sub_object_add(parent, obj);
1331 elm_widget_data_set(obj, wd);
1332 elm_widget_del_hook_set(obj, _del_hook);
1333 elm_widget_can_focus_set(obj, EINA_FALSE);
1334 elm_widget_theme_hook_set(obj, _theme_hook);
1335 elm_widget_disable_hook_set(obj, _disable_hook);
1338 wd->parent = parent;
1339 evas_object_geometry_get(parent, &x, &y, &w, &h);
1345 wd->mode = ELM_CONTROLBAR_MODE_DEFAULT;
1349 wd->vertical = EINA_FALSE;
1350 wd->auto_align = EINA_FALSE;
1351 wd->selected_animation = EINA_FALSE;
1352 wd->pressed_signal = eina_stringshare_add("elm,state,pressed");
1353 wd->selected_signal = eina_stringshare_add("elm,state,selected");
1354 wd->view = elm_layout_add(wd->parent);
1355 elm_layout_theme_set(wd->view, "controlbar", "view", "default");
1356 if (wd->view == NULL)
1358 printf("Cannot load bg edj\n");
1361 evas_object_show(wd->view);
1363 /* load background edj */
1364 wd->edje = elm_layout_add(obj);
1365 elm_layout_theme_set(wd->edje, "controlbar", "base", "default");
1366 if (wd->edje == NULL)
1368 printf("Cannot load base edj\n");
1371 evas_object_show(wd->edje);
1373 wd->bg = elm_layout_add(wd->edje);
1374 elm_layout_theme_set(wd->bg, "controlbar", "background", "default");
1377 printf("Cannot load bg edj\n");
1380 elm_layout_content_set(wd->edje, "bg_image", wd->bg);
1383 evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_RESIZE,
1384 _controlbar_object_resize, obj);
1385 evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_MOVE,
1386 _controlbar_object_move, obj);
1387 evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_SHOW,
1388 _controlbar_object_show, obj);
1389 evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_HIDE,
1390 _controlbar_object_hide, obj);
1392 bg = elm_layout_content_get(wd->edje, "bg_image");
1393 evas_object_event_callback_add(bg, EVAS_CALLBACK_MOVE, _controlbar_object_move, obj);
1394 evas_object_event_callback_add(bg, EVAS_CALLBACK_RESIZE, _controlbar_object_resize, obj);
1397 wd->box = elm_table_add(wd->edje);
1398 elm_table_homogeneous_set(wd->box, EINA_TRUE);
1399 evas_object_size_hint_weight_set(wd->box, EVAS_HINT_EXPAND,
1401 evas_object_size_hint_align_set(wd->box, EVAS_HINT_FILL, EVAS_HINT_FILL);
1402 elm_layout_content_set(wd->edje, "elm.swallow.items", wd->box);
1403 evas_object_show(wd->box);
1405 evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj);
1407 evas_object_smart_member_add(wd->view, obj);
1408 elm_widget_resize_object_set(obj, wd->edje);
1416 * Append new tab item
1418 * @param obj The controlbar object
1419 * @param icon_path The icon path of item
1420 * @param label The label of item
1421 * @param view The view of item
1422 * @return The item of controlbar
1424 * @ingroup Controlbar
1426 EAPI Elm_Controlbar_Item * elm_controlbar_tab_item_append(Evas_Object * obj,
1433 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1434 Elm_Controlbar_Item * it;
1435 Elm_Controlbar_Item * lit;
1437 it = _create_tab_item(obj, icon_path, label, view);
1438 if (!it) return NULL;
1439 wd = elm_widget_data_get(obj);
1440 if ((_check_bar_item_number(wd) >= 5) && (wd->auto_align))
1442 if (!wd->more_item) {
1443 lit = elm_controlbar_last_item_get(obj);
1444 _set_item_visible(lit, EINA_FALSE);
1445 _create_more_item(wd, TABBAR);
1447 _set_items_position(obj, it, NULL, EINA_FALSE);
1450 _set_items_position(obj, it, NULL, EINA_TRUE);
1452 wd->items = eina_list_append(wd->items, it);
1454 elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1456 _check_background(wd);
1462 * Prepend new tab item
1464 * @param obj The controlbar object
1465 * @param icon_path The icon path of item
1466 * @param label The label of item
1467 * @param view The view of item
1468 * @return The item of controlbar
1470 * @ingroup Controlbar
1472 EAPI Elm_Controlbar_Item * elm_controlbar_tab_item_prepend(Evas_Object *
1481 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1483 Elm_Controlbar_Item * it;
1484 Elm_Controlbar_Item * lit;
1485 Elm_Controlbar_Item * item;
1486 it = _create_tab_item(obj, icon_path, label, view);
1487 if (!it) return NULL;
1488 wd = elm_widget_data_get(obj);
1489 item = eina_list_data_get(wd->items);
1490 if ((_check_bar_item_number(wd) >= 5) && (wd->auto_align))
1492 if (!wd->more_item) {
1493 lit = elm_controlbar_last_item_get(obj);
1494 _set_item_visible(lit, EINA_FALSE);
1495 _create_more_item(wd, TABBAR);
1497 lit = elm_controlbar_item_prev(wd->more_item);
1498 _set_item_visible(lit, EINA_FALSE);
1499 _set_items_position(obj, it, item, EINA_TRUE);
1502 _set_items_position(obj, it, item, EINA_TRUE);
1504 wd->items = eina_list_prepend(wd->items, it);
1506 elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1508 _check_background(wd);
1514 * Insert new tab item before given item
1516 * @param obj The controlbar object
1517 * @param before The given item
1518 * @param icon_path The icon path of item
1519 * @param label The label of item
1520 * @param view The view of item
1521 * @return The item of controlbar
1523 * @ingroup Controlbar
1525 EAPI Elm_Controlbar_Item *
1526 elm_controlbar_tab_item_insert_before(Evas_Object * obj,
1527 Elm_Controlbar_Item * before,
1528 const char *icon_path,
1529 const char *label, Evas_Object * view)
1531 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1533 Elm_Controlbar_Item * it;
1534 Elm_Controlbar_Item * lit;
1535 if (!before) return NULL;
1536 it = _create_tab_item(obj, icon_path, label, view);
1537 if (!it) return NULL;
1538 wd = elm_widget_data_get(obj);
1539 if ((_check_bar_item_number(wd) >= 5) && (wd->auto_align))
1543 lit = elm_controlbar_last_item_get(obj);
1544 _set_item_visible(lit, EINA_FALSE);
1545 _create_more_item(wd, TABBAR);
1547 before = wd->more_item;
1548 if (before->order > 0)
1550 lit = elm_controlbar_item_prev(wd->more_item);
1551 _set_item_visible(lit, EINA_FALSE);
1552 _set_items_position(obj, it, before, EINA_TRUE);
1556 _set_items_position(obj, it, before, EINA_FALSE);
1560 _set_items_position(obj, it, before, EINA_TRUE);
1562 wd->items = eina_list_prepend_relative(wd->items, it, before);
1564 elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1566 _check_background(wd);
1572 * Insert new tab item after given item
1574 * @param obj The controlbar object
1575 * @param after The given item
1576 * @param icon_path The icon path of item
1577 * @param label The label of item
1578 * @param view The view of item
1579 * @return The item of controlbar
1581 * @ingroup Controlbar
1583 EAPI Elm_Controlbar_Item *
1584 elm_controlbar_tab_item_insert_after(Evas_Object * obj,
1585 Elm_Controlbar_Item * after,
1586 const char *icon_path, const char *label,
1589 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1591 Elm_Controlbar_Item * it;
1592 Elm_Controlbar_Item * lit;
1593 Elm_Controlbar_Item * item;
1594 if (!after) return NULL;
1595 it = _create_tab_item(obj, icon_path, label, view);
1596 if (!it) return NULL;
1597 wd = elm_widget_data_get(obj);
1598 item = elm_controlbar_item_next(after);
1599 if ((_check_bar_item_number(wd) >= 5) && (wd->auto_align))
1603 lit = elm_controlbar_last_item_get(obj);
1604 _set_item_visible(lit, EINA_FALSE);
1605 _create_more_item(wd, TABBAR);
1607 lit = elm_controlbar_item_prev(wd->more_item);
1608 if ((lit != after) && (item->order > 0))
1610 _set_item_visible(lit, EINA_FALSE);
1611 _set_items_position(obj, it, item, EINA_TRUE);
1615 _set_items_position(obj, it, NULL, EINA_FALSE);
1619 _set_items_position(obj, it, item, EINA_TRUE);
1621 wd->items = eina_list_append_relative(wd->items, it, after);
1623 elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1625 _check_background(wd);
1631 * Append new tool item
1633 * @param obj The controlbar object
1634 * @param icon_path The icon path of item
1635 * @param label The label of item
1636 * @param func Callback function of item
1637 * @param data The data of callback function
1638 * @return The item of controlbar
1640 * @ingroup Controlbar
1642 EAPI Elm_Controlbar_Item * elm_controlbar_tool_item_append(Evas_Object *
1657 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1658 Elm_Controlbar_Item * it;
1659 Elm_Controlbar_Item * lit;
1661 it = _create_tool_item(obj, icon_path, label, func, data);
1662 if (!it) return NULL;
1663 wd = elm_widget_data_get(obj);
1664 if ((_check_bar_item_number(wd) >= 5) && (wd->auto_align))
1666 if (!wd->more_item) {
1667 lit = elm_controlbar_last_item_get(obj);
1668 _set_item_visible(lit, EINA_FALSE);
1669 _create_more_item(wd, TOOLBAR);
1671 _set_items_position(obj, it, NULL, EINA_FALSE);
1674 _set_items_position(obj, it, NULL, EINA_TRUE);
1676 wd->items = eina_list_append(wd->items, it);
1677 _check_toolbar_line(wd);
1683 * Prepend new tool item
1685 * @param obj The controlbar object
1686 * @param icon_path The icon path of item
1687 * @param label The label of item
1688 * @param func Callback function of item
1689 * @param data The data of callback function
1690 * @return The item of controlbar
1692 * @ingroup Controlbar
1694 EAPI Elm_Controlbar_Item * elm_controlbar_tool_item_prepend(Evas_Object *
1710 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1712 Elm_Controlbar_Item * it;
1713 Elm_Controlbar_Item * lit;
1714 Elm_Controlbar_Item * item;
1715 it = _create_tool_item(obj, icon_path, label, func, data);
1716 if (!it) return NULL;
1717 wd = elm_widget_data_get(obj);
1718 item = eina_list_data_get(wd->items);
1719 if ((_check_bar_item_number(wd) >= 5) && (wd->auto_align))
1721 if (!wd->more_item) {
1722 lit = elm_controlbar_last_item_get(obj);
1723 _set_item_visible(lit, EINA_FALSE);
1724 _create_more_item(wd, TOOLBAR);
1726 lit = elm_controlbar_item_prev(wd->more_item);
1727 _set_item_visible(lit, EINA_FALSE);
1728 _set_items_position(obj, it, item, EINA_TRUE);
1731 _set_items_position(obj, it, item, EINA_TRUE);
1733 wd->items = eina_list_prepend(wd->items, it);
1734 _check_toolbar_line(wd);
1740 * Insert new tool item before given item
1742 * @param obj The controlbar object
1743 * @param before The given item
1744 * @param icon_path The icon path of item
1745 * @param label The label of item
1746 * @param func Callback function of item
1747 * @param data The data of callback function
1748 * @return The item of controlbar
1750 * @ingroup Controlbar
1752 EAPI Elm_Controlbar_Item *
1753 elm_controlbar_tool_item_insert_before(Evas_Object * obj,
1754 Elm_Controlbar_Item * before,
1755 const char *icon_path,
1757 void (*func) (void *data,
1762 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1764 Elm_Controlbar_Item * it;
1765 Elm_Controlbar_Item * lit;
1766 if (!before) return NULL;
1767 it = _create_tool_item(obj, icon_path, label, func, data);
1768 if (!it) return NULL;
1769 wd = elm_widget_data_get(obj);
1770 if ((_check_bar_item_number(wd) >= 5) && (wd->auto_align))
1774 lit = elm_controlbar_last_item_get(obj);
1775 _set_item_visible(lit, EINA_FALSE);
1776 _create_more_item(wd, TOOLBAR);
1778 before = wd->more_item;
1779 if (before->order > 0)
1781 lit = elm_controlbar_item_prev(wd->more_item);
1782 _set_item_visible(lit, EINA_FALSE);
1783 _set_items_position(obj, it, before, EINA_TRUE);
1787 _set_items_position(obj, it, before, EINA_FALSE);
1791 _set_items_position(obj, it, before, EINA_TRUE);
1793 wd->items = eina_list_prepend_relative(wd->items, it, before);
1794 _check_toolbar_line(wd);
1800 * Insert new tool item after given item
1802 * @param obj The controlbar object
1803 * @param after The given item
1804 * @param icon_path The icon path of item
1805 * @param label The label of item
1806 * @param func Callback function of item
1807 * @param data The data of callback function
1808 * @return The item of controlbar
1810 * @ingroup Controlbar
1812 EAPI Elm_Controlbar_Item *
1813 elm_controlbar_tool_item_insert_after(Evas_Object * obj,
1814 Elm_Controlbar_Item * after,
1815 const char *icon_path,
1817 void (*func) (void *data,
1822 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1824 Elm_Controlbar_Item * it;
1825 Elm_Controlbar_Item * lit;
1826 Elm_Controlbar_Item * item;
1827 if (!after) return NULL;
1828 it = _create_tool_item(obj, icon_path, label, func, data);
1829 if (!it) return NULL;
1830 wd = elm_widget_data_get(obj);
1831 item = elm_controlbar_item_next(after);
1832 if ((_check_bar_item_number(wd) >= 5) && (wd->auto_align))
1836 lit = elm_controlbar_last_item_get(obj);
1837 _set_item_visible(lit, EINA_FALSE);
1838 _create_more_item(wd, TOOLBAR);
1840 lit = elm_controlbar_item_prev(wd->more_item);
1841 if ((lit != after) && (item->order > 0))
1843 _set_item_visible(lit, EINA_FALSE);
1844 _set_items_position(obj, it, item, EINA_TRUE);
1848 _set_items_position(obj, it, NULL, EINA_FALSE);
1852 _set_items_position(obj, it, item, EINA_TRUE);
1854 wd->items = eina_list_append_relative(wd->items, it, after);
1855 _check_toolbar_line(wd);
1861 * Append new object item
1863 * @param obj The controlbar object
1864 * @param obj_item The object of item
1865 * @param sel The number of sel occupied
1866 * @return The item of controlbar
1868 * @ingroup Controlbar
1870 EAPI Elm_Controlbar_Item * elm_controlbar_object_item_append(Evas_Object *
1876 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1878 Elm_Controlbar_Item * it;
1879 wd = elm_widget_data_get(obj);
1880 if (!wd) return NULL;
1881 it = _create_object_item(obj, obj_item, sel);
1882 if (!it) return NULL;
1883 _set_items_position(obj, it, NULL, EINA_TRUE);
1884 wd->items = eina_list_append(wd->items, it);
1890 * Prepend new object item
1892 * @param obj The controlbar object
1893 * @param obj_item The object of item
1894 * @param sel The number of sel occupied
1895 * @return The item of controlbar
1897 * @ingroup Controlbar
1899 EAPI Elm_Controlbar_Item * elm_controlbar_object_item_prepend(Evas_Object *
1905 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1907 Elm_Controlbar_Item * it;
1908 Elm_Controlbar_Item * item;
1909 wd = elm_widget_data_get(obj);
1910 if (!wd) return NULL;
1911 it = _create_object_item(obj, obj_item, sel);
1912 if (!it) return NULL;
1913 item = eina_list_data_get(wd->items);
1914 _set_items_position(obj, it, item, EINA_TRUE);
1915 wd->items = eina_list_prepend(wd->items, it);
1921 * Insert new object item before given item
1923 * @param obj The controlbar object
1924 * @param before The given item
1925 * @param obj_item The object of item
1926 * @param sel The number of sel occupied
1927 * @return The item of controlbar
1929 * @ingroup Controlbar
1931 EAPI Elm_Controlbar_Item *
1932 elm_controlbar_object_item_insert_before(Evas_Object * obj,
1933 Elm_Controlbar_Item * before,
1934 Evas_Object * obj_item, const int sel)
1936 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1938 Elm_Controlbar_Item * it;
1939 wd = elm_widget_data_get(obj);
1940 if (!wd) return NULL;
1941 if (!before) return NULL;
1942 it = _create_object_item(obj, obj_item, sel);
1943 if (!it) return NULL;
1944 _set_items_position(obj, it, before, EINA_TRUE);
1945 wd->items = eina_list_prepend_relative(wd->items, it, before);
1951 * Insert new object item after given item
1953 * @param obj The controlbar object
1954 * @param after The given item
1955 * @param obj_item The object of item
1956 * @param sel The number of sel occupied
1957 * @return The item of controlbar
1959 * @ingroup Controlbar
1961 EAPI Elm_Controlbar_Item *
1962 elm_controlbar_object_item_insert_after(Evas_Object * obj,
1963 Elm_Controlbar_Item * after,
1964 Evas_Object * obj_item, const int sel)
1966 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1968 Elm_Controlbar_Item * it;
1969 Elm_Controlbar_Item * item;
1970 wd = elm_widget_data_get(obj);
1971 if (!wd) return NULL;
1972 if (!after) return NULL;
1973 it = _create_object_item(obj, obj_item, sel);
1974 if (!it) return NULL;
1975 item = elm_controlbar_item_next(after);
1976 _set_items_position(obj, it, item, EINA_TRUE);
1977 wd->items = eina_list_append_relative(wd->items, it, after);
1983 * Get the object of the object item
1985 * @param it The item of controlbar
1986 * @return The object of the object item
1988 * @ingroup Controlbar
1991 elm_controlbar_object_item_object_get(const Elm_Controlbar_Item * it)
1993 if (!it) return NULL;
1994 if (it->style != OBJECT) return NULL;
1995 if (!it->base_item) return NULL;
1996 return it->base_item;
2000 * Delete item from controlbar
2002 * @param it The item of controlbar
2004 * @ingroup Controlbar
2007 elm_controlbar_item_del(Elm_Controlbar_Item * it)
2013 Elm_Controlbar_Item * item;
2020 if (it->obj == NULL)
2022 printf("Invalid argument: controlbar object is NULL\n");
2025 wd = elm_widget_data_get(it->obj);
2028 printf("Cannot get smart data\n");
2036 elm_table_unpack(wd->box, it->base);
2038 EINA_LIST_FOREACH(wd->items, l, item)
2042 if (item->order > it->order)
2045 elm_table_unpack(wd->box, item->base);
2048 elm_table_pack(wd->box, item->base, item->order - 1, 0, item->sel, 1);
2050 elm_table_pack(wd->box, item->base, 0, item->order - 1, item->sel, 1);
2056 // delete item in list
2058 wd->items = eina_list_remove(wd->items, it);
2061 wd->num = wd->num - 1;
2066 * Select item in controlbar
2068 * @param it The item of controlbar
2070 * @ingroup Controlbar
2073 elm_controlbar_item_select(Elm_Controlbar_Item * it)
2076 if (it->obj == NULL) return;
2077 Widget_Data * wd = elm_widget_data_get(it->obj);
2084 * Set the icon of item
2086 * @param it The item of controlbar
2087 * @param icon_path The icon path of the item
2088 * @return The icon object
2090 * @ingroup Controlbar
2093 elm_controlbar_item_icon_set(Elm_Controlbar_Item * it, const char *icon_path)
2096 if (it->style == OBJECT) return;
2099 eina_stringshare_del(it->icon_path);
2100 it->icon_path = NULL;
2104 evas_object_del(it->icon);
2107 if (icon_path != NULL)
2109 it->icon_path = eina_stringshare_add(icon_path);
2110 it->icon = _create_item_icon(it->base_item, it, "elm.swallow.icon");
2112 if (it->wd->disabled || it->disabled)
2113 elm_widget_disabled_set(it->base_item, EINA_TRUE);
2115 elm_widget_disabled_set(it->base_item, EINA_FALSE);
2119 * Get the icon of item
2121 * @param it The item of controlbar
2122 * @return The icon object
2124 * @ingroup Controlbar
2127 elm_controlbar_item_icon_get(const Elm_Controlbar_Item * it)
2129 if (!it) return NULL;
2134 * Set the label of item
2136 * @param it The item of controlbar
2137 * @param label The label of item
2139 * @ingroup Controlbar
2142 elm_controlbar_item_label_set(Elm_Controlbar_Item * it, const char *label)
2145 if (it->style == OBJECT) return;
2148 eina_stringshare_del(it->text);
2153 it->text = eina_stringshare_add(label);
2154 elm_object_text_set(it->base_item, it->text);
2156 if (it->wd->disabled || it->disabled)
2157 elm_widget_disabled_set(it->base_item, EINA_TRUE);
2159 elm_widget_disabled_set(it->base_item, EINA_FALSE);
2163 * Get the label of item
2165 * @param it The item of controlbar
2166 * @return The label of item
2168 * @ingroup Controlbar
2171 elm_controlbar_item_label_get(const Elm_Controlbar_Item * it)
2173 if (!it) return NULL;
2178 * Get the selected item
2180 * @param obj The controlbar object
2181 * @return The item of controlbar
2183 * @ingroup Controlbar
2185 EAPI Elm_Controlbar_Item * elm_controlbar_selected_item_get(const Evas_Object *
2188 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
2191 Elm_Controlbar_Item * item;
2192 if (obj == NULL) return NULL;
2193 Widget_Data * wd = elm_widget_data_get(obj);
2194 if (!wd || !wd->items) return NULL;
2195 EINA_LIST_FOREACH(wd->items, l, item)
2197 if (item->selected) return item;
2203 * Get the first item
2205 * @param obj The controlbar object
2206 * @return The item of controlbar
2208 * @ingroup Controlbar
2210 EAPI Elm_Controlbar_Item * elm_controlbar_first_item_get(const Evas_Object * obj)
2212 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
2213 Widget_Data * wd = elm_widget_data_get(obj);
2214 if (!wd || !wd->items) return NULL;
2215 return eina_list_data_get(wd->items);
2221 * @param obj The controlbar object
2222 * @return The item of controlbar
2224 * @ingroup Controlbar
2226 EAPI Elm_Controlbar_Item * elm_controlbar_last_item_get(const Evas_Object * obj)
2228 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
2229 Widget_Data * wd = elm_widget_data_get(obj);
2230 if (!wd || !wd->items) return NULL;
2231 return eina_list_data_get(eina_list_last(wd->items));
2237 * @param obj The controlbar object
2238 * @return The list of the items
2240 * @ingroup Controlbar
2242 EAPI const Eina_List * elm_controlbar_items_get(const Evas_Object * obj)
2244 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
2245 Widget_Data * wd = elm_widget_data_get(obj);
2246 if (!wd || !wd->items) return NULL;
2251 * Get the previous item
2253 * @param it The item of controlbar
2254 * @return The previous item of the parameter item
2256 * @ingroup Controlbar
2258 EAPI Elm_Controlbar_Item * elm_controlbar_item_prev(Elm_Controlbar_Item *
2261 if (!it) return NULL;
2264 Elm_Controlbar_Item * item;
2265 if (it->obj == NULL) return NULL;
2266 Widget_Data * wd = elm_widget_data_get(it->obj);
2267 if (!wd || !wd->items) return NULL;
2268 EINA_LIST_FOREACH(wd->items, l, item)
2272 l = eina_list_prev(l);
2273 if (!l) return NULL;
2274 return eina_list_data_get(l);
2283 * @param obj The controlbar object
2284 * @return The next item of the parameter item
2286 * @ingroup Controlbar
2288 EAPI Elm_Controlbar_Item * elm_controlbar_item_next(Elm_Controlbar_Item *
2291 if (!it) return NULL;
2294 Elm_Controlbar_Item * item;
2295 if (it->obj == NULL) return NULL;
2296 Widget_Data * wd = elm_widget_data_get(it->obj);
2297 if (!wd || !wd->items) return NULL;
2298 EINA_LIST_FOREACH(wd->items, l, item)
2302 l = eina_list_next(l);
2303 if (!l) return NULL;
2304 return eina_list_data_get(l);
2311 * Set the visible status of item in bar
2313 * @param it The item of controlbar
2314 * @param bar EINA_TRUE or EINA_FALSE
2316 * @ingroup Controlbar
2319 elm_controlbar_item_visible_set(Elm_Controlbar_Item * it, Eina_Bool visible)
2322 if (it->obj == NULL) return;
2323 Widget_Data * wd = elm_widget_data_get(it->obj);
2326 if (!wd->auto_align)
2327 _set_item_visible(it, visible);
2331 * Get the result which or not item is visible in bar
2333 * @param it The item of controlbar
2334 * @return EINA_TRUE or EINA_FALSE
2336 * @ingroup Controlbar
2339 elm_controlbar_item_visible_get(const Elm_Controlbar_Item * it)
2341 if (!it) return EINA_FALSE;
2342 if (it->obj == NULL) return EINA_FALSE;
2343 Widget_Data * wd = elm_widget_data_get(it->obj);
2344 if (!wd) return EINA_FALSE;
2345 if (it->order <= 0) return EINA_FALSE;
2353 * @param it The item of controlbar
2354 * @param bar EINA_TRUE or EINA_FALSE
2356 * @ingroup Controlbar
2359 elm_controlbar_item_disabled_set(Elm_Controlbar_Item * it, Eina_Bool disabled)
2363 if (it->disabled == disabled) return;
2365 it->disabled = disabled;
2367 if ((it->wd) && (it->wd->disabled)) return;
2369 if (it->base_item) elm_widget_disabled_set(it->base_item, disabled);
2375 * @param it The item of controlbar
2376 * @return EINA_TRUE or EINA_FALSE
2378 * @ingroup Controlbar
2381 elm_controlbar_item_disabled_get(const Elm_Controlbar_Item * it)
2383 if (!it) return EINA_FALSE;
2385 return it->disabled;
2389 * Set the view of the item
2391 * @param it The item of controlbar
2392 * @param view The view for the item
2394 * @ingroup Controlbar
2397 elm_controlbar_item_view_set(Elm_Controlbar_Item *it, Evas_Object * view)
2400 if (it->view == view) return;
2402 evas_object_del(it->view);
2407 * Get the view of the item
2409 * @param it The item of controlbar
2410 * @return The view for the item
2412 * @ingroup Controlbar
2415 elm_controlbar_item_view_get(const Elm_Controlbar_Item *it)
2417 if (!it) return NULL;
2423 * Unset the view of the item
2425 * @param it The item of controlbar
2426 * @return The view for the item
2428 * @ingroup Controlbar
2431 elm_controlbar_item_view_unset(Elm_Controlbar_Item *it)
2433 if (!it) return NULL;
2434 if (it->obj == NULL) return NULL;
2435 Widget_Data * wd = elm_widget_data_get(it->obj);
2436 if (!wd) return NULL;
2437 Evas_Object *content;
2439 if (it->view == elm_layout_content_get(wd->view, "elm.swallow.view"))
2441 content = elm_layout_content_unset(wd->view, "elm.swallow.view");
2442 if (content) evas_object_hide(content);
2453 * Set the mode of the controlbar
2455 * @param obj The object of the controlbar
2456 * @param mode The mode of the controlbar
2458 * @ingroup Controlbar
2461 elm_controlbar_mode_set(Evas_Object *obj, int mode)
2463 ELM_CHECK_WIDTYPE(obj, widtype);
2464 Widget_Data *wd = elm_widget_data_get(obj);
2467 fprintf(stderr, "Cannot get smart data\n");
2470 Evas_Object *selected_box;
2476 case ELM_CONTROLBAR_MODE_DEFAULT:
2477 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,default", "elm");
2479 case ELM_CONTROLBAR_MODE_TRANSLUCENCE:
2480 elm_controlbar_alpha_set(obj, 85);
2482 case ELM_CONTROLBAR_MODE_TRANSPARENCY:
2483 elm_controlbar_alpha_set(obj, 0);
2485 case ELM_CONTROLBAR_MODE_LARGE:
2486 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,large", "elm");
2488 case ELM_CONTROLBAR_MODE_SMALL:
2489 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,small", "elm");
2491 case ELM_CONTROLBAR_MODE_LEFT:
2492 selected_box = elm_layout_content_get(wd->edje, "elm.dragable.box");
2493 if (selected_box) edje_object_signal_emit(_EDJ(selected_box), "elm,state,left", "elm");
2494 wd->selected_signal = eina_stringshare_add("elm,state,selected_left");
2495 wd->pressed_signal = eina_stringshare_add("elm,state,pressed_left");
2496 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,left", "elm");
2497 _check_background(wd);
2500 case ELM_CONTROLBAR_MODE_RIGHT:
2501 selected_box = elm_layout_content_get(wd->edje, "elm.dragable.box");
2502 if (selected_box) edje_object_signal_emit(_EDJ(selected_box), "elm,state,right", "elm");
2503 wd->selected_signal = eina_stringshare_add("elm,state,selected_right");
2504 wd->pressed_signal = eina_stringshare_add("elm,state,pressed_right");
2505 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,right", "elm");
2506 _check_background(wd);
2512 selected_box = elm_layout_content_get(wd->edje, "elm.dragable.box");
2513 if (selected_box) edje_object_signal_emit(_EDJ(selected_box), "elm,state,default", "elm");
2514 wd->selected_signal = eina_stringshare_add("elm,state,selected");
2515 wd->pressed_signal = eina_stringshare_add("elm,state,pressed");
2516 _check_background(wd);
2521 * Set the alpha of the controlbar
2523 * @param obj The object of the controlbar
2524 * @param alpha The alpha value of the controlbar (0-100)
2526 * @ingroup Controlbar
2529 elm_controlbar_alpha_set(Evas_Object *obj, int alpha)
2531 ELM_CHECK_WIDTYPE(obj, widtype);
2533 Widget_Data *wd = elm_widget_data_get(obj);
2536 fprintf(stderr, "Cannot get smart data\n");
2540 if (alpha < 0) wd->alpha = 0;
2541 else if (alpha > 100) wd->alpha = 100;
2542 else wd->alpha = alpha;
2544 evas_object_color_get(wd->bg, &r, &g, &b, NULL);
2545 evas_object_color_set(wd->bg, r, g, b, (int)(255 * wd->alpha / 100));
2550 * Set auto-align mode of the controlbar(It's not prepared yet)
2551 * If you set the auto-align and add items more than 5,
2552 * the "more" item will be made and the items more than 5 will be unvisible.
2554 * @param obj The object of the controlbar
2555 * @param auto_align The dicision that the controlbar use the auto-align
2557 * @ingroup Controlbar
2560 elm_controlbar_item_auto_align_set(Evas_Object *obj, Eina_Bool auto_align)
2562 ELM_CHECK_WIDTYPE(obj, widtype);
2563 Widget_Data *wd = elm_widget_data_get(obj);
2564 Elm_Controlbar_Item *item;
2569 fprintf(stderr, "Cannot get smart data\n");
2573 if (wd->auto_align == auto_align) return;
2577 if ((_check_bar_item_number(wd)) >= 5 && (!wd->more_item))
2580 EINA_LIST_FOREACH(wd->items, l, item)
2582 if (elm_controlbar_item_visible_get(item))
2585 _delete_item_in_bar(item);
2588 item = elm_controlbar_last_item_get(obj);
2589 while (!elm_controlbar_item_visible_get(item)){
2590 item = elm_controlbar_item_prev(item);
2592 _create_more_item(wd, item->style);
2600 if (wd->more_item->view)
2601 evas_object_del(wd->more_item->view);
2602 wd->items = eina_list_remove(wd->items, wd->more_item);
2603 eina_stringshare_del(wd->more_item->text);
2604 if (wd->more_item->icon)
2605 evas_object_del(wd->more_item->icon);
2606 if (wd->more_item->base)
2607 evas_object_del(wd->more_item->base);
2608 if (wd->more_item->base_item)
2609 evas_object_del(wd->more_item->base_item);
2610 free(wd->more_item);
2611 wd->more_item = NULL;
2613 // make all item is visible
2615 EINA_LIST_FOREACH(wd->items, l, item)
2617 if (!elm_controlbar_item_visible_get(item))
2618 _insert_item_in_bar(item, i);
2623 wd->auto_align = auto_align;
2628 * Set the vertical mode of the controlbar
2630 * @param obj The object of the controlbar
2631 * @param vertical The vertical mode of the controlbar (TRUE = vertical, FALSE = horizontal)
2633 * @ingroup Controlbar
2636 elm_controlbar_vertical_set(Evas_Object *obj, Eina_Bool vertical)
2638 ELM_CHECK_WIDTYPE(obj, widtype);
2639 Widget_Data *wd = elm_widget_data_get(obj);
2642 fprintf(stderr, "Cannot get smart data\n");
2646 if (wd->vertical == vertical) return;
2647 wd->vertical = vertical;
2649 if (_check_bar_item_number(wd) > 1)
2653 _check_toolbar_line(wd);
2657 * Get the button object of the item
2659 * @param it The item of controlbar
2660 * @return button object of the item
2662 * @ingroup Controlbar
2665 elm_controlbar_item_button_get(const Elm_Controlbar_Item *it)
2667 if (!it) return NULL;
2668 if (it->style == OBJECT) return NULL;
2670 if (it->base_item) return it->base_item;