} new_file;
E_Fm2_Icon *last_selected;
+ E_Fm2_Icon *range_selected;
Eina_List *selected_icons;
Eina_List *icons_place;
Eina_List *queue;
static void _e_fm2_icon_sel_next(Evas_Object *obj, Eina_Bool add);
static void _e_fm2_icon_sel_down(Evas_Object *obj, Eina_Bool add);
static void _e_fm2_icon_sel_up(Evas_Object *obj, Eina_Bool add);
+static void _e_fm2_icon_range_select(E_Fm2_Icon *ic);
static void _e_fm2_typebuf_show(Evas_Object *obj);
static void _e_fm2_typebuf_hide(Evas_Object *obj);
prev = eina_list_last_data_get(ic->sd->selected_icons);
if (prev) prev->last_selected = EINA_FALSE;
ic->selected = EINA_TRUE;
+ ic->sd->range_selected = NULL;
ic->sd->last_selected = ic;
ic->sd->selected_icons = eina_list_append(ic->sd->selected_icons, ic);
ic->last_selected = EINA_TRUE;
if (!ic->selected) return;
ic->selected = EINA_FALSE;
ic->last_selected = EINA_FALSE;
+ ic->sd->range_selected = NULL;
if (ic->sd->last_selected == ic) ic->sd->last_selected = NULL;
ic->sd->selected_icons = eina_list_remove(ic->sd->selected_icons, ic);
ic->selected_time = 0.0;
{
E_Fm2_Smart_Data *sd;
Eina_List *l;
- E_Fm2_Icon *ic, *ic_next;
+ E_Fm2_Icon *ic, *ic_next, *ic_vert, *ic_horz;
char view_mode;
int x = 0, y = 0, custom = 0;
- int dist, min = 65535;
+ int dist = 0, min_horz = 65535, min_vert = 65535;
sd = evas_object_smart_data_get(obj);
if (!sd) return NULL;
(view_mode == E_FM2_VIEW_MODE_CUSTOM_GRID_ICONS) ||
(view_mode == E_FM2_VIEW_MODE_CUSTOM_ICONS))
custom = 1;
-
+
+ l = eina_list_data_find_list(sd->icons, (sd->range_selected) ?
+ sd->range_selected :
+ sd->last_selected);
+
+ if (!l) return eina_list_data_get(sd->icons);
+
+ if (!next) return eina_list_data_get(l);
+
ic_next = NULL;
- /* find selected item / current position */
- EINA_LIST_FOREACH(sd->icons, l, ic)
- {
- if (ic->selected)
- {
- if (!custom && !match_func)
- {
- ic_next = ic;
- }
- else
- {
- x = ic->x;
- y = ic->y;
- }
- break;
- }
- }
- if (next && (custom || match_func))
- {
- /* find next item in custom grid, or list/grid when match
- func is given */
- if (next == 1)
- {
- EINA_LIST_FOREACH(sd->icons, l, ic)
- {
- if ((ic->x > x) &&
- (custom ? (ic->y >= y) : (ic->y == y)) &&
- (!match_func || match_func(ic, data)))
- {
- dist = 2 * (ic->y - y) + (ic->x - x);
- if (dist < min)
- {
- min = dist;
- ic_next = ic;
- }
- }
- }
- /* no next item was found in row go down and begin */
- if (!ic_next)
- {
- EINA_LIST_FOREACH(sd->icons, l, ic)
- {
- if ((ic->y > y) && (!match_func || match_func(ic, data)))
- {
- dist = 2 * (abs(ic->y - y)) + ic->x;
- if (dist < min)
- {
- min = dist;
- ic_next = ic;
- }
- }
- }
- }
- }
- /* find previous item */
- else if (next == -1)
+ ic_vert = NULL;
+ ic_horz = NULL;
+
+ if (custom || match_func)
+ {
+ ic = eina_list_data_get(l);
+ x = ic->x;
+ y = ic->y;
+
+ EINA_LIST_FOREACH(sd->icons, l, ic)
{
- EINA_LIST_FOREACH(sd->icons, l, ic)
+ if (match_func && !match_func(ic, data)) continue;
+
+ int dx = (ic->x - x);
+ int dy = (ic->y - y);
+ int sgnx = (dx) ? dx / abs(dx) : 0;
+ int sgny = (dy) ? dy / abs(dy) : 0;
+
+ if ((next == sgnx) && (abs(dx) >= abs(dy)) && ((sgny*sgnx) >= 0))
{
- if ((ic->x < x) &&
- (custom ? (ic->y <= y) : (ic->y == y)) &&
- (!match_func || match_func(ic, data)))
+ dist = abs(dy) + abs(dx);
+ if (dist < min_horz)
{
- dist = 2 * (y - ic->y) + (x - ic->x);
- if (dist < min)
- {
- min = dist;
- ic_next = ic;
- }
+ min_horz = dist;
+ ic_horz = ic;
}
}
- /* no prev item was found in row go to end and up */
- if (!ic_next)
+
+ if (!ic_horz && (next == sgny))
{
- EINA_LIST_FOREACH(sd->icons, l, ic)
+ dist = abs(dy) + ic->x * next;
+ if (dist < min_vert)
{
- if ((ic->y < y) && (!match_func || match_func(ic, data)))
- {
- dist = 2 * (abs(ic->y - y)) - ic->x;
- if (dist < min)
- {
- min = dist;
- ic_next = ic;
- }
- }
- }
+ min_vert = dist;
+ ic_vert = ic;
+ }
}
}
+ ic_next = (ic_horz) ? ic_horz : ic_vert;
}
- /* not custom, items are arranged in list order */
- else if (ic_next)
+ else
{
if (next == 1)
{
if (!eina_list_next(l)) return NULL;
ic_next = eina_list_data_get(eina_list_next(l));
}
- if (next == -1)
+ else if (next == -1)
{
if (!eina_list_prev(l)) return NULL;
ic_next = eina_list_data_get(eina_list_prev(l));
ic_prev = _e_fm2_icon_next_find(obj, -1, NULL, NULL);
- if (!ic_prev)
+ if (!ic_prev) return;
+
+ if ((!add) || ic_prev->sd->config->selection.single)
{
- /* FIXME this is not the bottomright item for custom grid */
- _e_fm2_icon_sel_last(obj, add);
- return;
+ _e_fm2_icon_desel_any(obj);
+ _e_fm2_icon_select(ic_prev);
}
- if ((!add) || ic_prev->sd->config->selection.single)
- _e_fm2_icon_desel_any(obj);
- _e_fm2_icon_select(ic_prev);
- evas_object_smart_callback_call(obj, "selection_change", NULL); /*XXX sd->obj*/
+ else
+ {
+ _e_fm2_icon_range_select(ic_prev);
+ }
+
+ evas_object_smart_callback_call(obj, "selection_change", NULL);
_e_fm2_icon_make_visible(ic_prev);
}
E_Fm2_Icon *ic_next;
ic_next = _e_fm2_icon_next_find(obj, 1, NULL, NULL);
- if (!ic_next)
+
+ if (!ic_next) return;
+
+ if ((!add) || ic_next->sd->config->selection.single)
{
- /* FIXME this is not the topleft item for custom grid */
- _e_fm2_icon_sel_first(obj, add);
- return;
+ _e_fm2_icon_desel_any(obj);
+ _e_fm2_icon_select(ic_next);
+ }
+ else
+ {
+ _e_fm2_icon_range_select(ic_next);
}
- if ((!add) || ic_next->sd->config->selection.single)
- _e_fm2_icon_desel_any(obj);
- _e_fm2_icon_select(ic_next);
evas_object_smart_callback_call(obj, "selection_change", NULL);
_e_fm2_icon_make_visible(ic_next);
}
{
E_Fm2_Smart_Data *sd;
Eina_List *l;
- E_Fm2_Icon *ic, *ic_down;
- int found, x = -1, y = -1, custom = 0;
+ E_Fm2_Icon *ic, *ic2, *ic_down;
int dist, min = 65535;
- char view_mode;
sd = evas_object_smart_data_get(obj);
if (!sd) return;
if (!sd->icons) return;
- view_mode = _e_fm2_view_mode_get(sd);
- if ((view_mode == E_FM2_VIEW_MODE_CUSTOM_SMART_GRID_ICONS) ||
- (view_mode == E_FM2_VIEW_MODE_CUSTOM_GRID_ICONS) ||
- (view_mode == E_FM2_VIEW_MODE_CUSTOM_ICONS))
- custom = 1;
+ ic = (sd->range_selected) ? sd->range_selected : sd->last_selected;
+ if (!ic) ic = eina_list_data_get(sd->icons);
- ic_down = NULL;
- found = 0;
+ ic_down = ic;
- EINA_LIST_FOREACH(sd->icons, l, ic)
+ EINA_LIST_FOREACH(sd->icons, l, ic2)
{
- if (!found)
+ if (ic2->y > ic->y)
{
- if (ic->selected)
- {
- found = 1;
- x = ic->x;
- y = ic->y;
- if (custom) break;
- }
- }
- else if (ic->y > y)
- {
- dist = (abs(ic->x - x)) + (ic->y - y) * 2;
+ dist = (abs(ic2->x - ic->x)) + (ic2->y - ic->y) * 2;
if (dist < min)
{
min = dist;
- ic_down = ic;
+ ic_down = ic2;
}
- else break;
}
}
- if (custom)
+ if ((!add) || ic_down->sd->config->selection.single)
{
- EINA_LIST_FOREACH(sd->icons, l, ic)
- {
- if (ic->y > y)
- {
- dist = (abs(ic->x - x)) + (ic->y - y) * 2;
- if (dist < min)
- {
- min = dist;
- ic_down = ic;
- }
- }
- }
+ _e_fm2_icon_desel_any(obj);
+ _e_fm2_icon_select(ic_down);
}
-
- if (!ic_down)
+ else
{
- if (!custom) _e_fm2_icon_sel_next(obj, add);
- return;
+ _e_fm2_icon_range_select(ic_down);
}
- if ((!add) || ic_down->sd->config->selection.single)
- _e_fm2_icon_desel_any(obj);
- _e_fm2_icon_select(ic_down);
+
evas_object_smart_callback_call(sd->obj, "selection_change", NULL);
_e_fm2_icon_make_visible(ic_down);
}
{
E_Fm2_Smart_Data *sd;
Eina_List *l;
- E_Fm2_Icon *ic, *ic_up;
- int found = 0, x = 0, y = 0, custom = 0;
+ E_Fm2_Icon *ic, *ic2, *ic_down;
int dist, min = 65535;
- char view_mode;
sd = evas_object_smart_data_get(obj);
if (!sd) return;
if (!sd->icons) return;
- view_mode = _e_fm2_view_mode_get(sd);
-
- if ((view_mode == E_FM2_VIEW_MODE_CUSTOM_SMART_GRID_ICONS) ||
- (view_mode == E_FM2_VIEW_MODE_CUSTOM_GRID_ICONS) ||
- (view_mode == E_FM2_VIEW_MODE_CUSTOM_ICONS))
- custom = 1;
+ ic = (sd->range_selected) ? sd->range_selected : sd->last_selected;
+ if (!ic) ic = eina_list_data_get(sd->icons);
- ic_up = NULL;
+ ic_down = ic;
- EINA_LIST_REVERSE_FOREACH(sd->icons, l, ic)
+ EINA_LIST_FOREACH(sd->icons, l, ic2)
{
- if (!found)
+ if (ic2->y < ic->y)
{
- if (ic->selected)
- {
- found = 1;
- x = ic->x;
- y = ic->y;
- if (custom) break;
- }
- }
- else if (ic->y < y)
- {
- dist = (abs(ic->x - x)) + (y - ic->y) * 2;
+ dist = (abs(ic2->x - ic->x)) + (ic->y - ic2->y) * 2;
if (dist < min)
{
min = dist;
- ic_up = ic;
+ ic_down = ic2;
}
- else break;
}
}
- if (custom && found)
+ if ((!add) || ic_down->sd->config->selection.single)
{
- EINA_LIST_FOREACH(sd->icons, l, ic)
+ _e_fm2_icon_desel_any(obj);
+ _e_fm2_icon_select(ic_down);
+ }
+ else
+ {
+ _e_fm2_icon_range_select(ic_down);
+ }
+
+ evas_object_smart_callback_call(sd->obj, "selection_change", NULL);
+ _e_fm2_icon_make_visible(ic_down);
+}
+
+static void
+_e_fm2_icon_range_select(E_Fm2_Icon *ic)
+{
+ const Eina_List *l;
+ E_Fm2_Icon *ic2;
+
+ char view_mode = _e_fm2_view_mode_get(ic->sd);
+ E_Fm2_Icon *last = ic->sd->last_selected;
+
+ _e_fm2_icon_desel_any(ic->sd->obj);
+
+ if ((!last) || (last == ic))
+ {
+ last = ic;
+ }
+ else if ((view_mode == E_FM2_VIEW_MODE_CUSTOM_SMART_GRID_ICONS) ||
+ (view_mode == E_FM2_VIEW_MODE_CUSTOM_GRID_ICONS) ||
+ (view_mode == E_FM2_VIEW_MODE_CUSTOM_ICONS))
+ {
+ int topx = (ic->x <= last->x) ? ic->x : last->x;
+ int boundx = (ic->x < last->x) ? (last->x + last->w) : (ic->x + ic->w);
+ int topy = (ic->y <= last->y) ? ic->y : last->y;
+ int boundy = (ic->y < last->y) ? (last->y + last->h) : (ic->y + ic->h);
+
+ EINA_LIST_FOREACH(ic->sd->icons, l, ic2)
{
- if (!ic->selected && ic->y < y)
- {
- dist = (abs(ic->x - x)) + (y - ic->y) * 2;
- if (dist < min)
- {
- min = dist;
- ic_up = ic;
- }
- }
+ if ((ic2 != last) &&
+ (ic2->x >= topx) && (ic2->x < boundx) &&
+ (ic2->y >= topy) && (ic2->y < boundy))
+ _e_fm2_icon_select(ic2);
}
}
-
- if (!ic_up)
+ else
{
- if (!custom) _e_fm2_icon_sel_prev(obj, add);
- return;
+ int trig = 2;
+ EINA_LIST_FOREACH(ic->sd->icons, l, ic2)
+ {
+ if ((ic2 == last) || (ic2 == ic)) trig--;
+ if ((trig < 2) && (ic2 != last)) _e_fm2_icon_select(ic2);
+ if (!trig) break;
+ }
}
- if ((!add) || ic_up->sd->config->selection.single)
- _e_fm2_icon_desel_any(obj);
- _e_fm2_icon_select(ic_up);
- evas_object_smart_callback_call(sd->obj, "selection_change", NULL);
- _e_fm2_icon_make_visible(ic_up);
+ _e_fm2_icon_select(last);
+ ic->sd->range_selected = ic;
}
/* FIXME: prototype */
if (range_sel)
{
- const Eina_List *l, *l2;
- E_Fm2_Icon *ic2;
- Eina_Bool seen = 0;
- /* find last selected - if any, and select all icons between */
- EINA_LIST_FOREACH(ic->sd->icons, l, ic2)
- {
- if (ic2 == ic) seen = 1;
- if (ic2->last_selected)
- {
- ic2->last_selected = 0;
- if (seen)
- {
- for (l2 = l, ic2 = l2->data; l2; l2 = l2->prev, ic2 = l2->data)
- {
- if (ic == ic2) break;
- if (!ic2->selected) sel_change = 1;
- _e_fm2_icon_select(ic2);
- ic2->last_selected = 0;
- }
- }
- else
- {
- EINA_LIST_FOREACH(l, l2, ic2)
- {
- if (ic == ic2) break;
- if (!ic2->selected) sel_change = 1;
- _e_fm2_icon_select(ic2);
- ic2->last_selected = 0;
- }
- }
- break;
- }
- }
+ if (!up) _e_fm2_icon_range_select(ic);
}
else if ((!multi_sel) && ((up) || ((!up) && (!ic->selected))))
{