make evrything handle mouse events.

- double click on item runs action, right click runs action and keep evry open
- same with selectors
- mouse down and move 150px browses that item. and back. TODO needs an indicator
- mouse wheel selects next/prev on plugin bar or selectors 



SVN revision: 48949
This commit is contained in:
Hannes Janetzek 2010-05-17 23:15:00 +00:00
parent 24188afa26
commit 5f9084b7d7
6 changed files with 952 additions and 686 deletions

File diff suppressed because it is too large Load Diff

View File

@ -36,6 +36,8 @@ struct _Evry_Window
Evry_Selector **sel_list;
int level;
int down_out;
};
struct _Evry_Selector
@ -120,9 +122,11 @@ struct _Evry_View
struct _Tab_View
{
Evas *evas;
const Evry_State *state;
Evry_View *view;
Evas *evas;
Evas_Object *o_tabs;
Eina_List *tabs;
@ -259,7 +263,7 @@ Evry_Type evry_type_register(const char *type);
const char *evry_type_get(Evry_Type type);
Tab_View *evry_tab_view_new(const Evry_State *s, Evas *e);
Tab_View *evry_tab_view_new(Evry_View *view, const Evry_State *s, Evas *e);
void evry_tab_view_free(Tab_View *v);
Eina_Bool view_thumb_init(void);
@ -295,6 +299,8 @@ void evry_history_free(void);
int evry_browse_item(Evry_Selector *sel);
int evry_browse_back(Evry_Selector *sel);
void evry_plugin_action(int finished);
extern Evry_History *evry_hist;
extern Evry_Config *evry_conf;

View File

@ -57,6 +57,7 @@ static void _evry_item_sel(Evry_State *s, Evry_Item *it);
static int _evry_cb_key_down(void *data, int type, void *event);
static int _evry_cb_selection_notify(void *data, int type, void *event);
static int _evry_cb_mouse(void *data, int type, void *event);
/* local subsystem globals */
@ -194,16 +195,39 @@ evry_show(E_Zone *zone, const char *params)
win->handlers = eina_list_append
(win->handlers, ecore_event_handler_add
(ECORE_EVENT_KEY_DOWN, _evry_cb_key_down, NULL));
(ECORE_EVENT_KEY_DOWN,
_evry_cb_key_down, NULL));
win->handlers = eina_list_append
(win->handlers, ecore_event_handler_add
(ECORE_X_EVENT_SELECTION_NOTIFY,
_evry_cb_selection_notify, win));
win->handlers = eina_list_append
(win->handlers, ecore_event_handler_add
(EVRY_EVENT_ITEM_CHANGED,
_evry_cb_item_changed, NULL));
win->handlers = eina_list_append
(win->handlers, ecore_event_handler_add
(ECORE_EVENT_MOUSE_BUTTON_DOWN,
_evry_cb_mouse, win));
win->handlers = eina_list_append
(win->handlers, ecore_event_handler_add
(ECORE_EVENT_MOUSE_BUTTON_UP,
_evry_cb_mouse, win));
win->handlers = eina_list_append
(win->handlers, ecore_event_handler_add
(ECORE_EVENT_MOUSE_MOVE,
_evry_cb_mouse, win));
win->handlers = eina_list_append
(win->handlers, ecore_event_handler_add
(ECORE_EVENT_MOUSE_WHEEL,
_evry_cb_mouse, win));
e_popup_layer_set(win->popup, 255);
e_popup_show(win->popup);
@ -376,7 +400,7 @@ _evry_selectors_shift(int dir)
return 0;
}
EAPI void
void
evry_clear_input(Evry_Plugin *p)
{
Evry_Selector *sel = _evry_selector_for_plugin_get(p);
@ -402,7 +426,7 @@ evry_clear_input(Evry_Plugin *p)
static int item_cnt = 0;
#endif
EAPI Evry_Item *
Evry_Item *
evry_item_new(Evry_Item *base, Evry_Plugin *p, const char *label,
Evas_Object *(*icon_get) (Evry_Item *it, Evas *e),
void (*cb_free) (Evry_Item *item))
@ -437,7 +461,7 @@ evry_item_new(Evry_Item *base, Evry_Plugin *p, const char *label,
return it;
}
EAPI void
void
evry_item_free(Evry_Item *it)
{
if (!it) return;
@ -520,7 +544,7 @@ _evry_selector_update_actions(Evry_Selector *sel)
sel->update_timer = ecore_timer_add(0.1, _evry_timer_cb_actions_get, it);
}
EAPI void
void
evry_item_select(const Evry_State *state, Evry_Item *it)
{
Evry_State *s = (Evry_State *)state;
@ -546,7 +570,7 @@ evry_item_select(const Evry_State *state, Evry_Item *it)
}
}
EAPI void
void
evry_item_mark(const Evry_State *state, Evry_Item *it, Eina_Bool mark)
{
Evry_State *s = (Evry_State *)state;
@ -563,13 +587,13 @@ evry_item_mark(const Evry_State *state, Evry_Item *it, Eina_Bool mark)
}
}
EAPI void
void
evry_item_ref(Evry_Item *it)
{
it->ref++;
}
EAPI int
int
evry_list_win_show(void)
{
if (win->visible) return 0;
@ -578,13 +602,13 @@ evry_list_win_show(void)
return 1;
}
EAPI void
void
evry_list_win_hide(void)
{
_evry_list_win_clear(1);
}
EAPI void
void
evry_plugin_update(Evry_Plugin *p, int action)
{
Evry_State *s;
@ -771,9 +795,76 @@ _evry_window_new(E_Zone *zone)
ecore_x_netwm_window_type_set(popup->evas_win, ECORE_X_WINDOW_TYPE_UTILITY);
evas_event_feed_mouse_in(win->popup->evas, ecore_x_current_time_get(), NULL);
evas_event_feed_mouse_move(win->popup->evas, -1000000, -1000000, ecore_x_current_time_get(), NULL);
return win;
}
static int
_evry_cb_mouse(void *data, int type, void *event)
{
Ecore_Event_Mouse_Button *ev;
E_Popup *pop;
ev = event;
if (ev->window != input_window) return 1;
pop = win->popup;
if (type == ECORE_EVENT_MOUSE_MOVE)
{
Ecore_Event_Mouse_Move *ev = event;
evas_event_feed_mouse_move
(pop->evas,
ev->x - pop->x + pop->zone->x,
ev->y - pop->y + pop->zone->y,
ev->timestamp, NULL);
}
else if (type == ECORE_EVENT_MOUSE_BUTTON_DOWN)
{
win->down_out = 0;
/* XXX shift triple click in flags when needed */
if (!E_INSIDE(ev->x, ev->y, pop->x + pop->zone->x,
pop->y + pop->zone->y, pop->w, pop->h))
{
win->down_out = 1;
return 1;
}
evas_event_feed_mouse_down
(pop->evas,
ev->buttons, ev->double_click,
ev->timestamp, NULL);
}
else if (type == ECORE_EVENT_MOUSE_BUTTON_UP)
{
if (win->down_out &&
!E_INSIDE(ev->x, ev->y, pop->x + pop->zone->x,
pop->y + pop->zone->y, pop->w, pop->h))
{
evry_hide(0);
return 1;
}
evas_event_feed_mouse_up
(pop->evas,
ev->buttons, ev->double_click,
ev->timestamp, NULL);
}
else if (type == ECORE_EVENT_MOUSE_WHEEL)
{
Ecore_Event_Mouse_Wheel *ev = event;
evas_event_feed_mouse_wheel
(pop->evas, 0, ev->z, ev->timestamp, NULL);
}
return 1;
}
static void
_evry_window_free(Evry_Window *win)
{
@ -785,6 +876,74 @@ _evry_window_free(Evry_Window *win)
E_FREE(win);
}
static void
_evry_selector_cb_down(void *data, Evas *e, Evas_Object *obj, void *event_info)
{
Evas_Event_Mouse_Down *ev = event_info;
/* Evry_Selector *sel = data; */
if (ev->button == 1)
{
if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK)
evry_plugin_action(1);
}
}
static void
_evry_selector_cb_wheel(void *data, Evas *e, Evas_Object *obj, void *event_info)
{
Evas_Event_Mouse_Wheel *ev = event_info;
if (ev->z > 0)
{
/* FIXME dont loose selector 2 state until state 0 changed: */
if (win->selector != win->selectors[2])
_evry_selectors_switch(1);
}
else if (ev->z < 0)
{
_evry_selectors_switch(-1);
}
}
static void
_evry_selector_cb_up(void *data, Evas *e, Evas_Object *obj, void *event_info)
{
Evas_Event_Mouse_Up *ev = event_info;
Evry_Selector *sel = data;
if (sel == win->selector)
return;
if (ev->button == 3)
{
evry_plugin_action(0);
}
else if (ev->button == 1)
{
if (sel == win->selectors[0])
{
if (win->selector == win->selectors[1])
_evry_selectors_switch(-1);
else
_evry_selectors_switch(1);
}
else if (sel == win->selectors[1])
{
if (win->selector == win->selectors[0])
_evry_selectors_switch(1);
else
_evry_selectors_switch(-1);
}
else if (sel == win->selectors[2])
{
if (win->selector == win->selectors[1])
_evry_selectors_switch(1);
}
}
}
static Evry_Selector *
_evry_selector_new(Evry_Window *win, int type)
{
@ -795,6 +954,13 @@ _evry_selector_new(Evry_Window *win, int type)
sel->o_main = o;
e_theme_edje_object_set(o, "base/theme/everything",
"e/modules/everything/selector_item");
evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN,
_evry_selector_cb_down, sel);
evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_UP,
_evry_selector_cb_up, sel);
evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_WHEEL,
_evry_selector_cb_wheel, sel);
evas_object_show(o);
sel->aggregator = evry_aggregator_new(win, type);
@ -1352,9 +1518,10 @@ evry_browse_item(Evry_Selector *sel)
return 1;
}
EAPI int
int
evry_browse_back(Evry_Selector *sel)
{
if (!sel) sel = win->selector;
Evry_State *s = sel->state;
DBG("%p", sel);
@ -1870,6 +2037,12 @@ _evry_action_do(Evry_Action *act)
return 0;
}
void
evry_plugin_action(int finished)
{
_evry_plugin_action(win->selector, finished);
}
static void
_evry_plugin_action(Evry_Selector *sel, int finished)
{

View File

@ -56,6 +56,10 @@ struct _Smart_Data
int sliding;
int clearing;
int mouse_act;
int mouse_down;
Item *it_down;
};
struct _Item
@ -77,6 +81,8 @@ struct _Item
static View *view = NULL;
static void _view_clear(Evry_View *view, int slide);
static void _pan_item_select(Evas_Object *obj, Item *it, int scroll);
static void
@ -138,7 +144,7 @@ _thumb_idler(void *data)
(it->item->icon && it->item->icon[0]))))
{
it->get_thumb = EINA_TRUE;
it->thumb = e_thumb_icon_add(sd->view->evas);
GET_FILE(file, it->item);
@ -149,7 +155,7 @@ _thumb_idler(void *data)
e_thumb_icon_file_set(it->thumb, it->item->icon, NULL);
else
e_thumb_icon_file_set(it->thumb, file->path, NULL);
e_thumb_icon_size_set(it->thumb, it->w, it->h);
e_thumb_icon_begin(it->thumb);
it->do_thumb = EINA_TRUE;
@ -164,6 +170,70 @@ _thumb_idler(void *data)
return 0;
}
static void
_item_down(void *data, Evas *e, Evas_Object *obj, void *event_info)
{
Evas_Event_Mouse_Down *ev = event_info;
Item *it = data;
Smart_Data *sd = evas_object_smart_data_get(it->obj);
sd->mouse_act = 1;
if (ev->button == 1)
{
if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK)
{
evry_item_select(sd->view->state, it->item);
_pan_item_select(it->obj, it, 0);
evry_plugin_action(1);
}
else
{
sd->mouse_down = ev->canvas.x;
sd->it_down = it;
if (sd->selector && evas_object_visible_get(sd->selector))
{
evas_object_hide(sd->selector);
}
}
}
}
static void
_item_up(void *data, Evas *e, Evas_Object *obj, void *event_info)
{
Evas_Event_Mouse_Up *ev = event_info;
Item *it = data;
Smart_Data *sd = evas_object_smart_data_get(it->obj);
sd->mouse_down = 0;
sd->it_down = NULL;
if (ev->button == 1)
{
if (!(ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD))
{
if (sd->selector)
evas_object_hide(sd->selector);
evry_item_select(sd->view->state, it->item);
_pan_item_select(it->obj, it, 0);
}
}
else if (ev->button == 3)
{
if (sd->selector)
evas_object_hide(sd->selector);
evry_item_select(sd->view->state, it->item);
_pan_item_select(it->obj, it, 0);
evry_plugin_action(0);
}
}
static void
_item_show(View *v, Item *it, Evas_Object *list)
{
@ -185,6 +255,10 @@ _item_show(View *v, Item *it, Evas_Object *list)
edje_object_signal_emit(it->frame, "e,state,detail,show", "e");
}
evas_object_event_callback_add(it->frame, EVAS_CALLBACK_MOUSE_DOWN,
_item_down, it);
evas_object_event_callback_add(it->frame, EVAS_CALLBACK_MOUSE_UP,
_item_up, it);
evas_object_smart_member_add(it->frame, list);
evas_object_clip_set(it->frame, evas_object_clip_get(list));
@ -342,7 +416,7 @@ _e_smart_reconfigure_do(void *data)
if (sd->selector)
evas_object_hide(sd->selector);
}
else
else if (!sd->mouse_act)
{
if (!sd->selector)
{
@ -716,8 +790,16 @@ _pan_item_select(Evas_Object *obj, Item *it, int scroll)
}
else scroll = 0;
if (sd->view->mode == VIEW_MODE_LIST ||
sd->view->mode == VIEW_MODE_DETAIL)
if (sd->mouse_act &&
((sd->view->mode == VIEW_MODE_LIST ||
sd->view->mode == VIEW_MODE_DETAIL)))
{
edje_object_signal_emit(sd->cur_item->frame,
"e,state,selected", "e");
return;
}
else if (sd->view->mode == VIEW_MODE_LIST ||
sd->view->mode == VIEW_MODE_DETAIL)
{
int all = sd->ch / it->h;
int rows = (it->h && sd->h < sd->ch) ? (sd->h / it->h) : all;
@ -769,8 +851,6 @@ _pan_item_select(Evas_Object *obj, Item *it, int scroll)
}
}
/* edje_object_signal_emit(sd->cur_item->frame,
* "e,state,selected", "e"); */
align *= it->h;
}
else
@ -847,7 +927,7 @@ _clear_items(Evas_Object *obj)
sd->thumb_idler = NULL;
if (sd->selector)
evas_object_del(sd->selector);
evas_object_del(sd->selector);
sd->selector = NULL;
}
@ -858,6 +938,10 @@ _view_clear(Evry_View *view, int slide)
Smart_Data *sd = evas_object_smart_data_get(v->span);
Item *it;
sd->mouse_down = 0;
sd->mouse_act = 0;
sd->it_down = NULL;
if (!sd->clearing && evry_conf->scroll_animate)
{
if (slide)
@ -879,7 +963,7 @@ _view_clear(Evry_View *view, int slide)
sd->clearing = EINA_FALSE;
_clear_items(v->span);
EINA_LIST_FREE(sd->items, it)
{
evry_item_free(it->item);
@ -943,6 +1027,8 @@ _view_update(Evry_View *view, int slide)
Evry_Plugin *p = v->state->plugin;
sd->cur_item = NULL;
sd->mouse_act = 0;
sd->mouse_down = 0;
if (!p)
{
@ -1104,6 +1190,9 @@ _cb_key_down(Evry_View *view, const Ecore_Event_Key *ev)
const char *key = ev->key;
sd->mouse_act = 0;
sd->mouse_down = 0;
if ((ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) &&
(!strcmp(key, "2")))
{
@ -1148,7 +1237,7 @@ _cb_key_down(Evry_View *view, const Ecore_Event_Key *ev)
{
v->mode = VIEW_MODE_DETAIL;
}
_clear_items(v->span);
_update_frame(v->span);
goto end;
@ -1393,6 +1482,52 @@ _cb_item_changed(void *data, int type, void *event)
return 1;
}
static void
_view_cb_mouse_wheel(void *data, Evas *e, Evas_Object *obj, void *event_info)
{
Evas_Event_Mouse_Wheel *ev = event_info;
Smart_Data *sd = evas_object_smart_data_get(obj);
if (ev->z)
{
evas_object_hide(sd->selector);
if (sd->cur_item)
edje_object_signal_emit(sd->cur_item->frame, "e,state,selected", "e");
sd->mouse_act = 1;
}
}
static void
_view_cb_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info)
{
Evas_Event_Mouse_Move *ev = event_info;
Smart_Data *sd = evas_object_smart_data_get(obj);
if (!sd->mouse_down)
return ;
if (!sd->it_down)
return;
if ((sd->cur_item != sd->it_down) &&
(abs(ev->cur.canvas.x - sd->mouse_down) > 15))
{
evry_item_select(sd->view->state, sd->it_down->item);
_pan_item_select(obj, sd->it_down, 0);
return;
}
if (ev->cur.canvas.x - sd->mouse_down > 150)
{
evry_browse_back(NULL);
sd->mouse_down = 0;
}
else if (sd->mouse_down - ev->cur.canvas.x > 150)
{
evry_browse_item(NULL);
sd->mouse_down = 0;
}
}
static Evry_View *
_view_create(Evry_View *view, const Evry_State *s, const Evas_Object *swallow)
{
@ -1424,11 +1559,17 @@ _view_create(Evry_View *view, const Evry_State *s, const Evas_Object *swallow)
// scrolled thumbs
v->span = _pan_add(v->evas);
_pan_view_set(v->span, v);
evas_object_event_callback_add(v->span, EVAS_CALLBACK_MOUSE_WHEEL,
_view_cb_mouse_wheel, NULL);
evas_object_event_callback_add(v->span, EVAS_CALLBACK_MOUSE_MOVE,
_view_cb_mouse_move, NULL);
// the scrollframe holding the scrolled thumbs
v->sframe = e_scrollframe_add(v->evas);
e_scrollframe_custom_theme_set(v->sframe, "base/theme/widgets",
"e/modules/everything/thumbview/main/scrollframe");
e_scrollframe_thumbscroll_force(v->sframe, 1);
e_scrollframe_extern_pan_set(v->sframe, v->span,
_pan_set, _pan_get, _pan_max_get,
_pan_child_size_get);
@ -1437,7 +1578,7 @@ _view_create(Evry_View *view, const Evry_State *s, const Evas_Object *swallow)
evas_object_show(v->sframe);
evas_object_show(v->span);
v->tabs = evry_tab_view_new(s, v->evas);
v->tabs = evry_tab_view_new(EVRY_VIEW(v), v->state, v->evas);
EVRY_VIEW(v)->o_list = v->bg;
EVRY_VIEW(v)->o_bar = v->tabs->o_tabs;

View File

@ -416,6 +416,7 @@ _evry_icon_fdo_set(Evas_Object *obj, const char *icon)
path = efreet_icon_path_find(e_config->icon_theme, icon, 128);
if (!path) return 0;
e_icon_scale_size_set(obj, 128);
e_icon_file_set(obj, path);
E_FREE(path);
return 1;

View File

@ -5,6 +5,7 @@ typedef struct _Tab Tab;
struct _Tab
{
Tab_View *tab_view;
Evry_Plugin *plugin;
Evas_Object *o_tab;
@ -13,6 +14,10 @@ struct _Tab
static void _tabs_update(Tab_View *v);
static void _plugin_select(Tab_View *v, Evry_Plugin *p);
static void _plugin_next(Tab_View *v);
static void _plugin_prev(Tab_View *v);
#if 0
static int
@ -98,10 +103,46 @@ _timer_cb(void *data)
}
static void
_tab_cb_down(void *data, Evas *e, Evas_Object *obj, void *event_info)
{
/* Evas_Event_Mouse_Down *ev = event_info; */
}
static void
_tab_cb_up(void *data, Evas *e, Evas_Object *obj, void *event_info)
{
Evas_Event_Mouse_Up *ev = event_info;
Tab *tab = data;
Tab_View *v = tab->tab_view;
if (ev->button == 1)
{
_plugin_select(v, tab->plugin);
v->view->update(v->view, 0);
}
}
static void
_tabs_cb_wheel(void *data, Evas *e, Evas_Object *obj, void *event_info)
{
Evas_Event_Mouse_Wheel *ev = event_info;
Tab_View *v = data;
if (ev->z > 0)
{
_plugin_next(v);
v->view->update(v->view, 0);
}
else if (ev->z < 0)
{
_plugin_prev(v);
v->view->update(v->view, 0);
}
}
static void
_tabs_update(Tab_View *v)
{
Eina_List *l, *ll, *plugins;
Evry_Plugin *p;
const Evry_State *s = v->state;
@ -118,7 +159,7 @@ _tabs_update(Tab_View *v)
v->timer = ecore_timer_add(0.1, _timer_cb, v);
return;
}
/* remove tabs for not active plugins */
e_box_freeze(v->o_tabs);
@ -153,12 +194,16 @@ _tabs_update(Tab_View *v)
{
tab = E_NEW(Tab, 1);
tab->plugin = p;
tab->tab_view = v;
o = edje_object_add(v->evas);
e_theme_edje_object_set(o, "base/theme/everything",
"e/modules/everything/tab_item");
edje_object_part_text_set(o, "e.text.label", EVRY_ITEM(p)->label);
evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN,
_tab_cb_down, tab);
evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_UP,
_tab_cb_up, tab);
tab->o_tab = o;
edje_object_size_min_calc(o, &tab->cw, NULL);
@ -254,7 +299,7 @@ _plugin_next_by_name(Tab_View *v, const char *key)
{
/* FIXME how can this happen ? */
if (!p) continue;
if (EVRY_ITEM(p)->label && (!strncasecmp(EVRY_ITEM(p)->label, key, 1)))
{
if (!first) first = p;
@ -340,7 +385,7 @@ _tabs_key_down(Tab_View *v, const Ecore_Event_Key *ev)
EAPI Tab_View *
evry_tab_view_new(const Evry_State *s, Evas *e)
evry_tab_view_new(Evry_View *view, const Evry_State *s, Evas *e)
{
Tab_View *v;
Evas_Object *o;
@ -349,12 +394,16 @@ evry_tab_view_new(const Evry_State *s, Evas *e)
v->update = &_tabs_update;
v->clear = &_tabs_clear;
v->key_down = &_tabs_key_down;
v->view = view;
v->state = s;
v->evas = e;
o = e_box_add(e);
e_box_orientation_set(o, 1);
e_box_homogenous_set(o, 1);
/* evas_object_propagate_events_set(o, 1); */
evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_WHEEL,
_tabs_cb_wheel, v);
v->o_tabs = o;
return v;