Ephoto: No need for timer - Correct multiselect+double click behavior

This commit is contained in:
Stephen Houston 2015-12-14 15:21:23 -06:00
parent 9692ab0f9d
commit a04ab14738
1 changed files with 97 additions and 86 deletions

View File

@ -45,7 +45,6 @@ struct _Ephoto_Thumb_Browser
Ecore_Idler *idler;
Ecore_Job *change_dir_job;
Ecore_Timer *click_timer;
Ecore_Timer *dc_timer;
int thumbs_only;
int dirs_only;
int totimages;
@ -58,13 +57,6 @@ struct _Ephoto_Thumb_Browser
int count;
int processed;
} animator;
struct
{
Elm_Object_Item *item;
Eina_Bool control;
Eina_Bool shift;
Eina_List *selected;
} egsd;
Eina_Bool main_deleted:1;
};
@ -2067,6 +2059,55 @@ _dnd_create_icon(void *data, Evas_Object *win, Evas_Coord *xoff,
return icon;
}
static Eina_List *
_dnd_icons_get(void *data)
{
Eina_List *l;
Eina_List *icons = NULL;
Evas_Coord xm, ym;
evas_pointer_canvas_xy_get(evas_object_evas_get(data), &xm, &ym);
Eina_List *items = eina_list_clone(elm_gengrid_selected_items_get(data));
Elm_Object_Item *gli = elm_gengrid_at_xy_item_get(data, xm, ym, 0, 0);
if (gli)
{
void *p = eina_list_search_sorted(items,
_entry_cmp_grid_alpha_asc, gli);
if (!p)
items = eina_list_append(items, gli);
}
EINA_LIST_FOREACH(items, l, gli)
{
Evas_Object *o =
elm_object_item_part_content_get(gli, "elm.swallow.icon");
if (o)
{
int x, y, w, h;
const char *f, *g;
elm_image_file_get(o, &f, &g);
Evas_Object *ic = elm_icon_add(data);
elm_image_file_set(ic, f, g);
evas_object_geometry_get(o, &x, &y, &w, &h);
evas_object_size_hint_align_set(ic, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_size_hint_weight_set(ic, EVAS_HINT_EXPAND,
EVAS_HINT_EXPAND);
evas_object_move(ic, x, y);
evas_object_resize(ic, w, h);
evas_object_show(ic);
icons = eina_list_append(icons, ic);
}
}
eina_list_free(items);
return icons;
}
static const char *
_dnd_get_drag_data(Evas_Object *obj, Elm_Object_Item *it, Eina_List **items)
{
@ -2101,7 +2142,7 @@ _dnd_item_data_get(Evas_Object *obj, Elm_Object_Item *it,
info->createicon = _dnd_create_icon;
info->createdata = it;
info->dragstart = _dnd_drag_start;
info->icons = NULL;
info->icons = _dnd_icons_get(obj);
info->dragdone = _dnd_drag_done;
info->data = _dnd_get_drag_data(obj, it, (Eina_List **) & info->donecbdata);
info->acceptdata = info->donecbdata;
@ -2798,69 +2839,6 @@ _fsel_mouse_up_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
}
}
static Eina_Bool
_dc_timer_cb(void *data)
{
Ephoto_Thumb_Browser *tb = data;
if (tb->egsd.control)
{
tb->last_sel = tb->egsd.item;
}
else if (tb->egsd.shift)
{
if (tb->last_sel)
{
int one, two, i;
Elm_Object_Item *it, *cur = tb->last_sel;
one = elm_gengrid_item_index_get(tb->last_sel);
two = elm_gengrid_item_index_get(tb->egsd.item);
if (two < one)
{
for (i = one; i > (two+1); i--)
{
it = elm_gengrid_item_prev_get(cur);
elm_gengrid_item_selected_set(it, EINA_TRUE);
cur = it;
}
}
else if (two > one)
{
for (i = one; i < (two-1); i++)
{
it = elm_gengrid_item_next_get(cur);
elm_gengrid_item_selected_set(it, EINA_TRUE);
cur = it;
}
}
tb->last_sel = tb->egsd.item;
}
else
{
tb->last_sel = tb->egsd.item;
}
}
else
{
Eina_List *node;
Elm_Object_Item *it;
if (eina_list_count(tb->egsd.selected) > 0)
{
EINA_LIST_FOREACH(tb->egsd.selected, node, it)
{
elm_gengrid_item_selected_set(it, EINA_FALSE);
}
}
tb->last_sel = tb->egsd.item;
}
tb->dc_timer = NULL;
eina_list_free(tb->egsd.selected);
tb->egsd.selected = NULL;
tb->egsd.item = NULL;
return ECORE_CALLBACK_CANCEL;
}
static void
_grid_mouse_up_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
void *event_info)
@ -2878,24 +2856,57 @@ _grid_mouse_up_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
if (info->button == 1 && item)
{
if (info->flags == EVAS_BUTTON_DOUBLE_CLICK)
if (evas_key_modifier_is_set(info->modifiers, "Control"))
{
ecore_timer_del(tb->dc_timer);
tb->dc_timer = NULL;
eina_list_free(tb->egsd.selected);
tb->egsd.selected = NULL;
tb->egsd.item = NULL;
return;
tb->last_sel = item;
}
else if (evas_key_modifier_is_set(info->modifiers, "Shift"))
{
if (tb->last_sel)
{
int one, two, i;
Elm_Object_Item *it, *cur = tb->last_sel;
one = elm_gengrid_item_index_get(tb->last_sel);
two = elm_gengrid_item_index_get(item);
if (two < one)
{
for (i = one; i > (two+1); i--)
{
it = elm_gengrid_item_prev_get(cur);
elm_gengrid_item_selected_set(it, EINA_TRUE);
cur = it;
}
}
else if (two > one)
{
for (i = one; i < (two-1); i++)
{
it = elm_gengrid_item_next_get(cur);
elm_gengrid_item_selected_set(it, EINA_TRUE);
cur = it;
}
}
tb->last_sel = item;
}
else
{
tb->last_sel = item;
}
}
else
{
tb->egsd.item = item;
tb->egsd.shift = evas_key_modifier_is_set(info->modifiers,
"Shift");
tb->egsd.control = evas_key_modifier_is_set(info->modifiers,
"Control");
tb->egsd.selected = eina_list_clone(selected);
tb->dc_timer = ecore_timer_add(0.3, _dc_timer_cb, tb);
Eina_List *sel = eina_list_clone(selected);
Eina_List *node;
Elm_Object_Item *it;
if (eina_list_count(sel) > 0)
{
EINA_LIST_FOREACH(sel, node, it)
{
elm_gengrid_item_selected_set(it, EINA_FALSE);
}
eina_list_free(sel);
}
tb->last_sel = item;
}
}
if (info->button != 3)