1 #include "e_mod_main.h"
3 typedef struct _View View;
4 typedef struct _Smart_Data Smart_Data;
5 typedef struct _Item Item;
16 const Evry_State *state;
17 const Evry_Plugin *plugin;
20 Evas_Object *bg, *sframe, *span;
29 /* smart object based on wallpaper module */
35 Ecore_Idle_Enterer *idle_enter;
36 Ecore_Idle_Enterer *thumb_idler;
37 Evas_Coord x, y, w, h;
38 Evas_Coord cx, cy, cw, ch;
44 double scroll_align_to;
45 Ecore_Animator *animator;
63 Evas_Coord x, y, w, h;
64 Evas_Object *frame, *image, *thumb;
65 Eina_Bool selected : 1;
66 Eina_Bool have_thumb : 1;
67 Eina_Bool do_thumb : 1;
68 Eina_Bool get_thumb : 1;
69 Eina_Bool showing : 1;
70 Eina_Bool visible : 1;
71 Eina_Bool changed : 1;
75 static View *view = NULL;
77 static void _view_clear(Evry_View *view);
78 static void _pan_item_select(Evas_Object *obj, Item *it, int scroll);
79 static void _animator_del(Evas_Object *obj);
80 static Eina_Bool _animator(void *data);
83 _thumb_gen(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
88 if (!it->frame) return;
90 e_icon_size_get(it->thumb, &w, &h);
91 edje_extern_object_aspect_set(it->thumb, EDJE_ASPECT_CONTROL_BOTH, w, h);
92 edje_object_part_swallow(it->frame, "e.swallow.thumb", it->thumb);
93 evas_object_show(it->thumb);
94 edje_object_signal_emit(it->frame, "e,action,thumb,show_delayed", "e");
95 edje_object_message_signal_process(it->frame);
96 it->have_thumb = EINA_TRUE;
97 it->do_thumb = EINA_FALSE;
99 if (it->image) evas_object_del(it->image);
104 _check_item(const Evry_Item *it)
110 if (!evry_file_path_get(file) || !file->mime) return 0;
112 if (!strncmp(file->mime, "image/", 6))
115 if ((suffix = strrchr(it->label, '.')))
116 if (!strncmp(suffix, ".edj", 4))
122 static int _sort_pos_cb(const void *d1, const void *d2)
124 const Item *it1 = d1;
125 const Item *it2 = d2;
126 return ((it1->x + it1->y * 4) - (it2->x + it2->y * 4));
130 _thumb_idler(void *data)
132 Smart_Data *sd = data;
139 sd->queue = eina_list_sort(sd->queue, -1, _sort_pos_cb);
141 EINA_LIST_FOREACH_SAFE(sd->queue, l, ll, it)
143 if (!it->image && !it->have_thumb)
145 it->image = evry_util_icon_get(it->item, sd->view->evas);
149 e_icon_size_get(it->image, &w, &h);
151 edje_extern_object_aspect_set(it->thumb, EDJE_ASPECT_CONTROL_BOTH, w, h);
153 edje_object_part_swallow(it->frame, "e.swallow.icon", it->image);
154 evas_object_show(it->image);
155 edje_object_signal_emit(it->frame, "e,action,thumb,show", "e");
157 else it->have_thumb = EINA_TRUE;
160 if ((CHECK_TYPE(it->item, EVRY_TYPE_FILE)) &&
161 ((!it->thumb && !(it->have_thumb || it->do_thumb)) &&
162 (it->get_thumb || _check_item(it->item) ||
163 (it->item->icon && it->item->icon[0] == '/'))))
165 it->get_thumb = EINA_TRUE;
167 it->thumb = e_thumb_icon_add(sd->view->evas);
169 GET_FILE(file, it->item);
171 evas_object_smart_callback_add(it->thumb, "e_thumb_gen", _thumb_gen, it);
173 e_thumb_icon_size_set(it->thumb, it->w, it->h);
175 if (it->item->icon && it->item->icon[0])
176 e_thumb_icon_file_set(it->thumb, it->item->icon, NULL);
177 else if ((suffix = strrchr(file->path, '.')) && (!strncmp(suffix, ".edj", 4)))
179 e_thumb_icon_file_set(it->thumb, file->path, "e/desktop/background");
180 e_thumb_icon_size_set(it->thumb, 128, 80);
183 e_thumb_icon_file_set(it->thumb, file->path, NULL);
185 e_thumb_icon_begin(it->thumb);
186 it->do_thumb = EINA_TRUE;
189 sd->queue = eina_list_remove_list(sd->queue, l);
194 return ECORE_CALLBACK_RENEW;
198 sd->thumb_idler = NULL;
200 return ECORE_CALLBACK_CANCEL;
204 _item_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
206 Evas_Event_Mouse_Down *ev = event_info;
208 Smart_Data *sd = evas_object_smart_data_get(it->obj);
214 sd->mouse_button = ev->button;
218 if ((ev->button == 1) && (ev->flags & EVAS_BUTTON_DOUBLE_CLICK))
220 if (it != sd->cur_item)
222 evry_item_select(s, it->item);
223 _pan_item_select(it->obj, it, 0);
226 if (it->item->browseable)
227 evry_browse_item(it->item);
229 evry_plugin_action(s->selector->win, 1);
233 sd->mouse_x = ev->canvas.x;
234 sd->mouse_y = ev->canvas.y;
239 _item_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
241 Evas_Event_Mouse_Up *ev = event_info;
243 Smart_Data *sd = evas_object_smart_data_get(it->obj);
252 edje_object_signal_emit(sd->view->bg, "e,action,hide,into", "e");
253 edje_object_signal_emit(sd->view->bg, "e,action,hide,back", "e");
260 if (!(ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) &&
261 (it != sd->cur_item))
263 evry_item_select(s, it->item);
264 _pan_item_select(it->obj, it, 0);
267 else if (ev->button == 3)
269 evry_item_select(s, it->item);
270 _pan_item_select(it->obj, it, 0);
272 evry_plugin_action(s->selector->win, 0);
277 _item_select(Item *it)
279 it->selected = EINA_TRUE;
280 edje_object_signal_emit(it->frame, "e,state,selected", "e");
284 if (strcmp(evas_object_type_get(it->thumb), "e_icon"))
285 edje_object_signal_emit(it->thumb, "e,state,selected", "e");
287 e_icon_selected_set(it->thumb, EINA_TRUE);
292 if (strcmp(evas_object_type_get(it->image), "e_icon"))
293 edje_object_signal_emit(it->image, "e,state,selected", "e");
295 e_icon_selected_set(it->image, EINA_TRUE);
300 _item_unselect(Item *it)
302 it->selected = EINA_FALSE;
303 edje_object_signal_emit(it->frame, "e,state,unselected", "e");
307 if (strcmp(evas_object_type_get(it->thumb), "e_icon"))
308 edje_object_signal_emit(it->thumb, "e,state,unselected", "e");
310 e_icon_selected_set(it->thumb, EINA_FALSE);
315 if (strcmp(evas_object_type_get(it->image), "e_icon"))
316 edje_object_signal_emit(it->image, "e,state,unselected", "e");
318 e_icon_selected_set(it->image, EINA_FALSE);
323 _item_show(View *v, Item *it, Evas_Object *list)
327 it->frame = edje_object_add(v->evas);
328 if (v->mode == VIEW_MODE_THUMB)
330 e_theme_edje_object_set(it->frame, "base/theme/modules/everything",
331 "e/modules/everything/thumbview/item/thumb");
335 e_theme_edje_object_set(it->frame, "base/theme/modules/everything",
336 "e/modules/everything/thumbview/item/list");
338 if (v->mode == VIEW_MODE_DETAIL)
339 edje_object_signal_emit(it->frame, "e,state,detail,show", "e");
342 evas_object_event_callback_add(it->frame, EVAS_CALLBACK_MOUSE_DOWN,
344 evas_object_event_callback_add(it->frame, EVAS_CALLBACK_MOUSE_UP,
346 evas_object_smart_member_add(it->frame, list);
348 evas_object_clip_set(it->frame, evas_object_clip_get(list));
350 if (it->item->selected)
353 if (it->item->marked)
354 edje_object_signal_emit(it->frame, "e,state,marked", "e");
357 edje_object_part_text_set(it->frame, "e.text.label", it->item->label);
359 if (v->mode == VIEW_MODE_DETAIL && it->item->detail)
360 edje_object_part_text_set(it->frame, "e.text.detail", it->item->detail);
362 evas_object_show(it->frame);
364 if (it->item->browseable)
365 edje_object_signal_emit(it->frame, "e,state,browseable", "e");
367 it->visible = EINA_TRUE;
373 if (it->do_thumb) e_thumb_icon_end(it->thumb);
375 if (it->thumb) evas_object_del(it->thumb);
376 if (it->image) evas_object_del(it->image);
377 if (it->frame) evas_object_del(it->frame);
383 it->have_thumb = EINA_FALSE;
384 it->do_thumb = EINA_FALSE;
385 it->visible = EINA_FALSE;
389 _e_smart_reconfigure_do(void *data)
391 Evas_Object *obj = data;
392 Smart_Data *sd = evas_object_smart_data_get(obj);
396 Evas_Coord x, y, xx, yy, ww, hh, mw, mh, ox = 0, oy = 0;
397 Evas_Coord aspect_w, aspect_h;
399 if (!sd) return ECORE_CALLBACK_CANCEL;
401 sd->idle_enter = NULL;
402 if (sd->w < 1) return ECORE_CALLBACK_CANCEL;
404 if (sd->cx > (sd->cw - sd->w)) sd->cx = sd->cw - sd->w;
405 if (sd->cy > (sd->ch - sd->h)) sd->cy = sd->ch - sd->h;
406 if (sd->cx < 0) sd->cx = 0;
407 if (sd->cy < 0) sd->cy = 0;
412 if (sd->view->mode == VIEW_MODE_LIST)
417 else if (sd->view->mode == VIEW_MODE_DETAIL)
425 int cnt = eina_list_count(sd->items);
427 int width = sd->w - 8;
432 aspect_w = width * 2;
434 else if ((cnt < 9) && (sd->w < (double)sd->h * 1.2))
437 aspect_w = width * 3;
442 aspect_w = width * 3;
444 else if (sd->view->zoom == 0)
447 aspect_w = width * (1 + (sd->h / size));
450 else if (sd->view->zoom == 1)
454 aspect_w = width * (1 + (sd->h / size));
457 else /* if (sd->view->zoom == 2) */
461 aspect_w = width * (1 + (sd->h / size));
464 if (col < 1) col = 1;
470 if (aspect_w <= 0) aspect_w = 1;
471 if (aspect_h <= 0) aspect_h = 1;
477 if (sd->view->mode == VIEW_MODE_THUMB)
478 hh = (aspect_h * iw) / (aspect_w);
481 EINA_LIST_FOREACH(sd->items, l, it)
483 if (x > (sd->w - ww))
494 if ((x + ww) > mw) mw = x + ww;
495 if ((y + hh) > mh) mh = y + hh;
499 if (sd->view->mode == VIEW_MODE_LIST ||
500 sd->view->mode == VIEW_MODE_DETAIL)
503 if ((mw != sd->cw) || (mh != sd->ch))
508 if (sd->cx > (sd->cw - sd->w))
509 sd->cx = sd->cw - sd->w;
510 if (sd->cy > (sd->ch - sd->h))
511 sd->cy = sd->ch - sd->h;
520 if (sd->view->mode == VIEW_MODE_THUMB)
522 if (sd->w > sd->cw) ox = (sd->w - sd->cw) / 2;
523 if (sd->h > sd->ch) oy = (sd->h - sd->ch) / 2;
526 EINA_LIST_FOREACH(sd->items, l, it)
528 xx = sd->x - sd->cx + it->x + ox;
529 yy = sd->y - sd->cy + it->y + oy;
531 if (E_INTERSECTS(xx, yy, it->w, it->h, 0, sd->y - it->h,
532 sd->x + sd->w, sd->y + sd->h + it->h))
535 _item_show(sd->view, it, obj);
537 evas_object_move(it->frame, xx, yy);
538 evas_object_resize(it->frame, it->w, it->h);
540 if (!(it->image || it->do_thumb || it->have_thumb) &&
541 !eina_list_data_find(sd->queue, it))
542 sd->queue = eina_list_append(sd->queue, it);
544 else if (it->visible)
546 sd->queue = eina_list_remove(sd->queue, it);
549 it->changed = EINA_FALSE;
553 evas_object_smart_callback_call(obj, "changed", NULL);
555 if (!sd->thumb_idler)
556 sd->thumb_idler = ecore_idle_enterer_add(_thumb_idler, sd);
558 sd->idle_enter = NULL;
560 return ECORE_CALLBACK_CANCEL;
564 _e_smart_reconfigure(Evas_Object *obj)
566 Smart_Data *sd = evas_object_smart_data_get(obj);
568 if (sd->idle_enter) return;
569 sd->idle_enter = ecore_idle_enterer_before_add(_e_smart_reconfigure_do, obj);
573 _e_smart_add(Evas_Object *obj)
575 Smart_Data *sd = calloc(1, sizeof(Smart_Data));
578 sd->sx = sd->sy = -1;
579 evas_object_smart_data_set(obj, sd);
583 _e_smart_del(Evas_Object *obj)
585 Smart_Data *sd = evas_object_smart_data_get(obj);
588 ecore_idle_enterer_del(sd->idle_enter);
591 ecore_idle_enterer_del(sd->thumb_idler);
596 evas_object_smart_data_set(obj, NULL);
600 _e_smart_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
602 Smart_Data *sd = evas_object_smart_data_get(obj);
606 _e_smart_reconfigure(obj);
610 _e_smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h)
612 Smart_Data *sd = evas_object_smart_data_get(obj);
615 _e_smart_reconfigure(obj);
616 evas_object_smart_callback_call(obj, "changed", NULL);
620 _e_smart_show(Evas_Object *obj __UNUSED__){}
623 _e_smart_hide(Evas_Object *obj __UNUSED__){}
626 _e_smart_color_set(Evas_Object *obj __UNUSED__, int r __UNUSED__, int g __UNUSED__, int b __UNUSED__, int a __UNUSED__){}
629 _e_smart_clip_set(Evas_Object *obj __UNUSED__, Evas_Object * clip __UNUSED__){}
632 _e_smart_clip_unset(Evas_Object *obj __UNUSED__){}
637 static Evas_Smart *smart = NULL;
638 static const Evas_Smart_Class sc =
641 EVAS_SMART_CLASS_VERSION,
659 smart = evas_smart_class_new(&sc);
660 return evas_object_smart_add(evas, smart);
664 _pan_set(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
666 Smart_Data *sd = evas_object_smart_data_get(obj);
667 if (x > (sd->cw - sd->w)) x = sd->cw - sd->w;
668 if (y > (sd->ch - sd->h)) y = sd->ch - sd->h;
671 if ((sd->cx == x) && (sd->cy == y)) return;
674 _e_smart_reconfigure(obj);
678 _pan_get(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y)
680 Smart_Data *sd = evas_object_smart_data_get(obj);
686 _pan_max_get(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y)
688 Smart_Data *sd = evas_object_smart_data_get(obj);
691 if (sd->w < sd->cw) *x = sd->cw - sd->w;
696 if (sd->h < sd->ch) *y = sd->ch - sd->h;
702 _pan_child_size_get(Evas_Object *obj, Evas_Coord *w, Evas_Coord *h)
704 Smart_Data *sd = evas_object_smart_data_get(obj);
710 _pan_view_set(Evas_Object *obj, View *view)
712 Smart_Data *sd = evas_object_smart_data_get(obj);
717 _pan_item_add(Evas_Object *obj, Evry_Item *item)
719 Smart_Data *sd = evas_object_smart_data_get(obj);
723 if (!it) return NULL;
725 sd->items = eina_list_append(sd->items, it);
728 it->changed = EINA_TRUE;
732 _e_smart_reconfigure(obj);
738 _pan_item_remove(Evas_Object *obj, Item *it)
740 Smart_Data *sd = evas_object_smart_data_get(obj);
742 sd->items = eina_list_remove(sd->items, it);
743 sd->queue = eina_list_remove(sd->queue, it);
747 evry_item_free(it->item);
749 _e_smart_reconfigure(obj);
755 _animator_del(Evas_Object *obj)
757 Smart_Data *sd = evas_object_smart_data_get(obj);
763 _animator(void *data)
765 Smart_Data *sd = evas_object_smart_data_get(data);
766 if (!sd) return ECORE_CALLBACK_CANCEL;
769 double spd = ((25.0/ (double)e_config->framerate) /
770 (double) (1 + sd->view->zoom));
771 if (spd > 0.9) spd = 0.9;
775 if (sd->scroll_align != sd->scroll_align_to)
777 sd->scroll_align = ((sd->scroll_align * (1.0 - spd)) +
778 (sd->scroll_align_to * spd));
780 da = sd->scroll_align - sd->scroll_align_to;
781 if (da < 0.0) da = -da;
783 sd->scroll_align = sd->scroll_align_to;
787 e_scrollframe_child_pos_set(sd->view->sframe,
788 0, sd->scroll_align);
792 return ECORE_CALLBACK_RENEW;
796 return ECORE_CALLBACK_CANCEL;
801 _child_region_get(Evas_Object *obj, Evas_Coord y, Evas_Coord h)
803 Smart_Data *sd = evas_object_smart_data_get(obj);
804 Evas_Coord my = 0, ch = 0, py = 0, ny;
816 else if ((y + h) > (py + (ch - my)))
818 ny = y + h - (ch - my);
828 _pan_item_select(Evas_Object *obj, Item *it, int scroll)
830 Smart_Data *sd = evas_object_smart_data_get(obj);
836 prev = sd->cur_item->y / (1 + sd->cur_item->h);
837 _item_unselect(sd->cur_item);
846 if (evry_conf->scroll_animate)
848 double now = ecore_time_get();
850 if (now - sd->last_select < 0.08)
852 sd->scroll_align = sd->scroll_align_to;
856 sd->last_select = now;
863 if (sd->view->mode == VIEW_MODE_THUMB)
865 if (sd->view->zoom < 2)
866 align = _child_region_get(obj, it->y - it->h, it->h * 3);
868 align = _child_region_get(obj, it->y, it->h);
872 align = _child_region_get(obj, it->y - it->h*2, it->h * 5);
875 if (scroll && evry_conf->scroll_animate)
877 sd->scroll_align_to = align;
879 if (align != sd->cy && !sd->animator)
880 sd->animator = ecore_animator_add(_animator, obj);
884 sd->scroll_align = sd->scroll_align_to;
888 sd->scroll_align = align;
889 sd->scroll_align_to = align;
890 e_scrollframe_child_pos_set(sd->view->sframe,
891 0, sd->scroll_align);
897 _e_smart_reconfigure(obj);
901 _clear_items(Evas_Object *obj)
903 Smart_Data *sd = evas_object_smart_data_get(obj);
909 EINA_LIST_FOREACH(sd->items, l, it)
913 eina_list_free(sd->queue);
917 ecore_idle_enterer_del(sd->thumb_idler);
918 sd->thumb_idler = NULL;
922 _view_clear(Evry_View *view)
924 View *v = (View*) view;
925 Smart_Data *sd = evas_object_smart_data_get(v->span);
934 _clear_items(v->span);
938 EINA_LIST_FREE(sd->items, it)
940 evry_item_free(it->item);
945 _e_smart_reconfigure(v->span);
947 v->tabs->clear(v->tabs);
951 _sort_cb(const void *data1, const void *data2)
953 const Item *it1 = data1;
954 const Item *it2 = data2;
956 return it1->pos - it2->pos;
960 _update_frame(Evas_Object *obj)
962 Smart_Data *sd = evas_object_smart_data_get(obj);
966 sd->scroll_align = 0;
968 e_scrollframe_child_pos_set(sd->view->sframe, 0, sd->scroll_align);
970 _e_smart_reconfigure_do(obj);
972 _pan_item_select(obj, sd->cur_item, 0);
974 _e_smart_reconfigure(obj);
980 _view_update(Evry_View *view)
983 Smart_Data *sd = evas_object_smart_data_get(v->span);
986 Eina_List *l, *ll, *v_remove = NULL, *v_items = NULL;
987 int pos, last_pos, last_vis = 0, first_vis = 0;
988 Eina_Bool update = EINA_FALSE;
989 Evry_Plugin *p = v->state->plugin;
1005 if (p != v->plugin && (v->plugin || (v->mode == VIEW_MODE_NONE)))
1007 if (p->config->view_mode != v->mode)
1009 _clear_items(v->span);
1011 if (p->config->view_mode < 0)
1012 v->mode = evry_conf->view_mode;
1014 v->mode = p->config->view_mode;
1018 /* go through current view items */
1019 EINA_LIST_FOREACH(sd->items, l, v_it)
1021 last_pos = v_it->pos;
1025 /* go through plugins current items */
1026 EINA_LIST_FOREACH(p->items, ll, p_it)
1028 if (v_it->item == p_it)
1030 if (pos != last_pos)
1031 v_it->changed = EINA_TRUE;
1037 sd->cur_item = v_it;
1038 v_it->selected = EINA_TRUE;
1042 if (v_it->selected && v_it->frame)
1043 edje_object_signal_emit
1044 (v_it->frame,"e,state,unselected", "e");
1045 v_it->selected = EINA_FALSE;
1054 if (!first_vis) first_vis = v_it->pos;
1055 last_vis = v_it->pos;
1058 /* view item is in list of current items */
1061 v_items = eina_list_append(v_items, v_it->item);
1063 if (v_it->visible && v_it->changed)
1068 if (v_it->visible) update = EINA_TRUE;
1069 v_remove = eina_list_append(v_remove, v_it);
1073 EINA_LIST_FREE(v_remove, v_it)
1074 _pan_item_remove(v->span, v_it);
1076 /* go through plugins current items */
1078 EINA_LIST_FOREACH(p->items, l, p_it)
1080 /* item is not already in view */
1081 if (!eina_list_data_find_list(v_items, p_it))
1083 v_it = _pan_item_add(v->span, p_it);
1085 if (!v_it) continue;
1089 if (p_it == v->state->cur_item)
1091 sd->cur_item = v_it;
1092 v_it->selected = EINA_TRUE;
1095 if (pos > first_vis && pos < last_vis)
1100 if (v_items) eina_list_free(v_items);
1102 sd->items = eina_list_sort(sd->items, -1, _sort_cb);
1104 if (update || !last_vis || v->plugin != p)
1107 _update_frame(v->span);
1110 v->tabs->update(v->tabs);
1116 _cb_key_down(Evry_View *view, const Ecore_Event_Key *ev)
1118 View *v = (View *) view;
1119 Smart_Data *sd = evas_object_smart_data_get(v->span);
1120 Eina_List *l = NULL, *ll;
1122 const Evry_State *s;
1125 if (!sd || !(s = v->state) || !(s->plugin))
1128 const char *key = ev->key;
1134 if ((ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) &&
1135 (!strcmp(key, "2")))
1137 if (v->mode == VIEW_MODE_LIST)
1138 v->mode = VIEW_MODE_DETAIL;
1140 v->mode = VIEW_MODE_LIST;
1143 _clear_items(v->span);
1144 _update_frame(v->span);
1147 else if (((ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) &&
1148 (!strcmp(key, "3"))) || !strcmp(key, "XF86Forward"))
1150 if (v->mode != VIEW_MODE_THUMB)
1153 v->mode = VIEW_MODE_THUMB;
1154 _clear_items(v->span);
1159 if (v->zoom > 2) v->zoom = 0;
1161 _clear_items(v->span);
1163 _update_frame(v->span);
1166 else if (!strcmp(key, "XF86Back"))
1168 if (v->mode == VIEW_MODE_LIST ||
1169 v->mode == VIEW_MODE_DETAIL)
1172 v->mode = VIEW_MODE_THUMB;
1176 v->mode = VIEW_MODE_DETAIL;
1179 _clear_items(v->span);
1180 _update_frame(v->span);
1184 if (((ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT) ||
1185 (ev->modifiers & ECORE_EVENT_MODIFIER_CTRL)) &&
1186 (!strcmp(key, "Up")))
1188 if (!sd->items) goto end;
1189 it = sd->items->data;
1191 _pan_item_select(v->span, it, 1);
1192 evry_item_select(s, it->item);
1195 else if (((ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT) ||
1196 (ev->modifiers & ECORE_EVENT_MODIFIER_CTRL)) &&
1197 (!strcmp(key, "Down")))
1199 if (!sd->items) goto end;
1201 it = eina_list_last(sd->items)->data;
1202 _pan_item_select(v->span, it, 1);
1203 evry_item_select(s, it->item);
1207 if ((ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) &&
1208 (!strcmp(key, "plus")))
1210 EINA_LIST_FOREACH(sd->items, ll, it)
1212 if (!it->item->marked)
1215 edje_object_signal_emit(it->frame, "e,state,marked", "e");
1216 evry_item_mark(s, it->item, 1);
1221 else if ((ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) &&
1222 (!strcmp(key, "minus")))
1224 EINA_LIST_FOREACH(sd->items, ll, it)
1226 if (it->item->marked)
1229 edje_object_signal_emit(it->frame, "e,state,unmarked", "e");
1230 evry_item_mark(s, it->item, 0);
1235 else if (!strcmp(key, "comma") || !strcmp(key, "semicolon"))
1240 if (!sd->cur_item->item->marked)
1242 edje_object_signal_emit(sd->cur_item->frame, "e,state,marked", "e");
1243 evry_item_mark(s, sd->cur_item->item, 1);
1247 edje_object_signal_emit(sd->cur_item->frame, "e,state,unmarked", "e");
1248 evry_item_mark(s, sd->cur_item->item, 0);
1251 if (v->mode == VIEW_MODE_THUMB)
1253 if (!strcmp(key, "comma"))
1260 if (!strcmp(key, "comma"))
1267 if ((slide = v->tabs->key_down(v->tabs, ev)))
1269 /* _view_update(view, -slide); */
1275 l = eina_list_data_find_list(sd->items, sd->cur_item);
1279 if (v->mode == VIEW_MODE_THUMB && !evry_conf->cycle_mode)
1281 if (!strcmp(key, "Right"))
1288 _pan_item_select(v->span, it, 1);
1289 evry_item_select(s, it->item);
1293 else if (!strcmp(key, "Left"))
1300 _pan_item_select(v->span, it, 1);
1301 evry_item_select(s, it->item);
1306 if (!strcmp(key, "Down"))
1308 if (v->mode == VIEW_MODE_THUMB &&
1309 (!evry_conf->cycle_mode) &&
1312 EINA_LIST_FOREACH(l, ll, it)
1314 if (it->y > sd->cur_item->y &&
1315 it->x >= sd->cur_item->x)
1320 if (!it && l && l->next)
1325 _pan_item_select(v->span, it, 1);
1326 evry_item_select(s, it->item);
1330 else if (!strcmp(key, "Up"))
1332 if (v->mode == VIEW_MODE_THUMB &&
1333 (!evry_conf->cycle_mode) &&
1336 for(ll = l; ll; ll = ll->prev)
1340 if (it->y < sd->cur_item->y &&
1341 it->x <= sd->cur_item->x)
1346 if (!it && l && l->prev)
1351 _pan_item_select(v->span, it, 1);
1352 evry_item_select(s, it->item);
1356 else if ((!strcmp(key, "Prior") || (!strcmp(key, "Next"))))
1359 int next = (!strcmp(key, "Next"));
1361 cur = sd->cur_item->y;
1363 EINA_LIST_FOREACH(sd->items, l, it)
1367 if (it->y >= cur + sd->h) break;
1371 if (it->y + it->h >= cur - sd->h) break;
1380 _pan_item_select(v->span, it, 0);
1381 evry_item_select(s, it->item);
1385 else if (!ev->modifiers && !strcmp(key, "Return"))
1387 if (v->mode == VIEW_MODE_THUMB)
1392 if (evry_browse_item(sd->cur_item->item))
1404 _cb_item_changed(void *data, int type __UNUSED__, void *event)
1406 Evry_Event_Item_Changed *ev = event;
1410 Smart_Data *sd = evas_object_smart_data_get(v->span);
1411 if (!sd) return ECORE_CALLBACK_PASS_ON;
1413 EINA_LIST_FOREACH(sd->items, l, it)
1414 if (it->item == ev->item)
1418 return ECORE_CALLBACK_PASS_ON;
1420 if (ev->changed_selection)
1422 _pan_item_select(v->span, it, 1);
1423 evry_item_select(v->state, ev->item);
1427 return ECORE_CALLBACK_PASS_ON;
1429 edje_object_part_text_set(it->frame, "e.text.label", it->item->label);
1431 if (ev->changed_icon)
1433 if (it->do_thumb) e_thumb_icon_end(it->thumb);
1434 if (it->thumb) evas_object_del(it->thumb);
1435 if (it->image) evas_object_del(it->image);
1440 it->have_thumb = EINA_FALSE;
1441 it->do_thumb = EINA_FALSE;
1443 if (!eina_list_data_find(sd->queue, it))
1444 sd->queue = eina_list_append(sd->queue, it);
1446 if (!sd->thumb_idler)
1447 sd->thumb_idler = ecore_idle_enterer_add(_thumb_idler, sd);
1450 return ECORE_CALLBACK_PASS_ON;
1454 _view_cb_mouse_wheel(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info)
1456 Evas_Event_Mouse_Wheel *ev = event_info;
1457 Smart_Data *sd = evas_object_smart_data_get(obj);
1462 _item_select(sd->cur_item);
1468 _view_cb_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
1470 Evas_Event_Mouse_Down *ev = event_info;
1471 Smart_Data *sd = evas_object_smart_data_get(data);
1474 sd->mouse_button = ev->button;
1475 sd->mouse_x = ev->canvas.x;
1476 sd->mouse_y = ev->canvas.y;
1480 _view_cb_mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1482 /* Evas_Event_Mouse_Up *ev = event_info; */
1483 Smart_Data *sd = evas_object_smart_data_get(data);
1487 sd->mouse_button = 0;
1488 edje_object_signal_emit(sd->view->bg, "e,action,hide,into", "e");
1489 edje_object_signal_emit(sd->view->bg, "e,action,hide,back", "e");
1492 #define SLIDE_RESISTANCE 80
1495 _view_cb_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
1497 Evas_Event_Mouse_Move *ev = event_info;
1498 Smart_Data *sd = evas_object_smart_data_get(data);
1507 sel = sd->view->state->selector;
1508 if (!sel || !sel->states)
1511 diff_x = abs(ev->cur.canvas.x - sd->mouse_x);
1512 diff_y = abs(ev->cur.canvas.y - sd->mouse_y);
1514 if (diff_y > 15 + (diff_x/2))
1516 edje_object_signal_emit(sd->view->bg, "e,action,hide,into", "e");
1517 edje_object_signal_emit(sd->view->bg, "e,action,hide,back", "e");
1521 if ((sel->states->next) || (sel != sel->win->selectors[0]))
1522 edje_object_signal_emit(sd->view->bg, "e,action,show,back", "e");
1526 if ((sd->it_down->item->browseable) ||
1527 (sel != sel->win->selectors[2]))
1528 edje_object_signal_emit(sd->view->bg, "e,action,show,into", "e");
1530 if ((sd->cur_item != sd->it_down) && (diff_x > 10))
1532 evry_item_select(sd->view->state, sd->it_down->item);
1533 _pan_item_select(data, sd->it_down, 0);
1537 if (sd->mouse_button == 1)
1539 if (ev->cur.canvas.x - sd->mouse_x > SLIDE_RESISTANCE)
1544 if (sel->states->next)
1545 evry_browse_back(sel);
1547 evry_selectors_switch(sel->win, -1, EINA_TRUE);
1549 else if ((sd->it_down && (sd->cur_item == sd->it_down)) &&
1550 (sd->mouse_x - ev->cur.canvas.x > SLIDE_RESISTANCE))
1552 edje_object_signal_emit(sd->view->bg, "e,action,hide,into", "e");
1553 edje_object_signal_emit(sd->view->bg, "e,action,hide,back", "e");
1555 if (sd->it_down->item->browseable)
1557 evry_browse_item(sd->it_down->item);
1561 evry_selectors_switch(sel->win, 1, EINA_TRUE);
1578 _view_create(Evry_View *view, const Evry_State *s, const Evas_Object *swallow)
1580 GET_VIEW(parent, view);
1583 Ecore_Event_Handler *h;
1588 v->evas = evas_object_evas_get(swallow);
1592 if ((s->selector->states->next) &&
1593 ((s->plugin->config->view_mode < 0) ||
1594 (!strcmp(s->plugin->name, N_("All")))))
1595 v->mode = parent->mode;
1596 else if (s->plugin->config->view_mode >= 0)
1597 v->mode = s->plugin->config->view_mode;
1599 v->mode = evry_conf->view_mode;
1603 if (s->selector->states->next)
1604 v->mode = parent->mode;
1606 v->mode = evry_conf->view_mode;
1609 v->plugin = s->plugin;
1610 v->mode_prev = v->mode;
1611 v->zoom = parent->zoom;
1613 v->bg = edje_object_add(v->evas);
1614 e_theme_edje_object_set(v->bg, "base/theme/modules/everything",
1615 "e/modules/everything/thumbview/main/window");
1617 v->span = _pan_add(v->evas);
1618 _pan_view_set(v->span, v);
1619 evas_object_event_callback_add(v->span, EVAS_CALLBACK_MOUSE_WHEEL,
1620 _view_cb_mouse_wheel, NULL);
1622 evas_object_event_callback_add(v->bg, EVAS_CALLBACK_MOUSE_MOVE,
1623 _view_cb_mouse_move, v->span);
1624 evas_object_event_callback_add(v->bg, EVAS_CALLBACK_MOUSE_DOWN,
1625 _view_cb_mouse_down, v->span);
1626 evas_object_event_callback_add(v->bg, EVAS_CALLBACK_MOUSE_UP,
1627 _view_cb_mouse_up, v->span);
1629 // the scrollframe holding the scrolled thumbs
1630 v->sframe = e_scrollframe_add(v->evas);
1631 e_scrollframe_custom_theme_set(v->sframe, "base/theme/modules/everything",
1632 "e/modules/everything/thumbview/main/scrollframe");
1633 e_scrollframe_thumbscroll_force(v->sframe, 1);
1635 e_scrollframe_extern_pan_set(v->sframe, v->span,
1636 _pan_set, _pan_get, _pan_max_get,
1637 _pan_child_size_get);
1638 edje_object_part_swallow(v->bg, "e.swallow.list", v->sframe);
1640 evas_object_show(v->sframe);
1641 evas_object_show(v->span);
1643 v->tabs = evry_tab_view_new(EVRY_VIEW(v), v->state, v->evas);
1645 EVRY_VIEW(v)->o_list = v->bg;
1646 EVRY_VIEW(v)->o_bar = v->tabs->o_tabs;
1648 h = evry_event_handler_add(EVRY_EVENT_ITEM_CHANGED, _cb_item_changed, v);
1649 v->handlers = eina_list_append(v->handlers, h);
1651 return EVRY_VIEW(v);
1655 _view_destroy(Evry_View *view)
1657 Ecore_Event_Handler *h;
1663 evas_object_del(v->span);
1664 evas_object_del(v->bg);
1665 evas_object_del(v->sframe);
1667 evry_tab_view_free(v->tabs);
1669 EINA_LIST_FREE(v->handlers, h)
1670 ecore_event_handler_del(h);
1676 evry_view_init(void)
1678 if (!evry_api_version_check(EVRY_API_VERSION))
1681 View *v = E_NEW(View, 1);
1683 v->view.id = EVRY_VIEW(v);
1684 v->view.name = "Icon View";
1685 v->view.create = &_view_create;
1686 v->view.destroy = &_view_destroy;
1687 v->view.update = &_view_update;
1688 v->view.clear = &_view_clear;
1689 v->view.cb_key_down = &_cb_key_down;
1690 v->mode = VIEW_MODE_NONE;
1692 evry_view_register(EVRY_VIEW(v), 1);
1700 evry_view_shutdown(void)
1702 evry_view_unregister(EVRY_VIEW(view));