3 typedef struct _E_Widget_Data E_Widget_Data;
4 typedef struct _Item Item;
7 Evas_Object *o_base, *o_box;
10 Eina_Bool scrollable : 1;
11 Eina_Bool focus_steal : 1;
16 Evas_Object *o_toolbar, *o_base, *o_icon;
17 void (*func) (void *data1, void *data2);
18 const void *data1, *data2;
19 Eina_Bool selected : 1;
22 static void _e_wid_del_hook(Evas_Object *obj);
23 static void _e_wid_focus_hook(Evas_Object *obj);
24 static void _e_wid_focus_steal(void *data, Evas *e, Evas_Object *obj, void *event_info);
25 static void _e_wid_disable_hook(Evas_Object *obj);
26 static void _e_wid_signal_cb1(void *data, Evas_Object *obj, const char *emission, const char *source);
27 static void _e_wid_cb_scrollframe_resize(void *data, Evas *e, Evas_Object *obj, void *event_info);
28 static void _e_wid_cb_key_down(void *data, Evas *evas, Evas_Object *obj, void *event_info);
29 static void _e_wid_signal_prev(void *data, Evas_Object *obj, const char *emission, const char *source);
30 static void _e_wid_signal_next(void *data, Evas_Object *obj, const char *emission, const char *source);
31 static void _item_show(Item *it);
32 static void _item_select(Item *it);
33 static void _item_unselect(Item *it);
35 /* local subsystem functions */
37 /* externally accessible functions */
39 e_widget_toolbar_add(Evas *evas, int icon_w, int icon_h)
43 Evas_Coord mw = 0, mh = 0;
45 obj = e_widget_add(evas);
47 e_widget_del_hook_set(obj, _e_wid_del_hook);
48 e_widget_focus_hook_set(obj, _e_wid_focus_hook);
49 e_widget_disable_hook_set(obj, _e_wid_disable_hook);
50 wd = E_NEW(E_Widget_Data, 1);
51 e_widget_data_set(obj, wd);
54 wd->focus_steal = EINA_TRUE;
56 o = e_scrollframe_add(evas);
61 e_scrollframe_custom_theme_set(o, "base/theme/widgets", "e/widgets/toolbar");
62 e_scrollframe_single_dir_set(o, 1);
63 e_scrollframe_policy_set(o, E_SCROLLFRAME_POLICY_AUTO,
64 E_SCROLLFRAME_POLICY_OFF);
65 e_scrollframe_thumbscroll_force(o, 1);
66 evas_object_event_callback_add(o, EVAS_CALLBACK_RESIZE,
67 _e_wid_cb_scrollframe_resize, obj);
68 evas_object_event_callback_add(e_scrollframe_edje_object_get(wd->o_base),
69 EVAS_CALLBACK_MOUSE_DOWN,
70 _e_wid_focus_steal, obj);
71 evas_object_event_callback_add(obj, EVAS_CALLBACK_KEY_DOWN,
72 _e_wid_cb_key_down, obj);
74 edje_object_signal_callback_add(e_scrollframe_edje_object_get(o),
76 _e_wid_signal_prev, obj);
77 edje_object_signal_callback_add(e_scrollframe_edje_object_get(o),
79 _e_wid_signal_next, obj);
81 e_widget_sub_object_add(obj, o);
82 e_widget_resize_object_set(obj, o);
85 e_box_orientation_set(o, 1);
86 e_box_homogenous_set(o, 1);
87 e_scrollframe_child_set(wd->o_base, o);
88 e_widget_sub_object_add(obj, o);
91 edje_object_size_min_calc(e_scrollframe_edje_object_get(wd->o_base),
93 e_widget_size_min_set(obj, mw, mh);
98 EAPI const Eina_List *
99 e_widget_toolbar_items_get(Evas_Object *obj)
102 if (!obj) return NULL;
103 if (!(wd = e_widget_data_get(obj))) return NULL;
108 e_widget_toolbar_items_count(Evas_Object *obj)
112 if (!(wd = e_widget_data_get(obj))) return 0;
113 return eina_list_count(wd->items);
117 e_widget_toolbar_item_label_get(void *item)
120 if (!it) return NULL;
121 return edje_object_part_text_get(it->o_base, "e.text.label");
125 e_widget_toolbar_item_append(Evas_Object *obj, Evas_Object *icon, const char *label, void (*func) (void *data1, void *data2), const void *data1, const void *data2)
130 Evas_Coord mw = 0, mh = 0, vw = 0, vh = 0;
133 if (!(wd = e_widget_data_get(obj))) return;
134 o = edje_object_add(evas_object_evas_get(obj));
135 e_theme_edje_object_set(o, "base/theme/widgets",
136 "e/widgets/toolbar/item");
144 wd->items = eina_list_append(wd->items, it);
146 edje_object_signal_callback_add(o, "e,action,click", "e",
147 _e_wid_signal_cb1, it);
148 edje_extern_object_min_size_set(icon, wd->icon_w, wd->icon_h);
149 edje_object_part_swallow(o, "e.swallow.icon", icon);
150 evas_object_show(icon);
151 edje_object_part_text_set(o, "e.text.label", label);
152 edje_object_size_min_calc(o, &mw, &mh);
153 e_widget_sub_object_add(obj, o);
154 e_box_pack_end(wd->o_box, o);
155 e_box_pack_options_set(o,
158 0.5, 0.5, /* align */
163 e_box_size_min_get(wd->o_box, &mw, &mh);
164 evas_object_resize(wd->o_box, mw, mh);
165 evas_object_resize(wd->o_base, 500, 500);
166 e_scrollframe_child_viewport_size_get(wd->o_base, &vw, &vh);
168 e_widget_size_min_set(obj, 500 - vw, mh + (500 - vh));
170 e_widget_size_min_set(obj, mw + (500 - vw), mh + (500 - vh));
171 evas_object_resize(wd->o_box, mw, mh);
175 e_widget_toolbar_item_remove(Evas_Object *obj, int num)
181 if (!(wd = e_widget_data_get(obj))) return;
182 it = eina_list_nth(wd->items, num);
185 evas_object_del(it->o_base);
186 if (it->o_icon) evas_object_del(it->o_icon);
187 wd->items = eina_list_remove(wd->items, it);
193 e_widget_toolbar_item_select(Evas_Object *obj, int num)
195 E_Widget_Data *wd = NULL;
201 if (!(wd = e_widget_data_get(obj))) return;
202 EINA_LIST_FOREACH(wd->items, l, it)
206 if (!it->selected) _item_select(it);
210 if (it->selected) _item_unselect(it);
217 e_widget_toolbar_item_label_set(Evas_Object *obj, int num, const char *label)
219 E_Widget_Data *wd = NULL;
223 if (!(wd = e_widget_data_get(obj))) return;
224 it = eina_list_nth(wd->items, num);
229 edje_object_part_text_set(it->o_base, "e.text.label", label);
230 edje_object_size_min_calc(it->o_base, &mw, &mh);
231 e_box_pack_options_set(it->o_base,
234 0.5, 0.5, /* align */
242 e_widget_toolbar_scrollable_set(Evas_Object *obj, Eina_Bool scrollable)
245 Evas_Coord mw = 0, mh = 0, vw = 0, vh = 0;
248 if (!(wd = e_widget_data_get(obj))) return;
249 wd->scrollable = scrollable;
250 e_box_size_min_get(wd->o_box, &mw, &mh);
251 evas_object_resize(wd->o_box, mw, mh);
252 evas_object_resize(wd->o_base, 500, 500);
253 e_scrollframe_child_viewport_size_get(wd->o_base, &vw, &vh);
255 e_widget_size_min_set(obj, 500 - vw, mh + (500 - vh));
257 e_widget_size_min_set(obj, mw + (500 - vw), mh + (500 - vh));
258 evas_object_resize(wd->o_box, mw, mh);
262 e_widget_toolbar_focus_steal_set(Evas_Object *obj, Eina_Bool steal)
267 if (!(wd = e_widget_data_get(obj))) return;
268 if (wd->focus_steal == steal) return;
271 evas_object_event_callback_add(e_scrollframe_edje_object_get(wd->o_base),
272 EVAS_CALLBACK_MOUSE_DOWN,
273 _e_wid_focus_steal, obj);
274 wd->focus_steal = EINA_TRUE;
278 evas_object_event_callback_del(e_scrollframe_edje_object_get(wd->o_base),
279 EVAS_CALLBACK_MOUSE_DOWN,
281 wd->focus_steal = EINA_FALSE;
286 e_widget_toolbar_clear(Evas_Object *obj)
288 E_Widget_Data *wd = NULL;
292 if (!(wd = e_widget_data_get(obj))) return;
293 EINA_LIST_FREE(wd->items, it)
295 evas_object_del(it->o_base);
296 if (it->o_icon) evas_object_del(it->o_icon);
302 e_widget_toolbar_item_selected_get(Evas_Object *obj)
304 E_Widget_Data *wd = NULL;
310 if (!(wd = e_widget_data_get(obj))) return 0;
311 EINA_LIST_FOREACH(wd->items, l, it)
313 if (it->selected) return i;
319 /* local functions */
321 _e_wid_del_hook(Evas_Object *obj)
327 if (!(wd = e_widget_data_get(obj))) return;
328 EINA_LIST_FREE(wd->items, it)
330 evas_object_del(it->o_base);
331 if (it->o_icon) evas_object_del(it->o_icon);
338 _e_wid_disable_hook(Evas_Object *obj)
343 if (!(wd = e_widget_data_get(obj))) return;
344 if (e_widget_disabled_get(obj))
345 edje_object_signal_emit(e_scrollframe_edje_object_get(wd->o_base),
346 "e,state,disabled", "e");
348 edje_object_signal_emit(e_scrollframe_edje_object_get(wd->o_base),
349 "e,state,enabled", "e");
353 _e_wid_signal_cb1(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
359 if (!(it = data)) return;
360 if (it->selected) return;
361 wd = e_widget_data_get(it->o_toolbar);
362 EINA_LIST_FOREACH(wd->items, l, it2)
374 _e_wid_signal_prev(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
378 Item *it = NULL, *it2 = NULL;
380 if (!(wd = e_widget_data_get(data))) return;
381 if ((!wd->o_base) || (!wd->o_box)) return;
382 EINA_LIST_FOREACH(wd->items, l, it)
386 l2 = eina_list_prev(l);
387 if (l2) it2 = eina_list_data_get(l2);
391 if ((it) && (it2) && (it != it2))
399 _e_wid_signal_next(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
403 Item *it = NULL, *it2 = NULL;
405 if (!(wd = e_widget_data_get(data))) return;
406 if ((!wd->o_base) || (!wd->o_box)) return;
407 EINA_LIST_FOREACH(wd->items, l, it)
411 l2 = eina_list_next(l);
412 if (l2) it2 = eina_list_data_get(l2);
416 if ((it) && (it2) && (it != it2))
424 _e_wid_cb_scrollframe_resize(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
427 Evas_Coord mw, mh, vw, vh, w, h;
431 if (!(wd = e_widget_data_get(data))) return;
432 if ((!wd->o_base) || (!wd->o_box)) return;
434 e_scrollframe_child_viewport_size_get(wd->o_base, &vw, &vh);
435 e_box_size_min_get(wd->o_box, &mw, &mh);
436 evas_object_geometry_get(wd->o_box, NULL, NULL, &w, &h);
439 if (w != vw) evas_object_resize(wd->o_box, vw, h);
441 EINA_LIST_FOREACH(wd->items, l, it)
452 _e_wid_cb_key_down(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
454 Evas_Event_Key_Down *ev;
457 Item *it = NULL, *it2 = NULL;
460 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
461 wd = e_widget_data_get(data);
462 if ((!strcmp(ev->keyname, "Up")) || (!strcmp(ev->keyname, "KP_Up")) ||
463 (!strcmp(ev->keyname, "Left")) || (!strcmp(ev->keyname, "KP_Left")))
465 EINA_LIST_FOREACH(wd->items, l, it)
469 l2 = eina_list_prev(l);
470 if (l2) it2 = eina_list_data_get(l2);
475 else if ((!strcmp(ev->keyname, "Down")) ||
476 (!strcmp(ev->keyname, "KP_Down")) ||
477 (!strcmp(ev->keyname, "Right")) ||
478 (!strcmp(ev->keyname, "KP_Right")))
480 EINA_LIST_FOREACH(wd->items, l, it)
484 l2 = eina_list_next(l);
485 if (l2) it2 = eina_list_data_get(l2);
490 else if ((!strcmp(ev->keyname, "Home")) ||
491 (!strcmp(ev->keyname, "KP_Home")))
493 EINA_LIST_FOREACH(wd->items, l, it)
497 it2 = eina_list_data_get(wd->items);
502 else if ((!strcmp(ev->keyname, "End")) || (!strcmp(ev->keyname, "KP_End")))
504 EINA_LIST_FOREACH(wd->items, l, it)
508 it2 = eina_list_data_get(eina_list_last(wd->items));
513 if ((it) && (it2) && (it != it2))
521 _e_wid_focus_hook(Evas_Object *obj)
526 if (!(wd = e_widget_data_get(obj))) return;
527 if (e_widget_focus_get(obj))
529 edje_object_signal_emit(wd->o_base, "e,state,focused", "e");
530 evas_object_focus_set(obj, EINA_TRUE);
534 edje_object_signal_emit(wd->o_base, "e,state,unfocused", "e");
535 evas_object_focus_set(obj, EINA_FALSE);
540 _e_wid_focus_steal(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
542 e_widget_focus_steal(data);
549 Evas_Coord x, y, w, h, bx, by;
551 wd = e_widget_data_get(it->o_toolbar);
552 evas_object_geometry_get(wd->o_box, &bx, &by, NULL, NULL);
553 evas_object_geometry_get(it->o_base, &x, &y, &w, &h);
554 e_scrollframe_child_region_show(wd->o_base, x - bx, y - by, w, h);
558 _item_select(Item *it)
560 it->selected = EINA_TRUE;
561 edje_object_signal_emit(it->o_base, "e,state,selected", "e");
564 if (strcmp(evas_object_type_get(it->o_icon), "e_icon"))
565 edje_object_signal_emit(it->o_icon, "e,state,selected", "e");
567 e_icon_selected_set(it->o_icon, EINA_TRUE);
570 if (it->func) it->func((void *)it->data1, (void *)it->data2);
574 _item_unselect(Item *it)
576 it->selected = EINA_FALSE;
577 edje_object_signal_emit(it->o_base, "e,state,unselected", "e");
580 if (strcmp(evas_object_type_get(it->o_icon), "e_icon"))
581 edje_object_signal_emit(it->o_icon, "e,state,unselected", "e");
583 e_icon_selected_set(it->o_icon, EINA_FALSE);