2009-08-24 21:33:16 -07:00
|
|
|
#include "e_mod_main.h"
|
|
|
|
|
|
|
|
typedef struct _Tab Tab;
|
|
|
|
|
|
|
|
struct _Tab
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
Tab_View *tab_view;
|
|
|
|
Evry_Plugin *plugin;
|
|
|
|
Evas_Object *o_tab;
|
2009-08-25 14:59:46 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
int cw, mw;
|
2009-08-24 21:33:16 -07:00
|
|
|
};
|
|
|
|
|
2010-04-17 11:28:01 -07:00
|
|
|
static void _tabs_update(Tab_View *v);
|
2010-05-17 16:15:00 -07:00
|
|
|
static void _plugin_select(Tab_View *v, Evry_Plugin *p);
|
|
|
|
static void _plugin_next(Tab_View *v);
|
|
|
|
static void _plugin_prev(Tab_View *v);
|
|
|
|
|
2010-06-24 09:19:12 -07:00
|
|
|
static Eina_Bool
|
2010-04-17 10:50:27 -07:00
|
|
|
_timer_cb(void *data)
|
|
|
|
{
|
2010-04-17 11:28:01 -07:00
|
|
|
Tab_View *v = data;
|
2010-04-23 17:54:12 -07:00
|
|
|
|
2010-04-17 11:28:01 -07:00
|
|
|
_tabs_update(v);
|
2010-04-17 10:50:27 -07:00
|
|
|
|
2010-04-17 11:28:01 -07:00
|
|
|
v->timer = NULL;
|
2010-06-24 09:19:12 -07:00
|
|
|
return ECORE_CALLBACK_CANCEL;
|
2010-04-17 10:50:27 -07:00
|
|
|
}
|
|
|
|
|
2009-08-24 21:33:16 -07:00
|
|
|
static void
|
2015-03-18 15:09:09 -07:00
|
|
|
_tab_cb_down(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
|
2009-08-24 21:33:16 -07:00
|
|
|
{
|
2010-05-17 16:15:00 -07:00
|
|
|
/* Evas_Event_Mouse_Down *ev = event_info; */
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2015-03-18 15:09:09 -07:00
|
|
|
_tab_cb_up(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
|
2010-05-17 16:15:00 -07:00
|
|
|
{
|
|
|
|
Evas_Event_Mouse_Up *ev = event_info;
|
|
|
|
Tab *tab = data;
|
|
|
|
Tab_View *v = tab->tab_view;
|
|
|
|
|
2010-06-03 05:58:03 -07:00
|
|
|
if (ev->button != 1)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (tab->plugin)
|
2010-05-17 16:15:00 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
_plugin_select(v, tab->plugin);
|
|
|
|
v->view->update(v->view);
|
2010-05-17 16:15:00 -07:00
|
|
|
}
|
2010-06-03 05:58:03 -07:00
|
|
|
else
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
evry_browse_back(v->state->selector);
|
2010-06-03 05:58:03 -07:00
|
|
|
}
|
2010-05-17 16:15:00 -07:00
|
|
|
}
|
2011-11-29 19:32:54 -08:00
|
|
|
|
2010-05-17 16:15:00 -07:00
|
|
|
static void
|
2015-03-18 15:09:09 -07:00
|
|
|
_tabs_cb_wheel(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
|
2010-05-17 16:15:00 -07:00
|
|
|
{
|
|
|
|
Evas_Event_Mouse_Wheel *ev = event_info;
|
|
|
|
Tab_View *v = data;
|
2009-08-24 21:33:16 -07:00
|
|
|
|
2010-05-17 16:15:00 -07:00
|
|
|
if (ev->z > 0)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
_plugin_next(v);
|
|
|
|
v->view->update(v->view);
|
2010-05-17 16:15:00 -07:00
|
|
|
}
|
|
|
|
else if (ev->z < 0)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
_plugin_prev(v);
|
|
|
|
v->view->update(v->view);
|
2010-05-17 16:15:00 -07:00
|
|
|
}
|
|
|
|
}
|
2011-11-29 19:32:54 -08:00
|
|
|
|
2010-06-03 05:58:03 -07:00
|
|
|
static Tab *
|
|
|
|
_add_tab(Tab_View *v, Evry_Plugin *p)
|
|
|
|
{
|
|
|
|
Evas_Object *o;
|
|
|
|
Tab *tab = E_NEW(Tab, 1);
|
|
|
|
tab->plugin = p;
|
|
|
|
tab->tab_view = v;
|
|
|
|
o = edje_object_add(v->evas);
|
|
|
|
if (p)
|
2010-07-08 14:04:57 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
e_theme_edje_object_set(o, "base/theme/modules/everything",
|
|
|
|
"e/modules/everything/tab_item");
|
|
|
|
edje_object_part_text_set(o, "e.text.label", EVRY_ITEM(p)->label);
|
2010-07-08 14:04:57 -07:00
|
|
|
}
|
2010-06-03 05:58:03 -07:00
|
|
|
else
|
2010-07-08 14:04:57 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
e_theme_edje_object_set(o, "base/theme/modules/everything",
|
|
|
|
"e/modules/everything/tab_item/back");
|
|
|
|
edje_object_part_text_set(o, "e.text.label", _("Back"));
|
2010-07-08 14:04:57 -07:00
|
|
|
}
|
2010-06-03 05:58:03 -07:00
|
|
|
|
|
|
|
evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN,
|
2011-11-29 19:32:54 -08:00
|
|
|
_tab_cb_down, tab);
|
2010-06-03 05:58:03 -07:00
|
|
|
evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_UP,
|
2011-11-29 19:32:54 -08:00
|
|
|
_tab_cb_up, tab);
|
2010-06-03 05:58:03 -07:00
|
|
|
tab->o_tab = o;
|
|
|
|
|
|
|
|
edje_object_size_min_calc(o, &tab->cw, NULL);
|
2011-11-29 19:32:54 -08:00
|
|
|
edje_object_size_min_get(o, &tab->mw, NULL);
|
2010-06-03 05:58:03 -07:00
|
|
|
|
|
|
|
v->tabs = eina_list_append(v->tabs, tab);
|
|
|
|
|
|
|
|
return tab;
|
|
|
|
}
|
2010-05-17 16:15:00 -07:00
|
|
|
|
|
|
|
static void
|
|
|
|
_tabs_update(Tab_View *v)
|
|
|
|
{
|
2010-05-12 11:44:26 -07:00
|
|
|
Eina_List *l, *ll, *plugins;
|
2009-08-24 21:33:16 -07:00
|
|
|
Evry_Plugin *p;
|
|
|
|
const Evry_State *s = v->state;
|
|
|
|
Tab *tab;
|
2012-12-03 06:27:18 -08:00
|
|
|
Evas_Coord w, x, mw;
|
2009-08-24 21:33:16 -07:00
|
|
|
Evas_Object *o;
|
2011-01-23 14:34:28 -08:00
|
|
|
unsigned int cur = 0, i = 0;
|
2010-05-12 12:58:40 -07:00
|
|
|
|
2010-06-12 18:05:24 -07:00
|
|
|
if (s->delete_me)
|
|
|
|
return;
|
2011-11-29 19:32:54 -08:00
|
|
|
|
2010-04-17 10:50:27 -07:00
|
|
|
evas_object_geometry_get(v->o_tabs, &x, NULL, &w, NULL);
|
|
|
|
|
2010-04-17 23:26:50 -07:00
|
|
|
if (!w && !v->timer)
|
|
|
|
{
|
2017-02-03 13:52:28 -08:00
|
|
|
v->timer = ecore_timer_loop_add(0.001, _timer_cb, v);
|
2011-11-29 19:32:54 -08:00
|
|
|
return;
|
2010-04-17 23:26:50 -07:00
|
|
|
}
|
2010-05-17 16:15:00 -07:00
|
|
|
|
2009-08-24 21:33:16 -07:00
|
|
|
/* remove tabs for not active plugins */
|
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
EINA_LIST_FOREACH (v->tabs, l, tab)
|
2009-08-24 21:33:16 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
if (!tab->plugin)
|
|
|
|
continue;
|
2010-06-03 05:58:03 -07:00
|
|
|
|
2015-01-01 14:29:25 -08:00
|
|
|
elm_box_unpack(v->o_tabs, tab->o_tab);
|
2011-11-29 19:32:54 -08:00
|
|
|
evas_object_hide(tab->o_tab);
|
2009-08-24 21:33:16 -07:00
|
|
|
}
|
|
|
|
|
2010-06-03 05:58:03 -07:00
|
|
|
if (s->selector->states->next)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
cur++;
|
|
|
|
i++;
|
|
|
|
|
|
|
|
if (!(tab = eina_list_data_get(v->tabs)))
|
|
|
|
{
|
|
|
|
tab = _add_tab(v, NULL);
|
|
|
|
|
|
|
|
o = tab->o_tab;
|
|
|
|
evas_object_show(o);
|
2012-12-03 04:06:28 -08:00
|
|
|
mw = tab->cw;
|
|
|
|
if (mw < tab->mw) mw = tab->mw;
|
2015-01-01 14:29:25 -08:00
|
|
|
E_EXPAND(o);
|
|
|
|
E_FILL(o);
|
|
|
|
evas_object_size_hint_min_set(o, mw, 1);
|
|
|
|
elm_box_pack_end(v->o_tabs, o);
|
2011-11-29 19:32:54 -08:00
|
|
|
}
|
2010-06-03 05:58:03 -07:00
|
|
|
}
|
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
for (l = s->cur_plugins; l; l = l->next, cur++)
|
2010-05-12 11:44:26 -07:00
|
|
|
if (l->data == s->plugin) break;
|
|
|
|
|
|
|
|
if (cur > 2)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
if ((cur + 1) == eina_list_count(s->cur_plugins))
|
|
|
|
plugins = eina_list_nth_list(s->cur_plugins, cur - 3);
|
|
|
|
else
|
|
|
|
plugins = eina_list_nth_list(s->cur_plugins, cur - 2);
|
2010-05-12 11:44:26 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
plugins = s->cur_plugins;
|
2010-05-12 11:44:26 -07:00
|
|
|
}
|
2010-05-12 12:58:40 -07:00
|
|
|
|
2009-08-24 21:33:16 -07:00
|
|
|
/* show/update tabs of active plugins */
|
2011-11-29 19:32:54 -08:00
|
|
|
EINA_LIST_FOREACH (plugins, l, p)
|
2009-08-24 21:33:16 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
EINA_LIST_FOREACH (v->tabs, ll, tab)
|
|
|
|
if (tab->plugin == p) break;
|
2009-08-24 21:33:16 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
if (!tab && !(tab = _add_tab(v, p)))
|
|
|
|
continue;
|
2009-08-24 21:33:16 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
o = tab->o_tab;
|
|
|
|
evas_object_show(o);
|
2012-12-03 06:27:18 -08:00
|
|
|
mw = tab->cw;
|
|
|
|
if (mw < tab->mw) mw = tab->mw;
|
2015-01-01 14:29:25 -08:00
|
|
|
E_EXPAND(o);
|
|
|
|
E_FILL(o);
|
|
|
|
evas_object_size_hint_min_set(o, mw, 1);
|
|
|
|
elm_box_pack_end(v->o_tabs, o);
|
2010-06-03 05:58:03 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
if (s->plugin == p)
|
|
|
|
edje_object_signal_emit(o, "e,state,selected", "e");
|
|
|
|
else
|
|
|
|
edje_object_signal_emit(o, "e,state,unselected", "e");
|
2010-05-12 11:44:26 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
if (++i > 3) break;
|
2009-08-24 21:33:16 -07:00
|
|
|
}
|
|
|
|
|
2015-01-01 14:29:25 -08:00
|
|
|
elm_box_align_set(v->o_tabs, 0.0, 0.5);
|
2009-08-24 21:33:16 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_tabs_clear(Tab_View *v)
|
|
|
|
{
|
|
|
|
Eina_List *l;
|
|
|
|
Tab *tab;
|
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
EINA_LIST_FOREACH (v->tabs, l, tab)
|
2009-08-24 21:33:16 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
if (!tab->plugin)
|
|
|
|
continue;
|
2010-06-03 05:58:03 -07:00
|
|
|
|
2015-01-01 14:29:25 -08:00
|
|
|
elm_box_unpack(v->o_tabs, tab->o_tab);
|
2011-11-29 19:32:54 -08:00
|
|
|
evas_object_hide(tab->o_tab);
|
2009-08-24 21:33:16 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_plugin_select(Tab_View *v, Evry_Plugin *p)
|
|
|
|
{
|
2010-05-19 07:44:36 -07:00
|
|
|
evry_plugin_select(p);
|
2009-08-24 21:33:16 -07:00
|
|
|
|
|
|
|
_tabs_update(v);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_plugin_next(Tab_View *v)
|
|
|
|
{
|
|
|
|
Eina_List *l;
|
|
|
|
Evry_Plugin *p = NULL;
|
|
|
|
const Evry_State *s = v->state;
|
|
|
|
|
|
|
|
if (!s->plugin) return;
|
|
|
|
|
|
|
|
l = eina_list_data_find_list(s->cur_plugins, s->plugin);
|
|
|
|
|
|
|
|
if (l && l->next)
|
|
|
|
p = l->next->data;
|
|
|
|
else if (s->plugin != s->cur_plugins->data)
|
|
|
|
p = s->cur_plugins->data;
|
|
|
|
|
|
|
|
if (p) _plugin_select(v, p);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_plugin_next_by_name(Tab_View *v, const char *key)
|
|
|
|
{
|
|
|
|
Eina_List *l;
|
|
|
|
Evry_Plugin *p, *first = NULL, *next = NULL;
|
|
|
|
int found = 0;
|
|
|
|
const Evry_State *s = v->state;
|
|
|
|
|
|
|
|
if (!s->plugin) return;
|
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
EINA_LIST_FOREACH (s->cur_plugins, l, p)
|
2009-08-24 21:33:16 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
/* if (!p)
|
|
|
|
* {
|
|
|
|
* // FIXME how can this happen?
|
|
|
|
* ERR("plugin == NULL");
|
|
|
|
* continue;
|
|
|
|
* } */
|
|
|
|
|
|
|
|
if (EVRY_ITEM(p)->label && (!strncasecmp(EVRY_ITEM(p)->label, key, 1)))
|
|
|
|
{
|
|
|
|
if (!first) first = p;
|
|
|
|
|
|
|
|
if (found && !next)
|
|
|
|
next = p;
|
|
|
|
}
|
|
|
|
if (p == s->plugin) found = 1;
|
2009-08-24 21:33:16 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
if (next)
|
|
|
|
p = next;
|
|
|
|
else if (first != s->plugin)
|
|
|
|
p = first;
|
|
|
|
else
|
|
|
|
p = NULL;
|
|
|
|
|
|
|
|
if (p) _plugin_select(v, p);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_plugin_prev(Tab_View *v)
|
|
|
|
{
|
|
|
|
Eina_List *l;
|
|
|
|
Evry_Plugin *p = NULL;
|
|
|
|
const Evry_State *s = v->state;
|
|
|
|
|
|
|
|
if (!s->plugin) return;
|
|
|
|
|
|
|
|
l = eina_list_data_find_list(s->cur_plugins, s->plugin);
|
|
|
|
|
|
|
|
if (l && l->prev)
|
|
|
|
p = l->prev->data;
|
|
|
|
else
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
l = eina_list_last(s->cur_plugins);
|
|
|
|
if (s->plugin != l->data)
|
|
|
|
p = l->data;
|
2009-08-24 21:33:16 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
if (p) _plugin_select(v, p);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_tabs_key_down(Tab_View *v, const Ecore_Event_Key *ev)
|
|
|
|
{
|
|
|
|
const char *key = ev->key;
|
|
|
|
|
2010-04-23 14:18:23 -07:00
|
|
|
if (!v->state || !v->state->cur_plugins) return 0;
|
2010-04-23 17:54:12 -07:00
|
|
|
|
2010-06-01 08:45:01 -07:00
|
|
|
if (ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT)
|
2009-08-24 21:33:16 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
if (!strcmp(key, "Next"))
|
|
|
|
{
|
|
|
|
_plugin_next(v);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
else if (!strcmp(key, "Prior"))
|
|
|
|
{
|
|
|
|
_plugin_prev(v);
|
|
|
|
return 1;
|
|
|
|
}
|
2009-08-24 21:33:16 -07:00
|
|
|
}
|
|
|
|
else if (ev->modifiers & ECORE_EVENT_MODIFIER_CTRL)
|
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
if (!strcmp(key, "Left"))
|
|
|
|
{
|
|
|
|
_plugin_prev(v);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
else if (!strcmp(key, "Right"))
|
|
|
|
{
|
|
|
|
_plugin_next(v);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
else if (ev->compose)
|
|
|
|
{
|
|
|
|
_plugin_next_by_name(v, key);
|
|
|
|
return 1;
|
|
|
|
}
|
2009-08-24 21:33:16 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2010-05-22 01:05:25 -07:00
|
|
|
Tab_View *
|
2015-01-01 14:29:25 -08:00
|
|
|
evry_tab_view_new(Evry_View *view, const Evry_State *s, Evas_Object *parent)
|
2009-08-24 21:33:16 -07:00
|
|
|
{
|
|
|
|
Tab_View *v;
|
|
|
|
Evas_Object *o;
|
|
|
|
|
|
|
|
v = E_NEW(Tab_View, 1);
|
2011-11-29 19:32:54 -08:00
|
|
|
v->update = &_tabs_update;
|
|
|
|
v->clear = &_tabs_clear;
|
2009-08-24 21:33:16 -07:00
|
|
|
v->key_down = &_tabs_key_down;
|
2010-05-17 16:15:00 -07:00
|
|
|
v->view = view;
|
2009-08-24 21:33:16 -07:00
|
|
|
v->state = s;
|
2010-04-23 17:54:12 -07:00
|
|
|
|
2015-01-01 14:29:25 -08:00
|
|
|
v->evas = evas_object_evas_get(parent);
|
2015-01-20 16:20:04 -08:00
|
|
|
o = elm_box_add(e_win_evas_object_win_get(parent));
|
2015-01-01 14:29:25 -08:00
|
|
|
elm_box_horizontal_set(o, 1);
|
|
|
|
elm_box_homogeneous_set(o, 1);
|
2010-05-17 16:15:00 -07:00
|
|
|
evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_WHEEL,
|
2011-11-29 19:32:54 -08:00
|
|
|
_tabs_cb_wheel, v);
|
2009-08-24 21:33:16 -07:00
|
|
|
v->o_tabs = o;
|
|
|
|
|
|
|
|
return v;
|
|
|
|
}
|
|
|
|
|
2010-05-22 01:05:25 -07:00
|
|
|
void
|
2009-08-24 21:33:16 -07:00
|
|
|
evry_tab_view_free(Tab_View *v)
|
|
|
|
{
|
|
|
|
Tab *tab;
|
2010-04-23 17:54:12 -07:00
|
|
|
|
2011-11-29 19:32:54 -08:00
|
|
|
EINA_LIST_FREE (v->tabs, tab)
|
2009-08-24 21:33:16 -07:00
|
|
|
{
|
2011-11-29 19:32:54 -08:00
|
|
|
evas_object_del(tab->o_tab);
|
|
|
|
E_FREE(tab);
|
2009-08-24 21:33:16 -07:00
|
|
|
}
|
|
|
|
|
2010-04-23 17:54:12 -07:00
|
|
|
evas_object_del(v->o_tabs);
|
2009-08-24 21:33:16 -07:00
|
|
|
|
2010-04-17 05:40:28 -07:00
|
|
|
if (v->animator)
|
|
|
|
ecore_animator_del(v->animator);
|
2010-04-17 11:28:01 -07:00
|
|
|
|
|
|
|
if (v->timer)
|
2011-04-08 15:16:59 -07:00
|
|
|
ecore_timer_del(v->timer);
|
2010-04-23 17:54:12 -07:00
|
|
|
|
2009-08-24 21:33:16 -07:00
|
|
|
E_FREE(v);
|
|
|
|
}
|
2011-11-29 19:32:54 -08:00
|
|
|
|