4 #include <Elementary.h>
8 #define EAPI __attribute__ ((visibility("default")))
11 #define ELM_MAX(v1, v2) (((v1) > (v2)) ? (v1) : (v2))
12 #define _EDJ(x) (Evas_Object *)elm_layout_edje_get(x)
18 typedef struct _Animation_Data Animation_Data;
20 struct _Animation_Data
33 void (*func) (void *data, Evas_Object * obj);
35 Ecore_Animator * timer;
38 // internal data structure of controlbar object
39 typedef struct _Widget_Data Widget_Data;
50 Elm_Controlbar_Item * more_item;
51 Elm_Controlbar_Item * pre_item;
52 Elm_Controlbar_Item * cur_item;
53 Evas_Coord x, y, w, h;
62 Eina_List * visible_items;
64 void (*ani_func) (void *data, Evas_Object * obj, void *event_info);
66 Ecore_Timer *effect_timer;
67 Eina_Bool selected_animation;
70 const char *pressed_signal;
71 const char *selected_signal;
73 Ecore_Job *del_callback_job;
76 struct _Elm_Controlbar_Item
81 Evas_Object * base_item;
84 const char *icon_path;
86 void (*func) (void *data, Evas_Object * obj, void *event_info);
95 static const char *widtype = NULL;
97 static void _sizing_eval(Evas_Object * obj);
98 static int _check_bar_item_number(Widget_Data *wd);
99 static void _unpress_box_cb(void *data, Evas_Object *obj, void *event_info);
100 static void _clicked_box_cb(void *data, Evas_Object *obj, void *event_info);
101 static void _select_box(Elm_Controlbar_Item * it);
102 static void _cancel_selected_box(Widget_Data *wd);
103 static void _check_toolbar_line(Widget_Data *wd);
104 static Eina_Bool _press_box(Elm_Controlbar_Item * it);
107 _controlbar_move(void *data, Evas_Object * obj __UNUSED__)
110 Evas_Coord x, y, x_, y_, width;
112 wd = elm_widget_data_get((Evas_Object *) data);
114 evas_object_geometry_get(wd->edje, &x, &y, NULL, NULL);
117 evas_object_move(wd->edje, x, y);
118 evas_object_geometry_get(elm_object_part_content_get(wd->edje, "bg_image"), NULL, NULL, &width, NULL);
119 evas_object_geometry_get(wd->edje, &x_, &y_, NULL, NULL);
123 _controlbar_resize(void *data, Evas_Object * obj __UNUSED__)
126 Evas_Coord x, y, x_, y_, w, h, width, height;
128 wd = elm_widget_data_get((Evas_Object *) data);
130 evas_object_geometry_get(wd->edje, &x, &y, &w, &h);
133 evas_object_resize(wd->edje, w, h);
134 evas_object_geometry_get(elm_object_part_content_get(wd->edje, "bg_image"), NULL, NULL, &width, &height);
135 evas_object_geometry_get(wd->edje, &x_, &y_, NULL, NULL);
139 _controlbar_object_move(void *data, Evas * e __UNUSED__, Evas_Object * obj,
140 void *event_info __UNUSED__)
142 _controlbar_move(data, obj);
146 _controlbar_object_resize(void *data, Evas * e __UNUSED__, Evas_Object * obj,
147 void *event_info __UNUSED__)
149 _controlbar_resize(data, obj);
153 _controlbar_object_show(void *data, Evas * e __UNUSED__, Evas_Object * obj __UNUSED__,
154 void *event_info __UNUSED__)
158 wd = elm_widget_data_get((Evas_Object *) data);
160 evas_object_show(wd->edje);
161 evas_object_show(wd->box);
165 _controlbar_object_hide(void *data, Evas * e __UNUSED__, Evas_Object * obj __UNUSED__,
166 void *event_info __UNUSED__)
170 wd = elm_widget_data_get((Evas_Object *) data);
172 evas_object_hide(wd->edje);
173 evas_object_hide(wd->box);
175 _cancel_selected_box(wd);
179 _item_del(Elm_Controlbar_Item *it)
182 Widget_Data *wd = elm_widget_data_get(it->obj);
186 eina_stringshare_del(it->text);
188 eina_stringshare_del(it->icon_path);
190 evas_object_del(it->icon);
192 evas_object_del(it->base);
195 evas_object_smart_callback_del(it->base_item, "unpressed", _unpress_box_cb);
196 evas_object_smart_callback_del(it->base_item, "clicked", _clicked_box_cb);
197 evas_object_del(it->base_item);
200 evas_object_del(it->view);
204 _del_hook(Evas_Object * obj)
206 Widget_Data * wd = elm_widget_data_get(obj);
207 Elm_Controlbar_Item * item;
210 EINA_LIST_FREE(wd->items, item)
218 evas_object_del(wd->bg);
223 evas_object_del(wd->box);
228 evas_object_del(wd->edje);
231 if (wd->effect_timer)
233 ecore_timer_del(wd->effect_timer);
234 wd->effect_timer = NULL;
238 if (wd->ad->timer) ecore_animator_del(wd->ad->timer);
239 wd->ad->timer = NULL;
243 if (wd->del_callback_job)
245 if (wd->del_callback_job) ecore_job_del(wd->del_callback_job);
246 wd->del_callback_job = NULL;
254 _theme_hook(Evas_Object * obj)
258 Elm_Controlbar_Item * item;
261 Widget_Data * wd = elm_widget_data_get(obj);
263 elm_layout_theme_set(wd->edje, "controlbar", "base",
264 elm_widget_style_get(obj));
265 elm_layout_theme_set(wd->bg, "controlbar", "background",
266 elm_widget_style_get(obj));
267 evas_object_color_get(wd->bg, &r, &g, &b, NULL);
268 evas_object_color_set(wd->bg, r, g, b, (int)(255 * wd->alpha / 100));
269 EINA_LIST_FOREACH(wd->items, l, item)
271 elm_layout_theme_set(item->base, "controlbar", "item_bg", elm_widget_style_get(obj));
275 elm_controlbar_mode_set(obj, wd->mode);
276 _check_toolbar_line(wd);
280 _disable_hook(Evas_Object * obj)
282 Widget_Data * wd = elm_widget_data_get(obj);
285 Elm_Controlbar_Item * item;
288 wd->disabled = elm_widget_disabled_get(obj);
290 EINA_LIST_FOREACH(wd->items, l, item)
293 disabled = wd->disabled;
295 disabled = item->disabled;
297 if (item->base_item) elm_widget_disabled_set(item->base_item, disabled);
302 _sub_del(void *data __UNUSED__, Evas_Object * obj, void *event_info)
307 _sizing_eval(Evas_Object * obj)
309 Widget_Data * wd = elm_widget_data_get(obj);
311 _controlbar_move(obj, obj);
312 _controlbar_resize(obj, obj);
316 _move_evas_object(void *data)
318 const Evas_Object *bg_image;
319 double t = 0.0, vx = 0.0, vy = 0.0, vw = 0.0, vh = 0.0;
320 int dx = 0 , dy = 0, dw = 0, dh = 0;
321 int px = 0, py = 0, pw = 0, ph = 0;
322 int ox = 0, oy = 0, ow = 0, oh = 0;
323 int x = 0, y = 0, w = 0, h = 0;
325 Animation_Data * ad = (Animation_Data *) data;
326 bg_image = edje_object_part_object_get(_EDJ(ad->obj), "bg_image");
327 if (bg_image) evas_object_geometry_get(bg_image, &ox, &oy, &ow, &oh);
328 t = ELM_MAX(0.0, ecore_loop_time_get() - ad->start_time);
329 dx = ad->tx - ad->fx;
330 dy = ad->ty - ad->fy;
331 dw = ad->tw - ad->fw;
332 dh = ad->th - ad->fh;
335 x = (1 * sin((t / ad->time) * (M_PI / 2)) * dx);
336 y = (1 * sin((t / ad->time) * (M_PI / 2)) * dy);
337 w = (1 * sin((t / ad->time) * (M_PI / 2)) * dw);
338 h = (1 * sin((t / ad->time) * (M_PI / 2)) * dh);
355 vx = (double)(px - ox) / (double)(ow - pw);
359 vy = (double)(py - oy) / (double)(oh - ph);
360 vw = (double)pw / (double)ow;
361 vh = (double)ph / (double)oh;
363 if ((x == dx) && (y == dy) && (w == dw) && (h == dh))
365 if (ad->timer) ecore_animator_del(ad->timer);
367 edje_object_part_drag_size_set(_EDJ(ad->obj), "elm.dragable.box", vw, vh);
368 edje_object_part_drag_value_set(_EDJ(ad->obj), "elm.dragable.box", vx, vy);
369 if (ad->func != NULL)
370 ad->func(ad->data, ad->obj);
371 return ECORE_CALLBACK_CANCEL;
375 edje_object_part_drag_size_set(_EDJ(ad->obj), "elm.dragable.box", vw, vh);
376 edje_object_part_drag_value_set(_EDJ(ad->obj), "elm.dragable.box", vx, vy);
378 return ECORE_CALLBACK_RENEW;
381 static Animation_Data*
382 _move_object_with_animation(Evas_Object * obj, Evas_Coord x, Evas_Coord y,
383 Evas_Coord w, Evas_Coord h, Evas_Coord x_,
384 Evas_Coord y_, Evas_Coord w_, Evas_Coord h_,
385 double time, Eina_Bool (*mv_func) (void *data),
386 void (*func) (void *data,
387 Evas_Object * obj), void *data)
389 Animation_Data * ad = (Animation_Data *) malloc(sizeof(Animation_Data));
390 if (!ad) return NULL;
400 ad->start_time = ecore_loop_time_get();
404 ad->timer = ecore_animator_add(mv_func, ad);
410 _sort_cb(const void *d1, const void *d2)
412 Elm_Controlbar_Item * item1, *item2;
413 item1 = (Elm_Controlbar_Item *) d1;
414 item2 = (Elm_Controlbar_Item *) d2;
415 if (item1->order <= 0) return 1;
416 if (item2->order <= 0) return -1;
417 return item1->order > item2->order ? 1 : -1;
421 _check_item(Widget_Data *wd, Elm_Controlbar_Item *item)
424 Elm_Controlbar_Item *it;
426 if (!wd) return EINA_FALSE;
427 if (!wd->items) return EINA_FALSE;
429 EINA_LIST_FOREACH(wd->items, l, it)
430 if (it == item) return EINA_TRUE;
436 _check_background(Widget_Data *wd)
440 Elm_Controlbar_Item *it;
442 EINA_LIST_FOREACH(wd->items, l, it)
444 if (it->style == TABBAR)
446 if (wd->mode == ELM_CONTROLBAR_MODE_LEFT)
447 edje_object_signal_emit(_EDJ(wd->bg), "elm,state,tabbar_left", "elm");
448 else if (wd->mode == ELM_CONTROLBAR_MODE_RIGHT)
449 edje_object_signal_emit(_EDJ(wd->bg), "elm,state,tabbar_right", "elm");
451 edje_object_signal_emit(_EDJ(wd->bg), "elm,state,tabbar", "elm");
455 edje_object_signal_emit(_EDJ(wd->bg), "elm,state,toolbar", "elm");
459 _check_toolbar_line(Widget_Data *wd)
463 Elm_Controlbar_Item *it, *it2;
465 EINA_LIST_FOREACH(wd->items, l, it)
467 it2 = elm_controlbar_item_prev(it);
469 if (it->style != TOOLBAR || it2->style != TOOLBAR) continue;
473 edje_object_signal_emit(_EDJ(it2->base), "elm,state,right_line_hide", "elm");
474 edje_object_signal_emit(_EDJ(it->base), "elm,state,left_line_hide", "elm");
476 if ((it->icon || it->text) && (it2->icon || it2->text))
478 edje_object_signal_emit(_EDJ(it2->base), "elm,state,bottom_line_show", "elm");
479 edje_object_signal_emit(_EDJ(it->base), "elm,state,top_line_show", "elm");
483 edje_object_signal_emit(_EDJ(it2->base), "elm,state,bottom_line_hide", "elm");
484 edje_object_signal_emit(_EDJ(it->base), "elm,state,top_line_hide", "elm");
489 edje_object_signal_emit(_EDJ(it2->base), "elm,state,bottom_line_hide", "elm");
490 edje_object_signal_emit(_EDJ(it->base), "elm,state,top_line_hide", "elm");
492 if ((it->icon || it->text) && (it2->icon || it2->text))
494 edje_object_signal_emit(_EDJ(it2->base), "elm,state,right_line_show", "elm");
495 edje_object_signal_emit(_EDJ(it->base), "elm,state,left_line_show", "elm");
499 edje_object_signal_emit(_EDJ(it2->base), "elm,state,right_line_hide", "elm");
500 edje_object_signal_emit(_EDJ(it->base), "elm,state,left_line_hide", "elm");
507 _check_bar_item_number(Widget_Data *wd)
510 Elm_Controlbar_Item * item;
513 EINA_LIST_FOREACH(wd->items, l, item)
514 if (item->order > 0) num++;
520 _insert_item_in_bar(Elm_Controlbar_Item * it, int order)
523 Elm_Controlbar_Item * item;
524 Widget_Data * wd = elm_widget_data_get(it->obj);
528 if (order == 0) return;
530 EINA_LIST_FOREACH(wd->items, l, item)
532 if ((item->order == order) && (item != it))
537 EINA_LIST_FOREACH(wd->items, l, item)
540 elm_table_unpack(wd->box, item->base);
542 EINA_LIST_FOREACH(wd->items, l, item)
546 if (item->order >= order)
549 elm_table_pack(wd->box, item->base, item->order - 1, 0, 1, 1);
551 elm_table_pack(wd->box, item->base, 0, item->order - 1, 1, 1);
552 evas_object_show(item->base);
558 elm_table_pack(wd->box, it->base, it->order - 1, 0, 1, 1);
560 elm_table_pack(wd->box, it->base, 0, it->order - 1, 1, 1);
561 evas_object_show(it->base);
565 _delete_item_in_bar(Elm_Controlbar_Item * it)
568 Elm_Controlbar_Item * item;
569 Widget_Data * wd = elm_widget_data_get(it->obj);
573 EINA_LIST_FOREACH(wd->items, l, item)
579 elm_table_unpack(wd->box, it->base);
580 evas_object_hide(it->base);
585 EINA_LIST_FOREACH(wd->items, l, item)
590 elm_table_unpack(wd->box, item->base);
592 elm_table_pack(wd->box, item->base, item->order - 1, 0, 1, 1);
594 elm_table_pack(wd->box, item->base, 0, item->order - 1, 1, 1);
601 _set_item_visible(Elm_Controlbar_Item *it, Eina_Bool visible)
603 Elm_Controlbar_Item *item;
604 Eina_Bool check = EINA_TRUE;
607 if (it->obj == NULL) return;
608 Widget_Data * wd = elm_widget_data_get(it->obj);
609 if (!wd || !wd->items) return;
610 if (it->order <= 0) check = EINA_FALSE;
611 if (check == visible) return;
614 item = elm_controlbar_last_item_get(it->obj);
616 while (!elm_controlbar_item_visible_get(item)){
617 item = elm_controlbar_item_prev(item);
619 _insert_item_in_bar(it, item->order + 1);
623 _delete_item_in_bar(it);
625 wd->items = eina_list_sort(wd->items, eina_list_count(wd->items), _sort_cb);
626 _sizing_eval(it->obj);
630 _hide_selected_box(void *data)
632 Evas_Object *base = (Evas_Object *)data;
634 edje_object_part_drag_size_set(_EDJ(base), "elm.dragable.box", 0.0, 0.0);
636 return ECORE_CALLBACK_CANCEL;
640 _end_selected_box(void *data, Evas_Object *obj __UNUSED__)
642 Widget_Data * wd = (Widget_Data *)data;
644 if (_check_item(wd, wd->cur_item))
646 edje_object_signal_emit(_EDJ(wd->cur_item->base), wd->selected_signal, "elm");
650 if (wd->animating < 0)
652 printf("animation error\n");
656 ecore_idler_add(_hide_selected_box, wd->edje);
660 _move_selected_box(Widget_Data *wd, Elm_Controlbar_Item * fit, Elm_Controlbar_Item * tit)
662 Evas_Coord fx, fy, fw, fh, tx, ty, tw, th;
663 Evas_Object *from, *to;
665 if ((fit->order <= 0) && (wd->auto_align))
668 from = (Evas_Object *) edje_object_part_object_get(_EDJ(fit->base), "bg_img");
669 evas_object_geometry_get(from, &fx, &fy, &fw, &fh);
671 to = (Evas_Object *) edje_object_part_object_get(_EDJ(tit->base), "bg_img");
672 evas_object_geometry_get(to, &tx, &ty, &tw, &th);
674 if (_check_item(wd, wd->pre_item))
676 edje_object_signal_emit(_EDJ(wd->pre_item->base), "elm,state,unselected", "elm");
678 if (_check_item(wd, wd->cur_item))
679 edje_object_signal_emit(_EDJ(wd->cur_item->base), "elm,state,unselected", "elm");
684 if (wd->ad->timer) ecore_animator_del(wd->ad->timer);
685 wd->ad->timer = NULL;
689 wd->ad = _move_object_with_animation(wd->edje, fx, fy, fw, fh, tx, ty, tw, th,
690 0.3, _move_evas_object, _end_selected_box, wd);
694 _select_box(Elm_Controlbar_Item * it)
697 Widget_Data * wd = elm_widget_data_get(it->obj);
700 Elm_Controlbar_Item * item, *fit = NULL;
701 Evas_Object * content;
703 if (wd->animating) return;
707 if (it->style == TABBAR)
709 content = elm_object_part_content_unset(wd->edje, "elm.swallow.view");
710 if (content) evas_object_hide(content);
712 EINA_LIST_FOREACH(wd->items, l, item){
713 if (item->selected) {
717 item->selected = EINA_FALSE;
719 it->selected = EINA_TRUE;
721 if ((fit != NULL) && (fit != it))
723 _move_selected_box(wd, fit, it);
727 edje_object_signal_emit(_EDJ(it->base), wd->selected_signal, "elm");
732 if (wd->more_item != it)
733 evas_object_smart_callback_call(it->obj, "view,change,before", it);
736 elm_object_part_content_set(wd->edje, "elm.swallow.view", it->view);
738 else if (it->style == TOOLBAR)
740 edje_object_signal_emit(_EDJ(it->base), "elm,state,text_unselected", "elm");
742 it->func(it->data, it->obj, it);
747 _cancel_selected_box(Widget_Data *wd)
750 Elm_Controlbar_Item * item;
752 EINA_LIST_FOREACH(wd->items, l, item)
754 if (item->style == TABBAR)
758 edje_object_signal_emit(_EDJ(item->base), wd->selected_signal, "elm");
762 edje_object_signal_emit(_EDJ(item->base), "elm,state,unselected", "elm");
765 else if (item->style == TOOLBAR)
767 edje_object_signal_emit(_EDJ(item->base), "elm,state,unselected", "elm");
773 _del_button_callback(void *data)
775 Widget_Data *wd = (Widget_Data *)data;
778 Elm_Controlbar_Item * it;
780 EINA_LIST_FOREACH(wd->items, l, it)
782 evas_object_smart_callback_del(it->base_item, "unpressed", _unpress_box_cb);
783 evas_object_smart_callback_del(it->base_item, "clicked", _clicked_box_cb);
786 wd->del_callback_job = NULL;
790 _unpress_box_cb(void *data, Evas_Object *obj, void *event_info)
792 Widget_Data * wd = (Widget_Data *) data;
795 Elm_Controlbar_Item * it;
797 EINA_LIST_FOREACH(wd->items, l, it)
799 if (it->base_item == obj) break;
803 if (wd->del_callback_job) ecore_job_del(wd->del_callback_job);
804 wd->del_callback_job = ecore_job_add(_del_button_callback, wd);
807 _cancel_selected_box(wd);
811 _clicked_box_cb(void *data, Evas_Object *obj, void *event_info)
813 Widget_Data * wd = (Widget_Data *) data;
816 Elm_Controlbar_Item * it;
818 EINA_LIST_FOREACH(wd->items, l, it)
820 if (it->base_item == obj) break;
824 if (wd->del_callback_job) ecore_job_del(wd->del_callback_job);
825 wd->del_callback_job = ecore_job_add(_del_button_callback, wd);
831 _press_box(Elm_Controlbar_Item * it)
833 Widget_Data * wd = elm_widget_data_get(it->obj);
834 if (!wd) return EINA_FALSE;
837 Elm_Controlbar_Item * item;
839 if (wd->animating) return EINA_FALSE;
841 if (wd->disabled || it->disabled) return EINA_FALSE;
843 EINA_LIST_FOREACH(wd->items, l, item)
847 if (it->style == TABBAR)
849 edje_object_signal_emit(_EDJ(it->base), wd->pressed_signal, "elm");
851 else if (it->style == TOOLBAR)
853 edje_object_signal_emit(_EDJ(it->base), "elm,state,toolbar_pressed", "elm");
855 evas_object_smart_callback_add(it->base_item, "unpressed", _unpress_box_cb, wd);
856 evas_object_smart_callback_add(it->base_item, "clicked", _clicked_box_cb, wd);
870 _create_item_icon(Evas_Object *obj, Elm_Controlbar_Item * it, char *part)
874 icon = elm_icon_add(obj);
876 if (it->wd->more_item == it)
877 elm_icon_standard_set(icon, it->icon_path);
879 elm_icon_file_set(icon, it->icon_path, NULL);
881 evas_object_size_hint_min_set(icon, 40, 40);
882 evas_object_size_hint_max_set(icon, 100, 100);
883 evas_object_show(icon);
885 elm_object_content_set(obj, icon);
891 _create_item_layout(Evas_Object * parent, Elm_Controlbar_Item * it, Evas_Object **item, Evas_Object **icon)
895 obj = elm_layout_add(parent);
898 fprintf(stderr, "Cannot load bg edj\n");
901 elm_layout_theme_set(obj, "controlbar", "item_bg",
902 elm_widget_style_get(it->obj));
903 evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
904 evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, EVAS_HINT_FILL);
906 *item = elm_button_add(parent);
907 if (*item == NULL) return NULL;
908 elm_object_style_set(*item, "controlbar/vertical");
909 elm_object_part_content_set(obj, "item", *item);
912 elm_object_text_set(*item, it->text);
914 *icon = _create_item_icon(*item, it, "elm.swallow.icon");
920 _bar_item_down_cb(void *data, Evas_Object * obj, void *event_info __UNUSED__)
922 Widget_Data * wd = (Widget_Data *) data;
924 Elm_Controlbar_Item * item;
925 if (wd->animating) return;
927 EINA_LIST_FOREACH(wd->items, l, item)
928 if (item->base_item == obj) break;
930 if (item == NULL) return;
935 static Elm_Controlbar_Item *
936 _create_tab_item(Evas_Object * obj, const char *icon_path, const char *label,
939 Elm_Controlbar_Item * it;
943 fprintf(stderr, "Invalid argument: controlbar object is NULL\n");
946 wd = elm_widget_data_get(obj);
949 fprintf(stderr, "Cannot get smart data\n");
952 it = ELM_NEW(Elm_Controlbar_Item);
953 if (!it) return NULL;
956 it->text = eina_stringshare_add(label);
957 it->icon_path = eina_stringshare_add(icon_path);
958 it->selected = EINA_FALSE;
962 it->base = _create_item_layout(wd->edje, it, &(it->base_item), &(it->icon));
963 evas_object_smart_callback_add(it->base_item, "pressed",
964 _bar_item_down_cb, wd);
965 evas_object_show(it->base);
970 static Elm_Controlbar_Item *
971 _create_tool_item(Evas_Object * obj, const char *icon_path, const char *label,
972 void (*func) (void *data, Evas_Object * obj,
973 void *event_info), void *data)
976 Elm_Controlbar_Item * it;
980 fprintf(stderr, "Invalid argument: controlbar object is NULL\n");
983 wd = elm_widget_data_get(obj);
986 fprintf(stderr, "Cannot get smart data\n");
989 it = ELM_NEW(Elm_Controlbar_Item);
994 it->text = eina_stringshare_add(label);
995 it->icon_path = eina_stringshare_add(icon_path);
996 it->selected = EINA_FALSE;
1000 it->style = TOOLBAR;
1001 it->base = _create_item_layout(wd->edje, it, &(it->base_item), &(it->icon));
1002 evas_object_smart_callback_add(it->base_item, "pressed",
1003 _bar_item_down_cb, wd);
1004 evas_object_show(it->base);
1009 static Elm_Controlbar_Item *
1010 _create_object_item(Evas_Object *obj, Evas_Object *obj_item, const int sel)
1012 Elm_Controlbar_Item *it;
1016 fprintf(stderr, "Invalid argument: controlbar object is NULL\n");
1019 wd = elm_widget_data_get(obj);
1022 fprintf(stderr, "Cannot get smart data\n");
1025 it = ELM_NEW(Elm_Controlbar_Item);
1032 it->base = elm_layout_add(wd->edje);
1033 elm_layout_theme_set(it->base, "controlbar", "item_bg",
1034 elm_widget_style_get(it->obj));
1035 evas_object_size_hint_weight_set(it->base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1036 evas_object_size_hint_align_set(it->base, EVAS_HINT_FILL, EVAS_HINT_FILL);
1037 it->base_item = obj_item;
1038 elm_object_part_content_set(it->base, "item", it->base_item);
1039 evas_object_show(it->base);
1044 _repack_items(Widget_Data *wd)
1047 Elm_Controlbar_Item * item;
1049 EINA_LIST_FOREACH(wd->items, l, item)
1051 if (item->order > 0)
1053 elm_table_unpack(wd->box, item->base);
1055 elm_table_pack(wd->box, item->base, item->order - 1, 0, item->sel, 1);
1057 elm_table_pack(wd->box, item->base, 0, item->order - 1, item->sel, 1);
1063 _set_items_position(Evas_Object *obj, Elm_Controlbar_Item *it,
1064 Elm_Controlbar_Item *mit, Eina_Bool bar)
1068 Elm_Controlbar_Item * item;
1069 int check = EINA_FALSE;
1074 fprintf(stderr, "Invalid argument: controlbar object is NULL\n");
1077 wd = elm_widget_data_get(obj);
1080 fprintf(stderr, "Cannot get smart data\n");
1084 EINA_LIST_FOREACH(wd->items, l, item)
1086 if ((item == mit) && (item->order > 0))
1089 it->order = mit->order;
1093 if (item->order > 0)
1095 elm_table_unpack(wd->box, item->base);
1096 item->order += it->sel;
1098 elm_table_pack(wd->box, item->base, item->order - 1, 0, item->sel, 1);
1100 elm_table_pack(wd->box, item->base, 0, item->order - 1, item->sel, 1);
1103 if (item->order > 0) order += item->sel;
1117 elm_table_pack(wd->box, it->base, it->order - 1, 0, it->sel, 1);
1119 elm_table_pack(wd->box, it->base, 0, it->order - 1, it->sel, 1);
1122 evas_object_hide(it->base);
1126 _list_clicked(void *data, Evas_Object *obj, void *event_info __UNUSED__)
1128 Elm_Controlbar_Item *item = (Elm_Controlbar_Item *)data;
1129 Elm_Controlbar_Item *it;
1132 Evas_Object *content;
1133 Elm_Object_Item *lit = (Elm_Object_Item *) elm_list_selected_item_get(obj);
1136 elm_list_item_selected_set(lit, 0);
1140 wd = elm_widget_data_get(item->obj);
1143 EINA_LIST_FOREACH(wd->items, l, it)
1145 it->selected = EINA_FALSE;
1148 if (item->style == TABBAR)
1150 content = elm_object_part_content_unset(wd->edje, "elm.swallow.view");
1151 evas_object_hide(content);
1152 item->selected = EINA_TRUE;
1153 evas_object_smart_callback_call(item->obj, "view,change,before", item);
1154 elm_object_part_content_set(wd->edje, "elm.swallow.view", item->view);
1157 if ((item->style == TOOLBAR) && (item->func))
1158 item->func(item->data, item->obj, item);
1161 static Evas_Object *
1162 _create_more_view(Widget_Data *wd)
1165 Elm_Controlbar_Item *item;
1169 list = elm_list_add( wd->object );
1170 elm_list_mode_set( list, ELM_LIST_COMPRESS );
1172 EINA_LIST_FOREACH(wd->items, l, item)
1174 if (item->order <= 0)
1177 if (item->icon_path)
1179 icon = _create_item_icon(list, item, NULL);
1180 evas_object_color_set(icon, 0, 0, 0, 255);
1182 elm_list_item_append(list, item->text, icon, NULL, _list_clicked, item);
1186 elm_list_go( list );
1192 _ctxpopup_cb(void *data, Evas_Object *obj, void *event_info)
1194 Elm_Controlbar_Item *it;
1196 Evas_Object *ctxpopup = obj;
1198 Widget_Data *wd = (Widget_Data *)data;
1200 EINA_LIST_FOREACH(wd->items, l, it)
1202 label = elm_ctxpopup_item_label_get((Elm_Object_Item *) event_info);
1203 if ((label) && (!strcmp(it->text, label))) break;
1207 it->func(it->data, it->obj, it);
1209 if (_check_item(wd, it)) evas_object_smart_callback_call(it->obj, "clicked", it);
1211 evas_object_del(ctxpopup);
1216 _ctxpopup_dismissed_cb(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
1218 Evas_Object *ctxpopup = obj;
1220 evas_object_del(ctxpopup);
1225 _create_more_func(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
1227 Evas_Object *ctxpopup;
1228 Elm_Controlbar_Item *item;
1231 Evas_Coord x, y, w, h;
1232 Widget_Data *wd = elm_widget_data_get(obj);
1235 ctxpopup = elm_ctxpopup_add(wd->parent);
1236 evas_object_smart_callback_add( ctxpopup, "dismissed", _ctxpopup_dismissed_cb, wd);
1238 EINA_LIST_FOREACH(wd->items, l, item)
1240 if (item->order <= 0)
1243 if (item->icon_path)
1245 icon = _create_item_icon(ctxpopup, item, NULL);
1246 evas_object_color_set(icon, 0, 0, 0, 255);
1248 elm_ctxpopup_item_append(ctxpopup, item->text, icon, _ctxpopup_cb, wd);
1252 evas_object_geometry_get(wd->more_item->base, &x, &y, &w, &h);
1253 evas_object_move(ctxpopup, x + w/2, y + h/2);
1255 evas_object_show(ctxpopup);
1258 static Elm_Controlbar_Item *
1259 _create_more_item(Widget_Data *wd, int style)
1261 Elm_Controlbar_Item * it;
1263 it = ELM_NEW(Elm_Controlbar_Item);
1264 if (!it) return NULL;
1266 it->obj = wd->object;
1267 it->text = eina_stringshare_add("more");
1268 it->icon_path = eina_stringshare_add("controlbar_more");
1269 it->selected = EINA_FALSE;
1271 it->view = _create_more_view(wd);
1272 it->func = _create_more_func;
1274 it->base = _create_item_layout(wd->edje, it, &(it->base_item), &(it->icon));
1275 evas_object_smart_callback_add(it->base_item, "pressed",
1276 _bar_item_down_cb, wd);
1277 evas_object_show(it->base);
1279 _set_items_position(it->obj, it, NULL, EINA_TRUE);
1280 wd->items = eina_list_append(wd->items, it);
1281 wd->items = eina_list_sort(wd->items, eina_list_count(wd->items), _sort_cb);
1287 elm_controlbar_add(Evas_Object *parent)
1289 if (parent == NULL) return NULL;
1290 Evas_Object * obj = NULL;
1291 Evas_Object * bg = NULL;
1292 Widget_Data * wd = NULL;
1293 Evas_Coord x, y, w, h;
1295 ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL);
1296 ELM_SET_WIDTYPE(widtype, "controlbar");
1297 elm_widget_type_set(obj, "controlbar");
1298 elm_widget_sub_object_add(parent, obj);
1299 elm_widget_data_set(obj, wd);
1300 elm_widget_del_hook_set(obj, _del_hook);
1301 elm_widget_can_focus_set(obj, EINA_FALSE);
1302 elm_widget_theme_hook_set(obj, _theme_hook);
1303 elm_widget_disable_hook_set(obj, _disable_hook);
1306 wd->parent = parent;
1307 evas_object_geometry_get(parent, &x, &y, &w, &h);
1313 wd->mode = ELM_CONTROLBAR_MODE_DEFAULT;
1317 wd->vertical = EINA_FALSE;
1318 wd->auto_align = EINA_FALSE;
1319 wd->selected_animation = EINA_FALSE;
1320 wd->pressed_signal = eina_stringshare_add("elm,state,pressed");
1321 wd->selected_signal = eina_stringshare_add("elm,state,selected");
1323 /* load background edj */
1324 wd->edje = elm_layout_add(obj);
1325 elm_layout_theme_set(wd->edje, "controlbar", "base", "default");
1326 if (wd->edje == NULL)
1328 printf("Cannot load base edj\n");
1331 evas_object_show(wd->edje);
1333 wd->bg = elm_layout_add(wd->edje);
1334 elm_layout_theme_set(wd->bg, "controlbar", "background", "default");
1337 printf("Cannot load bg edj\n");
1340 elm_object_part_content_set(wd->edje, "bg_image", wd->bg);
1343 evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_RESIZE,
1344 _controlbar_object_resize, obj);
1345 evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_MOVE,
1346 _controlbar_object_move, obj);
1347 evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_SHOW,
1348 _controlbar_object_show, obj);
1349 evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_HIDE,
1350 _controlbar_object_hide, obj);
1352 bg = elm_object_part_content_get(wd->edje, "bg_image");
1353 evas_object_event_callback_add(bg, EVAS_CALLBACK_MOVE, _controlbar_object_move, obj);
1354 evas_object_event_callback_add(bg, EVAS_CALLBACK_RESIZE, _controlbar_object_resize, obj);
1357 wd->box = elm_table_add(wd->edje);
1358 elm_table_homogeneous_set(wd->box, EINA_TRUE);
1359 evas_object_size_hint_weight_set(wd->box, EVAS_HINT_EXPAND,
1361 evas_object_size_hint_align_set(wd->box, EVAS_HINT_FILL, EVAS_HINT_FILL);
1362 elm_object_part_content_set(wd->edje, "elm.swallow.items", wd->box);
1363 evas_object_show(wd->box);
1365 evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj);
1367 elm_widget_resize_object_set(obj, wd->edje);
1374 EAPI Elm_Controlbar_Item *
1375 elm_controlbar_tab_item_append(Evas_Object *obj, const char *icon_path,
1376 const char *label, Evas_Object *view)
1378 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1379 Elm_Controlbar_Item * it;
1380 Elm_Controlbar_Item * lit;
1382 it = _create_tab_item(obj, icon_path, label, view);
1383 if (!it) return NULL;
1384 wd = elm_widget_data_get(obj);
1385 if ((_check_bar_item_number(wd) >= 5) && (wd->auto_align))
1387 if (!wd->more_item) {
1388 lit = elm_controlbar_last_item_get(obj);
1389 _set_item_visible(lit, EINA_FALSE);
1390 _create_more_item(wd, TABBAR);
1392 _set_items_position(obj, it, NULL, EINA_FALSE);
1396 _set_items_position(obj, it, NULL, EINA_TRUE);
1398 wd->items = eina_list_append(wd->items, it);
1400 elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1402 _check_background(wd);
1407 EAPI Elm_Controlbar_Item *
1408 elm_controlbar_tab_item_prepend(Evas_Object *obj, const char *icon_path,
1409 const char *label, Evas_Object *view)
1411 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1413 Elm_Controlbar_Item * it;
1414 Elm_Controlbar_Item * lit;
1415 Elm_Controlbar_Item * item;
1416 it = _create_tab_item(obj, icon_path, label, view);
1417 if (!it) return NULL;
1418 wd = elm_widget_data_get(obj);
1419 item = eina_list_data_get(wd->items);
1420 if ((_check_bar_item_number(wd) >= 5) && (wd->auto_align))
1424 lit = elm_controlbar_last_item_get(obj);
1425 _set_item_visible(lit, EINA_FALSE);
1426 _create_more_item(wd, TABBAR);
1428 lit = elm_controlbar_item_prev(wd->more_item);
1429 _set_item_visible(lit, EINA_FALSE);
1430 _set_items_position(obj, it, item, EINA_TRUE);
1434 _set_items_position(obj, it, item, EINA_TRUE);
1436 wd->items = eina_list_prepend(wd->items, it);
1438 elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1440 _check_background(wd);
1445 EAPI Elm_Controlbar_Item *
1446 elm_controlbar_tab_item_insert_before(Evas_Object *obj,
1447 Elm_Controlbar_Item *before,
1448 const char *icon_path,
1449 const char *label, Evas_Object *view)
1451 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1453 Elm_Controlbar_Item * it;
1454 Elm_Controlbar_Item * lit;
1455 if (!before) return NULL;
1456 it = _create_tab_item(obj, icon_path, label, view);
1457 if (!it) return NULL;
1458 wd = elm_widget_data_get(obj);
1459 if ((_check_bar_item_number(wd) >= 5) && (wd->auto_align))
1463 lit = elm_controlbar_last_item_get(obj);
1464 _set_item_visible(lit, EINA_FALSE);
1465 _create_more_item(wd, TABBAR);
1467 before = wd->more_item;
1468 if (before->order > 0)
1470 lit = elm_controlbar_item_prev(wd->more_item);
1471 _set_item_visible(lit, EINA_FALSE);
1472 _set_items_position(obj, it, before, EINA_TRUE);
1476 _set_items_position(obj, it, before, EINA_FALSE);
1481 _set_items_position(obj, it, before, EINA_TRUE);
1483 wd->items = eina_list_prepend_relative(wd->items, it, before);
1485 elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1487 _check_background(wd);
1492 EAPI Elm_Controlbar_Item *
1493 elm_controlbar_tab_item_insert_after(Evas_Object *obj,
1494 Elm_Controlbar_Item *after,
1495 const char *icon_path, const char *label,
1498 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1500 Elm_Controlbar_Item * it;
1501 Elm_Controlbar_Item * lit;
1502 Elm_Controlbar_Item * item;
1503 if (!after) return NULL;
1504 it = _create_tab_item(obj, icon_path, label, view);
1505 if (!it) return NULL;
1506 wd = elm_widget_data_get(obj);
1507 item = elm_controlbar_item_next(after);
1508 if ((_check_bar_item_number(wd) >= 5) && (wd->auto_align))
1512 lit = elm_controlbar_last_item_get(obj);
1513 _set_item_visible(lit, EINA_FALSE);
1514 _create_more_item(wd, TABBAR);
1516 lit = elm_controlbar_item_prev(wd->more_item);
1517 if ((lit != after) && (item->order > 0))
1519 _set_item_visible(lit, EINA_FALSE);
1520 _set_items_position(obj, it, item, EINA_TRUE);
1524 _set_items_position(obj, it, NULL, EINA_FALSE);
1529 _set_items_position(obj, it, item, EINA_TRUE);
1531 wd->items = eina_list_append_relative(wd->items, it, after);
1533 elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1535 _check_background(wd);
1540 EAPI Elm_Controlbar_Item *
1541 elm_controlbar_tool_item_append(Evas_Object *obj, const char *icon_path,
1543 void (*func)(void *data, Evas_Object * obj, void *event_info),
1547 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1548 Elm_Controlbar_Item * it;
1549 Elm_Controlbar_Item * lit;
1551 it = _create_tool_item(obj, icon_path, label, func, data);
1552 if (!it) return NULL;
1553 wd = elm_widget_data_get(obj);
1554 if ((_check_bar_item_number(wd) >= 5) && (wd->auto_align))
1558 lit = elm_controlbar_last_item_get(obj);
1559 _set_item_visible(lit, EINA_FALSE);
1560 _create_more_item(wd, TOOLBAR);
1562 _set_items_position(obj, it, NULL, EINA_FALSE);
1566 _set_items_position(obj, it, NULL, EINA_TRUE);
1568 wd->items = eina_list_append(wd->items, it);
1569 _check_toolbar_line(wd);
1574 EAPI Elm_Controlbar_Item *
1575 elm_controlbar_tool_item_prepend(Evas_Object *obj, const char *icon_path,
1577 void (*func) (void *data, Evas_Object *obj, void *event_info),
1580 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1582 Elm_Controlbar_Item * it;
1583 Elm_Controlbar_Item * lit;
1584 Elm_Controlbar_Item * item;
1585 it = _create_tool_item(obj, icon_path, label, func, data);
1586 if (!it) return NULL;
1587 wd = elm_widget_data_get(obj);
1588 item = eina_list_data_get(wd->items);
1589 if ((_check_bar_item_number(wd) >= 5) && (wd->auto_align))
1593 lit = elm_controlbar_last_item_get(obj);
1594 _set_item_visible(lit, EINA_FALSE);
1595 _create_more_item(wd, TOOLBAR);
1597 lit = elm_controlbar_item_prev(wd->more_item);
1598 _set_item_visible(lit, EINA_FALSE);
1599 _set_items_position(obj, it, item, EINA_TRUE);
1603 _set_items_position(obj, it, item, EINA_TRUE);
1605 wd->items = eina_list_prepend(wd->items, it);
1606 _check_toolbar_line(wd);
1611 EAPI Elm_Controlbar_Item *
1612 elm_controlbar_tool_item_insert_before(Evas_Object *obj,
1613 Elm_Controlbar_Item *before,
1614 const char *icon_path,
1616 void (*func)(void *data, Evas_Object *obj, void *event_info),
1619 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1621 Elm_Controlbar_Item * it;
1622 Elm_Controlbar_Item * lit;
1623 if (!before) return NULL;
1624 it = _create_tool_item(obj, icon_path, label, func, data);
1625 if (!it) return NULL;
1626 wd = elm_widget_data_get(obj);
1627 if ((_check_bar_item_number(wd) >= 5) && (wd->auto_align))
1631 lit = elm_controlbar_last_item_get(obj);
1632 _set_item_visible(lit, EINA_FALSE);
1633 _create_more_item(wd, TOOLBAR);
1635 before = wd->more_item;
1636 if (before->order > 0)
1638 lit = elm_controlbar_item_prev(wd->more_item);
1639 _set_item_visible(lit, EINA_FALSE);
1640 _set_items_position(obj, it, before, EINA_TRUE);
1644 _set_items_position(obj, it, before, EINA_FALSE);
1649 _set_items_position(obj, it, before, EINA_TRUE);
1651 wd->items = eina_list_prepend_relative(wd->items, it, before);
1652 _check_toolbar_line(wd);
1657 EAPI Elm_Controlbar_Item *
1658 elm_controlbar_tool_item_insert_after(Evas_Object *obj,
1659 Elm_Controlbar_Item *after,
1660 const char *icon_path,
1662 void (*func) (void *data, Evas_Object *obj, void *event_info),
1665 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1667 Elm_Controlbar_Item * it;
1668 Elm_Controlbar_Item * lit;
1669 Elm_Controlbar_Item * item;
1670 if (!after) return NULL;
1671 it = _create_tool_item(obj, icon_path, label, func, data);
1672 if (!it) return NULL;
1673 wd = elm_widget_data_get(obj);
1674 item = elm_controlbar_item_next(after);
1675 if ((_check_bar_item_number(wd) >= 5) && (wd->auto_align))
1679 lit = elm_controlbar_last_item_get(obj);
1680 _set_item_visible(lit, EINA_FALSE);
1681 _create_more_item(wd, TOOLBAR);
1683 lit = elm_controlbar_item_prev(wd->more_item);
1684 if ((lit != after) && (item->order > 0))
1686 _set_item_visible(lit, EINA_FALSE);
1687 _set_items_position(obj, it, item, EINA_TRUE);
1691 _set_items_position(obj, it, NULL, EINA_FALSE);
1696 _set_items_position(obj, it, item, EINA_TRUE);
1698 wd->items = eina_list_append_relative(wd->items, it, after);
1699 _check_toolbar_line(wd);
1704 EAPI Elm_Controlbar_Item *
1705 elm_controlbar_object_item_append(Evas_Object *obj, Evas_Object *obj_item,
1708 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1710 Elm_Controlbar_Item * it;
1711 wd = elm_widget_data_get(obj);
1712 if (!wd) return NULL;
1713 it = _create_object_item(obj, obj_item, sel);
1714 if (!it) return NULL;
1715 _set_items_position(obj, it, NULL, EINA_TRUE);
1716 wd->items = eina_list_append(wd->items, it);
1721 EAPI Elm_Controlbar_Item *
1722 elm_controlbar_object_item_prepend(Evas_Object *obj, Evas_Object *obj_item,
1725 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1727 Elm_Controlbar_Item * it;
1728 Elm_Controlbar_Item * item;
1729 wd = elm_widget_data_get(obj);
1730 if (!wd) return NULL;
1731 it = _create_object_item(obj, obj_item, sel);
1732 if (!it) return NULL;
1733 item = eina_list_data_get(wd->items);
1734 _set_items_position(obj, it, item, EINA_TRUE);
1735 wd->items = eina_list_prepend(wd->items, it);
1740 EAPI Elm_Controlbar_Item *
1741 elm_controlbar_object_item_insert_before(Evas_Object *obj,
1742 Elm_Controlbar_Item *before,
1743 Evas_Object *obj_item, const int sel)
1745 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1747 Elm_Controlbar_Item * it;
1748 wd = elm_widget_data_get(obj);
1749 if (!wd) return NULL;
1750 if (!before) return NULL;
1751 it = _create_object_item(obj, obj_item, sel);
1752 if (!it) return NULL;
1753 _set_items_position(obj, it, before, EINA_TRUE);
1754 wd->items = eina_list_prepend_relative(wd->items, it, before);
1759 EAPI Elm_Controlbar_Item *
1760 elm_controlbar_object_item_insert_after(Evas_Object *obj,
1761 Elm_Controlbar_Item *after,
1762 Evas_Object *obj_item, const int sel)
1764 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1766 Elm_Controlbar_Item *it;
1767 Elm_Controlbar_Item *item;
1768 wd = elm_widget_data_get(obj);
1769 if (!wd) return NULL;
1770 if (!after) return NULL;
1771 it = _create_object_item(obj, obj_item, sel);
1772 if (!it) return NULL;
1773 item = elm_controlbar_item_next(after);
1774 _set_items_position(obj, it, item, EINA_TRUE);
1775 wd->items = eina_list_append_relative(wd->items, it, after);
1781 elm_controlbar_object_item_object_get(const Elm_Controlbar_Item *it)
1783 if (!it) return NULL;
1784 if (it->style != OBJECT) return NULL;
1785 if (!it->base_item) return NULL;
1786 return it->base_item;
1790 elm_controlbar_item_del(Elm_Controlbar_Item *it)
1796 Elm_Controlbar_Item *item;
1803 if (it->obj == NULL)
1805 printf("Invalid argument: controlbar object is NULL\n");
1808 wd = elm_widget_data_get(it->obj);
1811 printf("Cannot get smart data\n");
1819 elm_table_unpack(wd->box, it->base);
1821 EINA_LIST_FOREACH(wd->items, l, item)
1825 if (item->order > it->order)
1828 elm_table_unpack(wd->box, item->base);
1831 elm_table_pack(wd->box, item->base, item->order - 1, 0, item->sel, 1);
1833 elm_table_pack(wd->box, item->base, 0, item->order - 1, item->sel, 1);
1839 // delete item in list
1841 wd->items = eina_list_remove(wd->items, it);
1844 wd->num = wd->num - 1;
1849 elm_controlbar_item_select(Elm_Controlbar_Item * it)
1852 if (it->obj == NULL) return;
1853 Widget_Data * wd = elm_widget_data_get(it->obj);
1860 elm_controlbar_item_icon_set(Elm_Controlbar_Item *it, const char *icon_path)
1863 if (it->style == OBJECT) return;
1866 eina_stringshare_del(it->icon_path);
1867 it->icon_path = NULL;
1871 evas_object_del(it->icon);
1874 if (icon_path != NULL)
1876 it->icon_path = eina_stringshare_add(icon_path);
1877 it->icon = _create_item_icon(it->base_item, it, "elm.swallow.icon");
1879 if (it->wd->disabled || it->disabled)
1880 elm_widget_disabled_set(it->base_item, EINA_TRUE);
1882 elm_widget_disabled_set(it->base_item, EINA_FALSE);
1886 elm_controlbar_item_icon_get(const Elm_Controlbar_Item *it)
1888 if (!it) return NULL;
1893 elm_controlbar_item_label_set(Elm_Controlbar_Item *it, const char *label)
1896 if (it->style == OBJECT) return;
1899 eina_stringshare_del(it->text);
1902 it->text = eina_stringshare_add(label);
1903 elm_object_text_set(it->base_item, it->text);
1905 if (it->wd->disabled || it->disabled)
1906 elm_widget_disabled_set(it->base_item, EINA_TRUE);
1908 elm_widget_disabled_set(it->base_item, EINA_FALSE);
1912 elm_controlbar_item_label_get(const Elm_Controlbar_Item * it)
1914 if (!it) return NULL;
1918 EAPI Elm_Controlbar_Item *
1919 elm_controlbar_selected_item_get(const Evas_Object *obj)
1921 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1924 Elm_Controlbar_Item * item;
1925 if (obj == NULL) return NULL;
1926 Widget_Data * wd = elm_widget_data_get(obj);
1927 if (!wd || !wd->items) return NULL;
1928 EINA_LIST_FOREACH(wd->items, l, item)
1930 if (item->selected) return item;
1935 EAPI Elm_Controlbar_Item *
1936 elm_controlbar_first_item_get(const Evas_Object *obj)
1938 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1939 Widget_Data * wd = elm_widget_data_get(obj);
1940 if (!wd || !wd->items) return NULL;
1941 return eina_list_data_get(wd->items);
1944 EAPI Elm_Controlbar_Item *
1945 elm_controlbar_last_item_get(const Evas_Object *obj)
1947 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1948 Widget_Data * wd = elm_widget_data_get(obj);
1949 if (!wd || !wd->items) return NULL;
1950 return eina_list_data_get(eina_list_last(wd->items));
1953 EAPI const Eina_List *
1954 elm_controlbar_items_get(const Evas_Object *obj)
1956 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1957 Widget_Data * wd = elm_widget_data_get(obj);
1958 if (!wd || !wd->items) return NULL;
1962 EAPI Elm_Controlbar_Item *
1963 elm_controlbar_item_prev(Elm_Controlbar_Item *it)
1965 if (!it) return NULL;
1968 Elm_Controlbar_Item * item;
1969 if (it->obj == NULL) return NULL;
1970 Widget_Data * wd = elm_widget_data_get(it->obj);
1971 if (!wd || !wd->items) return NULL;
1972 EINA_LIST_FOREACH(wd->items, l, item)
1976 l = eina_list_prev(l);
1977 if (!l) return NULL;
1978 return eina_list_data_get(l);
1984 EAPI Elm_Controlbar_Item *
1985 elm_controlbar_item_next(Elm_Controlbar_Item *it)
1987 if (!it) return NULL;
1990 Elm_Controlbar_Item * item;
1991 if (it->obj == NULL) return NULL;
1992 Widget_Data * wd = elm_widget_data_get(it->obj);
1993 if (!wd || !wd->items) return NULL;
1994 EINA_LIST_FOREACH(wd->items, l, item)
1998 l = eina_list_next(l);
1999 if (!l) return NULL;
2000 return eina_list_data_get(l);
2007 elm_controlbar_item_visible_set(Elm_Controlbar_Item *it, Eina_Bool visible)
2010 if (it->obj == NULL) return;
2011 Widget_Data * wd = elm_widget_data_get(it->obj);
2014 if (!wd->auto_align)
2015 _set_item_visible(it, visible);
2019 elm_controlbar_item_visible_get(const Elm_Controlbar_Item *it)
2021 if (!it) return EINA_FALSE;
2022 if (it->obj == NULL) return EINA_FALSE;
2023 Widget_Data * wd = elm_widget_data_get(it->obj);
2024 if (!wd) return EINA_FALSE;
2025 if (it->order <= 0) return EINA_FALSE;
2031 elm_controlbar_item_disabled_set(Elm_Controlbar_Item *it, Eina_Bool disabled)
2035 if (it->disabled == disabled) return;
2037 it->disabled = disabled;
2039 if ((it->wd) && (it->wd->disabled)) return;
2041 if (it->base_item) elm_widget_disabled_set(it->base_item, disabled);
2045 elm_controlbar_item_disabled_get(const Elm_Controlbar_Item *it)
2047 if (!it) return EINA_FALSE;
2049 return it->disabled;
2053 elm_controlbar_item_view_set(Elm_Controlbar_Item *it, Evas_Object * view)
2056 if (it->view == view) return;
2058 evas_object_del(it->view);
2063 elm_controlbar_item_view_get(const Elm_Controlbar_Item *it)
2065 if (!it) return NULL;
2071 elm_controlbar_item_view_unset(Elm_Controlbar_Item *it)
2073 if (!it) return NULL;
2074 if (it->obj == NULL) return NULL;
2075 Widget_Data * wd = elm_widget_data_get(it->obj);
2076 if (!wd) return NULL;
2077 Evas_Object *content;
2079 if (it->view == elm_object_part_content_get(wd->edje, "elm.swallow.view"))
2081 content = elm_object_part_content_unset(wd->edje, "elm.swallow.view");
2082 if (content) evas_object_hide(content);
2093 elm_controlbar_mode_set(Evas_Object *obj, int mode)
2095 ELM_CHECK_WIDTYPE(obj, widtype);
2096 Widget_Data *wd = elm_widget_data_get(obj);
2099 fprintf(stderr, "Cannot get smart data\n");
2102 Evas_Object *selected_box;
2108 case ELM_CONTROLBAR_MODE_DEFAULT:
2109 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,default", "elm");
2111 case ELM_CONTROLBAR_MODE_TRANSLUCENCE:
2112 elm_controlbar_alpha_set(obj, 85);
2114 case ELM_CONTROLBAR_MODE_TRANSPARENCY:
2115 elm_controlbar_alpha_set(obj, 0);
2117 case ELM_CONTROLBAR_MODE_LARGE:
2118 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,large", "elm");
2120 case ELM_CONTROLBAR_MODE_SMALL:
2121 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,small", "elm");
2123 case ELM_CONTROLBAR_MODE_LEFT:
2124 selected_box = elm_object_part_content_get(wd->edje, "elm.dragable.box");
2125 if (selected_box) edje_object_signal_emit(_EDJ(selected_box), "elm,state,left", "elm");
2126 wd->selected_signal = eina_stringshare_add("elm,state,selected_left");
2127 wd->pressed_signal = eina_stringshare_add("elm,state,pressed_left");
2128 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,left", "elm");
2129 _check_background(wd);
2132 case ELM_CONTROLBAR_MODE_RIGHT:
2133 selected_box = elm_object_part_content_get(wd->edje, "elm.dragable.box");
2134 if (selected_box) edje_object_signal_emit(_EDJ(selected_box), "elm,state,right", "elm");
2135 wd->selected_signal = eina_stringshare_add("elm,state,selected_right");
2136 wd->pressed_signal = eina_stringshare_add("elm,state,pressed_right");
2137 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,right", "elm");
2138 _check_background(wd);
2144 selected_box = elm_object_part_content_get(wd->edje, "elm.dragable.box");
2145 if (selected_box) edje_object_signal_emit(_EDJ(selected_box), "elm,state,default", "elm");
2146 wd->selected_signal = eina_stringshare_add("elm,state,selected");
2147 wd->pressed_signal = eina_stringshare_add("elm,state,pressed");
2148 _check_background(wd);
2153 elm_controlbar_alpha_set(Evas_Object *obj, int alpha)
2155 ELM_CHECK_WIDTYPE(obj, widtype);
2157 Widget_Data *wd = elm_widget_data_get(obj);
2160 fprintf(stderr, "Cannot get smart data\n");
2164 if (alpha < 0) wd->alpha = 0;
2165 else if (alpha > 100) wd->alpha = 100;
2166 else wd->alpha = alpha;
2168 evas_object_color_get(wd->bg, &r, &g, &b, NULL);
2169 evas_object_color_set(wd->bg, r, g, b, (int)(255 * wd->alpha / 100));
2173 elm_controlbar_item_auto_align_set(Evas_Object *obj, Eina_Bool auto_align)
2175 ELM_CHECK_WIDTYPE(obj, widtype);
2176 Widget_Data *wd = elm_widget_data_get(obj);
2177 Elm_Controlbar_Item *item;
2182 fprintf(stderr, "Cannot get smart data\n");
2186 if (wd->auto_align == auto_align) return;
2190 if ((_check_bar_item_number(wd)) >= 5 && (!wd->more_item))
2193 EINA_LIST_FOREACH(wd->items, l, item)
2195 if (elm_controlbar_item_visible_get(item))
2198 _delete_item_in_bar(item);
2201 item = elm_controlbar_last_item_get(obj);
2202 while (!elm_controlbar_item_visible_get(item)){
2203 item = elm_controlbar_item_prev(item);
2205 _create_more_item(wd, item->style);
2213 if (wd->more_item->view)
2214 evas_object_del(wd->more_item->view);
2215 wd->items = eina_list_remove(wd->items, wd->more_item);
2216 eina_stringshare_del(wd->more_item->text);
2217 if (wd->more_item->icon)
2218 evas_object_del(wd->more_item->icon);
2219 if (wd->more_item->base)
2220 evas_object_del(wd->more_item->base);
2221 if (wd->more_item->base_item)
2222 evas_object_del(wd->more_item->base_item);
2223 free(wd->more_item);
2224 wd->more_item = NULL;
2226 // make all item is visible
2228 EINA_LIST_FOREACH(wd->items, l, item)
2230 if (!elm_controlbar_item_visible_get(item))
2231 _insert_item_in_bar(item, i);
2236 wd->auto_align = auto_align;
2241 elm_controlbar_vertical_set(Evas_Object *obj, Eina_Bool vertical)
2243 ELM_CHECK_WIDTYPE(obj, widtype);
2244 Widget_Data *wd = elm_widget_data_get(obj);
2247 fprintf(stderr, "Cannot get smart data\n");
2251 if (wd->vertical == vertical) return;
2252 wd->vertical = vertical;
2254 if (_check_bar_item_number(wd) > 1)
2258 _check_toolbar_line(wd);
2262 elm_controlbar_item_button_get(const Elm_Controlbar_Item *it)
2264 if (!it) return NULL;
2265 if (it->style == OBJECT) return NULL;
2267 if (it->base_item) return it->base_item;