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
39 unsigned int start_time;
41 void (*func) (void *data, Evas_Object * obj);
43 Ecore_Animator * timer;
46 // internal data structure of controlbar object
47 typedef struct _Widget_Data Widget_Data;
57 Evas_Object * event_box;
58 Evas_Object * selected_box;
59 Evas_Object * focused_box;
60 Evas_Object * focused_box_left;
61 Evas_Object * focused_box_right;
63 Elm_Controlbar_Item * more_item;
64 Elm_Controlbar_Item * pre_item;
65 Elm_Controlbar_Item * cur_item;
66 Evas_Coord x, y, w, h;
75 Eina_List * visible_items;
77 void (*ani_func) (void *data, Evas_Object * obj, void *event_info);
79 Ecore_Timer *effect_timer;
80 Eina_Bool init_animation;
81 Eina_Bool selected_animation;
84 const char *pressed_signal;
85 const char *selected_signal;
88 struct _Elm_Controlbar_Item
93 Evas_Object * base_item;
97 const char *icon_path;
99 void (*func) (void *data, Evas_Object * obj, void *event_info);
108 static const char *widtype = NULL;
110 static int check_bar_item_number(Widget_Data *wd);
111 static void selected_box(Elm_Controlbar_Item * it);
112 static void cancel_selected_box(Widget_Data *wd);
113 static Eina_Bool pressed_box(Elm_Controlbar_Item * it);
114 static void item_color_set(Elm_Controlbar_Item *item, const char *color_part);
116 ///////////////////////////////////////////////////////////////////
118 // Smart Object basic function
120 ////////////////////////////////////////////////////////////////////
123 _controlbar_move(void *data, Evas_Object * obj)
126 Evas_Coord x, y, x_, y_, width;
128 wd = elm_widget_data_get((Evas_Object *) data);
130 evas_object_geometry_get(wd->edje, &x, &y, NULL, NULL);
133 evas_object_move(wd->edje, x, y);
134 evas_object_geometry_get(edje_object_part_object_get(wd->edje, "bg_image"), NULL, NULL, &width, NULL);
135 evas_object_geometry_get(wd->parent, &x_, &y_, NULL, NULL);
138 case ELM_CONTROLBAR_MODE_LEFT:
139 evas_object_move(wd->view, x + width, y);
141 case ELM_CONTROLBAR_MODE_RIGHT:
143 evas_object_move(wd->view, x, y);
146 evas_object_move(wd->event_box, x, y);
150 _controlbar_resize(void *data, Evas_Object * obj)
153 Elm_Controlbar_Item *item;
155 Evas_Coord x, y, x_, y_, w, h, width, height;
157 wd = elm_widget_data_get((Evas_Object *) data);
159 evas_object_geometry_get(wd->edje, &x, &y, &w, &h);
162 evas_object_resize(wd->edje, w, h);
163 evas_object_geometry_get(edje_object_part_object_get(wd->edje, "bg_image"), NULL, NULL, &width, &height);
164 evas_object_geometry_get(wd->parent, &x_, &y_, NULL, NULL);
167 case ELM_CONTROLBAR_MODE_LEFT:
168 case ELM_CONTROLBAR_MODE_RIGHT:
169 evas_object_resize(wd->view, w - width, h);
172 evas_object_resize(wd->view, w, h - height + 1);
175 evas_object_resize(wd->event_box, w, h);
177 EINA_LIST_FOREACH(wd->items, l, item)
183 elm_label_wrap_width_set(item->label, (int)(wd->w/check_bar_item_number(wd))-20);
187 elm_label_wrap_width_set(item->label, (int)(wd->w-20));
194 _controlbar_object_move(void *data, Evas * e, Evas_Object * obj,
197 _controlbar_move(data, obj);
201 _controlbar_object_resize(void *data, Evas * e, Evas_Object * obj,
204 _controlbar_resize(data, obj);
208 _controlbar_object_show(void *data, Evas * e, Evas_Object * obj,
213 wd = elm_widget_data_get((Evas_Object *) data);
215 evas_object_show(wd->view);
216 evas_object_show(wd->edje);
217 evas_object_show(wd->box);
218 evas_object_show(wd->event_box);
222 _controlbar_object_hide(void *data, Evas * e, Evas_Object * obj,
227 wd = elm_widget_data_get((Evas_Object *) data);
229 evas_object_hide(wd->view);
230 evas_object_hide(wd->edje);
231 evas_object_hide(wd->box);
232 evas_object_hide(wd->event_box);
234 cancel_selected_box(wd);
238 _item_del(Elm_Controlbar_Item *it)
241 Widget_Data *wd = elm_widget_data_get(it->obj);
244 if(it == wd->more_item)
246 evas_object_del(it->view);
248 eina_stringshare_del(it->text);
250 evas_object_del(it->label);
252 eina_stringshare_del(it->icon_path);
254 evas_object_del(it->icon);
257 if (it->style != OBJECT)
258 evas_object_del(it->base);
260 evas_object_hide(it->base);
263 evas_object_del(it->base_item);
266 evas_object_hide(it->view);
271 _del_hook(Evas_Object * obj)
273 Widget_Data * wd = elm_widget_data_get(obj);
274 Elm_Controlbar_Item * item;
277 EINA_LIST_FREE(wd->items, item)
285 evas_object_del(wd->bg);
290 evas_object_del(wd->box);
295 evas_object_del(wd->event_box);
296 wd->event_box = NULL;
300 evas_object_del(wd->focused_box);
301 wd->focused_box = NULL;
303 if (wd->focused_box_left)
305 evas_object_del(wd->focused_box_left);
306 wd->focused_box_left = NULL;
308 if (wd->focused_box_right)
310 evas_object_del(wd->focused_box_right);
311 wd->focused_box_right = NULL;
315 evas_object_del(wd->edje);
318 if (wd->effect_timer)
320 ecore_timer_del(wd->effect_timer);
321 wd->effect_timer = NULL;
325 if (wd->ad->timer) ecore_animator_del(wd->ad->timer);
326 wd->ad->timer = NULL;
336 _theme_hook(Evas_Object * obj)
340 Elm_Controlbar_Item * item;
343 Widget_Data * wd = elm_widget_data_get(obj);
345 _elm_theme_object_set(obj, wd->edje, "controlbar", "base",
346 elm_widget_style_get(obj));
347 _elm_theme_object_set(obj, wd->bg, "controlbar", "background",
348 elm_widget_style_get(obj));
349 evas_object_color_get(wd->bg, &r, &g, &b, NULL);
350 evas_object_color_set(wd->bg, r, g, b, (int)(255 * wd->alpha / 100));
351 elm_layout_theme_set(wd->view, "controlbar", "view", elm_widget_style_get(obj));
352 _elm_theme_object_set(obj, wd->focused_box, "controlbar", "item_bg_move", elm_widget_style_get(obj));
353 _elm_theme_object_set(obj, wd->focused_box_left, "controlbar", "item_bg_move", elm_widget_style_get(obj));
354 _elm_theme_object_set(obj, wd->focused_box_right, "controlbar", "item_bg_move", elm_widget_style_get(obj));
355 EINA_LIST_FOREACH(wd->items, l, item)
357 if (item->style != OBJECT)
359 elm_layout_theme_set(item->base, "controlbar", "item_bg", elm_widget_style_get(obj));
360 if (item->label && item->icon)
361 edje_object_signal_emit(_EDJ(item->base_item), "elm,state,icon_text", "elm");
369 _disable_hook(Evas_Object * obj)
371 Widget_Data * wd = elm_widget_data_get(obj);
374 Elm_Controlbar_Item * item;
377 wd->disabled = elm_widget_disabled_get(obj);
379 EINA_LIST_FOREACH(wd->items, l, item)
382 disabled = wd->disabled;
384 disabled = item->disable;
386 if (item->style == OBJECT)
388 if (item->base) elm_widget_disabled_set(item->base, disabled);
393 item_color_set(item, "elm.item.disable.color");
395 item_color_set(item, "elm.item.default.color");
401 _sub_del(void *data, Evas_Object * obj, void *event_info)
403 Widget_Data *wd = elm_widget_data_get(obj);
404 Evas_Object *sub = event_info;
405 Evas_Object *content;
410 content = elm_layout_content_unset(wd->view, "elm.swallow.view");
411 evas_object_hide(content);
416 _sizing_eval(Evas_Object * obj)
418 Widget_Data * wd = elm_widget_data_get(obj);
420 _controlbar_move(obj, obj);
421 _controlbar_resize(obj, obj);
424 /////////////////////////////////////////////////////////////
426 // animation function
428 /////////////////////////////////////////////////////////////
433 struct timeval timev;
435 gettimeofday(&timev, NULL);
436 return ((timev.tv_sec * 1000) + ((timev.tv_usec) / 1000));
440 move_evas_object(void *data)
450 Animation_Data * ad = (Animation_Data *) data;
451 t = ELM_MAX(0.0, current_time_get() - ad->start_time) / 1000;
452 dx = ad->tx - ad->fx;
453 dy = ad->ty - ad->fy;
454 dw = ad->tw - ad->fw;
455 dh = ad->th - ad->fh;
458 x = (1 * sin((t / ad->time) * (M_PI / 2)) * dx);
459 y = (1 * sin((t / ad->time) * (M_PI / 2)) * dy);
460 w = (1 * sin((t / ad->time) * (M_PI / 2)) * dw);
461 h = (1 * sin((t / ad->time) * (M_PI / 2)) * dh);
474 if (x == dx && y == dy && w == dw && h == dh)
476 if(ad->timer) ecore_animator_del(ad->timer);
478 evas_object_move(ad->obj, px, py);
479 evas_object_resize(ad->obj, pw, ph);
480 evas_object_show(ad->obj);
481 if (ad->func != NULL)
482 ad->func(ad->data, ad->obj);
483 return ECORE_CALLBACK_CANCEL;
487 evas_object_move(ad->obj, px, py);
488 evas_object_resize(ad->obj, pw, ph);
489 evas_object_show(ad->obj);
491 return ECORE_CALLBACK_RENEW;
494 static Animation_Data*
495 move_object_with_animation(Evas_Object * obj, Evas_Coord x, Evas_Coord y,
496 Evas_Coord w, Evas_Coord h, Evas_Coord x_,
497 Evas_Coord y_, Evas_Coord w_, Evas_Coord h_,
498 double time, Eina_Bool (*mv_func) (void *data),
499 void (*func) (void *data,
500 Evas_Object * obj), void *data)
502 Animation_Data * ad = (Animation_Data *) malloc(sizeof(Animation_Data));
512 ad->start_time = current_time_get();
516 ad->timer = ecore_animator_add(mv_func, ad);
522 item_animation_effect(void *data)
524 Widget_Data *wd = (Widget_Data *)data;
526 Elm_Controlbar_Item * item;
531 EINA_LIST_FOREACH(wd->items, l, item)
534 if(rand > 65 && item->order > 0)
554 return ECORE_CALLBACK_RENEW;
557 /////////////////////////////////////////////////////////////
561 /////////////////////////////////////////////////////////////
564 sort_cb(const void *d1, const void *d2)
566 Elm_Controlbar_Item * item1, *item2;
567 item1 = (Elm_Controlbar_Item *) d1;
568 item2 = (Elm_Controlbar_Item *) d2;
569 if (item1->order <= 0) return 1;
570 if (item2->order <= 0) return -1;
571 return item1->order > item2->order ? 1 : -1;
574 ///////////////////////////////////////////////////////////////////
576 // basic utility function
578 ////////////////////////////////////////////////////////////////////
581 item_exist_check(Widget_Data *wd, Elm_Controlbar_Item *item)
584 Elm_Controlbar_Item *it;
586 if(!wd) return EINA_FALSE;
587 if(!wd->items) return EINA_FALSE;
589 EINA_LIST_FOREACH(wd->items, l, it)
590 if(it == item) return EINA_TRUE;
596 check_background(Widget_Data *wd)
600 Elm_Controlbar_Item *it;
602 EINA_LIST_FOREACH(wd->items, l, it)
604 if(it->style == TABBAR)
606 if(wd->mode == ELM_CONTROLBAR_MODE_LEFT)
607 edje_object_signal_emit(wd->bg, "elm,state,tabbar_left", "elm");
608 else if(wd->mode == ELM_CONTROLBAR_MODE_RIGHT)
609 edje_object_signal_emit(wd->bg, "elm,state,tabbar_right", "elm");
611 edje_object_signal_emit(wd->bg, "elm,state,tabbar", "elm");
615 edje_object_signal_emit(wd->bg, "elm,state,toolbar", "elm");
619 check_toolbar_line(Widget_Data *wd)
623 Elm_Controlbar_Item *it, *it2;
625 EINA_LIST_FOREACH(wd->items, l, it)
627 it2 = elm_controlbar_item_prev(it);
629 if(it->style != TOOLBAR || it2->style != TOOLBAR) continue;
633 edje_object_signal_emit(_EDJ(it2->base), "elm,state,right_line_hide", "elm");
634 edje_object_signal_emit(_EDJ(it->base), "elm,state,left_line_hide", "elm");
636 if((it->icon || it->label) && (it2->icon || it2->label))
638 edje_object_signal_emit(_EDJ(it2->base), "elm,state,bottom_line_show", "elm");
639 edje_object_signal_emit(_EDJ(it->base), "elm,state,top_line_show", "elm");
643 edje_object_signal_emit(_EDJ(it2->base), "elm,state,bottom_line_hide", "elm");
644 edje_object_signal_emit(_EDJ(it->base), "elm,state,top_line_hide", "elm");
649 edje_object_signal_emit(_EDJ(it2->base), "elm,state,bottom_line_hide", "elm");
650 edje_object_signal_emit(_EDJ(it->base), "elm,state,top_line_hide", "elm");
652 if((it->icon || it->label) && (it2->icon || it2->label))
654 edje_object_signal_emit(_EDJ(it2->base), "elm,state,right_line_show", "elm");
655 edje_object_signal_emit(_EDJ(it->base), "elm,state,left_line_show", "elm");
659 edje_object_signal_emit(_EDJ(it2->base), "elm,state,right_line_hide", "elm");
660 edje_object_signal_emit(_EDJ(it->base), "elm,state,left_line_hide", "elm");
667 check_bar_item_number(Widget_Data *wd)
670 Elm_Controlbar_Item * item;
673 EINA_LIST_FOREACH(wd->items, l, item)
674 if(item->order > 0) num++;
680 item_insert_in_bar(Elm_Controlbar_Item * it, int order)
683 Elm_Controlbar_Item * item;
684 Widget_Data * wd = elm_widget_data_get(it->obj);
687 if(order == 0) return;
689 EINA_LIST_FOREACH(wd->items, l, item)
691 if (item->order == order && item != it)
696 EINA_LIST_FOREACH(wd->items, l, item)
699 elm_table_unpack(wd->box, item->base);
701 EINA_LIST_FOREACH(wd->items, l, item)
705 if (item->order >= order)
708 elm_table_pack(wd->box, item->base, item->order - 1, 0, 1, 1);
710 elm_table_pack(wd->box, item->base, 0, item->order - 1, 1, 1);
711 evas_object_show(item->base);
717 elm_table_pack(wd->box, it->base, it->order - 1, 0, 1, 1);
719 elm_table_pack(wd->box, it->base, 0, it->order - 1, 1, 1);
720 evas_object_show(it->base);
724 item_delete_in_bar(Elm_Controlbar_Item * it)
727 Elm_Controlbar_Item * item;
728 Widget_Data * wd = elm_widget_data_get(it->obj);
731 EINA_LIST_FOREACH(wd->items, l, item)
737 elm_table_unpack(wd->box, it->base);
738 evas_object_hide(it->base);
743 EINA_LIST_FOREACH(wd->items, l, item)
748 elm_table_unpack(wd->box, item->base);
750 elm_table_pack(wd->box, item->base, item->order - 1, 0, 1, 1);
752 elm_table_pack(wd->box, item->base, 0, item->order - 1, 1, 1);
759 item_visible_set(Elm_Controlbar_Item *it, Eina_Bool visible)
761 Elm_Controlbar_Item *item;
762 Eina_Bool check = EINA_TRUE;
765 if (it->obj == NULL) return;
766 Widget_Data * wd = elm_widget_data_get(it->obj);
767 if (!wd || !wd->items) return;
768 if (it->order <= 0) check = EINA_FALSE;
769 if (check == visible) return;
772 item = elm_controlbar_last_item_get(it->obj);
773 while(!elm_controlbar_item_visible_get(item)){
774 item = elm_controlbar_item_prev(item);
776 item_insert_in_bar(it, item->order + 1);
780 item_delete_in_bar(it);
782 wd->items = eina_list_sort(wd->items, eina_list_count(wd->items), sort_cb);
783 _sizing_eval(it->obj);
787 hide_selected_box(void *data)
789 Evas_Object *selected_box = (Evas_Object *)data;
791 evas_object_move(selected_box, -999, -999);
792 evas_object_hide(selected_box);
794 return ECORE_CALLBACK_CANCEL;
798 item_color_set(Elm_Controlbar_Item *item, const char *color_part)
803 color = (Evas_Object *) edje_object_part_object_get(_EDJ(item->base), color_part);
805 evas_object_color_get(color, &r, &g, &b, &a);
806 evas_object_color_set(item->label, r, g, b, a);
807 evas_object_color_set(item->icon, r, g, b, a);
811 _end_selected_box(void *data, Evas_Object *obj)
813 Widget_Data * wd = (Widget_Data *)data;
815 if(item_exist_check(wd, wd->cur_item))
817 edje_object_signal_emit(_EDJ(wd->cur_item->base), wd->selected_signal, "elm");
818 edje_object_signal_emit(_EDJ(wd->cur_item->base_item), "elm,state,shadow_show", "elm");
822 if (wd->animating < 0)
824 printf("animation error\n");
828 ecore_idler_add(hide_selected_box, wd->selected_box);
832 move_selected_box(Widget_Data *wd, Elm_Controlbar_Item * fit, Elm_Controlbar_Item * tit)
834 Evas_Coord fx, fy, fw, fh, tx, ty, tw, th;
835 Evas_Object *from, *to;
837 if(fit->order <= 0 && wd->auto_align)
840 from = (Evas_Object *)edje_object_part_object_get(_EDJ(fit->base), "bg_img");
841 evas_object_geometry_get(from, &fx, &fy, &fw, &fh);
843 to = (Evas_Object *)edje_object_part_object_get(_EDJ(tit->base), "bg_img");
844 evas_object_geometry_get(to, &tx, &ty, &tw, &th);
846 if(item_exist_check(wd, wd->pre_item))
848 edje_object_signal_emit(_EDJ(wd->pre_item->base), "elm,state,unselected", "elm");
849 edje_object_signal_emit(_EDJ(wd->pre_item->base_item), "elm,state,shadow_hide", "elm");
851 if(item_exist_check(wd, wd->cur_item))
852 edje_object_signal_emit(_EDJ(wd->cur_item->base), "elm,state,unselected", "elm");
857 if (wd->ad->timer) ecore_animator_del(wd->ad->timer);
858 wd->ad->timer = NULL;
862 wd->ad = move_object_with_animation(wd->selected_box, fx, fy, fw, fh, tx, ty, tw, th,
863 0.3, move_evas_object, _end_selected_box, wd);
867 selected_box(Elm_Controlbar_Item * it)
870 Widget_Data * wd = elm_widget_data_get(it->obj);
872 Elm_Controlbar_Item * item, *fit = NULL;
873 Evas_Object * content;
875 if(wd->animating) return;
879 if(it->style == TABBAR){
881 content = elm_layout_content_unset(wd->view, "elm.swallow.view");
882 EINA_LIST_FOREACH(wd->items, l, item){
887 item->selected = EINA_FALSE;
889 it->selected = EINA_TRUE;
891 if(fit != NULL && fit != it)
893 move_selected_box(wd, fit, it);
897 edje_object_signal_emit(_EDJ(it->base), wd->selected_signal, "elm");
898 edje_object_signal_emit(_EDJ(wd->cur_item->base_item), "elm,state,shadow_show", "elm");
903 if(wd->more_item != it)
904 evas_object_smart_callback_call(it->obj, "view,change,before", it);
907 elm_layout_content_set(wd->view, "elm.swallow.view", it->view);
909 if(content) evas_object_hide(content);
911 }else if(it->style == TOOLBAR){
912 edje_object_signal_emit(_EDJ(it->base), "elm,state,text_unselected", "elm");
914 it->func(it->data, it->obj, it);
919 cancel_selected_box(Widget_Data *wd)
922 Elm_Controlbar_Item * item;
924 EINA_LIST_FOREACH(wd->items, l, item)
926 if (item->style == TABBAR)
930 edje_object_signal_emit(_EDJ(item->base), wd->selected_signal, "elm");
934 edje_object_signal_emit(_EDJ(item->base), "elm,state,unselected", "elm");
935 edje_object_signal_emit(_EDJ(item->base_item), "elm,state,shadow_hide", "elm");
938 else if (item->style == TOOLBAR)
940 edje_object_signal_emit(_EDJ(item->base), "elm,state,unselected", "elm");
946 unpressed_box_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info)
948 Widget_Data * wd = (Widget_Data *) data;
949 Evas_Event_Mouse_Up * ev = event_info;
950 Evas_Coord x, y, w, h;
952 evas_object_event_callback_del(wd->event_box, EVAS_CALLBACK_MOUSE_UP, unpressed_box_cb);
954 cancel_selected_box(wd);
956 if(item_exist_check(wd, wd->pre_item))
958 evas_object_geometry_get(wd->pre_item->base, &x, &y, &w, &h);
959 if(ev->output.x > x && ev->output.x < x+w && ev->output.y > y && ev->output.y < y+h)
961 selected_box(wd->pre_item);
968 pressed_box(Elm_Controlbar_Item * it)
970 Widget_Data * wd = elm_widget_data_get(it->obj);
973 Elm_Controlbar_Item * item;
975 if(wd->animating) return EINA_FALSE;
977 if(wd->disabled || it->disable) return EINA_FALSE;
979 EINA_LIST_FOREACH(wd->items, l, item)
983 if (it->style == TABBAR)
985 edje_object_signal_emit(_EDJ(it->base), wd->pressed_signal, "elm");
987 else if (it->style == TOOLBAR)
989 edje_object_signal_emit(_EDJ(it->base), "elm,state,toolbar_pressed", "elm");
991 evas_object_event_callback_add(wd->event_box, EVAS_CALLBACK_MOUSE_UP, unpressed_box_cb, (void *)wd);
1004 static Evas_Object *
1005 create_item_label(Evas_Object *obj, Elm_Controlbar_Item * it, char *part)
1009 label = elm_label_add(obj);
1010 elm_object_style_set(label, "controlbar");
1011 elm_label_label_set(label, it->text);
1012 evas_object_color_set(label, 255, 255, 255, 255);
1013 elm_label_line_wrap_set(label, EINA_TRUE);
1014 elm_label_ellipsis_set(label, EINA_TRUE);
1015 elm_label_wrap_mode_set(label, 1);
1017 elm_layout_content_set(obj, part, label);
1022 static Evas_Object *
1023 create_item_icon(Evas_Object *obj, Elm_Controlbar_Item * it, char *part)
1027 icon = elm_icon_add(obj);
1028 if(!elm_icon_standard_set(icon, it->icon_path))
1030 elm_icon_file_set(icon, it->icon_path, NULL);
1033 evas_object_size_hint_min_set(icon, 40, 40);
1034 evas_object_size_hint_max_set(icon, 100, 100);
1035 evas_object_show(icon);
1037 elm_layout_content_set(obj, part, icon);
1042 static Evas_Object *
1043 create_item_layout(Evas_Object * parent, Elm_Controlbar_Item * it, Evas_Object **item, Evas_Object **label, Evas_Object **icon)
1047 obj = elm_layout_add(parent);
1050 fprintf(stderr, "Cannot load bg edj\n");
1053 elm_layout_theme_set(obj, "controlbar", "item_bg",
1054 elm_widget_style_get(it->obj));
1055 evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1056 evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, EVAS_HINT_FILL);
1058 *item = elm_layout_add(parent);
1061 fprintf(stderr, "Cannot load bg edj\n");
1064 elm_layout_theme_set(*item, "controlbar", "item",
1065 elm_widget_style_get(it->obj));
1066 elm_layout_content_set(obj, "item", *item);
1069 *label = create_item_label(*item, it, "elm.swallow.text");
1071 *icon = create_item_icon(*item, it, "elm.swallow.icon");
1072 if (*label && *icon)
1074 edje_object_signal_emit(_EDJ(*item), "elm,state,icon_text", "elm");
1075 elm_label_line_wrap_set(*label, EINA_FALSE);
1076 elm_label_wrap_mode_set(*label, 0);
1083 bar_item_down_cb(void *data, Evas * evas, Evas_Object * obj, void *event_info)
1085 Widget_Data * wd = (Widget_Data *) data;
1087 Elm_Controlbar_Item * item;
1088 if (wd->animating) return;
1090 EINA_LIST_FOREACH(wd->items, l, item)
1091 if (item->base == obj) break;
1093 if (item == NULL) return;
1098 static Elm_Controlbar_Item *
1099 create_tab_item(Evas_Object * obj, const char *icon_path, const char *label,
1102 Elm_Controlbar_Item * it;
1106 fprintf(stderr, "Invalid argument: controlbar object is NULL\n");
1109 wd = elm_widget_data_get(obj);
1112 fprintf(stderr, "Cannot get smart data\n");
1115 it = ELM_NEW(Elm_Controlbar_Item);
1116 if (!it) return NULL;
1119 it->text = eina_stringshare_add(label);
1120 it->icon_path = eina_stringshare_add(icon_path);
1121 it->selected = EINA_FALSE;
1125 it->base = create_item_layout(wd->edje, it, &(it->base_item), &(it->label), &(it->icon));
1126 evas_object_event_callback_add(it->base, EVAS_CALLBACK_MOUSE_DOWN,
1127 bar_item_down_cb, wd);
1128 evas_object_show(it->base);
1133 static Elm_Controlbar_Item *
1134 create_tool_item(Evas_Object * obj, const char *icon_path, const char *label,
1135 void (*func) (void *data, Evas_Object * obj,
1136 void *event_info), void *data)
1139 Elm_Controlbar_Item * it;
1143 fprintf(stderr, "Invalid argument: controlbar object is NULL\n");
1146 wd = elm_widget_data_get(obj);
1149 fprintf(stderr, "Cannot get smart data\n");
1152 it = ELM_NEW(Elm_Controlbar_Item);
1157 it->text = eina_stringshare_add(label);
1158 it->icon_path = eina_stringshare_add(icon_path);
1159 it->selected = EINA_FALSE;
1163 it->style = TOOLBAR;
1164 it->base = create_item_layout(wd->edje, it, &(it->base_item), &(it->label), &(it->icon));
1165 evas_object_event_callback_add(it->base, EVAS_CALLBACK_MOUSE_DOWN,
1166 bar_item_down_cb, wd);
1167 evas_object_show(it->base);
1172 static Elm_Controlbar_Item *
1173 create_object_item(Evas_Object * obj, Evas_Object * obj_item, const int sel)
1175 Elm_Controlbar_Item * it;
1179 fprintf(stderr, "Invalid argument: controlbar object is NULL\n");
1182 wd = elm_widget_data_get(obj);
1185 fprintf(stderr, "Cannot get smart data\n");
1188 it = ELM_NEW(Elm_Controlbar_Item);
1195 it->base = obj_item;
1200 repack_items(Widget_Data *wd)
1203 Elm_Controlbar_Item * item;
1205 EINA_LIST_FOREACH(wd->items, l, item)
1209 elm_table_unpack(wd->box, item->base);
1211 elm_table_pack(wd->box, item->base, item->order - 1, 0, item->sel, 1);
1213 elm_table_pack(wd->box, item->base, 0, item->order - 1, item->sel, 1);
1219 set_items_position(Evas_Object * obj, Elm_Controlbar_Item * it,
1220 Elm_Controlbar_Item * mit, Eina_Bool bar)
1224 Elm_Controlbar_Item * item;
1226 int check = EINA_FALSE;
1231 fprintf(stderr, "Invalid argument: controlbar object is NULL\n");
1234 wd = elm_widget_data_get(obj);
1237 fprintf(stderr, "Cannot get smart data\n");
1241 EINA_LIST_FOREACH(wd->items, l, item)
1243 if (item == mit && item->order > 0)
1246 it->order = mit->order;
1250 if(item->order > 0){
1251 elm_table_unpack(wd->box, item->base);
1252 item->order += it->sel;
1255 elm_table_pack(wd->box, item->base, item->order - 1, 0, item->sel, 1);
1259 elm_table_pack(wd->box, item->base, 0, item->order - 1, item->sel, 1);
1263 if (item->style != OBJECT)
1265 if(item->order > 0) order += item->sel;
1280 elm_table_pack(wd->box, it->base, it->order - 1, 0, it->sel, 1);
1284 elm_table_pack(wd->box, it->base, 0, it->order - 1, it->sel, 1);
1288 evas_object_hide(it->base);
1292 list_clicked(void *data, Evas_Object *obj, void *event_info)
1294 Elm_Controlbar_Item *item = (Elm_Controlbar_Item *)data;
1295 Elm_Controlbar_Item *it;
1298 Evas_Object *content;
1299 Elm_List_Item *lit = (Elm_List_Item *) elm_list_selected_item_get(obj);
1302 elm_list_item_selected_set(lit, 0);
1306 wd = elm_widget_data_get(item->obj);
1308 EINA_LIST_FOREACH(wd->items, l, it)
1310 it->selected = EINA_FALSE;
1313 if(item->style == TABBAR)
1315 content = elm_layout_content_unset(wd->view, "elm.swallow.view");
1316 evas_object_hide(content);
1317 item->selected = EINA_TRUE;
1318 evas_object_smart_callback_call(item->obj, "view,change,before", item);
1319 elm_layout_content_set(wd->view, "elm.swallow.view", item->view);
1322 if(item->style == TOOLBAR && item->func)
1323 item->func(item->data, item->obj, item);
1326 static Evas_Object *
1327 create_more_view(Widget_Data *wd)
1330 Elm_Controlbar_Item *item;
1334 list = elm_list_add( wd->object );
1335 elm_list_mode_set( list, ELM_LIST_COMPRESS );
1337 EINA_LIST_FOREACH(wd->items, l, item)
1339 if(item->order <= 0)
1344 icon = create_item_icon(list, item, NULL);
1345 evas_object_color_set(icon, 0, 0, 0, 255);
1347 elm_list_item_append(list, item->text, icon, NULL, list_clicked, item);
1351 elm_list_go( list );
1356 static void _ctxpopup_cb(void *data, Evas_Object *obj, void *event_info)
1358 Elm_Controlbar_Item *it;
1360 Evas_Object *ctxpopup = obj;
1361 Widget_Data *wd = (Widget_Data *)data;
1363 EINA_LIST_FOREACH(wd->items, l, it)
1364 if(!strcmp(it->text, elm_ctxpopup_item_label_get((Elm_Ctxpopup_Item *) event_info))) break;
1367 it->func(it->data, it->obj, it);
1369 if(item_exist_check(wd, it)) evas_object_smart_callback_call(it->obj, "clicked", it);
1371 evas_object_del(ctxpopup);
1375 static void _ctxpopup_hide_cb(void *data, Evas_Object *obj, void *event_info)
1377 Evas_Object *ctxpopup = obj;
1379 evas_object_del(ctxpopup);
1384 create_more_func(void *data, Evas_Object *obj, void *event_info)
1386 Evas_Object *ctxpopup;
1387 Elm_Controlbar_Item *item;
1390 Evas_Coord x, y, w, h;
1391 Widget_Data *wd = elm_widget_data_get(obj);
1394 ctxpopup = elm_ctxpopup_add(wd->parent);
1395 evas_object_smart_callback_add( ctxpopup, "hide", _ctxpopup_hide_cb, wd);
1397 EINA_LIST_FOREACH(wd->items, l, item)
1399 if(item->order <= 0)
1404 icon = create_item_icon(ctxpopup, item, NULL);
1405 evas_object_color_set(icon, 0, 0, 0, 255);
1407 elm_ctxpopup_item_append(ctxpopup, item->text, icon, _ctxpopup_cb, wd);
1411 evas_object_geometry_get(wd->more_item->base, &x, &y, &w, &h);
1412 evas_object_move(ctxpopup, x + w/2, y + h/2);
1414 evas_object_show(ctxpopup);
1417 static Elm_Controlbar_Item *
1418 create_more_item(Widget_Data *wd, int style)
1420 Elm_Controlbar_Item * it;
1422 it = ELM_NEW(Elm_Controlbar_Item);
1423 if (!it) return NULL;
1424 it->obj = wd->object;
1425 it->text = eina_stringshare_add("more");
1426 it->icon_path = eina_stringshare_add(CONTROLBAR_SYSTEM_ICON_MORE);
1427 it->selected = EINA_FALSE;
1429 it->view = create_more_view(wd);
1430 it->func = create_more_func;
1432 it->base = create_item_layout(wd->edje, it, &(it->base_item), &(it->label), &(it->icon));
1433 evas_object_event_callback_add(it->base, EVAS_CALLBACK_MOUSE_DOWN,
1434 bar_item_down_cb, wd);
1435 evas_object_show(it->base);
1437 set_items_position(it->obj, it, NULL, EINA_TRUE);
1438 wd->items = eina_list_append(wd->items, it);
1440 wd->items = eina_list_sort(wd->items, eina_list_count(wd->items), sort_cb);
1445 ///////////////////////////////////////////////////////////////////
1449 ////////////////////////////////////////////////////////////////////
1452 * Add a new controlbar object
1454 * @param parent The parent object
1455 * @return The new object or NULL if it cannot be created
1457 * @ingroup Controlbar
1459 EAPI Evas_Object * elm_controlbar_add(Evas_Object * parent)
1461 if (parent == NULL) return NULL;
1462 Evas_Object * obj = NULL;
1463 Evas_Object * bg = NULL;
1464 Widget_Data * wd = NULL;
1465 Evas_Coord x, y, w, h;
1466 wd = ELM_NEW(Widget_Data);
1467 Evas *evas = evas_object_evas_get(parent);
1468 if (evas == NULL) return NULL;
1469 obj = elm_widget_add(evas);
1470 if (obj == NULL) return NULL;
1471 ELM_SET_WIDTYPE(widtype, "controlbar");
1472 elm_widget_type_set(obj, "controlbar");
1473 elm_widget_sub_object_add(parent, obj);
1474 elm_widget_data_set(obj, wd);
1475 elm_widget_del_hook_set(obj, _del_hook);
1476 elm_widget_theme_hook_set(obj, _theme_hook);
1477 elm_widget_disable_hook_set(obj, _disable_hook);
1480 wd->parent = parent;
1481 evas_object_geometry_get(parent, &x, &y, &w, &h);
1487 wd->mode = ELM_CONTROLBAR_MODE_DEFAULT;
1491 wd->vertical = EINA_FALSE;
1492 wd->auto_align = EINA_FALSE;
1493 wd->init_animation = EINA_FALSE;
1494 wd->selected_animation = EINA_FALSE;
1495 wd->pressed_signal = eina_stringshare_add("elm,state,pressed");
1496 wd->selected_signal = eina_stringshare_add("elm,state,selected");
1497 wd->view = elm_layout_add(wd->parent);
1498 elm_layout_theme_set(wd->view, "controlbar", "view", "default");
1499 if (wd->view == NULL)
1501 printf("Cannot load bg edj\n");
1504 evas_object_show(wd->view);
1506 /* load background edj */
1507 wd->edje = edje_object_add(evas);
1508 _elm_theme_object_set(obj, wd->edje, "controlbar", "base", "default");
1509 if (wd->edje == NULL)
1511 printf("Cannot load base edj\n");
1514 evas_object_show(wd->edje);
1516 wd->bg = edje_object_add(evas);
1517 _elm_theme_object_set(obj, wd->bg, "controlbar", "background", "default");
1520 printf("Cannot load bg edj\n");
1523 edje_object_part_swallow(wd->edje, "bg_image", wd->bg);
1526 evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_RESIZE,
1527 _controlbar_object_resize, obj);
1528 evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_MOVE,
1529 _controlbar_object_move, obj);
1530 evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_SHOW,
1531 _controlbar_object_show, obj);
1532 evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_HIDE,
1533 _controlbar_object_hide, obj);
1534 bg = (Evas_Object *)edje_object_part_object_get(wd->edje, "bg_image");
1535 evas_object_event_callback_add(bg, EVAS_CALLBACK_MOVE, _controlbar_object_move, obj);
1536 evas_object_event_callback_add(bg, EVAS_CALLBACK_RESIZE, _controlbar_object_resize, obj);
1538 wd->selected_box = wd->focused_box = edje_object_add(evas);
1539 _elm_theme_object_set(obj, wd->focused_box, "controlbar", "item_bg_move", "default");
1540 evas_object_hide(wd->focused_box);
1542 wd->focused_box_left = edje_object_add(evas);
1543 _elm_theme_object_set(obj, wd->focused_box_left, "controlbar", "item_bg_move_left", "default");
1544 evas_object_hide(wd->focused_box_left);
1546 wd->focused_box_right = edje_object_add(evas);
1547 _elm_theme_object_set(obj, wd->focused_box_right, "controlbar", "item_bg_move_right", "default");
1548 evas_object_hide(wd->focused_box_right);
1551 wd->box = elm_table_add(wd->edje);
1552 elm_table_homogenous_set(wd->box, EINA_TRUE);
1553 evas_object_size_hint_weight_set(wd->box, EVAS_HINT_EXPAND,
1555 evas_object_size_hint_align_set(wd->box, EVAS_HINT_FILL, EVAS_HINT_FILL);
1556 edje_object_part_swallow(wd->edje, "elm.swallow.items", wd->box);
1557 evas_object_show(wd->box);
1559 wd->event_box = evas_object_rectangle_add(evas);
1560 evas_object_color_set(wd->event_box, 255, 255, 255, 0);
1561 evas_object_repeat_events_set(wd->event_box, EINA_TRUE);
1562 evas_object_show(wd->event_box);
1564 evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj);
1566 evas_object_smart_member_add(wd->view, obj);
1567 elm_widget_resize_object_set(obj, wd->edje);
1568 evas_object_smart_member_add(wd->focused_box, obj);
1569 evas_object_smart_member_add(wd->focused_box_left, obj);
1570 evas_object_smart_member_add(wd->focused_box_right, obj);
1571 evas_object_smart_member_add(wd->box, obj);
1572 evas_object_smart_member_add(wd->event_box, obj);
1580 * Append new tab item
1582 * @param obj The controlbar object
1583 * @param icon_path The icon path of item
1584 * @param label The label of item
1585 * @param view The view of item
1586 * @return The item of controlbar
1588 * @ingroup Controlbar
1590 EAPI Elm_Controlbar_Item * elm_controlbar_tab_item_append(Evas_Object * obj,
1597 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1598 Elm_Controlbar_Item * it;
1599 Elm_Controlbar_Item * lit;
1601 it = create_tab_item(obj, icon_path, label, view);
1602 if (!it) return NULL;
1603 wd = elm_widget_data_get(obj);
1604 if(check_bar_item_number(wd) >= 5 && wd->auto_align){
1605 if(!wd->more_item) {
1606 lit = elm_controlbar_last_item_get(obj);
1607 item_visible_set(lit, EINA_FALSE);
1608 create_more_item(wd, TABBAR);
1610 set_items_position(obj, it, NULL, EINA_FALSE);
1613 set_items_position(obj, it, NULL, EINA_TRUE);
1615 if(wd->init_animation) evas_object_hide(it->base);
1616 wd->items = eina_list_append(wd->items, it);
1618 elm_controlbar_item_view_set(wd->more_item, create_more_view(wd));
1620 check_background(wd);
1626 * Prepend new tab 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 view The view of item
1632 * @return The item of controlbar
1634 * @ingroup Controlbar
1636 EAPI Elm_Controlbar_Item * elm_controlbar_tab_item_prepend(Evas_Object *
1645 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1647 Elm_Controlbar_Item * it;
1648 Elm_Controlbar_Item * lit;
1649 Elm_Controlbar_Item * item;
1650 it = create_tab_item(obj, icon_path, label, view);
1651 if (!it) return NULL;
1652 wd = elm_widget_data_get(obj);
1653 item = eina_list_data_get(wd->items);
1654 if(check_bar_item_number(wd) >= 5 && wd->auto_align){
1655 if(!wd->more_item) {
1656 lit = elm_controlbar_last_item_get(obj);
1657 item_visible_set(lit, EINA_FALSE);
1658 create_more_item(wd, TABBAR);
1660 lit = elm_controlbar_item_prev(wd->more_item);
1661 item_visible_set(lit, EINA_FALSE);
1662 set_items_position(obj, it, item, EINA_TRUE);
1665 set_items_position(obj, it, item, EINA_TRUE);
1667 wd->items = eina_list_prepend(wd->items, it);
1669 elm_controlbar_item_view_set(wd->more_item, create_more_view(wd));
1671 check_background(wd);
1677 * Insert new tab item before given item
1679 * @param obj The controlbar object
1680 * @param before The given item
1681 * @param icon_path The icon path of item
1682 * @param label The label of item
1683 * @param view The view of item
1684 * @return The item of controlbar
1686 * @ingroup Controlbar
1688 EAPI Elm_Controlbar_Item *
1689 elm_controlbar_tab_item_insert_before(Evas_Object * obj,
1690 Elm_Controlbar_Item * before,
1691 const char *icon_path,
1692 const char *label, Evas_Object * view)
1694 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1696 Elm_Controlbar_Item * it;
1697 Elm_Controlbar_Item * lit;
1698 if (!before) return NULL;
1699 it = create_tab_item(obj, icon_path, label, view);
1700 if (!it) return NULL;
1701 wd = elm_widget_data_get(obj);
1702 if(check_bar_item_number(wd) >= 5 && wd->auto_align){
1705 lit = elm_controlbar_last_item_get(obj);
1706 item_visible_set(lit, EINA_FALSE);
1707 create_more_item(wd, TABBAR);
1709 before = wd->more_item;
1710 if(before->order > 0)
1712 lit = elm_controlbar_item_prev(wd->more_item);
1713 item_visible_set(lit, EINA_FALSE);
1714 set_items_position(obj, it, before, EINA_TRUE);
1718 set_items_position(obj, it, before, EINA_FALSE);
1722 set_items_position(obj, it, before, EINA_TRUE);
1724 wd->items = eina_list_prepend_relative(wd->items, it, before);
1726 elm_controlbar_item_view_set(wd->more_item, create_more_view(wd));
1728 check_background(wd);
1734 * Insert new tab item after given item
1736 * @param obj The controlbar object
1737 * @param after The given item
1738 * @param icon_path The icon path of item
1739 * @param label The label of item
1740 * @param view The view of item
1741 * @return The item of controlbar
1743 * @ingroup Controlbar
1745 EAPI Elm_Controlbar_Item *
1746 elm_controlbar_tab_item_insert_after(Evas_Object * obj,
1747 Elm_Controlbar_Item * after,
1748 const char *icon_path, const char *label,
1751 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1753 Elm_Controlbar_Item * it;
1754 Elm_Controlbar_Item * lit;
1755 Elm_Controlbar_Item * item;
1756 if (!after) return NULL;
1757 it = create_tab_item(obj, icon_path, label, view);
1758 if (!it) return NULL;
1759 wd = elm_widget_data_get(obj);
1760 item = elm_controlbar_item_next(after);
1761 if(check_bar_item_number(wd) >= 5 && wd->auto_align){
1764 lit = elm_controlbar_last_item_get(obj);
1765 item_visible_set(lit, EINA_FALSE);
1766 create_more_item(wd, TABBAR);
1768 lit = elm_controlbar_item_prev(wd->more_item);
1769 if(lit != after && item->order > 0)
1771 item_visible_set(lit, EINA_FALSE);
1772 set_items_position(obj, it, item, EINA_TRUE);
1776 set_items_position(obj, it, NULL, EINA_FALSE);
1780 set_items_position(obj, it, item, EINA_TRUE);
1782 wd->items = eina_list_append_relative(wd->items, it, after);
1784 elm_controlbar_item_view_set(wd->more_item, create_more_view(wd));
1786 check_background(wd);
1792 * Append new tool item
1794 * @param obj The controlbar object
1795 * @param icon_path The icon path of item
1796 * @param label The label of item
1797 * @param func Callback function of item
1798 * @param data The data of callback function
1799 * @return The item of controlbar
1801 * @ingroup Controlbar
1803 EAPI Elm_Controlbar_Item * elm_controlbar_tool_item_append(Evas_Object *
1818 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1819 Elm_Controlbar_Item * it;
1820 Elm_Controlbar_Item * lit;
1822 it = create_tool_item(obj, icon_path, label, func, data);
1823 if (!it) return NULL;
1824 wd = elm_widget_data_get(obj);
1825 if(check_bar_item_number(wd) >= 5 && wd->auto_align){
1826 if(!wd->more_item) {
1827 lit = elm_controlbar_last_item_get(obj);
1828 item_visible_set(lit, EINA_FALSE);
1829 create_more_item(wd, TOOLBAR);
1831 set_items_position(obj, it, NULL, EINA_FALSE);
1834 set_items_position(obj, it, NULL, EINA_TRUE);
1836 wd->items = eina_list_append(wd->items, it);
1837 check_toolbar_line(wd);
1843 * Prepend new tool item
1845 * @param obj The controlbar object
1846 * @param icon_path The icon path of item
1847 * @param label The label of item
1848 * @param func Callback function of item
1849 * @param data The data of callback function
1850 * @return The item of controlbar
1852 * @ingroup Controlbar
1854 EAPI Elm_Controlbar_Item * elm_controlbar_tool_item_prepend(Evas_Object *
1870 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1872 Elm_Controlbar_Item * it;
1873 Elm_Controlbar_Item * lit;
1874 Elm_Controlbar_Item * item;
1875 it = create_tool_item(obj, icon_path, label, func, data);
1876 if (!it) return NULL;
1877 wd = elm_widget_data_get(obj);
1878 item = eina_list_data_get(wd->items);
1879 if(check_bar_item_number(wd) >= 5 && wd->auto_align){
1880 if(!wd->more_item) {
1881 lit = elm_controlbar_last_item_get(obj);
1882 item_visible_set(lit, EINA_FALSE);
1883 create_more_item(wd, TOOLBAR);
1885 lit = elm_controlbar_item_prev(wd->more_item);
1886 item_visible_set(lit, EINA_FALSE);
1887 set_items_position(obj, it, item, EINA_TRUE);
1890 set_items_position(obj, it, item, EINA_TRUE);
1892 wd->items = eina_list_prepend(wd->items, it);
1893 check_toolbar_line(wd);
1899 * Insert new tool item before given item
1901 * @param obj The controlbar object
1902 * @param before The given item
1903 * @param icon_path The icon path of item
1904 * @param label The label of item
1905 * @param func Callback function of item
1906 * @param data The data of callback function
1907 * @return The item of controlbar
1909 * @ingroup Controlbar
1911 EAPI Elm_Controlbar_Item *
1912 elm_controlbar_tool_item_insert_before(Evas_Object * obj,
1913 Elm_Controlbar_Item * before,
1914 const char *icon_path,
1916 void (*func) (void *data,
1921 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1923 Elm_Controlbar_Item * it;
1924 Elm_Controlbar_Item * lit;
1925 if (!before) return NULL;
1926 it = create_tool_item(obj, icon_path, label, func, data);
1927 if (!it) return NULL;
1928 wd = elm_widget_data_get(obj);
1929 if(check_bar_item_number(wd) >= 5 && wd->auto_align){
1932 lit = elm_controlbar_last_item_get(obj);
1933 item_visible_set(lit, EINA_FALSE);
1934 create_more_item(wd, TOOLBAR);
1936 before = wd->more_item;
1937 if(before->order > 0)
1939 lit = elm_controlbar_item_prev(wd->more_item);
1940 item_visible_set(lit, EINA_FALSE);
1941 set_items_position(obj, it, before, EINA_TRUE);
1945 set_items_position(obj, it, before, EINA_FALSE);
1949 set_items_position(obj, it, before, EINA_TRUE);
1951 wd->items = eina_list_prepend_relative(wd->items, it, before);
1952 check_toolbar_line(wd);
1958 * Insert new tool item after given item
1960 * @param obj The controlbar object
1961 * @param after The given item
1962 * @param icon_path The icon path of item
1963 * @param label The label of item
1964 * @param func Callback function of item
1965 * @param data The data of callback function
1966 * @return The item of controlbar
1968 * @ingroup Controlbar
1970 EAPI Elm_Controlbar_Item *
1971 elm_controlbar_tool_item_insert_after(Evas_Object * obj,
1972 Elm_Controlbar_Item * after,
1973 const char *icon_path,
1975 void (*func) (void *data,
1980 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1982 Elm_Controlbar_Item * it;
1983 Elm_Controlbar_Item * lit;
1984 Elm_Controlbar_Item * item;
1985 if (!after) return NULL;
1986 it = create_tool_item(obj, icon_path, label, func, data);
1987 if (!it) return NULL;
1988 wd = elm_widget_data_get(obj);
1989 item = elm_controlbar_item_next(after);
1990 if(check_bar_item_number(wd) >= 5 && wd->auto_align){
1993 lit = elm_controlbar_last_item_get(obj);
1994 item_visible_set(lit, EINA_FALSE);
1995 create_more_item(wd, TOOLBAR);
1997 lit = elm_controlbar_item_prev(wd->more_item);
1998 if(lit != after && item->order > 0)
2000 item_visible_set(lit, EINA_FALSE);
2001 set_items_position(obj, it, item, EINA_TRUE);
2005 set_items_position(obj, it, NULL, EINA_FALSE);
2009 set_items_position(obj, it, item, EINA_TRUE);
2011 wd->items = eina_list_append_relative(wd->items, it, after);
2012 check_toolbar_line(wd);
2018 * Append new object item
2020 * @param obj The controlbar object
2021 * @param obj_item The object of item
2022 * @param sel The number of sel occupied
2023 * @return The item of controlbar
2025 * @ingroup Controlbar
2027 EAPI Elm_Controlbar_Item * elm_controlbar_object_item_append(Evas_Object *
2033 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
2035 Elm_Controlbar_Item * it;
2036 it = create_object_item(obj, obj_item, sel);
2037 if (!it) return NULL;
2038 wd = elm_widget_data_get(obj);
2039 set_items_position(obj, it, NULL, EINA_TRUE);
2040 wd->items = eina_list_append(wd->items, it);
2046 * Prepend new object item
2048 * @param obj The controlbar object
2049 * @param obj_item The object of item
2050 * @param sel The number of sel occupied
2051 * @return The item of controlbar
2053 * @ingroup Controlbar
2055 EAPI Elm_Controlbar_Item * elm_controlbar_object_item_prepend(Evas_Object *
2061 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
2063 Elm_Controlbar_Item * it;
2064 Elm_Controlbar_Item * item;
2065 it = create_object_item(obj, obj_item, sel);
2066 if (!it) return NULL;
2067 wd = elm_widget_data_get(obj);
2068 item = eina_list_data_get(wd->items);
2069 set_items_position(obj, it, item, EINA_TRUE);
2070 wd->items = eina_list_prepend(wd->items, it);
2076 * Insert new object item before given item
2078 * @param obj The controlbar object
2079 * @param before The given item
2080 * @param obj_item The object of item
2081 * @param sel The number of sel occupied
2082 * @return The item of controlbar
2084 * @ingroup Controlbar
2086 EAPI Elm_Controlbar_Item *
2087 elm_controlbar_object_item_insert_before(Evas_Object * obj,
2088 Elm_Controlbar_Item * before,
2089 Evas_Object * obj_item, const int sel)
2091 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
2093 Elm_Controlbar_Item * it;
2094 if (!before) return NULL;
2095 it = create_object_item(obj, obj_item, sel);
2096 if (!it) return NULL;
2097 wd = elm_widget_data_get(obj);
2098 set_items_position(obj, it, before, EINA_TRUE);
2099 wd->items = eina_list_prepend_relative(wd->items, it, before);
2105 * Insert new object item after given item
2107 * @param obj The controlbar object
2108 * @param after The given item
2109 * @param obj_item The object of item
2110 * @param sel The number of sel occupied
2111 * @return The item of controlbar
2113 * @ingroup Controlbar
2115 EAPI Elm_Controlbar_Item *
2116 elm_controlbar_object_item_insert_after(Evas_Object * obj,
2117 Elm_Controlbar_Item * after,
2118 Evas_Object * obj_item, const int sel)
2120 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
2122 Elm_Controlbar_Item * it;
2123 Elm_Controlbar_Item * item;
2124 if (!after) return NULL;
2125 it = create_object_item(obj, obj_item, sel);
2126 if (!it) return NULL;
2127 wd = elm_widget_data_get(obj);
2128 item = elm_controlbar_item_next(after);
2129 set_items_position(obj, it, item, EINA_TRUE);
2130 wd->items = eina_list_append_relative(wd->items, it, after);
2136 * Get the object of the object item
2138 * @param it The item of controlbar
2139 * @return The object of the object item
2141 * @ingroup Controlbar
2144 elm_controlbar_object_item_object_get(Elm_Controlbar_Item * it)
2146 if (!it) return NULL;
2147 if (it->style != OBJECT) return NULL;
2148 if (!it->base) return NULL;
2153 * Delete item from controlbar
2155 * @param it The item of controlbar
2157 * @ingroup Controlbar
2160 elm_controlbar_item_del(Elm_Controlbar_Item * it)
2167 Elm_Controlbar_Item * item;
2175 if (it->obj == NULL)
2177 printf("Invalid argument: controlbar object is NULL\n");
2180 wd = elm_widget_data_get(it->obj);
2183 printf("Cannot get smart data\n");
2190 elm_table_unpack(wd->box, it->base);
2192 EINA_LIST_FOREACH(wd->items, l, item)
2196 if (item->order > it->order)
2198 elm_table_unpack(wd->box, item->base);
2201 elm_table_pack(wd->box, item->base, item->order - 1, 0, item->sel, 1);
2203 elm_table_pack(wd->box, item->base, 0, item->order - 1, item->sel, 1);
2211 // delete item in list
2213 wd->items = eina_list_remove(wd->items, it);
2216 wd->num = wd->num - 1;
2221 * Select item in controlbar
2223 * @param it The item of controlbar
2225 * @ingroup Controlbar
2228 elm_controlbar_item_select(Elm_Controlbar_Item * it)
2231 if (it->obj == NULL) return;
2232 Widget_Data * wd = elm_widget_data_get(it->obj);
2233 if (wd == NULL) return;
2239 * Set the icon of item
2241 * @param it The item of controlbar
2242 * @param icon_path The icon path of the item
2243 * @return The icon object
2245 * @ingroup Controlbar
2248 elm_controlbar_item_icon_set(Elm_Controlbar_Item * it, const char *icon_path)
2253 eina_stringshare_del(it->icon_path);
2254 it->icon_path = NULL;
2258 evas_object_del(it->icon);
2262 if(icon_path != NULL)
2264 it->icon_path = eina_stringshare_add(icon_path);
2265 it->icon = create_item_icon(it->base_item, it, "elm.swallow.icon");
2268 if(it->label && it->icon)
2270 edje_object_signal_emit(_EDJ(it->base_item), "elm,state,icon_text", "elm");
2271 elm_label_line_wrap_set(it->label, EINA_FALSE);
2272 elm_label_wrap_mode_set(it->label, 0);
2275 edje_object_signal_emit(_EDJ(it->base_item), "elm,state,default", "elm");
2277 if(it->wd->disabled || it->disable)
2278 item_color_set(it, "elm.item.disable.color");
2280 item_color_set(it, "elm.item.default.color");
2284 * Get the icon of item
2286 * @param it The item of controlbar
2287 * @return The icon object
2289 * @ingroup Controlbar
2292 elm_controlbar_item_icon_get(Elm_Controlbar_Item * it)
2294 if (!it) return NULL;
2299 * Set the label of item
2301 * @param it The item of controlbar
2302 * @param label The label of item
2304 * @ingroup Controlbar
2307 elm_controlbar_item_label_set(Elm_Controlbar_Item * it, const char *label)
2312 eina_stringshare_del(it->text);
2317 evas_object_del(it->label);
2322 it->text = eina_stringshare_add(label);
2323 it->label = create_item_label(it->base_item, it, "elm.swallow.text");
2325 if(it->wd->disabled || it->disable) item_color_set(it, "elm.item.disable.color");
2327 if(it->label && it->icon)
2329 edje_object_signal_emit(_EDJ(it->base_item), "elm,state,icon_text", "elm");
2330 elm_label_line_wrap_set(it->label, EINA_FALSE);
2331 elm_label_wrap_mode_set(it->label, 0);
2334 edje_object_signal_emit(_EDJ(it->base_item), "elm,state,default", "elm");
2338 * Get the label of item
2340 * @param it The item of controlbar
2341 * @return The label of item
2343 * @ingroup Controlbar
2346 elm_controlbar_item_label_get(Elm_Controlbar_Item * it)
2348 if (!it) return NULL;
2353 * Get the selected item
2355 * @param obj The controlbar object
2356 * @return The item of controlbar
2358 * @ingroup Controlbar
2360 EAPI Elm_Controlbar_Item * elm_controlbar_selected_item_get(Evas_Object *
2363 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
2366 Elm_Controlbar_Item * item;
2367 if (obj == NULL) return NULL;
2368 Widget_Data * wd = elm_widget_data_get(obj);
2369 if (!wd || !wd->items) return NULL;
2370 EINA_LIST_FOREACH(wd->items, l, item)
2372 if (item->selected) return item;
2378 * Get the first item
2380 * @param obj The controlbar object
2381 * @return The item of controlbar
2383 * @ingroup Controlbar
2385 EAPI Elm_Controlbar_Item * elm_controlbar_first_item_get(Evas_Object * obj)
2387 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
2388 Widget_Data * wd = elm_widget_data_get(obj);
2389 if (!wd || !wd->items) return NULL;
2390 return eina_list_data_get(wd->items);
2396 * @param obj The controlbar object
2397 * @return The item of controlbar
2399 * @ingroup Controlbar
2401 EAPI Elm_Controlbar_Item * elm_controlbar_last_item_get(Evas_Object * obj)
2403 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
2404 Widget_Data * wd = elm_widget_data_get(obj);
2405 if (!wd || !wd->items) return NULL;
2406 return eina_list_data_get(eina_list_last(wd->items));
2412 * @param obj The controlbar object
2413 * @return The list of the items
2415 * @ingroup Controlbar
2417 EAPI Eina_List * elm_controlbar_items_get(Evas_Object * obj)
2419 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
2420 Widget_Data * wd = elm_widget_data_get(obj);
2421 if (!wd || !wd->items) return NULL;
2426 * Get the previous item
2428 * @param it The item of controlbar
2429 * @return The previous item of the parameter item
2431 * @ingroup Controlbar
2433 EAPI Elm_Controlbar_Item * elm_controlbar_item_prev(Elm_Controlbar_Item *
2436 if (!it) return NULL;
2439 Elm_Controlbar_Item * item;
2440 if (it->obj == NULL) return NULL;
2441 Widget_Data * wd = elm_widget_data_get(it->obj);
2442 if (!wd || !wd->items) return NULL;
2443 EINA_LIST_FOREACH(wd->items, l, item)
2447 l = eina_list_prev(l);
2448 if (!l) return NULL;
2449 return eina_list_data_get(l);
2458 * @param obj The controlbar object
2459 * @return The next item of the parameter item
2461 * @ingroup Controlbar
2463 EAPI Elm_Controlbar_Item * elm_controlbar_item_next(Elm_Controlbar_Item *
2466 if (!it) return NULL;
2469 Elm_Controlbar_Item * item;
2470 if (it->obj == NULL) return NULL;
2471 Widget_Data * wd = elm_widget_data_get(it->obj);
2472 if (!wd || !wd->items) return NULL;
2473 EINA_LIST_FOREACH(wd->items, l, item)
2477 l = eina_list_next(l);
2478 if (!l) return NULL;
2479 return eina_list_data_get(l);
2486 * Set the visible status of item in bar
2488 * @param it The item of controlbar
2489 * @param bar EINA_TRUE or EINA_FALSE
2491 * @ingroup Controlbar
2494 elm_controlbar_item_visible_set(Elm_Controlbar_Item * it, Eina_Bool visible)
2497 if (it->obj == NULL) return;
2498 Widget_Data * wd = elm_widget_data_get(it->obj);
2502 item_visible_set(it, visible);
2506 * Get the result which or not item is visible in bar
2508 * @param it The item of controlbar
2509 * @return EINA_TRUE or EINA_FALSE
2511 * @ingroup Controlbar
2514 elm_controlbar_item_visible_get(Elm_Controlbar_Item * it)
2516 if (!it) return EINA_FALSE;
2518 if (it->obj == NULL) return EINA_FALSE;
2519 Widget_Data * wd = elm_widget_data_get(it->obj);
2520 if (!wd) return EINA_FALSE;
2521 if(it->order <= 0) return EINA_FALSE;
2529 * @param it The item of controlbar
2530 * @param bar EINA_TRUE or EINA_FALSE
2532 * @ingroup Controlbar
2535 elm_controlbar_item_disable_set(Elm_Controlbar_Item * it, Eina_Bool disable)
2539 if (it->disable == disable) return;
2541 it->disable = disable;
2543 if (it->wd && it->wd->disabled) return;
2545 if (it->style == OBJECT)
2547 if (it->base) elm_widget_disabled_set(it->base, it->disable);
2552 item_color_set(it, "elm.item.disable.color");
2554 item_color_set(it, "elm.item.default.color");
2561 * @param it The item of controlbar
2562 * @return EINA_TRUE or EINA_FALSE
2564 * @ingroup Controlbar
2567 elm_controlbar_item_disable_get(Elm_Controlbar_Item * it)
2569 if (!it) return EINA_FALSE;
2575 * Set the view of the item
2577 * @param it The item of controlbar
2578 * @param view The view for the item
2580 * @ingroup Controlbar
2583 elm_controlbar_item_view_set(Elm_Controlbar_Item *it, Evas_Object * view)
2591 * Get the view of the item
2593 * @param it The item of controlbar
2594 * @return The view for the item
2596 * @ingroup Controlbar
2599 elm_controlbar_item_view_get(Elm_Controlbar_Item *it)
2601 if(!it) return NULL;
2607 * Set the mode of the controlbar
2609 * @param obj The object of the controlbar
2610 * @param mode The mode of the controlbar
2612 * @ingroup Controlbar
2615 elm_controlbar_mode_set(Evas_Object *obj, int mode)
2617 ELM_CHECK_WIDTYPE(obj, widtype);
2618 Widget_Data *wd = elm_widget_data_get(obj);
2621 fprintf(stderr, "Cannot get smart data\n");
2625 if(wd->mode == mode) return;
2631 case ELM_CONTROLBAR_MODE_DEFAULT:
2632 edje_object_signal_emit(wd->edje, "elm,state,default", "elm");
2634 case ELM_CONTROLBAR_MODE_TRANSLUCENCE:
2635 elm_controlbar_alpha_set(obj, 85);
2637 case ELM_CONTROLBAR_MODE_TRANSPARENCY:
2638 elm_controlbar_alpha_set(obj, 0);
2640 case ELM_CONTROLBAR_MODE_LARGE:
2641 edje_object_signal_emit(wd->edje, "elm,state,large", "elm");
2643 case ELM_CONTROLBAR_MODE_SMALL:
2644 edje_object_signal_emit(wd->edje, "elm,state,small", "elm");
2646 case ELM_CONTROLBAR_MODE_LEFT:
2647 wd->selected_box = wd->focused_box_left;
2648 wd->selected_signal = eina_stringshare_add("elm,state,selected_left");
2649 wd->pressed_signal = eina_stringshare_add("elm,state,pressed_left");
2650 edje_object_signal_emit(wd->edje, "elm,state,left", "elm");
2651 check_background(wd);
2654 case ELM_CONTROLBAR_MODE_RIGHT:
2655 wd->selected_box = wd->focused_box_right;
2656 wd->selected_signal = eina_stringshare_add("elm,state,selected_right");
2657 wd->pressed_signal = eina_stringshare_add("elm,state,pressed_right");
2658 edje_object_signal_emit(wd->edje, "elm,state,right", "elm");
2659 check_background(wd);
2666 wd->selected_box = wd->focused_box;
2667 wd->selected_signal = eina_stringshare_add("elm,state,selected");
2668 wd->pressed_signal = eina_stringshare_add("elm,state,pressed");
2669 check_background(wd);
2674 * Set the alpha of the controlbar
2676 * @param obj The object of the controlbar
2677 * @param alpha The alpha value of the controlbar (0-100)
2679 * @ingroup Controlbar
2682 elm_controlbar_alpha_set(Evas_Object *obj, int alpha)
2684 ELM_CHECK_WIDTYPE(obj, widtype);
2686 Widget_Data *wd = elm_widget_data_get(obj);
2689 fprintf(stderr, "Cannot get smart data\n");
2693 if(alpha < 0) wd->alpha = 0;
2694 else if(alpha > 100) wd->alpha = 100;
2695 else wd->alpha = alpha;
2697 evas_object_color_get(wd->bg, &r, &g, &b, NULL);
2698 evas_object_color_set(wd->bg, r, g, b, (int)(255 * wd->alpha / 100));
2703 * Set auto-align mode of the controlbar(It's not prepared yet)
2704 * If you set the auto-align and add items more than 5,
2705 * the "more" item will be made and the items more than 5 will be unvisible.
2707 * @param obj The object of the controlbar
2708 * @param auto_align The dicision that the controlbar use the auto-align
2710 * @ingroup Controlbar
2713 elm_controlbar_item_auto_align_set(Evas_Object *obj, Eina_Bool auto_align)
2715 ELM_CHECK_WIDTYPE(obj, widtype);
2716 Widget_Data *wd = elm_widget_data_get(obj);
2717 Elm_Controlbar_Item *item;
2722 fprintf(stderr, "Cannot get smart data\n");
2726 if(wd->auto_align == auto_align) return;
2730 if(check_bar_item_number(wd) >= 5 && !wd->more_item)
2733 EINA_LIST_FOREACH(wd->items, l, item)
2735 if(elm_controlbar_item_visible_get(item))
2738 item_delete_in_bar(item);
2741 item = elm_controlbar_last_item_get(obj);
2742 while(!elm_controlbar_item_visible_get(item)){
2743 item = elm_controlbar_item_prev(item);
2745 create_more_item(wd, item->style);
2753 if(wd->more_item->view)
2754 evas_object_del(wd->more_item->view);
2755 wd->items = eina_list_remove(wd->items, wd->more_item);
2756 eina_stringshare_del(wd->more_item->text);
2757 if (wd->more_item->icon)
2758 evas_object_del(wd->more_item->icon);
2759 if (wd->more_item->base)
2760 evas_object_del(wd->more_item->base);
2761 if (wd->more_item->base_item)
2762 evas_object_del(wd->more_item->base_item);
2763 free(wd->more_item);
2764 wd->more_item = NULL;
2766 // make all item is visible
2768 EINA_LIST_FOREACH(wd->items, l, item)
2770 if(!elm_controlbar_item_visible_get(item))
2771 item_insert_in_bar(item, i);
2776 wd->auto_align = auto_align;
2781 * Set the vertical mode of the controlbar
2783 * @param obj The object of the controlbar
2784 * @param vertical The vertical mode of the controlbar (TRUE = vertical, FALSE = horizontal)
2786 * @ingroup Controlbar
2789 elm_controlbar_vertical_set(Evas_Object *obj, Eina_Bool vertical)
2791 ELM_CHECK_WIDTYPE(obj, widtype);
2792 Widget_Data *wd = elm_widget_data_get(obj);
2795 fprintf(stderr, "Cannot get smart data\n");
2799 if(wd->vertical == vertical) return;
2800 wd->vertical = vertical;
2802 if(check_bar_item_number(wd) > 1)
2806 check_toolbar_line(wd);
2810 init_animation(void *data)
2813 Elm_Controlbar_Item * item;
2814 Widget_Data * wd = (Widget_Data *)data;
2816 wd->visible_items = eina_list_free(wd->visible_items);
2817 EINA_LIST_FOREACH(wd->items, l, item)
2821 wd->visible_items = eina_list_append(wd->visible_items, item->base);
2826 wd->ani_func(wd->ani_data, wd->object, wd->visible_items);
2828 return ECORE_CALLBACK_CANCEL;
2832 elm_controlbar_animation_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, void *event_info), void *data)
2834 printf("\n==================================\n");
2835 printf("%s\n", __func__);
2836 printf("==================================\n");
2837 printf("This API is just for test.\n");
2838 printf("Please don't use it!!\n");
2839 printf("Thank you.\n");
2840 printf("==================================\n");
2842 ELM_CHECK_WIDTYPE(obj, widtype);
2843 Widget_Data *wd = elm_widget_data_get(obj);
2846 fprintf(stderr, "Cannot get smart data\n");
2852 wd->init_animation = EINA_TRUE;
2854 wd->ani_func = func;
2855 wd->ani_data = data;
2857 ecore_idler_add(init_animation, wd);
2862 elm_controlbar_item_animation_set(Evas_Object *obj, Eina_Bool auto_animation, Eina_Bool selected_animation)
2864 printf("\n==================================\n");
2865 printf("%s\n", __func__);
2866 printf("==================================\n");
2867 printf("This API is just for test.\n");
2868 printf("Please don't use it!!\n");
2869 printf("Thank you.\n");
2870 printf("==================================\n");
2872 ELM_CHECK_WIDTYPE(obj, widtype);
2873 Widget_Data *wd = elm_widget_data_get(obj);
2876 fprintf(stderr, "Cannot get smart data\n");
2880 if(auto_animation && !wd->effect_timer)
2882 wd->effect_timer = ecore_timer_add(1.5, item_animation_effect, wd);
2886 if(wd->effect_timer) ecore_timer_del(wd->effect_timer);
2887 wd->effect_timer = NULL;
2890 wd->selected_animation = selected_animation;