1 #include "e_mod_main.h"
4 typedef struct _Tab Tab;
15 static void _tabs_update(Tab_View *v);
16 static void _plugin_select(Tab_View *v, Evry_Plugin *p);
17 static void _plugin_next(Tab_View *v);
18 static void _plugin_prev(Tab_View *v);
28 return ECORE_CALLBACK_CANCEL;
32 _tab_cb_down(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
34 /* Evas_Event_Mouse_Down *ev = event_info; */
38 _tab_cb_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
40 Evas_Event_Mouse_Up *ev = event_info;
42 Tab_View *v = tab->tab_view;
49 _plugin_select(v, tab->plugin);
50 v->view->update(v->view);
54 evry_browse_back(v->state->selector);
58 _tabs_cb_wheel(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
60 Evas_Event_Mouse_Wheel *ev = event_info;
66 v->view->update(v->view);
71 v->view->update(v->view);
75 _add_tab(Tab_View *v, Evry_Plugin *p)
78 Tab *tab = E_NEW(Tab, 1);
81 o = edje_object_add(v->evas);
84 e_theme_edje_object_set(o, "base/theme/modules/everything",
85 "e/modules/everything/tab_item");
86 edje_object_part_text_set(o, "e.text.label", EVRY_ITEM(p)->label);
90 e_theme_edje_object_set(o, "base/theme/modules/everything",
91 "e/modules/everything/tab_item/back");
92 edje_object_part_text_set(o, "e.text.label", _("Back"));
95 evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN,
97 evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_UP,
101 edje_object_size_min_calc(o, &tab->cw, NULL);
102 edje_object_size_min_get(o, &tab->mw, NULL);
104 v->tabs = eina_list_append(v->tabs, tab);
110 _tabs_update(Tab_View *v)
112 Eina_List *l, *ll, *plugins;
114 const Evry_State *s = v->state;
118 unsigned int cur = 0, i = 0;
123 edje_object_calc_force(v->o_tabs);
124 evas_object_geometry_get(v->o_tabs, &x, NULL, &w, NULL);
128 v->timer = ecore_timer_add(0.001, _timer_cb, v);
132 /* remove tabs for not active plugins */
133 e_box_freeze(v->o_tabs);
135 EINA_LIST_FOREACH(v->tabs, l, tab)
140 e_box_unpack(tab->o_tab);
141 evas_object_hide(tab->o_tab);
144 if (s->selector->states->next)
149 if (!(tab = eina_list_data_get(v->tabs)))
151 tab = _add_tab(v, NULL);
155 e_box_pack_end(v->o_tabs, o);
156 e_box_pack_options_set(o, 1, 1, 0, 0, 0.0, 0.5, w/4, 10, w/3, 9999);
160 for(l = s->cur_plugins; l; l = l->next, cur++)
161 if (l->data == s->plugin) break;
165 if ((cur + 1) == eina_list_count(s->cur_plugins))
166 plugins = eina_list_nth_list(s->cur_plugins, cur - 3);
168 plugins = eina_list_nth_list(s->cur_plugins, cur - 2);
172 plugins = s->cur_plugins;
175 /* show/update tabs of active plugins */
176 EINA_LIST_FOREACH(plugins, l, p)
178 EINA_LIST_FOREACH(v->tabs, ll, tab)
179 if (tab->plugin == p) break;
181 if (!tab && !(tab = _add_tab(v, p)))
186 e_box_pack_end(v->o_tabs, o);
187 e_box_pack_options_set(o, 1, 1, 0, 0, 0.0, 0.5, w/4, 10, w/3, 9999);
190 edje_object_signal_emit(o, "e,state,selected", "e");
192 edje_object_signal_emit(o, "e,state,unselected", "e");
197 e_box_align_set(v->o_tabs, 0.0, 0.5);
198 e_box_thaw(v->o_tabs);
203 _tabs_clear(Tab_View *v)
208 e_box_freeze(v->o_tabs);
209 EINA_LIST_FOREACH(v->tabs, l, tab)
214 e_box_unpack(tab->o_tab);
215 evas_object_hide(tab->o_tab);
217 e_box_thaw(v->o_tabs);
221 _plugin_select(Tab_View *v, Evry_Plugin *p)
223 evry_plugin_select(p);
229 _plugin_next(Tab_View *v)
232 Evry_Plugin *p = NULL;
233 const Evry_State *s = v->state;
235 if (!s->plugin) return;
237 l = eina_list_data_find_list(s->cur_plugins, s->plugin);
241 else if (s->plugin != s->cur_plugins->data)
242 p = s->cur_plugins->data;
244 if (p) _plugin_select(v, p);
248 _plugin_next_by_name(Tab_View *v, const char *key)
251 Evry_Plugin *p, *first = NULL, *next = NULL;
253 const Evry_State *s = v->state;
255 if (!s->plugin) return;
257 EINA_LIST_FOREACH(s->cur_plugins, l, p)
261 * // FIXME how can this happen?
262 * ERR("plugin == NULL");
266 if (EVRY_ITEM(p)->label && (!strncasecmp(EVRY_ITEM(p)->label, key, 1)))
268 if (!first) first = p;
273 if (p == s->plugin) found = 1;
278 else if (first != s->plugin)
283 if (p) _plugin_select(v, p);
287 _plugin_prev(Tab_View *v)
290 Evry_Plugin *p = NULL;
291 const Evry_State *s = v->state;
293 if (!s->plugin) return;
295 l = eina_list_data_find_list(s->cur_plugins, s->plugin);
301 l = eina_list_last(s->cur_plugins);
302 if (s->plugin != l->data)
306 if (p) _plugin_select(v, p);
311 _tabs_key_down(Tab_View *v, const Ecore_Event_Key *ev)
313 const char *key = ev->key;
315 if (!v->state || !v->state->cur_plugins) return 0;
317 if (ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT)
319 if (!strcmp(key, "Next"))
324 else if (!strcmp(key, "Prior"))
330 else if (ev->modifiers & ECORE_EVENT_MODIFIER_CTRL)
332 if (!strcmp(key, "Left"))
337 else if (!strcmp(key, "Right"))
342 else if (ev->compose)
344 _plugin_next_by_name(v, key);
354 evry_tab_view_new(Evry_View *view, const Evry_State *s, Evas *e)
359 v = E_NEW(Tab_View, 1);
360 v->update = &_tabs_update;
361 v->clear = &_tabs_clear;
362 v->key_down = &_tabs_key_down;
368 e_box_orientation_set(o, 1);
369 e_box_homogenous_set(o, 1);
370 evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_WHEEL,
378 evry_tab_view_free(Tab_View *v)
382 EINA_LIST_FREE(v->tabs, tab)
384 e_box_unpack(tab->o_tab);
385 evas_object_del(tab->o_tab);
389 evas_object_del(v->o_tabs);
392 ecore_animator_del(v->animator);
395 ecore_timer_del(v->timer);