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;
74 struct _Elm_Controlbar_Item
79 Evas_Object * base_item;
82 const char *icon_path;
84 void (*func) (void *data, Evas_Object * obj, void *event_info);
93 static const char *widtype = NULL;
95 static void _sizing_eval(Evas_Object * obj);
96 static int _check_bar_item_number(Widget_Data *wd);
97 static void _select_box(Elm_Controlbar_Item * it);
98 static void _cancel_selected_box(Widget_Data *wd);
99 static void _check_toolbar_line(Widget_Data *wd);
100 static Eina_Bool _press_box(Elm_Controlbar_Item * it);
103 _controlbar_move(void *data, Evas_Object * obj __UNUSED__)
106 Evas_Coord x, y, x_, y_, width;
108 wd = elm_widget_data_get((Evas_Object *) data);
110 evas_object_geometry_get(wd->edje, &x, &y, NULL, NULL);
113 evas_object_move(wd->edje, x, y);
114 evas_object_geometry_get(elm_object_part_content_get(wd->edje, "bg_image"), NULL, NULL, &width, NULL);
115 evas_object_geometry_get(wd->edje, &x_, &y_, NULL, NULL);
119 _controlbar_resize(void *data, Evas_Object * obj __UNUSED__)
122 Evas_Coord x, y, x_, y_, w, h, width, height;
124 wd = elm_widget_data_get((Evas_Object *) data);
126 evas_object_geometry_get(wd->edje, &x, &y, &w, &h);
129 evas_object_resize(wd->edje, w, h);
130 evas_object_geometry_get(elm_object_part_content_get(wd->edje, "bg_image"), NULL, NULL, &width, &height);
131 evas_object_geometry_get(wd->edje, &x_, &y_, NULL, NULL);
135 _controlbar_object_move(void *data, Evas * e __UNUSED__, Evas_Object * obj,
136 void *event_info __UNUSED__)
138 _controlbar_move(data, obj);
142 _controlbar_object_resize(void *data, Evas * e __UNUSED__, Evas_Object * obj,
143 void *event_info __UNUSED__)
145 _controlbar_resize(data, obj);
149 _controlbar_object_show(void *data, Evas * e __UNUSED__, Evas_Object * obj __UNUSED__,
150 void *event_info __UNUSED__)
154 wd = elm_widget_data_get((Evas_Object *) data);
156 evas_object_show(wd->edje);
157 evas_object_show(wd->box);
161 _controlbar_object_hide(void *data, Evas * e __UNUSED__, Evas_Object * obj __UNUSED__,
162 void *event_info __UNUSED__)
166 wd = elm_widget_data_get((Evas_Object *) data);
168 evas_object_hide(wd->edje);
169 evas_object_hide(wd->box);
171 _cancel_selected_box(wd);
175 _item_del(Elm_Controlbar_Item *it)
178 Widget_Data *wd = elm_widget_data_get(it->obj);
182 eina_stringshare_del(it->text);
184 eina_stringshare_del(it->icon_path);
186 evas_object_del(it->icon);
188 evas_object_del(it->base);
190 evas_object_del(it->base_item);
192 evas_object_del(it->view);
196 _del_hook(Evas_Object * obj)
198 Widget_Data * wd = elm_widget_data_get(obj);
199 Elm_Controlbar_Item * item;
202 EINA_LIST_FREE(wd->items, item)
210 evas_object_del(wd->bg);
215 evas_object_del(wd->box);
220 evas_object_del(wd->edje);
223 if (wd->effect_timer)
225 ecore_timer_del(wd->effect_timer);
226 wd->effect_timer = NULL;
230 if (wd->ad->timer) ecore_animator_del(wd->ad->timer);
231 wd->ad->timer = NULL;
241 _theme_hook(Evas_Object * obj)
245 Elm_Controlbar_Item * item;
248 Widget_Data * wd = elm_widget_data_get(obj);
250 elm_layout_theme_set(wd->edje, "controlbar", "base",
251 elm_widget_style_get(obj));
252 elm_layout_theme_set(wd->bg, "controlbar", "background",
253 elm_widget_style_get(obj));
254 evas_object_color_get(wd->bg, &r, &g, &b, NULL);
255 evas_object_color_set(wd->bg, r, g, b, (int)(255 * wd->alpha / 100));
256 EINA_LIST_FOREACH(wd->items, l, item)
258 elm_layout_theme_set(item->base, "controlbar", "item_bg", elm_widget_style_get(obj));
262 elm_controlbar_mode_set(obj, wd->mode);
263 _check_toolbar_line(wd);
267 _disable_hook(Evas_Object * obj)
269 Widget_Data * wd = elm_widget_data_get(obj);
272 Elm_Controlbar_Item * item;
275 wd->disabled = elm_widget_disabled_get(obj);
277 EINA_LIST_FOREACH(wd->items, l, item)
280 disabled = wd->disabled;
282 disabled = item->disabled;
284 if (item->base_item) elm_widget_disabled_set(item->base_item, disabled);
289 _sub_del(void *data __UNUSED__, Evas_Object * obj, void *event_info)
294 _sizing_eval(Evas_Object * obj)
296 Widget_Data * wd = elm_widget_data_get(obj);
298 _controlbar_move(obj, obj);
299 _controlbar_resize(obj, obj);
303 _move_evas_object(void *data)
305 const Evas_Object *bg_image;
306 double t = 0.0, vx = 0.0, vy = 0.0, vw = 0.0, vh = 0.0;
307 int dx = 0 , dy = 0, dw = 0, dh = 0;
308 int px = 0, py = 0, pw = 0, ph = 0;
309 int ox = 0, oy = 0, ow = 0, oh = 0;
310 int x = 0, y = 0, w = 0, h = 0;
312 Animation_Data * ad = (Animation_Data *) data;
313 bg_image = edje_object_part_object_get(_EDJ(ad->obj), "bg_image");
314 if (bg_image) evas_object_geometry_get(bg_image, &ox, &oy, &ow, &oh);
315 t = ELM_MAX(0.0, ecore_loop_time_get() - ad->start_time);
316 dx = ad->tx - ad->fx;
317 dy = ad->ty - ad->fy;
318 dw = ad->tw - ad->fw;
319 dh = ad->th - ad->fh;
322 x = (1 * sin((t / ad->time) * (M_PI / 2)) * dx);
323 y = (1 * sin((t / ad->time) * (M_PI / 2)) * dy);
324 w = (1 * sin((t / ad->time) * (M_PI / 2)) * dw);
325 h = (1 * sin((t / ad->time) * (M_PI / 2)) * dh);
342 vx = (double)(px - ox) / (double)(ow - pw);
346 vy = (double)(py - oy) / (double)(oh - ph);
347 vw = (double)pw / (double)ow;
348 vh = (double)ph / (double)oh;
350 if ((x == dx) && (y == dy) && (w == dw) && (h == dh))
352 if (ad->timer) ecore_animator_del(ad->timer);
354 edje_object_part_drag_size_set(_EDJ(ad->obj), "elm.dragable.box", vw, vh);
355 edje_object_part_drag_value_set(_EDJ(ad->obj), "elm.dragable.box", vx, vy);
356 if (ad->func != NULL)
357 ad->func(ad->data, ad->obj);
358 return ECORE_CALLBACK_CANCEL;
362 edje_object_part_drag_size_set(_EDJ(ad->obj), "elm.dragable.box", vw, vh);
363 edje_object_part_drag_value_set(_EDJ(ad->obj), "elm.dragable.box", vx, vy);
365 return ECORE_CALLBACK_RENEW;
368 static Animation_Data*
369 _move_object_with_animation(Evas_Object * obj, Evas_Coord x, Evas_Coord y,
370 Evas_Coord w, Evas_Coord h, Evas_Coord x_,
371 Evas_Coord y_, Evas_Coord w_, Evas_Coord h_,
372 double time, Eina_Bool (*mv_func) (void *data),
373 void (*func) (void *data,
374 Evas_Object * obj), void *data)
376 Animation_Data * ad = (Animation_Data *) malloc(sizeof(Animation_Data));
377 if (!ad) return NULL;
387 ad->start_time = ecore_loop_time_get();
391 ad->timer = ecore_animator_add(mv_func, ad);
397 _sort_cb(const void *d1, const void *d2)
399 Elm_Controlbar_Item * item1, *item2;
400 item1 = (Elm_Controlbar_Item *) d1;
401 item2 = (Elm_Controlbar_Item *) d2;
402 if (item1->order <= 0) return 1;
403 if (item2->order <= 0) return -1;
404 return item1->order > item2->order ? 1 : -1;
408 _check_item(Widget_Data *wd, Elm_Controlbar_Item *item)
411 Elm_Controlbar_Item *it;
413 if (!wd) return EINA_FALSE;
414 if (!wd->items) return EINA_FALSE;
416 EINA_LIST_FOREACH(wd->items, l, it)
417 if (it == item) return EINA_TRUE;
423 _check_background(Widget_Data *wd)
427 Elm_Controlbar_Item *it;
429 EINA_LIST_FOREACH(wd->items, l, it)
431 if (it->style == TABBAR)
433 if (wd->mode == ELM_CONTROLBAR_MODE_LEFT)
434 edje_object_signal_emit(_EDJ(wd->bg), "elm,state,tabbar_left", "elm");
435 else if (wd->mode == ELM_CONTROLBAR_MODE_RIGHT)
436 edje_object_signal_emit(_EDJ(wd->bg), "elm,state,tabbar_right", "elm");
438 edje_object_signal_emit(_EDJ(wd->bg), "elm,state,tabbar", "elm");
442 edje_object_signal_emit(_EDJ(wd->bg), "elm,state,toolbar", "elm");
446 _check_toolbar_line(Widget_Data *wd)
450 Elm_Controlbar_Item *it, *it2;
452 EINA_LIST_FOREACH(wd->items, l, it)
454 it2 = elm_controlbar_item_prev(it);
456 if (it->style != TOOLBAR || it2->style != TOOLBAR) continue;
460 edje_object_signal_emit(_EDJ(it2->base), "elm,state,right_line_hide", "elm");
461 edje_object_signal_emit(_EDJ(it->base), "elm,state,left_line_hide", "elm");
463 if ((it->icon || it->text) && (it2->icon || it2->text))
465 edje_object_signal_emit(_EDJ(it2->base), "elm,state,bottom_line_show", "elm");
466 edje_object_signal_emit(_EDJ(it->base), "elm,state,top_line_show", "elm");
470 edje_object_signal_emit(_EDJ(it2->base), "elm,state,bottom_line_hide", "elm");
471 edje_object_signal_emit(_EDJ(it->base), "elm,state,top_line_hide", "elm");
476 edje_object_signal_emit(_EDJ(it2->base), "elm,state,bottom_line_hide", "elm");
477 edje_object_signal_emit(_EDJ(it->base), "elm,state,top_line_hide", "elm");
479 if ((it->icon || it->text) && (it2->icon || it2->text))
481 edje_object_signal_emit(_EDJ(it2->base), "elm,state,right_line_show", "elm");
482 edje_object_signal_emit(_EDJ(it->base), "elm,state,left_line_show", "elm");
486 edje_object_signal_emit(_EDJ(it2->base), "elm,state,right_line_hide", "elm");
487 edje_object_signal_emit(_EDJ(it->base), "elm,state,left_line_hide", "elm");
494 _check_bar_item_number(Widget_Data *wd)
497 Elm_Controlbar_Item * item;
500 EINA_LIST_FOREACH(wd->items, l, item)
501 if (item->order > 0) num++;
507 _insert_item_in_bar(Elm_Controlbar_Item * it, int order)
510 Elm_Controlbar_Item * item;
511 Widget_Data * wd = elm_widget_data_get(it->obj);
515 if (order == 0) return;
517 EINA_LIST_FOREACH(wd->items, l, item)
519 if ((item->order == order) && (item != it))
524 EINA_LIST_FOREACH(wd->items, l, item)
527 elm_table_unpack(wd->box, item->base);
529 EINA_LIST_FOREACH(wd->items, l, item)
533 if (item->order >= order)
536 elm_table_pack(wd->box, item->base, item->order - 1, 0, 1, 1);
538 elm_table_pack(wd->box, item->base, 0, item->order - 1, 1, 1);
539 evas_object_show(item->base);
545 elm_table_pack(wd->box, it->base, it->order - 1, 0, 1, 1);
547 elm_table_pack(wd->box, it->base, 0, it->order - 1, 1, 1);
548 evas_object_show(it->base);
552 _delete_item_in_bar(Elm_Controlbar_Item * it)
555 Elm_Controlbar_Item * item;
556 Widget_Data * wd = elm_widget_data_get(it->obj);
560 EINA_LIST_FOREACH(wd->items, l, item)
566 elm_table_unpack(wd->box, it->base);
567 evas_object_hide(it->base);
572 EINA_LIST_FOREACH(wd->items, l, item)
577 elm_table_unpack(wd->box, item->base);
579 elm_table_pack(wd->box, item->base, item->order - 1, 0, 1, 1);
581 elm_table_pack(wd->box, item->base, 0, item->order - 1, 1, 1);
588 _set_item_visible(Elm_Controlbar_Item *it, Eina_Bool visible)
590 Elm_Controlbar_Item *item;
591 Eina_Bool check = EINA_TRUE;
594 if (it->obj == NULL) return;
595 Widget_Data * wd = elm_widget_data_get(it->obj);
596 if (!wd || !wd->items) return;
597 if (it->order <= 0) check = EINA_FALSE;
598 if (check == visible) return;
601 item = elm_controlbar_last_item_get(it->obj);
603 while (!elm_controlbar_item_visible_get(item)){
604 item = elm_controlbar_item_prev(item);
606 _insert_item_in_bar(it, item->order + 1);
610 _delete_item_in_bar(it);
612 wd->items = eina_list_sort(wd->items, eina_list_count(wd->items), _sort_cb);
613 _sizing_eval(it->obj);
617 _hide_selected_box(void *data)
619 Evas_Object *base = (Evas_Object *)data;
621 edje_object_part_drag_size_set(_EDJ(base), "elm.dragable.box", 0.0, 0.0);
623 return ECORE_CALLBACK_CANCEL;
627 _end_selected_box(void *data, Evas_Object *obj __UNUSED__)
629 Widget_Data * wd = (Widget_Data *)data;
631 if (_check_item(wd, wd->cur_item))
633 edje_object_signal_emit(_EDJ(wd->cur_item->base), wd->selected_signal, "elm");
637 if (wd->animating < 0)
639 printf("animation error\n");
643 ecore_idler_add(_hide_selected_box, wd->edje);
647 _move_selected_box(Widget_Data *wd, Elm_Controlbar_Item * fit, Elm_Controlbar_Item * tit)
649 Evas_Coord fx, fy, fw, fh, tx, ty, tw, th;
650 Evas_Object *from, *to;
652 if ((fit->order <= 0) && (wd->auto_align))
655 from = (Evas_Object *) edje_object_part_object_get(_EDJ(fit->base), "bg_img");
656 evas_object_geometry_get(from, &fx, &fy, &fw, &fh);
658 to = (Evas_Object *) edje_object_part_object_get(_EDJ(tit->base), "bg_img");
659 evas_object_geometry_get(to, &tx, &ty, &tw, &th);
661 if (_check_item(wd, wd->pre_item))
663 edje_object_signal_emit(_EDJ(wd->pre_item->base), "elm,state,unselected", "elm");
665 if (_check_item(wd, wd->cur_item))
666 edje_object_signal_emit(_EDJ(wd->cur_item->base), "elm,state,unselected", "elm");
671 if (wd->ad->timer) ecore_animator_del(wd->ad->timer);
672 wd->ad->timer = NULL;
676 wd->ad = _move_object_with_animation(wd->edje, fx, fy, fw, fh, tx, ty, tw, th,
677 0.3, _move_evas_object, _end_selected_box, wd);
681 _select_box(Elm_Controlbar_Item * it)
684 Widget_Data * wd = elm_widget_data_get(it->obj);
687 Elm_Controlbar_Item * item, *fit = NULL;
688 Evas_Object * content;
690 if (wd->animating) return;
694 if (it->style == TABBAR)
696 content = elm_object_part_content_unset(wd->edje, "elm.swallow.view");
697 if (content) evas_object_hide(content);
699 EINA_LIST_FOREACH(wd->items, l, item){
700 if (item->selected) {
704 item->selected = EINA_FALSE;
706 it->selected = EINA_TRUE;
708 if ((fit != NULL) && (fit != it))
710 _move_selected_box(wd, fit, it);
714 edje_object_signal_emit(_EDJ(it->base), wd->selected_signal, "elm");
719 if (wd->more_item != it)
720 evas_object_smart_callback_call(it->obj, "view,change,before", it);
723 elm_object_part_content_set(wd->edje, "elm.swallow.view", it->view);
725 else if (it->style == TOOLBAR)
727 edje_object_signal_emit(_EDJ(it->base), "elm,state,text_unselected", "elm");
729 it->func(it->data, it->obj, it);
734 _cancel_selected_box(Widget_Data *wd)
737 Elm_Controlbar_Item * item;
739 EINA_LIST_FOREACH(wd->items, l, item)
741 if (item->style == TABBAR)
745 edje_object_signal_emit(_EDJ(item->base), wd->selected_signal, "elm");
749 edje_object_signal_emit(_EDJ(item->base), "elm,state,unselected", "elm");
752 else if (item->style == TOOLBAR)
754 edje_object_signal_emit(_EDJ(item->base), "elm,state,unselected", "elm");
760 _unpress_box_cb(void *data, Evas_Object *obj, void *event_info)
762 Widget_Data * wd = (Widget_Data *) data;
765 _cancel_selected_box(wd);
769 _clicked_box_cb(void *data, Evas_Object *obj, void *event_info)
771 Widget_Data * wd = (Widget_Data *) data;
774 _select_box(wd->pre_item);
778 _press_box(Elm_Controlbar_Item * it)
780 Widget_Data * wd = elm_widget_data_get(it->obj);
781 if (!wd) return EINA_FALSE;
784 Elm_Controlbar_Item * item;
786 if (wd->animating) return EINA_FALSE;
788 if (wd->disabled || it->disabled) return EINA_FALSE;
790 EINA_LIST_FOREACH(wd->items, l, item)
794 if (it->style == TABBAR)
796 edje_object_signal_emit(_EDJ(it->base), wd->pressed_signal, "elm");
798 else if (it->style == TOOLBAR)
800 edje_object_signal_emit(_EDJ(it->base), "elm,state,toolbar_pressed", "elm");
815 _create_item_icon(Evas_Object *obj, Elm_Controlbar_Item * it, char *part)
819 icon = elm_icon_add(obj);
820 if (!elm_icon_standard_set(icon, it->icon_path))
822 elm_icon_file_set(icon, it->icon_path, NULL);
825 evas_object_size_hint_min_set(icon, 40, 40);
826 evas_object_size_hint_max_set(icon, 100, 100);
827 evas_object_show(icon);
829 elm_object_content_set(obj, icon);
835 _create_item_layout(Evas_Object * parent, Elm_Controlbar_Item * it, Evas_Object **item, Evas_Object **icon)
839 obj = elm_layout_add(parent);
842 fprintf(stderr, "Cannot load bg edj\n");
845 elm_layout_theme_set(obj, "controlbar", "item_bg",
846 elm_widget_style_get(it->obj));
847 evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
848 evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, EVAS_HINT_FILL);
850 *item = elm_button_add(parent);
851 if (*item == NULL) return NULL;
852 elm_object_style_set(*item, "controlbar/vertical");
853 elm_object_part_content_set(obj, "item", *item);
856 elm_object_text_set(*item, it->text);
858 *icon = _create_item_icon(*item, it, "elm.swallow.icon");
864 _bar_item_down_cb(void *data, Evas_Object * obj, void *event_info __UNUSED__)
866 Widget_Data * wd = (Widget_Data *) data;
868 Elm_Controlbar_Item * item;
869 if (wd->animating) return;
871 EINA_LIST_FOREACH(wd->items, l, item)
872 if (item->base_item == obj) break;
874 if (item == NULL) return;
879 static Elm_Controlbar_Item *
880 _create_tab_item(Evas_Object * obj, const char *icon_path, const char *label,
883 Elm_Controlbar_Item * it;
887 fprintf(stderr, "Invalid argument: controlbar object is NULL\n");
890 wd = elm_widget_data_get(obj);
893 fprintf(stderr, "Cannot get smart data\n");
896 it = ELM_NEW(Elm_Controlbar_Item);
897 if (!it) return NULL;
900 it->text = eina_stringshare_add(label);
901 it->icon_path = eina_stringshare_add(icon_path);
902 it->selected = EINA_FALSE;
906 it->base = _create_item_layout(wd->edje, it, &(it->base_item), &(it->icon));
907 evas_object_smart_callback_add(it->base_item, "pressed",
908 _bar_item_down_cb, wd);
909 evas_object_smart_callback_add(it->base_item, "unpressed", _unpress_box_cb, wd);
910 evas_object_smart_callback_add(it->base_item, "clicked", _clicked_box_cb, wd);
911 evas_object_show(it->base);
916 static Elm_Controlbar_Item *
917 _create_tool_item(Evas_Object * obj, const char *icon_path, const char *label,
918 void (*func) (void *data, Evas_Object * obj,
919 void *event_info), void *data)
922 Elm_Controlbar_Item * it;
926 fprintf(stderr, "Invalid argument: controlbar object is NULL\n");
929 wd = elm_widget_data_get(obj);
932 fprintf(stderr, "Cannot get smart data\n");
935 it = ELM_NEW(Elm_Controlbar_Item);
940 it->text = eina_stringshare_add(label);
941 it->icon_path = eina_stringshare_add(icon_path);
942 it->selected = EINA_FALSE;
947 it->base = _create_item_layout(wd->edje, it, &(it->base_item), &(it->icon));
948 evas_object_smart_callback_add(it->base_item, "pressed",
949 _bar_item_down_cb, wd);
950 evas_object_smart_callback_add(it->base_item, "unpressed", _unpress_box_cb, wd);
951 evas_object_smart_callback_add(it->base_item, "clicked", _clicked_box_cb, wd);
952 evas_object_show(it->base);
957 static Elm_Controlbar_Item *
958 _create_object_item(Evas_Object *obj, Evas_Object *obj_item, const int sel)
960 Elm_Controlbar_Item *it;
964 fprintf(stderr, "Invalid argument: controlbar object is NULL\n");
967 wd = elm_widget_data_get(obj);
970 fprintf(stderr, "Cannot get smart data\n");
973 it = ELM_NEW(Elm_Controlbar_Item);
980 it->base = elm_layout_add(wd->edje);
981 elm_layout_theme_set(it->base, "controlbar", "item_bg",
982 elm_widget_style_get(it->obj));
983 evas_object_size_hint_weight_set(it->base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
984 evas_object_size_hint_align_set(it->base, EVAS_HINT_FILL, EVAS_HINT_FILL);
985 it->base_item = obj_item;
986 elm_object_part_content_set(it->base, "item", it->base_item);
987 evas_object_show(it->base);
992 _repack_items(Widget_Data *wd)
995 Elm_Controlbar_Item * item;
997 EINA_LIST_FOREACH(wd->items, l, item)
1001 elm_table_unpack(wd->box, item->base);
1003 elm_table_pack(wd->box, item->base, item->order - 1, 0, item->sel, 1);
1005 elm_table_pack(wd->box, item->base, 0, item->order - 1, item->sel, 1);
1011 _set_items_position(Evas_Object *obj, Elm_Controlbar_Item *it,
1012 Elm_Controlbar_Item *mit, Eina_Bool bar)
1016 Elm_Controlbar_Item * item;
1017 int check = EINA_FALSE;
1022 fprintf(stderr, "Invalid argument: controlbar object is NULL\n");
1025 wd = elm_widget_data_get(obj);
1028 fprintf(stderr, "Cannot get smart data\n");
1032 EINA_LIST_FOREACH(wd->items, l, item)
1034 if ((item == mit) && (item->order > 0))
1037 it->order = mit->order;
1041 if (item->order > 0)
1043 elm_table_unpack(wd->box, item->base);
1044 item->order += it->sel;
1046 elm_table_pack(wd->box, item->base, item->order - 1, 0, item->sel, 1);
1048 elm_table_pack(wd->box, item->base, 0, item->order - 1, item->sel, 1);
1051 if (item->order > 0) order += item->sel;
1065 elm_table_pack(wd->box, it->base, it->order - 1, 0, it->sel, 1);
1067 elm_table_pack(wd->box, it->base, 0, it->order - 1, it->sel, 1);
1070 evas_object_hide(it->base);
1074 _list_clicked(void *data, Evas_Object *obj, void *event_info __UNUSED__)
1076 Elm_Controlbar_Item *item = (Elm_Controlbar_Item *)data;
1077 Elm_Controlbar_Item *it;
1080 Evas_Object *content;
1081 Elm_List_Item *lit = (Elm_List_Item *) elm_list_selected_item_get(obj);
1084 elm_list_item_selected_set(lit, 0);
1088 wd = elm_widget_data_get(item->obj);
1091 EINA_LIST_FOREACH(wd->items, l, it)
1093 it->selected = EINA_FALSE;
1096 if (item->style == TABBAR)
1098 content = elm_object_part_content_unset(wd->edje, "elm.swallow.view");
1099 evas_object_hide(content);
1100 item->selected = EINA_TRUE;
1101 evas_object_smart_callback_call(item->obj, "view,change,before", item);
1102 elm_object_part_content_set(wd->edje, "elm.swallow.view", item->view);
1105 if ((item->style == TOOLBAR) && (item->func))
1106 item->func(item->data, item->obj, item);
1109 static Evas_Object *
1110 _create_more_view(Widget_Data *wd)
1113 Elm_Controlbar_Item *item;
1117 list = elm_list_add( wd->object );
1118 elm_list_mode_set( list, ELM_LIST_COMPRESS );
1120 EINA_LIST_FOREACH(wd->items, l, item)
1122 if (item->order <= 0)
1125 if (item->icon_path)
1127 icon = _create_item_icon(list, item, NULL);
1128 evas_object_color_set(icon, 0, 0, 0, 255);
1130 elm_list_item_append(list, item->text, icon, NULL, _list_clicked, item);
1134 elm_list_go( list );
1140 _ctxpopup_cb(void *data, Evas_Object *obj, void *event_info)
1142 Elm_Controlbar_Item *it;
1144 Evas_Object *ctxpopup = obj;
1146 Widget_Data *wd = (Widget_Data *)data;
1148 EINA_LIST_FOREACH(wd->items, l, it)
1150 label = elm_ctxpopup_item_label_get((Elm_Ctxpopup_Item *) event_info);
1151 if ((label) && (!strcmp(it->text, label))) break;
1155 it->func(it->data, it->obj, it);
1157 if (_check_item(wd, it)) evas_object_smart_callback_call(it->obj, "clicked", it);
1159 evas_object_del(ctxpopup);
1164 _ctxpopup_dismissed_cb(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
1166 Evas_Object *ctxpopup = obj;
1168 evas_object_del(ctxpopup);
1173 _create_more_func(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
1175 Evas_Object *ctxpopup;
1176 Elm_Controlbar_Item *item;
1179 Evas_Coord x, y, w, h;
1180 Widget_Data *wd = elm_widget_data_get(obj);
1183 ctxpopup = elm_ctxpopup_add(wd->parent);
1184 evas_object_smart_callback_add( ctxpopup, "dismissed", _ctxpopup_dismissed_cb, wd);
1186 EINA_LIST_FOREACH(wd->items, l, item)
1188 if (item->order <= 0)
1191 if (item->icon_path)
1193 icon = _create_item_icon(ctxpopup, item, NULL);
1194 evas_object_color_set(icon, 0, 0, 0, 255);
1196 elm_ctxpopup_item_append(ctxpopup, item->text, icon, _ctxpopup_cb, wd);
1200 evas_object_geometry_get(wd->more_item->base, &x, &y, &w, &h);
1201 evas_object_move(ctxpopup, x + w/2, y + h/2);
1203 evas_object_show(ctxpopup);
1206 static Elm_Controlbar_Item *
1207 _create_more_item(Widget_Data *wd, int style)
1209 Elm_Controlbar_Item * it;
1211 it = ELM_NEW(Elm_Controlbar_Item);
1212 if (!it) return NULL;
1213 it->obj = wd->object;
1214 it->text = eina_stringshare_add("more");
1215 it->icon_path = eina_stringshare_add(CONTROLBAR_SYSTEM_ICON_MORE);
1216 it->selected = EINA_FALSE;
1218 it->view = _create_more_view(wd);
1219 it->func = _create_more_func;
1221 it->base = _create_item_layout(wd->edje, it, &(it->base_item), &(it->icon));
1222 evas_object_smart_callback_add(it->base_item, "pressed",
1223 _bar_item_down_cb, wd);
1224 evas_object_smart_callback_add(it->base_item, "unpressed", _unpress_box_cb, wd);
1225 evas_object_smart_callback_add(it->base_item, "clicked", _clicked_box_cb, wd);
1226 evas_object_show(it->base);
1228 _set_items_position(it->obj, it, NULL, EINA_TRUE);
1229 wd->items = eina_list_append(wd->items, it);
1231 wd->items = eina_list_sort(wd->items, eina_list_count(wd->items), _sort_cb);
1237 elm_controlbar_add(Evas_Object *parent)
1239 if (parent == NULL) return NULL;
1240 Evas_Object * obj = NULL;
1241 Evas_Object * bg = NULL;
1242 Widget_Data * wd = NULL;
1243 Evas_Coord x, y, w, h;
1245 ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL);
1246 ELM_SET_WIDTYPE(widtype, "controlbar");
1247 elm_widget_type_set(obj, "controlbar");
1248 elm_widget_sub_object_add(parent, obj);
1249 elm_widget_data_set(obj, wd);
1250 elm_widget_del_hook_set(obj, _del_hook);
1251 elm_widget_can_focus_set(obj, EINA_FALSE);
1252 elm_widget_theme_hook_set(obj, _theme_hook);
1253 elm_widget_disable_hook_set(obj, _disable_hook);
1256 wd->parent = parent;
1257 evas_object_geometry_get(parent, &x, &y, &w, &h);
1263 wd->mode = ELM_CONTROLBAR_MODE_DEFAULT;
1267 wd->vertical = EINA_FALSE;
1268 wd->auto_align = EINA_FALSE;
1269 wd->selected_animation = EINA_FALSE;
1270 wd->pressed_signal = eina_stringshare_add("elm,state,pressed");
1271 wd->selected_signal = eina_stringshare_add("elm,state,selected");
1273 /* load background edj */
1274 wd->edje = elm_layout_add(obj);
1275 elm_layout_theme_set(wd->edje, "controlbar", "base", "default");
1276 if (wd->edje == NULL)
1278 printf("Cannot load base edj\n");
1281 evas_object_show(wd->edje);
1283 wd->bg = elm_layout_add(wd->edje);
1284 elm_layout_theme_set(wd->bg, "controlbar", "background", "default");
1287 printf("Cannot load bg edj\n");
1290 elm_object_part_content_set(wd->edje, "bg_image", wd->bg);
1293 evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_RESIZE,
1294 _controlbar_object_resize, obj);
1295 evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_MOVE,
1296 _controlbar_object_move, obj);
1297 evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_SHOW,
1298 _controlbar_object_show, obj);
1299 evas_object_event_callback_add(wd->edje, EVAS_CALLBACK_HIDE,
1300 _controlbar_object_hide, obj);
1302 bg = elm_object_part_content_get(wd->edje, "bg_image");
1303 evas_object_event_callback_add(bg, EVAS_CALLBACK_MOVE, _controlbar_object_move, obj);
1304 evas_object_event_callback_add(bg, EVAS_CALLBACK_RESIZE, _controlbar_object_resize, obj);
1307 wd->box = elm_table_add(wd->edje);
1308 elm_table_homogeneous_set(wd->box, EINA_TRUE);
1309 evas_object_size_hint_weight_set(wd->box, EVAS_HINT_EXPAND,
1311 evas_object_size_hint_align_set(wd->box, EVAS_HINT_FILL, EVAS_HINT_FILL);
1312 elm_object_part_content_set(wd->edje, "elm.swallow.items", wd->box);
1313 evas_object_show(wd->box);
1315 evas_object_smart_callback_add(obj, "sub-object-del", _sub_del, obj);
1317 elm_widget_resize_object_set(obj, wd->edje);
1324 EAPI Elm_Controlbar_Item *
1325 elm_controlbar_tab_item_append(Evas_Object *obj, const char *icon_path,
1326 const char *label, Evas_Object *view)
1328 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1329 Elm_Controlbar_Item * it;
1330 Elm_Controlbar_Item * lit;
1332 it = _create_tab_item(obj, icon_path, label, view);
1333 if (!it) return NULL;
1334 wd = elm_widget_data_get(obj);
1335 if ((_check_bar_item_number(wd) >= 5) && (wd->auto_align))
1337 if (!wd->more_item) {
1338 lit = elm_controlbar_last_item_get(obj);
1339 _set_item_visible(lit, EINA_FALSE);
1340 _create_more_item(wd, TABBAR);
1342 _set_items_position(obj, it, NULL, EINA_FALSE);
1346 _set_items_position(obj, it, NULL, EINA_TRUE);
1348 wd->items = eina_list_append(wd->items, it);
1350 elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1352 _check_background(wd);
1357 EAPI Elm_Controlbar_Item *
1358 elm_controlbar_tab_item_prepend(Evas_Object *obj, const char *icon_path,
1359 const char *label, Evas_Object *view)
1361 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1363 Elm_Controlbar_Item * it;
1364 Elm_Controlbar_Item * lit;
1365 Elm_Controlbar_Item * item;
1366 it = _create_tab_item(obj, icon_path, label, view);
1367 if (!it) return NULL;
1368 wd = elm_widget_data_get(obj);
1369 item = eina_list_data_get(wd->items);
1370 if ((_check_bar_item_number(wd) >= 5) && (wd->auto_align))
1374 lit = elm_controlbar_last_item_get(obj);
1375 _set_item_visible(lit, EINA_FALSE);
1376 _create_more_item(wd, TABBAR);
1378 lit = elm_controlbar_item_prev(wd->more_item);
1379 _set_item_visible(lit, EINA_FALSE);
1380 _set_items_position(obj, it, item, EINA_TRUE);
1384 _set_items_position(obj, it, item, EINA_TRUE);
1386 wd->items = eina_list_prepend(wd->items, it);
1388 elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1390 _check_background(wd);
1395 EAPI Elm_Controlbar_Item *
1396 elm_controlbar_tab_item_insert_before(Evas_Object *obj,
1397 Elm_Controlbar_Item *before,
1398 const char *icon_path,
1399 const char *label, Evas_Object *view)
1401 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1403 Elm_Controlbar_Item * it;
1404 Elm_Controlbar_Item * lit;
1405 if (!before) return NULL;
1406 it = _create_tab_item(obj, icon_path, label, view);
1407 if (!it) return NULL;
1408 wd = elm_widget_data_get(obj);
1409 if ((_check_bar_item_number(wd) >= 5) && (wd->auto_align))
1413 lit = elm_controlbar_last_item_get(obj);
1414 _set_item_visible(lit, EINA_FALSE);
1415 _create_more_item(wd, TABBAR);
1417 before = wd->more_item;
1418 if (before->order > 0)
1420 lit = elm_controlbar_item_prev(wd->more_item);
1421 _set_item_visible(lit, EINA_FALSE);
1422 _set_items_position(obj, it, before, EINA_TRUE);
1426 _set_items_position(obj, it, before, EINA_FALSE);
1431 _set_items_position(obj, it, before, EINA_TRUE);
1433 wd->items = eina_list_prepend_relative(wd->items, it, before);
1435 elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1437 _check_background(wd);
1442 EAPI Elm_Controlbar_Item *
1443 elm_controlbar_tab_item_insert_after(Evas_Object *obj,
1444 Elm_Controlbar_Item *after,
1445 const char *icon_path, const char *label,
1448 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1450 Elm_Controlbar_Item * it;
1451 Elm_Controlbar_Item * lit;
1452 Elm_Controlbar_Item * item;
1453 if (!after) return NULL;
1454 it = _create_tab_item(obj, icon_path, label, view);
1455 if (!it) return NULL;
1456 wd = elm_widget_data_get(obj);
1457 item = elm_controlbar_item_next(after);
1458 if ((_check_bar_item_number(wd) >= 5) && (wd->auto_align))
1462 lit = elm_controlbar_last_item_get(obj);
1463 _set_item_visible(lit, EINA_FALSE);
1464 _create_more_item(wd, TABBAR);
1466 lit = elm_controlbar_item_prev(wd->more_item);
1467 if ((lit != after) && (item->order > 0))
1469 _set_item_visible(lit, EINA_FALSE);
1470 _set_items_position(obj, it, item, EINA_TRUE);
1474 _set_items_position(obj, it, NULL, EINA_FALSE);
1479 _set_items_position(obj, it, item, EINA_TRUE);
1481 wd->items = eina_list_append_relative(wd->items, it, after);
1483 elm_controlbar_item_view_set(wd->more_item, _create_more_view(wd));
1485 _check_background(wd);
1490 EAPI Elm_Controlbar_Item *
1491 elm_controlbar_tool_item_append(Evas_Object *obj, const char *icon_path,
1493 void (*func)(void *data, Evas_Object * obj, void *event_info),
1497 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1498 Elm_Controlbar_Item * it;
1499 Elm_Controlbar_Item * lit;
1501 it = _create_tool_item(obj, icon_path, label, func, data);
1502 if (!it) return NULL;
1503 wd = elm_widget_data_get(obj);
1504 if ((_check_bar_item_number(wd) >= 5) && (wd->auto_align))
1508 lit = elm_controlbar_last_item_get(obj);
1509 _set_item_visible(lit, EINA_FALSE);
1510 _create_more_item(wd, TOOLBAR);
1512 _set_items_position(obj, it, NULL, EINA_FALSE);
1516 _set_items_position(obj, it, NULL, EINA_TRUE);
1518 wd->items = eina_list_append(wd->items, it);
1519 _check_toolbar_line(wd);
1524 EAPI Elm_Controlbar_Item *
1525 elm_controlbar_tool_item_prepend(Evas_Object *obj, const char *icon_path,
1527 void (*func) (void *data, Evas_Object *obj, void *event_info),
1530 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1532 Elm_Controlbar_Item * it;
1533 Elm_Controlbar_Item * lit;
1534 Elm_Controlbar_Item * item;
1535 it = _create_tool_item(obj, icon_path, label, func, data);
1536 if (!it) return NULL;
1537 wd = elm_widget_data_get(obj);
1538 item = eina_list_data_get(wd->items);
1539 if ((_check_bar_item_number(wd) >= 5) && (wd->auto_align))
1543 lit = elm_controlbar_last_item_get(obj);
1544 _set_item_visible(lit, EINA_FALSE);
1545 _create_more_item(wd, TOOLBAR);
1547 lit = elm_controlbar_item_prev(wd->more_item);
1548 _set_item_visible(lit, EINA_FALSE);
1549 _set_items_position(obj, it, item, EINA_TRUE);
1553 _set_items_position(obj, it, item, EINA_TRUE);
1555 wd->items = eina_list_prepend(wd->items, it);
1556 _check_toolbar_line(wd);
1561 EAPI Elm_Controlbar_Item *
1562 elm_controlbar_tool_item_insert_before(Evas_Object *obj,
1563 Elm_Controlbar_Item *before,
1564 const char *icon_path,
1566 void (*func)(void *data, Evas_Object *obj, void *event_info),
1569 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1571 Elm_Controlbar_Item * it;
1572 Elm_Controlbar_Item * lit;
1573 if (!before) return NULL;
1574 it = _create_tool_item(obj, icon_path, label, func, data);
1575 if (!it) return NULL;
1576 wd = elm_widget_data_get(obj);
1577 if ((_check_bar_item_number(wd) >= 5) && (wd->auto_align))
1581 lit = elm_controlbar_last_item_get(obj);
1582 _set_item_visible(lit, EINA_FALSE);
1583 _create_more_item(wd, TOOLBAR);
1585 before = wd->more_item;
1586 if (before->order > 0)
1588 lit = elm_controlbar_item_prev(wd->more_item);
1589 _set_item_visible(lit, EINA_FALSE);
1590 _set_items_position(obj, it, before, EINA_TRUE);
1594 _set_items_position(obj, it, before, EINA_FALSE);
1599 _set_items_position(obj, it, before, EINA_TRUE);
1601 wd->items = eina_list_prepend_relative(wd->items, it, before);
1602 _check_toolbar_line(wd);
1607 EAPI Elm_Controlbar_Item *
1608 elm_controlbar_tool_item_insert_after(Evas_Object *obj,
1609 Elm_Controlbar_Item *after,
1610 const char *icon_path,
1612 void (*func) (void *data, Evas_Object *obj, void *event_info),
1615 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1617 Elm_Controlbar_Item * it;
1618 Elm_Controlbar_Item * lit;
1619 Elm_Controlbar_Item * item;
1620 if (!after) return NULL;
1621 it = _create_tool_item(obj, icon_path, label, func, data);
1622 if (!it) return NULL;
1623 wd = elm_widget_data_get(obj);
1624 item = elm_controlbar_item_next(after);
1625 if ((_check_bar_item_number(wd) >= 5) && (wd->auto_align))
1629 lit = elm_controlbar_last_item_get(obj);
1630 _set_item_visible(lit, EINA_FALSE);
1631 _create_more_item(wd, TOOLBAR);
1633 lit = elm_controlbar_item_prev(wd->more_item);
1634 if ((lit != after) && (item->order > 0))
1636 _set_item_visible(lit, EINA_FALSE);
1637 _set_items_position(obj, it, item, EINA_TRUE);
1641 _set_items_position(obj, it, NULL, EINA_FALSE);
1646 _set_items_position(obj, it, item, EINA_TRUE);
1648 wd->items = eina_list_append_relative(wd->items, it, after);
1649 _check_toolbar_line(wd);
1654 EAPI Elm_Controlbar_Item *
1655 elm_controlbar_object_item_append(Evas_Object *obj, Evas_Object *obj_item,
1658 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1660 Elm_Controlbar_Item * it;
1661 wd = elm_widget_data_get(obj);
1662 if (!wd) return NULL;
1663 it = _create_object_item(obj, obj_item, sel);
1664 if (!it) return NULL;
1665 _set_items_position(obj, it, NULL, EINA_TRUE);
1666 wd->items = eina_list_append(wd->items, it);
1671 EAPI Elm_Controlbar_Item *
1672 elm_controlbar_object_item_prepend(Evas_Object *obj, Evas_Object *obj_item,
1675 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1677 Elm_Controlbar_Item * it;
1678 Elm_Controlbar_Item * item;
1679 wd = elm_widget_data_get(obj);
1680 if (!wd) return NULL;
1681 it = _create_object_item(obj, obj_item, sel);
1682 if (!it) return NULL;
1683 item = eina_list_data_get(wd->items);
1684 _set_items_position(obj, it, item, EINA_TRUE);
1685 wd->items = eina_list_prepend(wd->items, it);
1690 EAPI Elm_Controlbar_Item *
1691 elm_controlbar_object_item_insert_before(Evas_Object *obj,
1692 Elm_Controlbar_Item *before,
1693 Evas_Object *obj_item, const int sel)
1695 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1697 Elm_Controlbar_Item * it;
1698 wd = elm_widget_data_get(obj);
1699 if (!wd) return NULL;
1700 if (!before) return NULL;
1701 it = _create_object_item(obj, obj_item, sel);
1702 if (!it) return NULL;
1703 _set_items_position(obj, it, before, EINA_TRUE);
1704 wd->items = eina_list_prepend_relative(wd->items, it, before);
1709 EAPI Elm_Controlbar_Item *
1710 elm_controlbar_object_item_insert_after(Evas_Object *obj,
1711 Elm_Controlbar_Item *after,
1712 Evas_Object *obj_item, const int sel)
1714 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1716 Elm_Controlbar_Item *it;
1717 Elm_Controlbar_Item *item;
1718 wd = elm_widget_data_get(obj);
1719 if (!wd) return NULL;
1720 if (!after) return NULL;
1721 it = _create_object_item(obj, obj_item, sel);
1722 if (!it) return NULL;
1723 item = elm_controlbar_item_next(after);
1724 _set_items_position(obj, it, item, EINA_TRUE);
1725 wd->items = eina_list_append_relative(wd->items, it, after);
1731 elm_controlbar_object_item_object_get(const Elm_Controlbar_Item *it)
1733 if (!it) return NULL;
1734 if (it->style != OBJECT) return NULL;
1735 if (!it->base_item) return NULL;
1736 return it->base_item;
1740 elm_controlbar_item_del(Elm_Controlbar_Item *it)
1746 Elm_Controlbar_Item *item;
1753 if (it->obj == NULL)
1755 printf("Invalid argument: controlbar object is NULL\n");
1758 wd = elm_widget_data_get(it->obj);
1761 printf("Cannot get smart data\n");
1769 elm_table_unpack(wd->box, it->base);
1771 EINA_LIST_FOREACH(wd->items, l, item)
1775 if (item->order > it->order)
1778 elm_table_unpack(wd->box, item->base);
1781 elm_table_pack(wd->box, item->base, item->order - 1, 0, item->sel, 1);
1783 elm_table_pack(wd->box, item->base, 0, item->order - 1, item->sel, 1);
1789 // delete item in list
1791 wd->items = eina_list_remove(wd->items, it);
1794 wd->num = wd->num - 1;
1799 elm_controlbar_item_select(Elm_Controlbar_Item * it)
1802 if (it->obj == NULL) return;
1803 Widget_Data * wd = elm_widget_data_get(it->obj);
1810 elm_controlbar_item_icon_set(Elm_Controlbar_Item *it, const char *icon_path)
1813 if (it->style == OBJECT) return;
1816 eina_stringshare_del(it->icon_path);
1817 it->icon_path = NULL;
1821 evas_object_del(it->icon);
1824 if (icon_path != NULL)
1826 it->icon_path = eina_stringshare_add(icon_path);
1827 it->icon = _create_item_icon(it->base_item, it, "elm.swallow.icon");
1829 if (it->wd->disabled || it->disabled)
1830 elm_widget_disabled_set(it->base_item, EINA_TRUE);
1832 elm_widget_disabled_set(it->base_item, EINA_FALSE);
1836 elm_controlbar_item_icon_get(const Elm_Controlbar_Item *it)
1838 if (!it) return NULL;
1843 elm_controlbar_item_label_set(Elm_Controlbar_Item *it, const char *label)
1846 if (it->style == OBJECT) return;
1849 eina_stringshare_del(it->text);
1854 it->text = eina_stringshare_add(label);
1855 elm_object_text_set(it->base_item, it->text);
1857 if (it->wd->disabled || it->disabled)
1858 elm_widget_disabled_set(it->base_item, EINA_TRUE);
1860 elm_widget_disabled_set(it->base_item, EINA_FALSE);
1864 elm_controlbar_item_label_get(const Elm_Controlbar_Item * it)
1866 if (!it) return NULL;
1870 EAPI Elm_Controlbar_Item *
1871 elm_controlbar_selected_item_get(const Evas_Object *obj)
1873 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1876 Elm_Controlbar_Item * item;
1877 if (obj == NULL) return NULL;
1878 Widget_Data * wd = elm_widget_data_get(obj);
1879 if (!wd || !wd->items) return NULL;
1880 EINA_LIST_FOREACH(wd->items, l, item)
1882 if (item->selected) return item;
1887 EAPI Elm_Controlbar_Item *
1888 elm_controlbar_first_item_get(const Evas_Object *obj)
1890 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1891 Widget_Data * wd = elm_widget_data_get(obj);
1892 if (!wd || !wd->items) return NULL;
1893 return eina_list_data_get(wd->items);
1896 EAPI Elm_Controlbar_Item *
1897 elm_controlbar_last_item_get(const Evas_Object *obj)
1899 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1900 Widget_Data * wd = elm_widget_data_get(obj);
1901 if (!wd || !wd->items) return NULL;
1902 return eina_list_data_get(eina_list_last(wd->items));
1905 EAPI const Eina_List *
1906 elm_controlbar_items_get(const Evas_Object *obj)
1908 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1909 Widget_Data * wd = elm_widget_data_get(obj);
1910 if (!wd || !wd->items) return NULL;
1914 EAPI Elm_Controlbar_Item *
1915 elm_controlbar_item_prev(Elm_Controlbar_Item *it)
1917 if (!it) return NULL;
1920 Elm_Controlbar_Item * item;
1921 if (it->obj == NULL) return NULL;
1922 Widget_Data * wd = elm_widget_data_get(it->obj);
1923 if (!wd || !wd->items) return NULL;
1924 EINA_LIST_FOREACH(wd->items, l, item)
1928 l = eina_list_prev(l);
1929 if (!l) return NULL;
1930 return eina_list_data_get(l);
1936 EAPI Elm_Controlbar_Item *
1937 elm_controlbar_item_next(Elm_Controlbar_Item *it)
1939 if (!it) return NULL;
1942 Elm_Controlbar_Item * item;
1943 if (it->obj == NULL) return NULL;
1944 Widget_Data * wd = elm_widget_data_get(it->obj);
1945 if (!wd || !wd->items) return NULL;
1946 EINA_LIST_FOREACH(wd->items, l, item)
1950 l = eina_list_next(l);
1951 if (!l) return NULL;
1952 return eina_list_data_get(l);
1959 elm_controlbar_item_visible_set(Elm_Controlbar_Item *it, Eina_Bool visible)
1962 if (it->obj == NULL) return;
1963 Widget_Data * wd = elm_widget_data_get(it->obj);
1966 if (!wd->auto_align)
1967 _set_item_visible(it, visible);
1971 elm_controlbar_item_visible_get(const Elm_Controlbar_Item *it)
1973 if (!it) return EINA_FALSE;
1974 if (it->obj == NULL) return EINA_FALSE;
1975 Widget_Data * wd = elm_widget_data_get(it->obj);
1976 if (!wd) return EINA_FALSE;
1977 if (it->order <= 0) return EINA_FALSE;
1983 elm_controlbar_item_disabled_set(Elm_Controlbar_Item *it, Eina_Bool disabled)
1987 if (it->disabled == disabled) return;
1989 it->disabled = disabled;
1991 if ((it->wd) && (it->wd->disabled)) return;
1993 if (it->base_item) elm_widget_disabled_set(it->base_item, disabled);
1997 elm_controlbar_item_disabled_get(const Elm_Controlbar_Item *it)
1999 if (!it) return EINA_FALSE;
2001 return it->disabled;
2005 elm_controlbar_item_view_set(Elm_Controlbar_Item *it, Evas_Object * view)
2008 if (it->view == view) return;
2010 evas_object_del(it->view);
2015 elm_controlbar_item_view_get(const Elm_Controlbar_Item *it)
2017 if (!it) return NULL;
2023 elm_controlbar_item_view_unset(Elm_Controlbar_Item *it)
2025 if (!it) return NULL;
2026 if (it->obj == NULL) return NULL;
2027 Widget_Data * wd = elm_widget_data_get(it->obj);
2028 if (!wd) return NULL;
2029 Evas_Object *content;
2031 if (it->view == elm_object_part_content_get(wd->edje, "elm.swallow.view"))
2033 content = elm_object_part_content_unset(wd->edje, "elm.swallow.view");
2034 if (content) evas_object_hide(content);
2045 elm_controlbar_mode_set(Evas_Object *obj, int mode)
2047 ELM_CHECK_WIDTYPE(obj, widtype);
2048 Widget_Data *wd = elm_widget_data_get(obj);
2051 fprintf(stderr, "Cannot get smart data\n");
2054 Evas_Object *selected_box;
2060 case ELM_CONTROLBAR_MODE_DEFAULT:
2061 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,default", "elm");
2063 case ELM_CONTROLBAR_MODE_TRANSLUCENCE:
2064 elm_controlbar_alpha_set(obj, 85);
2066 case ELM_CONTROLBAR_MODE_TRANSPARENCY:
2067 elm_controlbar_alpha_set(obj, 0);
2069 case ELM_CONTROLBAR_MODE_LARGE:
2070 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,large", "elm");
2072 case ELM_CONTROLBAR_MODE_SMALL:
2073 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,small", "elm");
2075 case ELM_CONTROLBAR_MODE_LEFT:
2076 selected_box = elm_object_part_content_get(wd->edje, "elm.dragable.box");
2077 if (selected_box) edje_object_signal_emit(_EDJ(selected_box), "elm,state,left", "elm");
2078 wd->selected_signal = eina_stringshare_add("elm,state,selected_left");
2079 wd->pressed_signal = eina_stringshare_add("elm,state,pressed_left");
2080 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,left", "elm");
2081 _check_background(wd);
2084 case ELM_CONTROLBAR_MODE_RIGHT:
2085 selected_box = elm_object_part_content_get(wd->edje, "elm.dragable.box");
2086 if (selected_box) edje_object_signal_emit(_EDJ(selected_box), "elm,state,right", "elm");
2087 wd->selected_signal = eina_stringshare_add("elm,state,selected_right");
2088 wd->pressed_signal = eina_stringshare_add("elm,state,pressed_right");
2089 edje_object_signal_emit(_EDJ(wd->edje), "elm,state,right", "elm");
2090 _check_background(wd);
2096 selected_box = elm_object_part_content_get(wd->edje, "elm.dragable.box");
2097 if (selected_box) edje_object_signal_emit(_EDJ(selected_box), "elm,state,default", "elm");
2098 wd->selected_signal = eina_stringshare_add("elm,state,selected");
2099 wd->pressed_signal = eina_stringshare_add("elm,state,pressed");
2100 _check_background(wd);
2105 elm_controlbar_alpha_set(Evas_Object *obj, int alpha)
2107 ELM_CHECK_WIDTYPE(obj, widtype);
2109 Widget_Data *wd = elm_widget_data_get(obj);
2112 fprintf(stderr, "Cannot get smart data\n");
2116 if (alpha < 0) wd->alpha = 0;
2117 else if (alpha > 100) wd->alpha = 100;
2118 else wd->alpha = alpha;
2120 evas_object_color_get(wd->bg, &r, &g, &b, NULL);
2121 evas_object_color_set(wd->bg, r, g, b, (int)(255 * wd->alpha / 100));
2125 elm_controlbar_item_auto_align_set(Evas_Object *obj, Eina_Bool auto_align)
2127 ELM_CHECK_WIDTYPE(obj, widtype);
2128 Widget_Data *wd = elm_widget_data_get(obj);
2129 Elm_Controlbar_Item *item;
2134 fprintf(stderr, "Cannot get smart data\n");
2138 if (wd->auto_align == auto_align) return;
2142 if ((_check_bar_item_number(wd)) >= 5 && (!wd->more_item))
2145 EINA_LIST_FOREACH(wd->items, l, item)
2147 if (elm_controlbar_item_visible_get(item))
2150 _delete_item_in_bar(item);
2153 item = elm_controlbar_last_item_get(obj);
2154 while (!elm_controlbar_item_visible_get(item)){
2155 item = elm_controlbar_item_prev(item);
2157 _create_more_item(wd, item->style);
2165 if (wd->more_item->view)
2166 evas_object_del(wd->more_item->view);
2167 wd->items = eina_list_remove(wd->items, wd->more_item);
2168 eina_stringshare_del(wd->more_item->text);
2169 if (wd->more_item->icon)
2170 evas_object_del(wd->more_item->icon);
2171 if (wd->more_item->base)
2172 evas_object_del(wd->more_item->base);
2173 if (wd->more_item->base_item)
2174 evas_object_del(wd->more_item->base_item);
2175 free(wd->more_item);
2176 wd->more_item = NULL;
2178 // make all item is visible
2180 EINA_LIST_FOREACH(wd->items, l, item)
2182 if (!elm_controlbar_item_visible_get(item))
2183 _insert_item_in_bar(item, i);
2188 wd->auto_align = auto_align;
2193 elm_controlbar_vertical_set(Evas_Object *obj, Eina_Bool vertical)
2195 ELM_CHECK_WIDTYPE(obj, widtype);
2196 Widget_Data *wd = elm_widget_data_get(obj);
2199 fprintf(stderr, "Cannot get smart data\n");
2203 if (wd->vertical == vertical) return;
2204 wd->vertical = vertical;
2206 if (_check_bar_item_number(wd) > 1)
2210 _check_toolbar_line(wd);
2214 elm_controlbar_item_button_get(const Elm_Controlbar_Item *it)
2216 if (!it) return NULL;
2217 if (it->style == OBJECT) return NULL;
2219 if (it->base_item) return it->base_item;