1 #include <Elementary.h>
3 #include "elm_widget_toolbar.h"
5 EAPI const char ELM_TOOLBAR_SMART_NAME[] = "elm_toolbar";
7 #define ELM_TOOLBAR_ITEM_FROM_INLIST(item) \
8 ((item) ? EINA_INLIST_CONTAINER_GET(item, Elm_Toolbar_Item) : NULL)
10 static const char SIG_CLICKED[] = "clicked";
11 static const char SIG_LONGPRESSED[] = "longpressed";
12 static const char SIG_CLICKED_DOUBLE[] = "clicked,double";
13 static const char SIG_LANG_CHANGED[] = "language,changed";
14 static const Evas_Smart_Cb_Description _smart_callbacks[] = {
16 {SIG_LONGPRESSED, ""},
17 {SIG_CLICKED_DOUBLE, ""},
18 {SIG_LANG_CHANGED, ""},
22 static const Evas_Smart_Interface *_smart_interfaces[] =
24 (Evas_Smart_Interface *)&ELM_SCROLLABLE_IFACE, NULL
27 EVAS_SMART_SUBCLASS_IFACE_NEW
28 (ELM_TOOLBAR_SMART_NAME, _elm_toolbar, Elm_Toolbar_Smart_Class,
29 Elm_Widget_Smart_Class, elm_widget_smart_class_get, _smart_callbacks,
33 _toolbar_item_prio_compare_cb(const void *i1,
36 const Elm_Toolbar_Item *eti1 = i1;
37 const Elm_Toolbar_Item *eti2 = i2;
42 if (eti2->prio.priority == eti1->prio.priority)
45 return eti2->prio.priority - eti1->prio.priority;
49 _items_visibility_fix(Elm_Toolbar_Smart_Data *sd,
54 Elm_Toolbar_Item *it, *prev;
55 Evas_Coord ciw = 0, cih = 0;
56 Eina_List *sorted = NULL;
61 EINA_INLIST_FOREACH(sd->items, it)
65 prev = ELM_TOOLBAR_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
66 it->prio.priority = prev->prio.priority;
70 EINA_INLIST_FOREACH(sd->items, it)
72 sorted = eina_list_sorted_insert
73 (sorted, _toolbar_item_prio_compare_cb, it);
78 evas_object_geometry_get(sd->VIEW(more_item), NULL, NULL, &ciw, &cih);
79 if (sd->vertical) *iw += cih;
83 EINA_LIST_FREE(sorted, it)
85 if (it->prio.priority > sd->standard_priority)
87 evas_object_geometry_get(VIEW(it), NULL, NULL, &ciw, &cih);
88 if (sd->vertical) *iw += cih;
90 it->prio.visible = (*iw <= vw);
92 if (!it->separator) count++;
96 it->prio.visible = EINA_FALSE;
97 if (!it->separator) i++;
99 it->in_box = sd->bx_more;
101 it->in_box = sd->bx_more2;
108 _item_menu_destroy(Elm_Toolbar_Item *item)
112 evas_object_del(item->o_menu);
115 item->menu = EINA_FALSE;
119 _item_unselect(Elm_Toolbar_Item *item)
121 if ((!item) || (!item->selected)) return;
123 ELM_TOOLBAR_DATA_GET(WIDGET(item), sd);
125 item->selected = EINA_FALSE;
126 sd->selected_item = NULL;
127 edje_object_signal_emit(VIEW(item), "elm,state,unselected", "elm");
128 elm_widget_signal_emit(item->icon, "elm,state,unselected", "elm");
132 _menu_hide(void *data,
134 Evas_Object *obj __UNUSED__,
135 void *event_info __UNUSED__)
137 Elm_Toolbar_Item *selected;
138 Elm_Toolbar_Item *it = data;
140 selected = (Elm_Toolbar_Item *)elm_toolbar_selected_item_get(WIDGET(it));
141 _item_unselect(selected);
145 _menu_del(void *data,
148 void *event_info __UNUSED__)
150 // avoid hide being emitted during object deletion
151 evas_object_event_callback_del_full
152 (obj, EVAS_CALLBACK_HIDE, _menu_hide, data);
156 _item_menu_create(Elm_Toolbar_Smart_Data *sd,
157 Elm_Toolbar_Item *item)
159 item->o_menu = elm_menu_add(elm_widget_parent_get(WIDGET(item)));
160 item->menu = EINA_TRUE;
163 elm_menu_parent_set(item->o_menu, sd->menu_parent);
165 evas_object_event_callback_add
166 (item->o_menu, EVAS_CALLBACK_HIDE, _menu_hide, item);
167 evas_object_event_callback_add
168 (item->o_menu, EVAS_CALLBACK_DEL, _menu_del, item);
172 _elm_toolbar_item_menu_cb(void *data,
173 Evas_Object *obj __UNUSED__,
174 void *event_info __UNUSED__)
176 Elm_Toolbar_Item *it = data;
178 if (it->func) it->func((void *)(it->base.data), WIDGET(it), it);
182 _item_show(Elm_Toolbar_Item *it)
184 Evas_Coord x, y, w, h, bx, by;
186 ELM_TOOLBAR_DATA_GET(WIDGET(it), sd);
188 evas_object_geometry_get(sd->bx, &bx, &by, NULL, NULL);
189 evas_object_geometry_get(VIEW(it), &x, &y, &w, &h);
190 sd->s_iface->content_region_show
191 (ELM_WIDGET_DATA(sd)->obj, x - bx, y - by, w, h);
195 _item_mirrored_set(Evas_Object *obj __UNUSED__,
196 Elm_Toolbar_Item *it,
199 edje_object_mirrored_set(VIEW(it), mirrored);
200 if (it->o_menu) elm_widget_mirrored_set(it->o_menu, mirrored);
204 _mirrored_set(Evas_Object *obj,
207 Elm_Toolbar_Item *it;
209 ELM_TOOLBAR_DATA_GET(obj, sd);
211 EINA_INLIST_FOREACH(sd->items, it)
212 _item_mirrored_set(obj, it, mirrored);
214 _item_mirrored_set(obj, sd->more_item, mirrored);
218 _items_size_fit(Evas_Object *obj, Evas_Coord *bl, Evas_Coord view)
220 Elm_Toolbar_Item *it, *prev;
221 Eina_Bool full = EINA_FALSE, more = EINA_FALSE;
222 Evas_Coord min, mw, mh;
223 int sumf = 0, sumb = 0, prev_min = 0;
225 ELM_TOOLBAR_DATA_GET(obj, sd);
227 EINA_INLIST_FOREACH(sd->items, it)
230 if (it->in_box && it->in_box == sd->bx)
232 if (!it->separator && !it->object)
233 elm_coords_finger_size_adjust(1, &mw, 1, &mh);
234 edje_object_size_min_restricted_calc(VIEW(it), &mw, &mh, mw, mh);
235 if (!it->separator && !it->object)
236 elm_coords_finger_size_adjust(1, &mw, 1, &mh);
241 elm_coords_finger_size_adjust(1, &mw, 1, &mh);
242 edje_object_size_min_restricted_calc(sd->VIEW(more_item), &mw, &mh, mw, mh);
243 elm_coords_finger_size_adjust(1, &mw, 1, &mh);
246 if (mw != -1 || mh != -1)
248 if (sd->vertical) min = mh;
251 if ((!full) && ((sumf + min) > view))
253 prev = ELM_TOOLBAR_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->prev);
254 if (prev && prev->separator)
262 if (!full) sumf += min;
267 if (sumf != 0) *bl = (Evas_Coord)(((sumf + sumb) * view) / sumf);
271 _elm_toolbar_item_coordinates_calc(Elm_Object_Item *item,
272 Elm_Toolbar_Item_Scrollto_Type type,
278 Evas_Coord ix, iy, iw, ih, bx, by, vw, vh;
280 ELM_TOOLBAR_DATA_GET(WIDGET(item), sd);
282 sd->s_iface->content_viewport_size_get(WIDGET(item), &vw, &vh);
283 evas_object_geometry_get(sd->bx, &bx, &by, NULL, NULL);
284 evas_object_geometry_get(VIEW(item), &ix, &iy, &iw, &ih);
288 case ELM_TOOLBAR_ITEM_SCROLLTO_IN:
295 case ELM_TOOLBAR_ITEM_SCROLLTO_FIRST:
302 case ELM_TOOLBAR_ITEM_SCROLLTO_MIDDLE:
303 *x = ix - bx + (iw / 2) - (vw / 2);
304 *y = iy - by + (ih / 2) - (vh / 2);
309 case ELM_TOOLBAR_ITEM_SCROLLTO_LAST:
310 *x = ix - bx + iw - vw;
311 *y = iy - by + ih - vh;
324 _resize_job(void *data)
326 Evas_Object *obj = (Evas_Object *)data;
327 Evas_Coord mw, mh, vw = 0, vh = 0, w = 0, h = 0;
328 Elm_Toolbar_Item *it;
329 Evas_Object *o; // TIZEN ONLY
330 Eina_List *l; // TIZEN ONLY
334 ELM_TOOLBAR_DATA_GET(obj, sd);
336 sd->resize_job = NULL;
337 sd->s_iface->content_viewport_size_get(obj, &vw, &vh);
338 evas_object_size_hint_min_get(sd->bx, &mw, &mh);
339 evas_object_geometry_get(sd->bx, NULL, NULL, &w, &h);
341 if (sd->shrink_mode == ELM_TOOLBAR_SHRINK_MENU)
343 Evas_Coord iw = 0, ih = 0, more_w = 0, more_h = 0;
348 _items_visibility_fix(sd, &ih, vh, &more);
353 _items_visibility_fix(sd, &iw, vw, &more);
355 evas_object_geometry_get
356 (sd->VIEW(more_item), NULL, NULL, &more_w, &more_h);
360 if ((ih - more_h) <= vh) ih -= more_h;
364 if ((iw - more_w) <= vw) iw -= more_w;
367 /* All items are removed from the box object, since removing
368 * individual items won't trigger a resize. Items are be
370 evas_object_box_remove_all(sd->bx, EINA_FALSE);
371 if (((sd->vertical) && (ih > vh)) ||
372 ((!sd->vertical) && (iw > vw)) || more)
376 _item_menu_destroy(sd->more_item);
377 _item_menu_create(sd, sd->more_item);
379 elm_toolbar_item_menu_get((Elm_Object_Item *)sd->more_item);
380 EINA_INLIST_FOREACH(sd->items, it)
382 if (!it->prio.visible)
385 elm_menu_item_separator_add(menu, NULL);
388 Elm_Object_Item *menu_it;
390 menu_it = elm_menu_item_add
391 (menu, NULL, it->icon_str, it->label,
392 _elm_toolbar_item_menu_cb, it);
393 elm_object_item_disabled_set
394 (menu_it, elm_widget_item_disabled_get(it));
396 elm_menu_clone(it->o_menu, menu, menu_it);
398 evas_object_hide(VIEW(it));
402 evas_object_box_append(sd->bx, VIEW(it));
403 evas_object_show(VIEW(it));
406 evas_object_box_append(sd->bx, sd->VIEW(more_item));
407 evas_object_show(sd->VIEW(more_item));
411 /* All items are visible, show them all (except for the
412 * "More" button, of course). */
413 EINA_INLIST_FOREACH(sd->items, it)
415 evas_object_show(VIEW(it));
416 evas_object_box_append(sd->bx, VIEW(it));
418 evas_object_hide(sd->VIEW(more_item));
421 else if (sd->shrink_mode == ELM_TOOLBAR_SHRINK_HIDE)
423 Evas_Coord iw = 0, ih = 0;
428 _items_visibility_fix(sd, &ih, vh, &more);
433 _items_visibility_fix(sd, &iw, vw, &more);
435 evas_object_box_remove_all(sd->bx, EINA_FALSE);
436 if (((sd->vertical) && (ih > vh)) ||
437 ((!sd->vertical) && (iw > vw)) || more)
439 EINA_INLIST_FOREACH(sd->items, it)
441 if (!it->prio.visible)
442 evas_object_hide(VIEW(it));
445 evas_object_box_append(sd->bx, VIEW(it));
446 evas_object_show(VIEW(it));
452 /* All items are visible, show them all */
453 EINA_INLIST_FOREACH(sd->items, it)
455 evas_object_show(VIEW(it));
456 evas_object_box_append(sd->bx, VIEW(it));
460 else if (sd->shrink_mode == ELM_TOOLBAR_SHRINK_EXPAND)
462 Evas_Coord iw = 0, ih = 0;
465 h = (vh >= mh) ? vh : mh;
467 w = (vw >= mw) ? vw : mw;
470 _items_visibility_fix(sd, &ih, vh, &more);
472 _items_visibility_fix(sd, &iw, vw, &more);
474 evas_object_box_remove_all(sd->bx, EINA_FALSE);
475 evas_object_box_remove_all(sd->bx_more, EINA_FALSE);
476 evas_object_box_remove_all(sd->bx_more2, EINA_FALSE);
478 EINA_INLIST_FOREACH(sd->items, it)
482 evas_object_box_append(it->in_box, VIEW(it));
483 evas_object_show(VIEW(it));
488 evas_object_box_append(sd->bx, sd->VIEW(more_item));
489 evas_object_show(sd->VIEW(more_item));
492 evas_object_hide(sd->VIEW(more_item));
496 if (h >= vh) _items_size_fit(obj, &h, vh);
497 if (sd->item_count - sd->separator_count > 0)
498 sd->s_iface->paging_set(obj, 0.0, 0.0, 0, (h / (sd->item_count - sd->separator_count)));
502 if (w >= vw) _items_size_fit(obj, &w, vw);
503 if (sd->item_count - sd->separator_count > 0)
504 sd->s_iface->paging_set(obj, 0.0, 0.0, (w / (sd->item_count - sd->separator_count)), 0);
511 if ((vh >= mh) && (h != vh)) h = vh;
515 if ((vw >= mw) && (w != vw)) w = vw;
517 EINA_INLIST_FOREACH(sd->items, it)
527 if (sd->transverse_expanded)
535 evas_object_resize(sd->bx, w, h);
538 list = evas_object_box_children_get(sd->bx);
539 EINA_LIST_FOREACH(list, l, o)
541 if (o == eina_list_nth(list, 0))
542 edje_object_signal_emit(o, "elm,order,first,item", "elm");
543 else if (o == eina_list_nth(list, eina_list_count(list)-1))
544 edje_object_signal_emit(o, "elm,order,last,item", "elm");
546 edje_object_signal_emit(o, "elm,order,default,item", "elm");
550 // Remove the first or last separator since it is not neccessary
551 list = evas_object_box_children_get(sd->bx_more);
552 EINA_INLIST_FOREACH(sd->items, it)
555 ((VIEW(it) == eina_list_data_get(list)) ||
556 (VIEW(it) == eina_list_nth(list, eina_list_count(list) - 1))))
558 evas_object_box_remove(sd->bx_more, VIEW(it));
559 evas_object_move(VIEW(it), -9999, -9999);
560 evas_object_hide(VIEW(it));
563 list = evas_object_box_children_get(sd->bx_more2);
564 EINA_INLIST_FOREACH(sd->items, it)
567 ((VIEW(it) == eina_list_data_get(list)) ||
568 (VIEW(it) == eina_list_nth(list, eina_list_count(list) - 1))))
570 evas_object_box_remove(sd->bx_more2, VIEW(it));
571 evas_object_move(VIEW(it), -9999, -9999);
572 evas_object_hide(VIEW(it));
576 _mirrored_set(obj, elm_widget_mirrored_get(obj));
580 _elm_toolbar_smart_on_focus(Evas_Object *obj)
582 ELM_TOOLBAR_DATA_GET(obj, sd);
584 if (elm_widget_focus_get(obj))
585 evas_object_focus_set(ELM_WIDGET_DATA(sd)->resize_obj, EINA_TRUE);
587 evas_object_focus_set(ELM_WIDGET_DATA(sd)->resize_obj, EINA_FALSE);
593 _elm_toolbar_smart_event(Evas_Object *obj __UNUSED__,
594 Evas_Object *src __UNUSED__,
595 Evas_Callback_Type type __UNUSED__,
598 Evas_Event_Key_Down *ev = event_info;
600 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
602 // Key Down Event precess for toolbar.
604 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
610 _resize_cb(void *data,
612 Evas_Object *obj __UNUSED__,
613 void *event_info __UNUSED__)
617 ELM_TOOLBAR_DATA_GET(data, sd);
619 evas_object_geometry_get(data, &x, &y, NULL, &h);
620 evas_object_move(sd->more, x, y + h);
623 sd->resize_job = ecore_job_add(_resize_job, data);
627 _item_disable_hook(Elm_Object_Item *it)
629 Elm_Toolbar_Item *toolbar_it = (Elm_Toolbar_Item *)it;
631 if (elm_widget_item_disabled_get(toolbar_it))
633 edje_object_signal_emit(VIEW(toolbar_it), "elm,state,disabled", "elm");
634 elm_widget_signal_emit(toolbar_it->icon, "elm,state,disabled", "elm");
638 edje_object_signal_emit(VIEW(toolbar_it), "elm,state,enabled", "elm");
639 elm_widget_signal_emit(toolbar_it->icon, "elm,state,enabled", "elm");
642 _resize_cb(WIDGET(toolbar_it), NULL, NULL, NULL);
646 _item_icon_set(Evas_Object *icon_obj,
652 if ((!type) || (!*type)) goto end;
653 if ((!icon) || (!*icon)) return EINA_FALSE;
654 if ((snprintf(icon_str, sizeof(icon_str), "%s%s", type, icon) > 0)
655 && (elm_icon_standard_set(icon_obj, icon_str)))
658 if (elm_icon_standard_set(icon_obj, icon))
661 WRN("couldn't find icon definition for '%s'", icon);
666 _elm_toolbar_icon_size_get(Elm_Toolbar_Smart_Data *sd)
668 const char *icon_size = edje_object_data_get
669 (ELM_WIDGET_DATA(sd)->resize_obj, "icon_size");
671 if (icon_size) return atoi(icon_size);
673 return _elm_config->icon_size;
677 _menu_move_resize_cb(void *data,
679 Evas_Object *obj __UNUSED__,
680 void *event_info __UNUSED__)
682 Elm_Toolbar_Item *it = data;
685 ELM_TOOLBAR_DATA_GET(WIDGET(it), sd);
687 if (!sd->menu_parent) return;
688 evas_object_geometry_get(VIEW(it), &x, &y, NULL, &h);
689 elm_menu_move(it->o_menu, x, y + h);
693 _item_select(Elm_Toolbar_Item *it)
695 Elm_Toolbar_Item *it2;
699 ELM_TOOLBAR_DATA_GET(WIDGET(it), sd);
701 if (elm_widget_item_disabled_get(it) || (it->separator) || (it->object))
705 if (sd->select_mode != ELM_OBJECT_SELECT_MODE_NONE)
709 if (sd->shrink_mode == ELM_TOOLBAR_SHRINK_EXPAND)
711 if (sd->more_item == it)
713 elm_layout_signal_emit
714 (sd->more, "elm,state,close", "elm");
718 if (sd->select_mode != ELM_OBJECT_SELECT_MODE_ALWAYS)
723 it2 = (Elm_Toolbar_Item *)
724 elm_toolbar_selected_item_get(WIDGET(it));
727 it->selected = EINA_TRUE;
728 sd->selected_item = it;
729 if (sd->shrink_mode == ELM_TOOLBAR_SHRINK_EXPAND)
731 if (sd->more_item == it)
733 if (!evas_object_box_children_get(sd->bx_more2))
734 elm_layout_signal_emit
735 (sd->more, "elm,state,open", "elm");
737 elm_layout_signal_emit
738 (sd->more, "elm,state,open2", "elm");
742 if (it->in_box != sd->bx)
744 edje_object_signal_emit
745 (sd->VIEW(more_item), "elm,state,selected",
747 elm_widget_signal_emit
748 (sd->more_item->icon, "elm,state,selected",
753 edje_object_signal_emit
754 (sd->VIEW(more_item), "elm,state,unselected",
756 elm_widget_signal_emit
757 (sd->more_item->icon, "elm,state,unselected",
760 elm_layout_signal_emit
761 (sd->more, "elm,state,close", "elm");
764 edje_object_signal_emit(VIEW(it), "elm,state,selected", "elm");
765 elm_widget_signal_emit(it->icon, "elm,state,selected", "elm");
771 if (it->menu && (!sel))
773 evas_object_show(it->o_menu);
774 evas_object_event_callback_add
775 (VIEW(it), EVAS_CALLBACK_RESIZE, _menu_move_resize_cb, it);
776 evas_object_event_callback_add
777 (VIEW(it), EVAS_CALLBACK_MOVE, _menu_move_resize_cb, it);
779 _menu_move_resize_cb(it, NULL, NULL, NULL);
782 if ((!sel) || (sd->select_mode == ELM_OBJECT_SELECT_MODE_ALWAYS))
784 if (it->func) it->func((void *)(it->base.data), WIDGET(it), it);
786 evas_object_smart_callback_call(obj2, SIG_CLICKED, it);
790 _item_del(Elm_Toolbar_Item *it)
792 Elm_Toolbar_Item_State *it_state;
796 EINA_LIST_FREE(it->states, it_state)
798 if (it->icon == it_state->icon)
800 eina_stringshare_del(it_state->label);
801 eina_stringshare_del(it_state->icon_str);
802 if (it_state->icon) evas_object_del(it_state->icon);
806 eina_stringshare_del(it->label);
808 edje_object_signal_emit(VIEW(it), "elm,state,text,hidden", "elm");
809 eina_stringshare_del(it->icon_str);
813 edje_object_signal_emit(VIEW(it), "elm,state,icon,hidden", "elm");
814 evas_object_del(it->icon);
817 if (it->object) evas_object_del(it->object);
818 //TODO: See if checking for sd->menu_parent is necessary before
820 if (it->o_menu) evas_object_del(it->o_menu);
824 _item_theme_hook(Evas_Object *obj,
825 Elm_Toolbar_Item *it,
829 Evas_Coord mw, mh, minw, minh;
830 Evas_Object *view = VIEW(it);
833 ELM_TOOLBAR_DATA_GET(obj, sd);
835 style = elm_widget_style_get(obj);
837 _item_mirrored_set(obj, it, elm_widget_mirrored_get(obj));
838 edje_object_scale_set(view, scale);
840 if (!it->separator && !it->object)
842 elm_widget_theme_object_set(obj, view, "toolbar", "item", style);
845 edje_object_signal_emit(view, "elm,state,selected", "elm");
846 elm_widget_signal_emit(it->icon, "elm,state,selected", "elm");
848 if (elm_widget_item_disabled_get(it))
850 edje_object_signal_emit(view, "elm,state,disabled", "elm");
851 elm_widget_signal_emit(it->icon, "elm,state,disabled", "elm");
857 ms = ((double)icon_size * scale);
858 evas_object_size_hint_min_set(it->icon, ms, ms);
859 evas_object_size_hint_max_set(it->icon, ms, ms);
860 edje_object_part_swallow(view, "elm.swallow.icon", it->icon);
861 edje_object_signal_emit
862 (VIEW(it), "elm,state,icon,visible", "elm");
866 edje_object_part_text_escaped_set(view, "elm.text", it->label);
867 edje_object_signal_emit(VIEW(it), "elm,state,text,visible", "elm");
874 elm_widget_theme_object_set
875 (obj, view, "toolbar", "separator", style);
878 evas_object_size_hint_weight_set
879 (view, EVAS_HINT_EXPAND, -1.0);
880 evas_object_size_hint_align_set
881 (view, EVAS_HINT_FILL, EVAS_HINT_FILL);
885 evas_object_size_hint_weight_set
886 (view, -1.0, EVAS_HINT_EXPAND);
887 evas_object_size_hint_align_set
888 (view, EVAS_HINT_FILL, EVAS_HINT_FILL);
893 elm_widget_theme_object_set
894 (obj, view, "toolbar", "object", style);
895 edje_object_part_swallow(view, "elm.swallow.object", it->object);
899 mw = mh = minw = minh = -1;
900 if (!it->separator && !it->object)
901 elm_coords_finger_size_adjust(1, &mw, 1, &mh);
903 edje_object_size_min_restricted_calc(view, &mw, &mh, mw, mh);
904 if (!it->separator && !it->object)
905 elm_coords_finger_size_adjust(1, &mw, 1, &mh);
906 evas_object_size_hint_min_set(view, mw, mh);
910 _inform_item_number(Evas_Object *obj)
912 ELM_TOOLBAR_DATA_GET(obj, sd);
913 Elm_Toolbar_Item *it;
914 char buf[sizeof("elm,action,click,") + 3];
915 static int scount = 0;
918 EINA_INLIST_FOREACH(sd->items, it)
920 if (!it->separator) count++;
925 sprintf(buf, "elm,number,item,%d", count);
927 EINA_INLIST_FOREACH(sd->items, it)
929 if (!it->separator && !it->object)
930 edje_object_signal_emit(VIEW(it), buf, "elm");
936 _sizing_eval(Evas_Object *obj)
938 Evas_Coord minw = -1, minh = -1, minw_bx = -1, minh_bx = -1;
939 Evas_Coord vw = 0, vh = 0;
942 ELM_TOOLBAR_DATA_GET(obj, sd);
944 evas_object_smart_need_recalculate_set(sd->bx, EINA_TRUE);
945 evas_object_smart_calculate(sd->bx);
946 edje_object_size_min_calc(ELM_WIDGET_DATA(sd)->resize_obj, &minw, &minh);
947 evas_object_geometry_get(obj, NULL, NULL, &w, &h);
949 if (w < minw) w = minw;
950 if (h < minh) h = minh;
952 evas_object_resize(ELM_WIDGET_DATA(sd)->resize_obj, w, h);
954 evas_object_size_hint_min_get(sd->bx, &minw_bx, &minh_bx);
955 sd->s_iface->content_viewport_size_get(obj, &vw, &vh);
957 if (sd->shrink_mode == ELM_TOOLBAR_SHRINK_NONE)
959 minw = minw_bx + (w - vw);
960 minh = minh_bx + (h - vh);
962 else if (sd->shrink_mode == ELM_TOOLBAR_SHRINK_EXPAND)
966 minw = minw_bx + (w - vw);
967 if (minh_bx < vh) minh_bx = vh;
968 else _items_size_fit(obj, &minh_bx, vh);
972 minh = minh_bx + (h - vh);
973 if (minw_bx < vw) minw_bx = vw;
974 else _items_size_fit(obj, &minw_bx, vw);
981 minw = minw_bx + (w - vw);
987 minh = minh_bx + (h - vh);
991 if (sd->transverse_expanded)
999 evas_object_resize(sd->bx, minw_bx, minh_bx);
1000 evas_object_resize(sd->more, minw_bx, minh_bx);
1001 evas_object_size_hint_min_set(obj, minw, minh);
1002 evas_object_size_hint_max_set(obj, -1, -1);
1004 _inform_item_number(obj);
1008 _elm_toolbar_smart_theme(Evas_Object *obj)
1010 Elm_Toolbar_Item *it;
1013 ELM_TOOLBAR_DATA_GET(obj, sd);
1015 if (sd->on_deletion)
1018 if (!ELM_WIDGET_CLASS(_elm_toolbar_parent_sc)->theme(obj))
1021 elm_widget_theme_object_set
1022 (obj, ELM_WIDGET_DATA(sd)->resize_obj, "toolbar", "base",
1023 elm_widget_style_get(obj));
1025 elm_layout_theme_set
1026 (sd->more, "toolbar", "more", elm_widget_style_get(obj));
1028 _mirrored_set(obj, elm_widget_mirrored_get(obj));
1030 sd->theme_icon_size = _elm_toolbar_icon_size_get(sd);
1031 if (sd->priv_icon_size) sd->icon_size = sd->priv_icon_size;
1032 else sd->icon_size = sd->theme_icon_size;
1034 EINA_INLIST_FOREACH(sd->items, it)
1035 _item_theme_hook(obj, it, scale, sd->icon_size);
1038 _item_theme_hook(obj, sd->more_item, scale, sd->icon_size);
1046 _elm_toolbar_item_label_update(Elm_Toolbar_Item *item)
1048 Evas_Coord mw = -1, mh = -1, minw = -1, minh = -1;
1050 ELM_TOOLBAR_DATA_GET(WIDGET(item), sd);
1052 edje_object_part_text_escaped_set(VIEW(item), "elm.text", item->label);
1054 edje_object_signal_emit(VIEW(item), "elm,state,text,visible", "elm");
1056 edje_object_signal_emit(VIEW(item), "elm,state,text,hidden", "elm");
1058 elm_coords_finger_size_adjust(1, &mw, 1, &mh);
1059 edje_object_size_min_restricted_calc(VIEW(item), &mw, &mh, mw, mh);
1060 elm_coords_finger_size_adjust(1, &mw, 1, &mh);
1061 if (sd->shrink_mode != ELM_TOOLBAR_SHRINK_EXPAND)
1065 evas_object_size_hint_weight_set
1066 (VIEW(item), EVAS_HINT_EXPAND, -1.0);
1067 evas_object_size_hint_align_set
1068 (VIEW(item), EVAS_HINT_FILL, EVAS_HINT_FILL);
1072 evas_object_size_hint_weight_set
1073 (VIEW(item), -1.0, EVAS_HINT_EXPAND);
1074 evas_object_size_hint_align_set
1075 (VIEW(item), EVAS_HINT_FILL, EVAS_HINT_FILL);
1080 evas_object_size_hint_weight_set
1081 (VIEW(item), EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1082 evas_object_size_hint_align_set
1083 (VIEW(item), EVAS_HINT_FILL, EVAS_HINT_FILL);
1086 evas_object_size_hint_min_get(VIEW(item), &minw, &minh);
1087 if ((minw < mw) && (minh < mh))
1088 evas_object_size_hint_min_set(VIEW(item), mw, mh);
1089 else if ((minw < mw) && (minh > mh))
1090 evas_object_size_hint_min_set(VIEW(item), mw, minh);
1091 else if ((minw > mw) && (minh < mh))
1092 evas_object_size_hint_min_set(VIEW(item), minw, mh);
1096 _elm_toolbar_item_label_set_cb(void *data,
1098 const char *emission,
1101 Elm_Toolbar_Item *item = data;
1103 _elm_toolbar_item_label_update(item);
1104 edje_object_signal_callback_del
1105 (obj, emission, source, _elm_toolbar_item_label_set_cb);
1106 edje_object_signal_emit(VIEW(item), "elm,state,label,reset", "elm");
1110 _item_label_set(Elm_Toolbar_Item *item,
1116 if ((label) && (item->label) && (!strcmp(label, item->label))) return;
1118 eina_stringshare_replace(&item->label, label);
1119 s = edje_object_data_get(VIEW(item), "transition_animation_on");
1120 if ((s) && (atoi(s)))
1122 edje_object_part_text_escaped_set
1123 (VIEW(item), "elm.text_new", item->label);
1124 edje_object_signal_emit(VIEW(item), sig, "elm");
1125 edje_object_signal_callback_add
1126 (VIEW(item), "elm,state,label_set,done", "elm",
1127 _elm_toolbar_item_label_set_cb, item);
1130 _elm_toolbar_item_label_update(item);
1132 _resize_cb(WIDGET(item), NULL, NULL, NULL);
1136 _item_text_set_hook(Elm_Object_Item *it,
1140 Elm_Toolbar_Item *item;
1142 item = (Elm_Toolbar_Item *)it;
1144 if ((!part) || (!strcmp(part, "default")) ||
1145 (!strcmp(part, "elm.text")))
1147 _item_label_set(((Elm_Toolbar_Item *)it), label, "elm,state,label_set");
1153 snprintf(buf, sizeof(buf), "elm,state,%s,visible", part);
1154 edje_object_signal_emit(VIEW(item), buf, "elm");
1158 snprintf(buf, sizeof(buf), "elm,state,%s,hidden", part);
1159 edje_object_signal_emit(VIEW(item), buf, "elm");
1161 edje_object_part_text_escaped_set(VIEW(item), part, label);
1166 _item_text_get_hook(const Elm_Object_Item *it,
1171 if (!part || !strcmp(part, "default"))
1172 snprintf(buf, sizeof(buf), "elm.text");
1174 snprintf(buf, sizeof(buf), "%s", part);
1176 return edje_object_part_text_get(VIEW(it), buf);
1180 _item_content_set_hook(Elm_Object_Item *it,
1182 Evas_Object *content)
1184 Elm_Toolbar_Item *item = (Elm_Toolbar_Item *)it;
1185 Evas_Object *obj = WIDGET(item);
1188 ELM_TOOLBAR_DATA_GET(obj, sd);
1190 if (part && strcmp(part, "object")) return;
1191 if (item->object == content) return;
1193 if (item->object) evas_object_del(item->object);
1195 item->object = content;
1197 elm_widget_sub_object_add(obj, item->object);
1199 scale = (elm_widget_scale_get(obj) * elm_config_scale_get());
1200 _item_theme_hook(obj, item, scale, sd->icon_size);
1203 static Evas_Object *
1204 _item_content_get_hook(const Elm_Object_Item *it,
1207 if (part && strcmp(part, "object")) return NULL;
1208 return ((Elm_Toolbar_Item *)it)->object;
1211 static Evas_Object *
1212 _item_content_unset_hook(Elm_Object_Item *it,
1215 Elm_Toolbar_Item *item = (Elm_Toolbar_Item *)it;
1216 Evas_Object *obj = WIDGET(item);
1220 ELM_TOOLBAR_DATA_GET(obj, sd);
1222 if (part && strcmp(part, "object")) return NULL;
1224 edje_object_part_unswallow(VIEW(it), item->object);
1225 elm_widget_sub_object_del(obj, item->object);
1227 item->object = NULL;
1228 scale = (elm_widget_scale_get(obj) * elm_config_scale_get());
1229 _item_theme_hook(obj, item, scale, sd->icon_size);
1235 _elm_toolbar_smart_translate(Evas_Object *obj)
1237 evas_object_smart_callback_call(obj, SIG_LANG_CHANGED, NULL);
1243 _item_resize(void *data,
1245 Evas_Object *obj __UNUSED__,
1246 void *event_info __UNUSED__)
1249 _resize_cb(data, NULL, NULL, NULL);
1253 _move_cb(void *data,
1255 Evas_Object *obj __UNUSED__,
1256 void *event_info __UNUSED__)
1260 ELM_TOOLBAR_DATA_GET(data, sd);
1261 evas_object_geometry_get(data, &x, &y, NULL, &h);
1262 evas_object_move(sd->more, x, y + h);
1266 _select_filter_cb(Elm_Toolbar_Item *it,
1267 Evas_Object *obj __UNUSED__,
1268 const char *emission,
1269 const char *source __UNUSED__)
1272 char buf[sizeof("elm,action,click,") + 1];
1274 button = atoi(emission + sizeof("mouse,clicked,") - 1);
1275 if (button == 1) return; /* regular left click event */
1276 snprintf(buf, sizeof(buf), "elm,action,click,%d", button);
1277 edje_object_signal_emit(VIEW(it), buf, "elm");
1281 _select_cb(void *data,
1282 Evas_Object *obj __UNUSED__,
1283 const char *emission __UNUSED__,
1284 const char *source __UNUSED__)
1286 Elm_Toolbar_Item *it = data;
1288 if ((_elm_config->access_mode == ELM_ACCESS_MODE_OFF) ||
1289 (_elm_access_2nd_click_timeout(VIEW(it))))
1291 if (_elm_config->access_mode != ELM_ACCESS_MODE_OFF)
1292 _elm_access_say(E_("Selected"));
1298 _items_change(Evas_Object *obj)
1300 Elm_Toolbar_Item *prev = NULL, *next = NULL;
1303 ELM_TOOLBAR_DATA_GET(obj, sd);
1305 if ((sd->reorder_from) && (sd->reorder_to) &&
1306 (!sd->reorder_from->separator) && (!sd->reorder_to->separator))
1308 prev = ELM_TOOLBAR_ITEM_FROM_INLIST
1309 (EINA_INLIST_GET(sd->reorder_from)->prev);
1310 if (prev == sd->reorder_to)
1311 prev = sd->reorder_from;
1313 next = ELM_TOOLBAR_ITEM_FROM_INLIST
1314 (EINA_INLIST_GET(sd->reorder_from)->next);
1315 if (next == sd->reorder_to)
1318 sd->items = eina_inlist_remove
1319 (sd->items, EINA_INLIST_GET(sd->reorder_from));
1320 sd->items = eina_inlist_append_relative
1321 (sd->items, EINA_INLIST_GET(sd->reorder_from),
1322 EINA_INLIST_GET(sd->reorder_to));
1324 sd->items = eina_inlist_remove
1325 (sd->items, EINA_INLIST_GET(sd->reorder_to));
1327 sd->items = eina_inlist_append_relative
1328 (sd->items, EINA_INLIST_GET(sd->reorder_to),
1329 EINA_INLIST_GET(prev));
1331 sd->items = eina_inlist_prepend_relative
1332 (sd->items, EINA_INLIST_GET(sd->reorder_to),
1333 EINA_INLIST_GET(next));
1335 sd->items = eina_inlist_prepend
1336 (sd->items, EINA_INLIST_GET(sd->reorder_to));
1338 if (sd->shrink_mode == ELM_TOOLBAR_SHRINK_NONE ||
1339 sd->shrink_mode == ELM_TOOLBAR_SHRINK_SCROLL)
1341 evas_object_box_remove(sd->bx, VIEW(sd->reorder_from));
1342 evas_object_box_insert_after(sd->bx, VIEW(sd->reorder_from),
1343 VIEW(sd->reorder_to));
1344 evas_object_box_remove(sd->bx, VIEW(sd->reorder_to));
1346 evas_object_box_insert_after(sd->bx, VIEW(sd->reorder_to),
1349 evas_object_box_insert_before(sd->bx, VIEW(sd->reorder_to),
1352 evas_object_box_prepend(sd->bx, VIEW(sd->reorder_to));
1355 tmp = sd->reorder_from->prio.priority;
1356 sd->reorder_from->prio.priority = sd->reorder_to->prio.priority;
1357 sd->reorder_to->prio.priority = tmp;
1360 _resize_cb(obj, NULL, NULL, NULL);
1364 _mouse_move_reorder(Elm_Toolbar_Item *it,
1365 Evas *evas __UNUSED__,
1366 Evas_Object *obj __UNUSED__,
1367 Evas_Event_Mouse_Move *ev)
1371 evas_object_geometry_get(VIEW(it), NULL, NULL, &w, &h);
1373 (VIEW(it), ev->cur.canvas.x - (w / 2), ev->cur.canvas.y - (h / 2));
1374 evas_object_show(VIEW(it));
1378 _mouse_up_reorder(Elm_Toolbar_Item *it,
1379 Evas *evas __UNUSED__,
1381 Evas_Event_Mouse_Up *ev)
1383 Evas_Coord x, y, w, h;
1385 ELM_TOOLBAR_DATA_GET(WIDGET(it), sd);
1387 evas_object_event_callback_del_full
1388 (obj, EVAS_CALLBACK_MOUSE_MOVE,
1389 (Evas_Object_Event_Cb)_mouse_move_reorder, it);
1390 evas_object_event_callback_del_full
1391 (sd->more, EVAS_CALLBACK_MOUSE_MOVE,
1392 (Evas_Object_Event_Cb)_mouse_move_reorder, it);
1393 evas_object_event_callback_del_full
1394 (VIEW(it), EVAS_CALLBACK_MOUSE_MOVE,
1395 (Evas_Object_Event_Cb)_mouse_move_reorder, it);
1396 evas_object_event_callback_del_full
1397 (obj, EVAS_CALLBACK_MOUSE_UP,
1398 (Evas_Object_Event_Cb)_mouse_up_reorder, it);
1399 evas_object_event_callback_del_full
1400 (sd->more, EVAS_CALLBACK_MOUSE_UP,
1401 (Evas_Object_Event_Cb)_mouse_up_reorder, it);
1402 elm_widget_item_del(it);
1404 EINA_INLIST_FOREACH(sd->items, it)
1406 evas_object_geometry_get(VIEW(it), &x, &y, &w, &h);
1407 if ((x < ev->canvas.x) && (ev->canvas.x < x + w) &&
1408 (y < ev->canvas.y) && (ev->canvas.y < y + h))
1410 sd->reorder_to = it;
1411 _items_change(WIDGET(it));
1415 sd->s_iface->hold_set(obj, EINA_FALSE);
1419 _item_reorder_start(Elm_Toolbar_Item *item)
1421 Evas_Object *obj = WIDGET(item);
1422 Evas_Object *icon_obj;
1423 Evas_Coord x, y, w, h;
1424 Elm_Toolbar_Item *it;
1426 ELM_TOOLBAR_DATA_GET(obj, sd);
1428 sd->reorder_from = item;
1430 icon_obj = elm_icon_add(obj);
1431 elm_icon_order_lookup_set(icon_obj, sd->lookup_order);
1433 if (!icon_obj) return;
1434 it = elm_widget_item_new(obj, Elm_Toolbar_Item);
1437 evas_object_del(icon_obj);
1441 it->label = eina_stringshare_add(item->label);
1442 VIEW(it) = edje_object_add(evas_object_evas_get(obj));
1444 if (_item_icon_set(icon_obj, "toolbar/", item->icon_str))
1446 it->icon = icon_obj;
1447 it->icon_str = eina_stringshare_add(item->icon_str);
1452 it->icon_str = NULL;
1453 evas_object_del(icon_obj);
1456 elm_widget_theme_object_set(obj, VIEW(it), "toolbar", "item",
1457 elm_widget_style_get(obj));
1462 ms = ((double)sd->icon_size * elm_config_scale_get());
1463 evas_object_size_hint_min_set(it->icon, ms, ms);
1464 evas_object_size_hint_max_set(it->icon, ms, ms);
1465 edje_object_part_swallow(VIEW(it), "elm.swallow.icon", it->icon);
1466 edje_object_signal_emit(VIEW(it), "elm,state,icon,visible", "elm");
1467 evas_object_show(it->icon);
1468 elm_widget_sub_object_add(obj, it->icon);
1472 edje_object_part_text_escaped_set(VIEW(it), "elm.text", it->label);
1473 edje_object_signal_emit(VIEW(it), "elm,state,text,visible", "elm");
1476 edje_object_signal_emit(VIEW(it), "elm,state,moving", "elm");
1478 evas_object_event_callback_add
1479 (obj, EVAS_CALLBACK_MOUSE_MOVE,
1480 (Evas_Object_Event_Cb)_mouse_move_reorder, it);
1482 evas_object_event_callback_add
1483 (sd->more, EVAS_CALLBACK_MOUSE_MOVE,
1484 (Evas_Object_Event_Cb)_mouse_move_reorder, it);
1486 evas_object_event_callback_add
1487 (VIEW(it), EVAS_CALLBACK_MOUSE_MOVE,
1488 (Evas_Object_Event_Cb)_mouse_move_reorder, it);
1490 evas_object_event_callback_add
1491 (obj, EVAS_CALLBACK_MOUSE_UP,
1492 (Evas_Object_Event_Cb)_mouse_up_reorder, it);
1494 evas_object_event_callback_add
1495 (sd->more, EVAS_CALLBACK_MOUSE_UP,
1496 (Evas_Object_Event_Cb)_mouse_up_reorder, it);
1498 evas_object_geometry_get(VIEW(item), &x, &y, &w, &h);
1499 evas_object_resize(VIEW(it), w, h);
1500 evas_object_move(VIEW(it), x, y);
1501 evas_object_show(VIEW(it));
1503 sd->s_iface->hold_set(WIDGET(it), EINA_TRUE);
1507 _long_press(Elm_Toolbar_Item *it)
1509 ELM_TOOLBAR_DATA_GET(WIDGET(it), sd);
1511 sd->long_timer = NULL;
1512 sd->long_press = EINA_TRUE;
1514 if (sd->reorder_mode)
1515 _item_reorder_start(it);
1517 evas_object_smart_callback_call(WIDGET(it), SIG_LONGPRESSED, it);
1519 return ECORE_CALLBACK_CANCEL;
1523 _drag_start_cb(Evas_Object *obj, void *data __UNUSED__)
1525 ELM_TOOLBAR_DATA_GET(obj, sd);
1529 ecore_timer_del(sd->long_timer);
1530 sd->long_timer = NULL;
1535 _mouse_move_cb(Elm_Toolbar_Item *it,
1536 Evas *evas __UNUSED__,
1537 Evas_Object *obj __UNUSED__,
1538 Evas_Event_Mouse_Move *ev)
1540 Evas_Coord x, y, w, h;
1542 ELM_TOOLBAR_DATA_GET(WIDGET(it), sd);
1543 evas_object_geometry_get(VIEW(it), &x, &y, &w, &h);
1545 if ((sd->long_timer) &&
1546 ((x > ev->cur.canvas.x) || (ev->cur.canvas.x > x + w) ||
1547 (y > ev->cur.canvas.y) || (ev->cur.canvas.y > y + h)))
1549 ecore_timer_del(sd->long_timer);
1550 sd->long_timer = NULL;
1555 _mouse_down_cb(Elm_Toolbar_Item *it,
1556 Evas *evas __UNUSED__,
1557 Evas_Object *obj __UNUSED__,
1558 Evas_Event_Mouse_Down *ev)
1560 ELM_TOOLBAR_DATA_GET(WIDGET(it), sd);
1562 if (ev->button != 1) return;
1563 if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK)
1564 evas_object_smart_callback_call(WIDGET(it), SIG_CLICKED_DOUBLE, it);
1565 sd->long_press = EINA_FALSE;
1567 ecore_timer_interval_set
1568 (sd->long_timer, _elm_config->longpress_timeout);
1570 sd->long_timer = ecore_timer_add
1571 (_elm_config->longpress_timeout, (Ecore_Task_Cb)_long_press, it);
1573 evas_object_event_callback_add(VIEW(it), EVAS_CALLBACK_MOUSE_MOVE,
1574 (Evas_Object_Event_Cb)_mouse_move_cb, it);
1578 _mouse_up_cb(Elm_Toolbar_Item *it,
1579 Evas *evas __UNUSED__,
1580 Evas_Object *obj __UNUSED__,
1581 Evas_Event_Mouse_Up *ev)
1583 ELM_TOOLBAR_DATA_GET(WIDGET(it), sd);
1585 if (ev->button != 1) return;
1588 ecore_timer_del(sd->long_timer);
1589 sd->long_timer = NULL;
1591 evas_object_event_callback_del_full
1592 (VIEW(it), EVAS_CALLBACK_MOUSE_MOVE,
1593 (Evas_Object_Event_Cb)_mouse_move_cb, it);
1597 _mouse_in_cb(void *data,
1598 Evas_Object *obj __UNUSED__,
1599 const char *emission __UNUSED__,
1600 const char *source __UNUSED__)
1602 Elm_Toolbar_Item *it = data;
1604 edje_object_signal_emit(VIEW(it), "elm,state,highlighted", "elm");
1605 elm_widget_signal_emit(it->icon, "elm,state,highlighted", "elm");
1609 _mouse_out_cb(void *data,
1610 Evas_Object *obj __UNUSED__,
1611 const char *emission __UNUSED__,
1612 const char *source __UNUSED__)
1614 Elm_Toolbar_Item *it = data;
1616 edje_object_signal_emit(VIEW(it), "elm,state,unhighlighted", "elm");
1617 elm_widget_signal_emit(it->icon, "elm,state,unhighlighted", "elm");
1621 _layout(Evas_Object *o,
1622 Evas_Object_Box_Data *priv,
1625 Evas_Object *obj = (Evas_Object *)data;
1627 ELM_TOOLBAR_DATA_GET(obj, sd);
1629 (o, priv, !sd->vertical, sd->homogeneous, elm_widget_mirrored_get(obj));
1633 _access_info_cb(void *data, Evas_Object *obj __UNUSED__)
1635 Elm_Toolbar_Item *it = (Elm_Toolbar_Item *)data;
1636 const char *txt = ((Elm_Widget_Item *)it)->access_info;
1638 if (!txt) txt = it->label;
1639 if (txt) return strdup(txt);
1645 _access_state_cb(void *data, Evas_Object *obj __UNUSED__)
1647 Elm_Toolbar_Item *it = (Elm_Toolbar_Item *)data;
1650 return strdup(E_("Separator"));
1651 else if (elm_widget_item_disabled_get(it))
1652 return strdup(E_("State: Disabled"));
1653 else if (it->selected)
1654 return strdup(E_("State: Selected"));
1656 return strdup(E_("Has menu"));
1662 _item_del_pre_hook(Elm_Object_Item *it)
1664 Elm_Toolbar_Item *item, *next;
1667 item = (Elm_Toolbar_Item *)it;
1669 ELM_TOOLBAR_DATA_GET(WIDGET(item), sd);
1673 if (item != sd->more_item) /* more item does not get in the list */
1675 if (!sd->on_deletion)
1676 next = ELM_TOOLBAR_ITEM_FROM_INLIST(EINA_INLIST_GET(item)->next);
1677 sd->items = eina_inlist_remove(sd->items, EINA_INLIST_GET(item));
1679 if (!sd->on_deletion)
1681 if (!next) next = ELM_TOOLBAR_ITEM_FROM_INLIST(sd->items);
1682 if ((sd->select_mode == ELM_OBJECT_SELECT_MODE_ALWAYS) &&
1683 item->selected && next) _item_select(next);
1689 if (item != sd->more_item)
1690 _elm_toolbar_smart_theme(obj);
1696 _access_activate_cb(void *data __UNUSED__,
1697 Evas_Object *part_obj __UNUSED__,
1698 Elm_Object_Item *item)
1700 Elm_Toolbar_Item *it;
1701 it = (Elm_Toolbar_Item *)item;
1703 if (elm_widget_item_disabled_get(it)) return;
1707 _elm_access_say(E_("Unselected"));
1712 _elm_access_say(E_("Selected"));
1718 _access_widget_item_register(Elm_Toolbar_Item *it)
1720 Elm_Access_Info *ai;
1721 _elm_access_widget_item_register((Elm_Widget_Item *)it);
1722 ai = _elm_access_object_get(it->base.access_obj);
1724 _elm_access_text_set(ai, ELM_ACCESS_TYPE, E_("Toolbar Item"));
1725 _elm_access_callback_set(ai, ELM_ACCESS_INFO, _access_info_cb, it);
1726 _elm_access_callback_set(ai, ELM_ACCESS_STATE, _access_state_cb, it);
1727 _elm_access_activate_callback_set(ai, _access_activate_cb, NULL);
1730 static Elm_Toolbar_Item *
1731 _item_new(Evas_Object *obj,
1737 Evas_Object *icon_obj;
1738 Elm_Toolbar_Item *it;
1741 ELM_TOOLBAR_DATA_GET(obj, sd);
1743 icon_obj = elm_icon_add(obj);
1744 elm_icon_order_lookup_set(icon_obj, sd->lookup_order);
1745 if (!icon_obj) return NULL;
1747 it = elm_widget_item_new(obj, Elm_Toolbar_Item);
1750 evas_object_del(icon_obj);
1754 elm_widget_item_del_pre_hook_set(it, _item_del_pre_hook);
1755 elm_widget_item_disable_hook_set(it, _item_disable_hook);
1756 elm_widget_item_text_set_hook_set(it, _item_text_set_hook);
1757 elm_widget_item_text_get_hook_set(it, _item_text_get_hook);
1758 elm_widget_item_content_set_hook_set(it, _item_content_set_hook);
1759 elm_widget_item_content_get_hook_set(it, _item_content_get_hook);
1760 elm_widget_item_content_unset_hook_set(it, _item_content_unset_hook);
1762 it->label = eina_stringshare_add(label);
1763 it->prio.visible = 1;
1764 it->prio.priority = 0;
1766 it->separator = EINA_FALSE;
1768 it->base.data = data;
1770 VIEW(it) = edje_object_add(evas_object_evas_get(obj));
1772 if (_elm_config->access_mode == ELM_ACCESS_MODE_ON)
1773 _access_widget_item_register(it);
1775 if (_item_icon_set(icon_obj, "toolbar/", icon))
1777 it->icon = icon_obj;
1778 it->icon_str = eina_stringshare_add(icon);
1783 it->icon_str = NULL;
1784 evas_object_del(icon_obj);
1787 elm_widget_theme_object_set
1788 (obj, VIEW(it), "toolbar", "item", elm_widget_style_get(obj));
1789 edje_object_signal_callback_add
1790 (VIEW(it), "elm,action,click", "elm", _select_cb, it);
1791 edje_object_signal_callback_add
1792 (VIEW(it), "mouse,clicked,*", "*", (Edje_Signal_Cb)_select_filter_cb, it);
1793 edje_object_signal_callback_add
1794 (VIEW(it), "elm,mouse,in", "elm", _mouse_in_cb, it);
1795 edje_object_signal_callback_add
1796 (VIEW(it), "elm,mouse,out", "elm", _mouse_out_cb, it);
1797 evas_object_event_callback_add
1798 (VIEW(it), EVAS_CALLBACK_MOUSE_DOWN, (Evas_Object_Event_Cb)_mouse_down_cb,
1800 evas_object_event_callback_add
1801 (VIEW(it), EVAS_CALLBACK_MOUSE_UP, (Evas_Object_Event_Cb)_mouse_up_cb, it);
1802 elm_widget_sub_object_add(obj, VIEW(it));
1808 ms = ((double)sd->icon_size * elm_config_scale_get());
1809 evas_object_size_hint_min_set(it->icon, ms, ms);
1810 evas_object_size_hint_max_set(it->icon, ms, ms);
1811 edje_object_part_swallow(VIEW(it), "elm.swallow.icon", it->icon);
1812 edje_object_signal_emit(VIEW(it), "elm,state,icon,visible", "elm");
1813 evas_object_show(it->icon);
1814 elm_widget_sub_object_add(obj, it->icon);
1818 edje_object_part_text_escaped_set(VIEW(it), "elm.text", it->label);
1819 edje_object_signal_emit(VIEW(it), "elm,state,text,visible", "elm");
1823 if (!it->separator && !it->object)
1824 elm_coords_finger_size_adjust(1, &mw, 1, &mh);
1825 edje_object_size_min_restricted_calc(VIEW(it), &mw, &mh, mw, mh);
1826 if (!it->separator && !it->object)
1827 elm_coords_finger_size_adjust(1, &mw, 1, &mh);
1828 if (sd->shrink_mode != ELM_TOOLBAR_SHRINK_EXPAND)
1832 evas_object_size_hint_weight_set(VIEW(it), EVAS_HINT_EXPAND, -1.0);
1833 evas_object_size_hint_align_set
1834 (VIEW(it), EVAS_HINT_FILL, EVAS_HINT_FILL);
1838 evas_object_size_hint_weight_set(VIEW(it), -1.0, EVAS_HINT_EXPAND);
1839 evas_object_size_hint_align_set
1840 (VIEW(it), EVAS_HINT_FILL, EVAS_HINT_FILL);
1845 evas_object_size_hint_weight_set
1846 (VIEW(it), EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1847 evas_object_size_hint_align_set
1848 (VIEW(it), EVAS_HINT_FILL, EVAS_HINT_FILL);
1851 evas_object_size_hint_min_set(VIEW(it), mw, mh);
1852 evas_object_size_hint_max_set(VIEW(it), -1, -1);
1853 evas_object_event_callback_add
1854 (VIEW(it), EVAS_CALLBACK_RESIZE, _item_resize, obj);
1856 if ((!sd->items) && (sd->select_mode == ELM_OBJECT_SELECT_MODE_ALWAYS))
1862 _elm_toolbar_item_icon_update(Elm_Toolbar_Item *item)
1864 Evas_Coord mw = -1, mh = -1, minw = -1, minh = -1;
1865 Elm_Toolbar_Item_State *it_state;
1866 Evas_Object *old_icon =
1867 edje_object_part_swallow_get(VIEW(item), "elm.swallow.icon");
1870 ELM_TOOLBAR_DATA_GET(WIDGET(item), sd);
1872 elm_widget_sub_object_del(VIEW(item), old_icon);
1873 edje_object_part_swallow(VIEW(item), "elm.swallow.icon", item->icon);
1875 edje_object_signal_emit(VIEW(item), "elm,state,icon,visible", "elm");
1877 edje_object_signal_emit(VIEW(item), "elm,state,icon,hidden", "elm");
1878 evas_object_hide(old_icon);
1879 elm_coords_finger_size_adjust(1, &mw, 1, &mh);
1880 edje_object_size_min_restricted_calc(VIEW(item), &mw, &mh, mw, mh);
1881 elm_coords_finger_size_adjust(1, &mw, 1, &mh);
1882 if (sd->shrink_mode != ELM_TOOLBAR_SHRINK_EXPAND)
1886 evas_object_size_hint_weight_set
1887 (VIEW(item), EVAS_HINT_EXPAND, -1.0);
1888 evas_object_size_hint_align_set
1889 (VIEW(item), EVAS_HINT_FILL, EVAS_HINT_FILL);
1893 evas_object_size_hint_weight_set
1894 (VIEW(item), -1.0, EVAS_HINT_EXPAND);
1895 evas_object_size_hint_align_set
1896 (VIEW(item), EVAS_HINT_FILL, EVAS_HINT_FILL);
1901 evas_object_size_hint_weight_set
1902 (VIEW(item), EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1903 evas_object_size_hint_align_set
1904 (VIEW(item), EVAS_HINT_FILL, EVAS_HINT_FILL);
1907 evas_object_size_hint_min_get(VIEW(item), &minw, &minh);
1908 if ((minw < mw) && (minh < mh))
1909 evas_object_size_hint_min_set(VIEW(item), mw, mh);
1910 else if ((minw < mw) && (minh > mh))
1911 evas_object_size_hint_min_set(VIEW(item), mw, minh);
1912 else if ((minw > mw) && (minh < mh))
1913 evas_object_size_hint_min_set(VIEW(item), minw, mh);
1915 EINA_LIST_FOREACH(item->states, l, it_state)
1917 if (it_state->icon == old_icon) return;
1919 evas_object_del(old_icon);
1923 _elm_toolbar_item_icon_set_cb(void *data,
1925 const char *emission,
1928 Elm_Toolbar_Item *item = data;
1930 edje_object_part_unswallow(VIEW(item), item->icon);
1931 _elm_toolbar_item_icon_update(item);
1932 edje_object_signal_callback_del
1933 (obj, emission, source, _elm_toolbar_item_icon_set_cb);
1934 edje_object_signal_emit(VIEW(item), "elm,state,icon,reset", "elm");
1938 _elm_toolbar_item_icon_obj_set(Evas_Object *obj,
1939 Elm_Toolbar_Item *item,
1940 Evas_Object *icon_obj,
1941 const char *icon_str,
1945 Evas_Object *old_icon;
1950 eina_stringshare_replace(&item->icon_str, icon_str);
1953 eina_stringshare_del(item->icon_str);
1954 item->icon_str = NULL;
1956 item->icon = icon_obj;
1959 ms = (icon_size * elm_config_scale_get());
1960 evas_object_size_hint_min_set(item->icon, ms, ms);
1961 evas_object_size_hint_max_set(item->icon, ms, ms);
1962 evas_object_show(item->icon);
1963 elm_widget_sub_object_add(obj, item->icon);
1965 s = edje_object_data_get(VIEW(item), "transition_animation_on");
1966 if ((s) && (atoi(s)))
1968 old_icon = edje_object_part_swallow_get
1969 (VIEW(item), "elm.swallow.icon_new");
1972 elm_widget_sub_object_del(VIEW(item), old_icon);
1973 evas_object_hide(old_icon);
1975 edje_object_part_swallow
1976 (VIEW(item), "elm.swallow.icon_new", item->icon);
1977 edje_object_signal_emit(VIEW(item), sig, "elm");
1978 edje_object_signal_callback_add
1979 (VIEW(item), "elm,state,icon_set,done", "elm",
1980 _elm_toolbar_item_icon_set_cb, item);
1983 _elm_toolbar_item_icon_update(item);
1985 _resize_cb(obj, NULL, NULL, NULL);
1989 _elm_toolbar_item_state_cb(void *data __UNUSED__,
1990 Evas_Object *obj __UNUSED__,
1993 Elm_Toolbar_Item *it = event_info;
1994 Elm_Toolbar_Item_State *it_state;
1996 it_state = eina_list_data_get(it->current_state);
1998 it_state->func((void *)it_state->data, obj, event_info);
2001 static Elm_Toolbar_Item_State *
2002 _item_state_new(const char *label,
2003 const char *icon_str,
2008 Elm_Toolbar_Item_State *it_state;
2010 it_state = ELM_NEW(Elm_Toolbar_Item_State);
2011 it_state->label = eina_stringshare_add(label);
2012 it_state->icon_str = eina_stringshare_add(icon_str);
2013 it_state->icon = icon;
2014 it_state->func = func;
2015 it_state->data = data;
2021 _elm_toolbar_action_left_cb(void *data,
2022 Evas_Object *o __UNUSED__,
2023 const char *sig __UNUSED__,
2024 const char *src __UNUSED__)
2026 Evas_Object *obj = data;
2027 Elm_Toolbar_Item *it, *it2;
2028 Eina_Bool done = EINA_FALSE;
2030 ELM_TOOLBAR_DATA_GET(obj, sd);
2032 EINA_INLIST_FOREACH(sd->items, it)
2036 Eina_Bool found = EINA_FALSE;
2038 EINA_INLIST_REVERSE_FOREACH(sd->items, it2)
2040 if (elm_object_item_disabled_get((Elm_Object_Item *)it2))
2047 if (!found) continue;
2048 if (it2->separator) continue;
2059 EINA_INLIST_FOREACH(sd->items, it)
2061 if (elm_object_item_disabled_get((Elm_Object_Item *)it)) continue;
2062 if (it->separator) continue;
2070 _elm_toolbar_action_right_cb(void *data,
2071 Evas_Object *o __UNUSED__,
2072 const char *sig __UNUSED__,
2073 const char *src __UNUSED__)
2075 Evas_Object *obj = data;
2076 Elm_Toolbar_Item *it, *it2;
2077 Eina_Bool done = EINA_FALSE;
2079 ELM_TOOLBAR_DATA_GET(obj, sd);
2081 EINA_INLIST_FOREACH(sd->items, it)
2085 Eina_Bool found = EINA_FALSE;
2087 EINA_INLIST_FOREACH(sd->items, it2)
2089 if (elm_object_item_disabled_get((Elm_Object_Item *)it2))
2096 if (!found) continue;
2097 if (it2->separator) continue;
2108 EINA_INLIST_REVERSE_FOREACH(sd->items, it)
2110 if (elm_object_item_disabled_get((Elm_Object_Item *)it)) continue;
2111 if (it->separator) continue;
2119 _elm_toolbar_action_up_cb(void *data,
2124 _elm_toolbar_action_left_cb(data, o, sig, src);
2128 _elm_toolbar_action_down_cb(void *data,
2133 _elm_toolbar_action_right_cb(data, o, sig, src);
2137 _elm_toolbar_smart_add(Evas_Object *obj)
2139 EVAS_SMART_DATA_ALLOC(obj, Elm_Toolbar_Smart_Data);
2141 ELM_WIDGET_DATA(priv)->resize_obj =
2142 edje_object_add(evas_object_evas_get(obj));
2144 ELM_WIDGET_CLASS(_elm_toolbar_parent_sc)->base.add(obj);
2146 elm_widget_theme_object_set
2147 (obj, ELM_WIDGET_DATA(priv)->resize_obj, "toolbar", "base",
2148 elm_widget_style_get(obj));
2150 priv->hit_rect = evas_object_rectangle_add(evas_object_evas_get(obj));
2151 evas_object_smart_member_add(priv->hit_rect, obj);
2152 elm_widget_sub_object_add(obj, priv->hit_rect);
2154 /* common scroller hit rectangle setup */
2155 evas_object_color_set(priv->hit_rect, 0, 0, 0, 0);
2156 evas_object_show(priv->hit_rect);
2157 evas_object_repeat_events_set(priv->hit_rect, EINA_TRUE);
2159 elm_widget_can_focus_set(obj, EINA_TRUE);
2161 priv->s_iface = evas_object_smart_interface_get
2162 (obj, ELM_SCROLLABLE_IFACE_NAME);
2164 priv->s_iface->objects_set
2165 (obj, ELM_WIDGET_DATA(priv)->resize_obj, priv->hit_rect);
2167 priv->more_item = NULL;
2168 priv->selected_item = NULL;
2169 priv->standard_priority = -99999;
2171 priv->s_iface->bounce_allow_set
2172 (obj, _elm_config->thumbscroll_bounce_enable, EINA_FALSE);
2173 priv->s_iface->policy_set
2174 (obj, ELM_SCROLLER_POLICY_AUTO, ELM_SCROLLER_POLICY_OFF);
2175 priv->s_iface->drag_start_cb_set(obj, _drag_start_cb);
2177 edje_object_signal_callback_add
2178 (ELM_WIDGET_DATA(priv)->resize_obj, "elm,action,left", "elm",
2179 _elm_toolbar_action_left_cb, obj);
2180 edje_object_signal_callback_add
2181 (ELM_WIDGET_DATA(priv)->resize_obj, "elm,action,right", "elm",
2182 _elm_toolbar_action_right_cb, obj);
2183 edje_object_signal_callback_add
2184 (ELM_WIDGET_DATA(priv)->resize_obj, "elm,action,up", "elm",
2185 _elm_toolbar_action_up_cb, obj);
2186 edje_object_signal_callback_add
2187 (ELM_WIDGET_DATA(priv)->resize_obj, "elm,action,down", "elm",
2188 _elm_toolbar_action_down_cb, obj);
2190 priv->shrink_mode = ELM_TOOLBAR_SHRINK_NONE;
2191 priv->priv_icon_size = 0; // unset
2192 priv->theme_icon_size = _elm_toolbar_icon_size_get(priv);
2193 if (priv->priv_icon_size) priv->icon_size = priv->priv_icon_size;
2194 else priv->icon_size = priv->theme_icon_size;
2196 priv->homogeneous = EINA_TRUE;
2199 priv->bx = evas_object_box_add(evas_object_evas_get(obj));
2200 evas_object_size_hint_align_set(priv->bx, priv->align, 0.5);
2201 evas_object_box_layout_set(priv->bx, _layout, obj, NULL);
2202 elm_widget_sub_object_add(obj, priv->bx);
2203 priv->s_iface->content_set(obj, priv->bx);
2204 evas_object_show(priv->bx);
2206 priv->more = elm_layout_add(obj);
2207 elm_layout_theme_set(priv->more, "toolbar", "more", "default");
2208 elm_widget_sub_object_add(obj, priv->more);
2209 evas_object_show(priv->more);
2211 priv->bx_more = evas_object_box_add(evas_object_evas_get(obj));
2212 evas_object_size_hint_align_set(priv->bx_more, priv->align, 0.5);
2213 evas_object_box_layout_set(priv->bx_more, _layout, obj, NULL);
2214 elm_widget_sub_object_add(obj, priv->bx_more);
2215 elm_layout_content_set
2216 (priv->more, "elm.swallow.content", priv->bx_more);
2217 evas_object_show(priv->bx_more);
2219 priv->bx_more2 = evas_object_box_add(evas_object_evas_get(obj));
2220 evas_object_size_hint_align_set(priv->bx_more2, priv->align, 0.5);
2221 evas_object_box_layout_set(priv->bx_more2, _layout, obj, NULL);
2222 elm_widget_sub_object_add(obj, priv->bx_more2);
2223 elm_layout_content_set
2224 (priv->more, "elm.swallow.content2", priv->bx_more2);
2225 evas_object_show(priv->bx_more2);
2227 elm_toolbar_shrink_mode_set(obj, _elm_config->toolbar_shrink_mode);
2228 evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, _resize_cb, obj);
2229 evas_object_event_callback_add(obj, EVAS_CALLBACK_MOVE, _move_cb, obj);
2230 evas_object_event_callback_add
2231 (priv->bx, EVAS_CALLBACK_RESIZE, _resize_cb, obj);
2232 elm_toolbar_icon_order_lookup_set(obj, ELM_ICON_LOOKUP_THEME_FDO);
2238 _elm_toolbar_smart_del(Evas_Object *obj)
2240 Elm_Toolbar_Item *it, *next;
2242 ELM_TOOLBAR_DATA_GET(obj, sd);
2244 sd->on_deletion = EINA_TRUE;
2247 ecore_job_del(sd->resize_job);
2249 sd->resize_job = NULL;
2251 it = ELM_TOOLBAR_ITEM_FROM_INLIST(sd->items);
2254 next = ELM_TOOLBAR_ITEM_FROM_INLIST(EINA_INLIST_GET(it)->next);
2255 elm_widget_item_del(it);
2260 elm_widget_item_del(sd->more_item);
2261 sd->more_item = NULL;
2265 ecore_timer_del(sd->long_timer);
2266 sd->long_timer = NULL;
2269 ELM_WIDGET_CLASS(_elm_toolbar_parent_sc)->base.del(obj);
2273 _elm_toolbar_smart_move(Evas_Object *obj,
2277 ELM_TOOLBAR_DATA_GET(obj, sd);
2279 ELM_WIDGET_CLASS(_elm_toolbar_parent_sc)->base.move(obj, x, y);
2281 evas_object_move(sd->hit_rect, x, y);
2285 _elm_toolbar_smart_resize(Evas_Object *obj,
2289 ELM_TOOLBAR_DATA_GET(obj, sd);
2291 ELM_WIDGET_CLASS(_elm_toolbar_parent_sc)->base.resize(obj, w, h);
2293 evas_object_resize(sd->hit_rect, w, h);
2297 _elm_toolbar_smart_member_add(Evas_Object *obj,
2298 Evas_Object *member)
2300 ELM_TOOLBAR_DATA_GET(obj, sd);
2302 ELM_WIDGET_CLASS(_elm_toolbar_parent_sc)->base.member_add(obj, member);
2305 evas_object_raise(sd->hit_rect);
2309 _access_item_find_append(const Evas_Object *obj,
2313 Elm_Toolbar_Item *it;
2316 ELM_TOOLBAR_DATA_GET(obj, sd);
2318 list = evas_object_box_children_get(bx);
2319 if (!list) return items;
2321 EINA_INLIST_FOREACH (sd->items, it)
2323 if (it->separator) continue;
2324 if (eina_list_data_find(list, it->base.view))
2325 items = eina_list_append(items, it->base.access_obj);
2332 _elm_toolbar_smart_focus_next(const Evas_Object *obj,
2333 Elm_Focus_Direction dir,
2336 Eina_List *items = NULL;
2338 ELM_TOOLBAR_DATA_GET(obj, sd);
2340 if (sd->more_item && sd->more_item->selected)
2342 items = _access_item_find_append(obj, sd->bx_more, items);
2343 items = _access_item_find_append(obj, sd->bx_more2, items);
2344 items = eina_list_append(items, sd->more_item->base.access_obj);
2348 items = _access_item_find_append(obj, sd->bx, items);
2349 if (sd->more_item &&
2350 eina_list_data_find(evas_object_box_children_get(sd->bx),
2351 sd->more_item->base.view))
2352 items = eina_list_append(items, sd->more_item->base.access_obj);
2355 return elm_widget_focus_list_next_get
2356 (obj, items, eina_list_data_get, dir, next);
2360 _access_obj_process(Elm_Toolbar_Smart_Data * sd, Eina_Bool is_access)
2362 Elm_Toolbar_Item *it;
2364 EINA_INLIST_FOREACH (sd->items, it)
2366 if (is_access) _access_widget_item_register(it);
2367 else _elm_access_widget_item_unregister((Elm_Widget_Item *)it);
2372 _elm_toolbar_smart_access(Evas_Object *obj, Eina_Bool is_access)
2374 ELM_TOOLBAR_CHECK(obj);
2375 ELM_TOOLBAR_DATA_GET(obj, sd);
2378 ELM_WIDGET_CLASS(ELM_WIDGET_DATA(sd)->api)->focus_next =
2379 _elm_toolbar_smart_focus_next;
2381 ELM_WIDGET_CLASS(ELM_WIDGET_DATA(sd)->api)->focus_next = NULL;
2382 _access_obj_process(sd, is_access);
2386 _elm_toolbar_smart_set_user(Elm_Toolbar_Smart_Class *sc)
2388 ELM_WIDGET_CLASS(sc)->base.add = _elm_toolbar_smart_add;
2389 ELM_WIDGET_CLASS(sc)->base.del = _elm_toolbar_smart_del;
2390 ELM_WIDGET_CLASS(sc)->base.move = _elm_toolbar_smart_move;
2391 ELM_WIDGET_CLASS(sc)->base.resize = _elm_toolbar_smart_resize;
2392 ELM_WIDGET_CLASS(sc)->base.member_add = _elm_toolbar_smart_member_add;
2394 ELM_WIDGET_CLASS(sc)->on_focus = _elm_toolbar_smart_on_focus;
2395 ELM_WIDGET_CLASS(sc)->event = _elm_toolbar_smart_event;
2396 ELM_WIDGET_CLASS(sc)->theme = _elm_toolbar_smart_theme;
2397 ELM_WIDGET_CLASS(sc)->translate = _elm_toolbar_smart_translate;
2399 if (_elm_config->access_mode != ELM_ACCESS_MODE_OFF)
2400 ELM_WIDGET_CLASS(sc)->focus_next = _elm_toolbar_smart_focus_next;
2402 ELM_WIDGET_CLASS(sc)->access = _elm_toolbar_smart_access;
2405 EAPI const Elm_Toolbar_Smart_Class *
2406 elm_toolbar_smart_class_get(void)
2408 static Elm_Toolbar_Smart_Class _sc =
2409 ELM_TOOLBAR_SMART_CLASS_INIT_NAME_VERSION(ELM_TOOLBAR_SMART_NAME);
2410 static const Elm_Toolbar_Smart_Class *class = NULL;
2411 Evas_Smart_Class *esc = (Evas_Smart_Class *)&_sc;
2416 _elm_toolbar_smart_set(&_sc);
2417 esc->callbacks = _smart_callbacks;
2424 elm_toolbar_add(Evas_Object *parent)
2428 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
2430 obj = elm_widget_add(_elm_toolbar_smart_class_new(), parent);
2431 if (!obj) return NULL;
2433 if (!elm_widget_sub_object_add(parent, obj))
2434 ERR("could not add %p as sub object of %p", obj, parent);
2440 elm_toolbar_icon_size_set(Evas_Object *obj,
2443 ELM_TOOLBAR_CHECK(obj);
2444 ELM_TOOLBAR_DATA_GET(obj, sd);
2446 if (sd->priv_icon_size == icon_size) return;
2447 sd->priv_icon_size = icon_size;
2449 if (sd->priv_icon_size) sd->icon_size = sd->priv_icon_size;
2450 else sd->icon_size = sd->theme_icon_size;
2452 _elm_toolbar_smart_theme(obj);
2456 elm_toolbar_icon_size_get(const Evas_Object *obj)
2458 ELM_TOOLBAR_CHECK(obj) 0;
2459 ELM_TOOLBAR_DATA_GET(obj, sd);
2461 return sd->priv_icon_size;
2464 EAPI Elm_Object_Item *
2465 elm_toolbar_item_append(Evas_Object *obj,
2471 Elm_Toolbar_Item *it;
2474 ELM_TOOLBAR_CHECK(obj) NULL;
2475 ELM_TOOLBAR_DATA_GET(obj, sd);
2477 it = _item_new(obj, icon, label, func, data);
2478 if (!it) return NULL;
2479 scale = (elm_widget_scale_get(obj) * elm_config_scale_get());
2481 sd->items = eina_inlist_append(sd->items, EINA_INLIST_GET(it));
2482 evas_object_box_append(sd->bx, VIEW(it));
2483 evas_object_show(VIEW(it));
2485 _item_theme_hook(obj, it, scale, sd->icon_size);
2489 return (Elm_Object_Item *)it;
2492 EAPI Elm_Object_Item *
2493 elm_toolbar_item_prepend(Evas_Object *obj,
2499 Elm_Toolbar_Item *it;
2502 ELM_TOOLBAR_CHECK(obj) NULL;
2503 ELM_TOOLBAR_DATA_GET(obj, sd);
2505 it = _item_new(obj, icon, label, func, data);
2506 if (!it) return NULL;
2507 scale = (elm_widget_scale_get(obj) * elm_config_scale_get());
2509 sd->items = eina_inlist_prepend(sd->items, EINA_INLIST_GET(it));
2510 evas_object_box_prepend(sd->bx, VIEW(it));
2511 evas_object_show(VIEW(it));
2512 _item_theme_hook(obj, it, scale, sd->icon_size);
2516 return (Elm_Object_Item *)it;
2519 EAPI Elm_Object_Item *
2520 elm_toolbar_item_insert_before(Evas_Object *obj,
2521 Elm_Object_Item *before,
2527 Elm_Toolbar_Item *it, *_before;
2530 ELM_TOOLBAR_CHECK(obj) NULL;
2531 ELM_TOOLBAR_ITEM_CHECK_OR_RETURN(before, NULL);
2532 ELM_TOOLBAR_DATA_GET(obj, sd);
2534 _before = (Elm_Toolbar_Item *)before;
2535 it = _item_new(obj, icon, label, func, data);
2536 if (!it) return NULL;
2537 scale = (elm_widget_scale_get(obj) * elm_config_scale_get());
2539 sd->items = eina_inlist_prepend_relative
2540 (sd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(_before));
2541 evas_object_box_insert_before(sd->bx, VIEW(it), VIEW(_before));
2542 evas_object_show(VIEW(it));
2543 _item_theme_hook(obj, it, scale, sd->icon_size);
2547 return (Elm_Object_Item *)it;
2550 EAPI Elm_Object_Item *
2551 elm_toolbar_item_insert_after(Evas_Object *obj,
2552 Elm_Object_Item *after,
2558 Elm_Toolbar_Item *it, *_after;
2561 ELM_TOOLBAR_CHECK(obj) NULL;
2562 ELM_TOOLBAR_ITEM_CHECK_OR_RETURN(after, NULL);
2564 ELM_TOOLBAR_DATA_GET(obj, sd);
2565 _after = (Elm_Toolbar_Item *)after;
2566 it = _item_new(obj, icon, label, func, data);
2567 if (!it) return NULL;
2568 scale = (elm_widget_scale_get(obj) * elm_config_scale_get());
2570 sd->items = eina_inlist_append_relative
2571 (sd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(_after));
2572 evas_object_box_insert_after(sd->bx, VIEW(it), VIEW(_after));
2573 evas_object_show(VIEW(it));
2574 _item_theme_hook(obj, it, scale, sd->icon_size);
2578 return (Elm_Object_Item *)it;
2581 EAPI Elm_Object_Item *
2582 elm_toolbar_first_item_get(const Evas_Object *obj)
2584 ELM_TOOLBAR_CHECK(obj) NULL;
2585 ELM_TOOLBAR_DATA_GET(obj, sd);
2587 if (!sd->items) return NULL;
2588 return (Elm_Object_Item *)ELM_TOOLBAR_ITEM_FROM_INLIST(sd->items);
2591 EAPI Elm_Object_Item *
2592 elm_toolbar_last_item_get(const Evas_Object *obj)
2594 ELM_TOOLBAR_CHECK(obj) NULL;
2595 ELM_TOOLBAR_DATA_GET(obj, sd);
2597 if (!sd->items) return NULL;
2599 return (Elm_Object_Item *)ELM_TOOLBAR_ITEM_FROM_INLIST(sd->items->last);
2602 EAPI Elm_Object_Item *
2603 elm_toolbar_item_next_get(const Elm_Object_Item *it)
2605 ELM_TOOLBAR_ITEM_CHECK_OR_RETURN(it, NULL);
2607 return (Elm_Object_Item *)ELM_TOOLBAR_ITEM_FROM_INLIST(
2608 EINA_INLIST_GET(((Elm_Toolbar_Item *)it))->next);
2611 EAPI Elm_Object_Item *
2612 elm_toolbar_item_prev_get(const Elm_Object_Item *it)
2614 ELM_TOOLBAR_ITEM_CHECK_OR_RETURN(it, NULL);
2616 return (Elm_Object_Item *)ELM_TOOLBAR_ITEM_FROM_INLIST(
2617 EINA_INLIST_GET(((Elm_Toolbar_Item *)it))->prev);
2621 elm_toolbar_item_priority_set(Elm_Object_Item *it,
2624 Elm_Toolbar_Item *item = (Elm_Toolbar_Item *)it;
2626 ELM_TOOLBAR_ITEM_CHECK_OR_RETURN(it);
2628 if (item->prio.priority == priority) return;
2629 item->prio.priority = priority;
2630 _resize_cb(WIDGET(item), NULL, NULL, NULL);
2634 elm_toolbar_item_priority_get(const Elm_Object_Item *it)
2636 ELM_TOOLBAR_ITEM_CHECK_OR_RETURN(it, 0);
2638 return ((Elm_Toolbar_Item *)it)->prio.priority;
2641 EAPI Elm_Object_Item *
2642 elm_toolbar_item_find_by_label(const Evas_Object *obj,
2645 Elm_Toolbar_Item *it;
2647 ELM_TOOLBAR_CHECK(obj) NULL;
2648 ELM_TOOLBAR_DATA_GET(obj, sd);
2650 EINA_INLIST_FOREACH(sd->items, it)
2652 if (!strcmp(it->label, label))
2653 return (Elm_Object_Item *)it;
2660 elm_toolbar_item_selected_set(Elm_Object_Item *it,
2663 Elm_Toolbar_Item *item = (Elm_Toolbar_Item *)it;
2665 ELM_TOOLBAR_ITEM_CHECK_OR_RETURN(it);
2667 if (item->selected == selected) return;
2668 if (selected) _item_select(item);
2669 else _item_unselect(item);
2673 elm_toolbar_item_selected_get(const Elm_Object_Item *it)
2675 ELM_TOOLBAR_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
2677 return ((Elm_Toolbar_Item *)it)->selected;
2680 EAPI Elm_Object_Item *
2681 elm_toolbar_selected_item_get(const Evas_Object *obj)
2683 ELM_TOOLBAR_CHECK(obj) NULL;
2684 ELM_TOOLBAR_DATA_GET(obj, sd);
2686 return (Elm_Object_Item *)sd->selected_item;
2689 EAPI Elm_Object_Item *
2690 elm_toolbar_more_item_get(const Evas_Object *obj)
2692 ELM_TOOLBAR_CHECK(obj) NULL;
2693 ELM_TOOLBAR_DATA_GET(obj, sd);
2695 return (Elm_Object_Item *)sd->more_item;
2699 elm_toolbar_item_icon_set(Elm_Object_Item *it,
2703 Evas_Object *icon_obj;
2704 Elm_Toolbar_Item *item = (Elm_Toolbar_Item *)it;
2706 ELM_TOOLBAR_ITEM_CHECK_OR_RETURN(it);
2709 ELM_TOOLBAR_DATA_GET(obj, sd);
2710 if ((icon) && (item->icon_str) && (!strcmp(icon, item->icon_str))) return;
2712 icon_obj = elm_icon_add(obj);
2713 if (!icon_obj) return;
2714 if (_item_icon_set(icon_obj, "toolbar/", icon))
2715 _elm_toolbar_item_icon_obj_set
2716 (obj, item, icon_obj, icon, sd->icon_size, "elm,state,icon_set");
2719 _elm_toolbar_item_icon_obj_set
2720 (obj, item, NULL, NULL, 0, "elm,state,icon_set");
2721 evas_object_del(icon_obj);
2726 elm_toolbar_item_icon_get(const Elm_Object_Item *it)
2728 ELM_TOOLBAR_ITEM_CHECK_OR_RETURN(it, NULL);
2730 return ((Elm_Toolbar_Item *)it)->icon_str;
2734 elm_toolbar_item_object_get(const Elm_Object_Item *it)
2736 Elm_Toolbar_Item *item = (Elm_Toolbar_Item *)it;
2738 ELM_TOOLBAR_ITEM_CHECK_OR_RETURN(it, NULL);
2744 elm_toolbar_item_icon_object_get(Elm_Object_Item *it)
2746 ELM_TOOLBAR_ITEM_CHECK_OR_RETURN(it, NULL);
2748 return ((Elm_Toolbar_Item *)it)->icon;
2752 elm_toolbar_item_icon_memfile_set(Elm_Object_Item *it,
2758 Elm_Toolbar_Item *item = (Elm_Toolbar_Item *)it;
2759 Evas_Object *icon_obj;
2763 ELM_TOOLBAR_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
2766 ELM_TOOLBAR_DATA_GET(obj, sd);
2770 icon_obj = elm_icon_add(obj);
2771 evas_object_repeat_events_set(icon_obj, EINA_TRUE);
2772 ret = elm_image_memfile_set(icon_obj, img, size, format, key);
2775 evas_object_del(icon_obj);
2778 _elm_toolbar_item_icon_obj_set
2779 (obj, item, icon_obj, NULL, sd->icon_size, "elm,state,icon_set");
2782 _elm_toolbar_item_icon_obj_set
2783 (obj, item, NULL, NULL, 0, "elm,state,icon_set");
2788 elm_toolbar_item_icon_file_set(Elm_Object_Item *it,
2792 Elm_Toolbar_Item *item = (Elm_Toolbar_Item *)it;
2793 Evas_Object *icon_obj;
2797 ELM_TOOLBAR_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
2800 ELM_TOOLBAR_DATA_GET(obj, sd);
2804 icon_obj = elm_icon_add(obj);
2805 evas_object_repeat_events_set(icon_obj, EINA_TRUE);
2806 ret = elm_image_file_set(icon_obj, file, key);
2809 evas_object_del(icon_obj);
2812 _elm_toolbar_item_icon_obj_set
2813 (obj, item, icon_obj, NULL, sd->icon_size, "elm,state,icon_set");
2816 _elm_toolbar_item_icon_obj_set
2817 (obj, item, NULL, NULL, 0, "elm,state,icon_set");
2822 elm_toolbar_item_separator_set(Elm_Object_Item *it,
2823 Eina_Bool separator)
2825 Elm_Toolbar_Item *item = (Elm_Toolbar_Item *)it;
2826 Evas_Object *obj = WIDGET(item);
2829 ELM_TOOLBAR_ITEM_CHECK_OR_RETURN(it);
2830 ELM_TOOLBAR_DATA_GET(obj, sd);
2832 if (item->separator == separator) return;
2833 item->separator = separator;
2834 scale = (elm_widget_scale_get(obj) * elm_config_scale_get());
2835 _item_theme_hook(obj, item, scale, sd->icon_size);
2836 evas_object_size_hint_min_set(VIEW(item), -1, -1);
2837 if (separator) sd->separator_count++;
2838 else sd->separator_count--;
2842 elm_toolbar_item_separator_get(const Elm_Object_Item *it)
2844 ELM_TOOLBAR_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
2846 return ((Elm_Toolbar_Item *)it)->separator;
2850 elm_toolbar_shrink_mode_set(Evas_Object *obj,
2851 Elm_Toolbar_Shrink_Mode shrink_mode)
2855 ELM_TOOLBAR_CHECK(obj);
2856 ELM_TOOLBAR_DATA_GET(obj, sd);
2858 if (sd->shrink_mode == shrink_mode) return;
2859 sd->shrink_mode = shrink_mode;
2860 bounce = (_elm_config->thumbscroll_bounce_enable) &&
2861 (shrink_mode == ELM_TOOLBAR_SHRINK_SCROLL);
2862 sd->s_iface->bounce_allow_set(obj, bounce, EINA_FALSE);
2866 elm_widget_item_del(sd->more_item);
2867 sd->more_item = NULL;
2870 if (shrink_mode == ELM_TOOLBAR_SHRINK_MENU)
2872 elm_toolbar_homogeneous_set(obj, EINA_FALSE);
2873 sd->s_iface->policy_set
2874 (obj, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
2875 sd->more_item = _item_new(obj, "more_menu", "More", NULL, NULL);
2877 else if (shrink_mode == ELM_TOOLBAR_SHRINK_HIDE)
2879 elm_toolbar_homogeneous_set(obj, EINA_FALSE);
2880 sd->s_iface->policy_set
2881 (obj, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
2883 else if (shrink_mode == ELM_TOOLBAR_SHRINK_EXPAND)
2885 elm_toolbar_homogeneous_set(obj, EINA_FALSE);
2886 sd->s_iface->policy_set
2887 (obj, ELM_SCROLLER_POLICY_AUTO, ELM_SCROLLER_POLICY_OFF);
2888 sd->more_item = _item_new(obj, "more_menu", "More", NULL, NULL);
2891 sd->s_iface->policy_set
2892 (obj, ELM_SCROLLER_POLICY_AUTO, ELM_SCROLLER_POLICY_OFF);
2897 EAPI Elm_Toolbar_Shrink_Mode
2898 elm_toolbar_shrink_mode_get(const Evas_Object *obj)
2900 ELM_TOOLBAR_CHECK(obj) ELM_TOOLBAR_SHRINK_NONE;
2901 ELM_TOOLBAR_DATA_GET(obj, sd);
2903 return sd->shrink_mode;
2907 elm_toolbar_transverse_expanded_set(Evas_Object *obj, Eina_Bool transverse_expanded)
2909 ELM_TOOLBAR_CHECK(obj);
2910 ELM_TOOLBAR_DATA_GET(obj, sd);
2912 if (sd->transverse_expanded == transverse_expanded) return;
2913 sd->transverse_expanded = transverse_expanded;
2919 elm_toolbar_transverse_expanded_get(const Evas_Object *obj)
2921 ELM_TOOLBAR_CHECK(obj) EINA_FALSE;
2922 ELM_TOOLBAR_DATA_GET(obj, sd);
2924 return sd->transverse_expanded;
2928 elm_toolbar_homogeneous_set(Evas_Object *obj,
2929 Eina_Bool homogeneous)
2931 ELM_TOOLBAR_CHECK(obj);
2932 ELM_TOOLBAR_DATA_GET(obj, sd);
2934 homogeneous = !!homogeneous;
2935 if (homogeneous == sd->homogeneous) return;
2936 sd->homogeneous = homogeneous;
2937 if (homogeneous) elm_toolbar_shrink_mode_set(obj, ELM_TOOLBAR_SHRINK_NONE);
2938 evas_object_smart_calculate(sd->bx);
2942 elm_toolbar_homogeneous_get(const Evas_Object *obj)
2944 ELM_TOOLBAR_CHECK(obj) EINA_FALSE;
2945 ELM_TOOLBAR_DATA_GET(obj, sd);
2947 return sd->homogeneous;
2951 elm_toolbar_menu_parent_set(Evas_Object *obj,
2952 Evas_Object *parent)
2954 Elm_Toolbar_Item *it;
2956 ELM_TOOLBAR_CHECK(obj);
2957 ELM_TOOLBAR_DATA_GET(obj, sd);
2958 EINA_SAFETY_ON_NULL_RETURN(parent);
2960 sd->menu_parent = parent;
2961 EINA_INLIST_FOREACH(sd->items, it)
2964 elm_menu_parent_set(it->o_menu, sd->menu_parent);
2966 if ((sd->more_item) && (sd->more_item->o_menu))
2967 elm_menu_parent_set(sd->more_item->o_menu, sd->menu_parent);
2971 elm_toolbar_menu_parent_get(const Evas_Object *obj)
2973 ELM_TOOLBAR_CHECK(obj) NULL;
2974 ELM_TOOLBAR_DATA_GET(obj, sd);
2976 return sd->menu_parent;
2980 elm_toolbar_align_set(Evas_Object *obj,
2983 ELM_TOOLBAR_CHECK(obj);
2984 ELM_TOOLBAR_DATA_GET(obj, sd);
2988 if (sd->align != align)
2989 evas_object_size_hint_align_set(sd->bx, 0.5, align);
2993 if (sd->align != align)
2994 evas_object_size_hint_align_set(sd->bx, align, 0.5);
3000 elm_toolbar_align_get(const Evas_Object *obj)
3002 ELM_TOOLBAR_CHECK(obj) 0.0;
3003 ELM_TOOLBAR_DATA_GET(obj, sd);
3009 elm_toolbar_item_menu_set(Elm_Object_Item *it,
3012 Elm_Toolbar_Item *item = (Elm_Toolbar_Item *)it;
3014 ELM_TOOLBAR_ITEM_CHECK_OR_RETURN(it);
3015 ELM_TOOLBAR_DATA_GET(WIDGET(item), sd);
3017 if (item->menu == menu) return;
3018 if (menu) _item_menu_create(sd, item);
3019 else _item_menu_destroy(item);
3023 elm_toolbar_item_menu_get(const Elm_Object_Item *it)
3025 Elm_Toolbar_Item *item = (Elm_Toolbar_Item *)it;
3027 ELM_TOOLBAR_ITEM_CHECK_OR_RETURN(it, NULL);
3029 if (!item->menu) return NULL;
3030 return item->o_menu;
3033 EAPI Elm_Toolbar_Item_State *
3034 elm_toolbar_item_state_add(Elm_Object_Item *it,
3040 Elm_Toolbar_Item *item = (Elm_Toolbar_Item *)it;
3041 Elm_Toolbar_Item_State *it_state;
3042 Evas_Object *icon_obj;
3045 ELM_TOOLBAR_ITEM_CHECK_OR_RETURN(it, NULL);
3048 ELM_TOOLBAR_DATA_GET(WIDGET(item), sd);
3052 it_state = _item_state_new
3053 (item->label, item->icon_str, item->icon, item->func,
3055 item->states = eina_list_append(item->states, it_state);
3056 item->current_state = item->states;
3059 icon_obj = elm_icon_add(obj);
3060 elm_icon_order_lookup_set(icon_obj, sd->lookup_order);
3061 if (!icon_obj) goto error_state_add;
3063 if (!_item_icon_set(icon_obj, "toolbar/", icon))
3065 evas_object_del(icon_obj);
3070 it_state = _item_state_new(label, icon, icon_obj, func, data);
3071 item->states = eina_list_append(item->states, it_state);
3072 item->func = _elm_toolbar_item_state_cb;
3073 item->base.data = NULL;
3078 if (item->states && !eina_list_next(item->states))
3080 eina_stringshare_del(item->label);
3081 eina_stringshare_del(item->icon_str);
3082 free(eina_list_data_get(item->states));
3083 eina_list_free(item->states);
3084 item->states = NULL;
3090 elm_toolbar_item_state_del(Elm_Object_Item *it,
3091 Elm_Toolbar_Item_State *state)
3093 Elm_Toolbar_Item_State *it_state;
3094 Elm_Toolbar_Item *item;
3095 Eina_List *del_state;
3097 ELM_TOOLBAR_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
3099 if (!state) return EINA_FALSE;
3101 item = (Elm_Toolbar_Item *)it;
3102 if (!item->states) return EINA_FALSE;
3104 del_state = eina_list_data_find_list(item->states, state);
3105 if (del_state == item->states) return EINA_FALSE;
3106 if (del_state == item->current_state)
3107 elm_toolbar_item_state_unset(it);
3109 eina_stringshare_del(state->label);
3110 eina_stringshare_del(state->icon_str);
3111 if (state->icon) evas_object_del(state->icon);
3114 item->states = eina_list_remove_list(item->states, del_state);
3115 if (item->states && !eina_list_next(item->states))
3117 it_state = eina_list_data_get(item->states);
3118 item->base.data = it_state->data;
3119 item->func = it_state->func;
3120 eina_stringshare_del(it_state->label);
3121 eina_stringshare_del(it_state->icon_str);
3122 free(eina_list_data_get(item->states));
3123 eina_list_free(item->states);
3124 item->states = NULL;
3131 elm_toolbar_item_state_set(Elm_Object_Item *it,
3132 Elm_Toolbar_Item_State *state)
3134 Elm_Toolbar_Item *item = (Elm_Toolbar_Item *)it;
3135 Elm_Toolbar_Item_State *it_state;
3136 Eina_List *next_state;
3139 ELM_TOOLBAR_ITEM_CHECK_OR_RETURN(it, EINA_FALSE);
3142 ELM_TOOLBAR_DATA_GET(obj, sd);
3143 if (!item->states) return EINA_FALSE;
3147 next_state = eina_list_data_find_list(item->states, state);
3148 if (!next_state) return EINA_FALSE;
3151 next_state = item->states;
3153 if (next_state == item->current_state) return EINA_TRUE;
3155 it_state = eina_list_data_get(next_state);
3156 if (eina_list_data_find(item->current_state, state))
3158 _item_label_set(item, it_state->label, "elm,state,label_set,forward");
3159 _elm_toolbar_item_icon_obj_set
3160 (obj, item, it_state->icon, it_state->icon_str,
3161 sd->icon_size, "elm,state,icon_set,forward");
3165 _item_label_set(item, it_state->label, "elm,state,label_set,backward");
3166 _elm_toolbar_item_icon_obj_set
3167 (obj, item, it_state->icon, it_state->icon_str,
3168 sd->icon_size, "elm,state,icon_set,backward");
3170 if (elm_widget_item_disabled_get(item))
3171 elm_widget_signal_emit(item->icon, "elm,state,disabled", "elm");
3173 elm_widget_signal_emit(item->icon, "elm,state,enabled", "elm");
3175 item->current_state = next_state;
3181 elm_toolbar_item_state_unset(Elm_Object_Item *it)
3183 elm_toolbar_item_state_set(it, NULL);
3186 EAPI Elm_Toolbar_Item_State *
3187 elm_toolbar_item_state_get(const Elm_Object_Item *it)
3189 Elm_Toolbar_Item *item = (Elm_Toolbar_Item *)it;
3191 ELM_TOOLBAR_ITEM_CHECK_OR_RETURN(it, NULL);
3193 if ((!item->states) || (!item->current_state)) return NULL;
3194 if (item->current_state == item->states) return NULL;
3196 return eina_list_data_get(item->current_state);
3199 EAPI Elm_Toolbar_Item_State *
3200 elm_toolbar_item_state_next(Elm_Object_Item *it)
3202 Eina_List *next_state;
3203 Elm_Toolbar_Item *item = (Elm_Toolbar_Item *)it;
3205 ELM_TOOLBAR_ITEM_CHECK_OR_RETURN(it, NULL);
3207 if (!item->states) return NULL;
3209 next_state = eina_list_next(item->current_state);
3211 next_state = eina_list_next(item->states);
3212 return eina_list_data_get(next_state);
3215 EAPI Elm_Toolbar_Item_State *
3216 elm_toolbar_item_state_prev(Elm_Object_Item *it)
3218 Eina_List *prev_state;
3219 Elm_Toolbar_Item *item = (Elm_Toolbar_Item *)it;
3221 ELM_TOOLBAR_ITEM_CHECK_OR_RETURN(it, NULL);
3223 if (!item->states) return NULL;
3225 prev_state = eina_list_prev(item->current_state);
3226 if ((!prev_state) || (prev_state == item->states))
3227 prev_state = eina_list_last(item->states);
3228 return eina_list_data_get(prev_state);
3232 elm_toolbar_icon_order_lookup_set(Evas_Object *obj,
3233 Elm_Icon_Lookup_Order order)
3235 Elm_Toolbar_Item *it;
3237 ELM_TOOLBAR_CHECK(obj);
3238 ELM_TOOLBAR_DATA_GET(obj, sd);
3240 if (sd->lookup_order == order) return;
3241 sd->lookup_order = order;
3242 EINA_INLIST_FOREACH(sd->items, it)
3243 elm_icon_order_lookup_set(it->icon, order);
3245 elm_icon_order_lookup_set(sd->more_item->icon, order);
3248 EAPI Elm_Icon_Lookup_Order
3249 elm_toolbar_icon_order_lookup_get(const Evas_Object *obj)
3251 ELM_TOOLBAR_CHECK(obj) ELM_ICON_LOOKUP_THEME_FDO;
3252 ELM_TOOLBAR_DATA_GET(obj, sd);
3254 return sd->lookup_order;
3258 elm_toolbar_horizontal_set(Evas_Object *obj,
3259 Eina_Bool horizontal)
3261 ELM_TOOLBAR_CHECK(obj);
3262 ELM_TOOLBAR_DATA_GET(obj, sd);
3264 horizontal = !!horizontal;
3265 if (!horizontal == sd->vertical) return;
3266 sd->vertical = !horizontal;
3268 evas_object_size_hint_align_set(sd->bx, 0.5, sd->align);
3270 evas_object_size_hint_align_set(sd->bx, sd->align, 0.5);
3276 elm_toolbar_horizontal_get(const Evas_Object *obj)
3278 ELM_TOOLBAR_CHECK(obj) EINA_FALSE;
3279 ELM_TOOLBAR_DATA_GET(obj, sd);
3281 return !sd->vertical;
3285 elm_toolbar_items_count(const Evas_Object *obj)
3287 ELM_TOOLBAR_CHECK(obj) 0;
3288 ELM_TOOLBAR_DATA_GET(obj, sd);
3290 return sd->item_count;
3294 elm_toolbar_standard_priority_set(Evas_Object *obj,
3297 ELM_TOOLBAR_CHECK(obj);
3298 ELM_TOOLBAR_DATA_GET(obj, sd);
3300 if (sd->standard_priority == priority) return;
3301 sd->standard_priority = priority;
3302 _resize_cb(obj, NULL, NULL, NULL);
3306 elm_toolbar_standard_priority_get(const Evas_Object *obj)
3308 ELM_TOOLBAR_CHECK(obj) 0;
3309 ELM_TOOLBAR_DATA_GET(obj, sd);
3311 return sd->standard_priority;
3315 elm_toolbar_select_mode_set(Evas_Object *obj,
3316 Elm_Object_Select_Mode mode)
3318 ELM_TOOLBAR_CHECK(obj);
3319 ELM_TOOLBAR_DATA_GET(obj, sd);
3321 if (mode >= ELM_OBJECT_SELECT_MODE_MAX)
3324 if (sd->select_mode == mode) return;
3326 if ((mode == ELM_OBJECT_SELECT_MODE_ALWAYS) &&
3327 (sd->select_mode != ELM_OBJECT_SELECT_MODE_ALWAYS) &&
3329 _item_select(ELM_TOOLBAR_ITEM_FROM_INLIST(sd->items));
3331 if (sd->select_mode != mode)
3332 sd->select_mode = mode;
3335 EAPI Elm_Object_Select_Mode
3336 elm_toolbar_select_mode_get(const Evas_Object *obj)
3338 ELM_TOOLBAR_CHECK(obj) ELM_OBJECT_SELECT_MODE_MAX;
3339 ELM_TOOLBAR_DATA_GET(obj, sd);
3341 return sd->select_mode;
3345 elm_toolbar_reorder_mode_set(Evas_Object *obj,
3346 Eina_Bool reorder_mode)
3348 ELM_TOOLBAR_CHECK(obj);
3349 ELM_TOOLBAR_DATA_GET(obj, sd);
3351 sd->reorder_mode = !!reorder_mode;
3355 elm_toolbar_reorder_mode_get(const Evas_Object *obj)
3357 ELM_TOOLBAR_CHECK(obj) EINA_FALSE;
3358 ELM_TOOLBAR_DATA_GET(obj, sd);
3360 return sd->reorder_mode;
3364 elm_toolbar_item_show(Elm_Object_Item *it, Elm_Toolbar_Item_Scrollto_Type type)
3366 Evas_Coord x, y, w, h;
3367 Elm_Toolbar_Item *item = (Elm_Toolbar_Item *)it;
3369 ELM_TOOLBAR_ITEM_CHECK_OR_RETURN(it);
3370 ELM_TOOLBAR_DATA_GET(WIDGET(item), sd);
3372 if (_elm_toolbar_item_coordinates_calc(it, type, &x, &y, &w, &h))
3373 sd->s_iface->content_region_show(WIDGET(item), x, y, w, h);
3377 elm_toolbar_item_bring_in(Elm_Object_Item *it, Elm_Toolbar_Item_Scrollto_Type type)
3379 Evas_Coord x, y, w, h;
3380 Elm_Toolbar_Item *item = (Elm_Toolbar_Item *)it;
3382 ELM_TOOLBAR_ITEM_CHECK_OR_RETURN(it);
3383 ELM_TOOLBAR_DATA_GET(WIDGET(item), sd);
3385 if (_elm_toolbar_item_coordinates_calc(it, type, &x, &y, &w, &h))
3386 sd->s_iface->region_bring_in(WIDGET(item), x, y, w, h);