1 #include "e_mod_main.h"
3 typedef struct _View View;
4 typedef struct _Smart_Data Smart_Data;
5 typedef struct _Item Item;
15 const Evry_State *state;
16 const Evry_Plugin *plugin;
19 Evas_Object *bg, *sframe, *span;
30 /* smart object based on wallpaper module */
36 Ecore_Idle_Enterer *idle_enter;
37 Evas_Coord x, y, w, h;
38 Evas_Coord cx, cy, cw, ch;
43 double scroll_align_to;
44 Ecore_Animator *animator;
64 Evas_Coord x, y, w, h;
65 Evas_Object *frame, *image, *thumb;
66 Eina_Bool selected : 1;
67 Eina_Bool have_thumb : 1;
68 Eina_Bool do_thumb : 1;
69 Eina_Bool get_thumb : 1;
70 Eina_Bool showing : 1;
71 Eina_Bool visible : 1;
72 Eina_Bool changed : 1;
77 static View *view = NULL;
79 static void _view_clear(Evry_View *view);
80 static void _pan_item_select(Evas_Object *obj, Item *it, int scroll);
81 static void _animator_del(Evas_Object *obj);
82 static Eina_Bool _animator(void *data);
85 _cb_thumb_gen(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
90 if (!it->frame) return;
92 e_icon_size_get(it->thumb, &w, &h);
93 edje_extern_object_aspect_set(it->thumb, EDJE_ASPECT_CONTROL_BOTH, w, h);
94 evas_object_size_hint_max_set(it->thumb, w, h);
95 edje_object_part_unswallow(it->frame, it->image);
96 edje_object_part_swallow(it->frame, "e.swallow.thumb", it->thumb);
97 evas_object_show(it->thumb);
98 edje_object_signal_emit(it->frame, "e,action,thumb,show_delayed", "e");
99 edje_object_message_signal_process(it->frame);
100 it->have_thumb = EINA_TRUE;
101 it->do_thumb = EINA_FALSE;
103 if (it->image) evas_object_del(it->image);
108 _cb_preload(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
112 if (!it->frame) return;
113 printf("preload callback!!!!\n");
115 edje_object_part_swallow(it->frame, "e.swallow.icon", it->image);
116 /* evas_object_show(it->image); */
120 _check_item(const Evry_Item *it)
126 if (!evry_file_path_get(file) || !file->mime) return 0;
128 if (!strncmp(file->mime, "image/", 6))
131 if ((suffix = strrchr(it->label, '.')))
132 if (!strncmp(suffix, ".edj", 4))
139 _item_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
141 Evas_Event_Mouse_Down *ev = event_info;
143 Smart_Data *sd = evas_object_smart_data_get(it->obj);
149 sd->mouse_button = ev->button;
153 if ((ev->button == 1) && (ev->flags & EVAS_BUTTON_DOUBLE_CLICK))
155 if (it != sd->cur_item)
157 evry_item_select(s, it->item);
158 _pan_item_select(it->obj, it, 0);
161 if (it->item->browseable)
162 evry_browse_item(it->item);
164 evry_plugin_action(s->selector->win, 1);
168 sd->mouse_x = ev->canvas.x;
169 sd->mouse_y = ev->canvas.y;
174 _item_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
176 Evas_Event_Mouse_Up *ev = event_info;
178 Smart_Data *sd = evas_object_smart_data_get(it->obj);
187 edje_object_signal_emit(sd->view->bg, "e,action,hide,into", "e");
188 edje_object_signal_emit(sd->view->bg, "e,action,hide,back", "e");
195 if (!(ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) &&
196 (it != sd->cur_item))
198 evry_item_select(s, it->item);
199 _pan_item_select(it->obj, it, 0);
202 else if (ev->button == 3)
204 evry_item_select(s, it->item);
205 _pan_item_select(it->obj, it, 0);
207 evry_plugin_action(s->selector->win, 0);
212 _item_select(Item *it)
214 it->selected = EINA_TRUE;
215 edje_object_signal_emit(it->frame, "e,state,selected", "e");
219 if (strcmp(evas_object_type_get(it->thumb), "e_icon"))
220 edje_object_signal_emit(it->thumb, "e,state,selected", "e");
222 e_icon_selected_set(it->thumb, EINA_TRUE);
227 if (strcmp(evas_object_type_get(it->image), "e_icon"))
228 edje_object_signal_emit(it->image, "e,state,selected", "e");
230 e_icon_selected_set(it->image, EINA_TRUE);
235 _item_unselect(Item *it)
237 it->selected = EINA_FALSE;
238 edje_object_signal_emit(it->frame, "e,state,unselected", "e");
242 if (strcmp(evas_object_type_get(it->thumb), "e_icon"))
243 edje_object_signal_emit(it->thumb, "e,state,unselected", "e");
245 e_icon_selected_set(it->thumb, EINA_FALSE);
250 if (strcmp(evas_object_type_get(it->image), "e_icon"))
251 edje_object_signal_emit(it->image, "e,state,unselected", "e");
253 e_icon_selected_set(it->image, EINA_FALSE);
257 //static double _icon_time;
260 _item_show(View *v, Item *it, Evas_Object *list)
267 it->frame = edje_object_add(v->evas);
268 if (v->mode == VIEW_MODE_THUMB)
270 e_theme_edje_object_set(it->frame, "base/theme/modules/everything",
271 "e/modules/everything/thumbview/item/thumb");
275 e_theme_edje_object_set(it->frame, "base/theme/modules/everything",
276 "e/modules/everything/thumbview/item/list");
278 if (v->mode == VIEW_MODE_DETAIL)
279 edje_object_signal_emit(it->frame, "e,state,detail,show", "e");
282 evas_object_event_callback_add(it->frame, EVAS_CALLBACK_MOUSE_DOWN,
284 evas_object_event_callback_add(it->frame, EVAS_CALLBACK_MOUSE_UP,
286 evas_object_smart_member_add(it->frame, list);
288 evas_object_clip_set(it->frame, evas_object_clip_get(list));
290 if (it->item->selected)
293 if (it->item->marked)
294 edje_object_signal_emit(it->frame, "e,state,marked", "e");
297 edje_object_part_text_set(it->frame, "e.text.label", it->item->label);
299 if (v->mode == VIEW_MODE_DETAIL && it->item->detail)
300 edje_object_part_text_set(it->frame, "e.text.detail", it->item->detail);
302 evas_object_show(it->frame);
304 if (it->item->browseable)
305 edje_object_signal_emit(it->frame, "e,state,browseable", "e");
307 if (!it->image && !it->have_thumb)
309 //double t = ecore_time_get();
310 it->image = evry_util_icon_get(it->item, v->evas);
311 //_icon_time += ecore_time_get() - t;
316 e_icon_size_get(it->image, &it->max_w, &it->max_h);
318 if ((it->max_w > 0) && (it->max_h > 0))
319 evas_object_size_hint_max_set(it->image, it->max_w * 2, it->max_h * 2);
323 if (0 && e_icon_preload_get(it->image) && !evas_object_visible_get(it->image))
325 evas_object_smart_callback_add(it->image, "preloaded", _cb_preload, it);
329 edje_object_part_swallow(it->frame, "e.swallow.icon", it->image);
330 evas_object_show(it->image);
333 else it->have_thumb = EINA_TRUE;
336 if ((it->get_thumb) || (CHECK_TYPE(it->item, EVRY_TYPE_FILE) && _check_item(it->item)))
340 it->get_thumb = EINA_TRUE;
342 it->thumb = e_thumb_icon_add(v->evas);
344 GET_FILE(file, it->item);
346 evas_object_smart_callback_add(it->thumb, "e_thumb_gen", _cb_thumb_gen, it);
348 e_thumb_icon_size_set(it->thumb, it->w, it->h);
350 if (it->item->icon && it->item->icon[0])
351 e_thumb_icon_file_set(it->thumb, it->item->icon, NULL);
352 else if ((suffix = strrchr(file->path, '.')) && (!strncmp(suffix, ".edj", 4)))
354 e_thumb_icon_file_set(it->thumb, file->path, "e/desktop/background");
355 e_thumb_icon_size_set(it->thumb, 128, 80);
358 e_thumb_icon_file_set(it->thumb, file->path, NULL);
360 e_thumb_icon_begin(it->thumb);
361 it->do_thumb = EINA_TRUE;
364 edje_object_signal_emit(it->frame, "e,action,thumb,show", "e");
366 it->visible = EINA_TRUE;
372 if (it->do_thumb) e_thumb_icon_end(it->thumb);
374 if (it->thumb) evas_object_del(it->thumb);
375 if (it->image) evas_object_del(it->image);
376 if (it->frame) evas_object_del(it->frame);
382 it->have_thumb = EINA_FALSE;
383 it->do_thumb = EINA_FALSE;
384 it->visible = EINA_FALSE;
388 _place_items(Smart_Data *sd)
393 Evas_Coord x = 0, y = 0, ww, hh, mw = 0, mh = 0;
395 if (sd->view->mode == VIEW_MODE_LIST)
400 else if (sd->view->mode == VIEW_MODE_DETAIL)
408 Evas_Object *o = edje_object_add(sd->view->evas);
409 e_theme_edje_object_set(o, "base/theme/modules/everything",
410 "e/modules/everything/thumbview/item/thumb");
411 edje_object_size_min_get(o, &w, &h);
414 if ((w > 0) && (h > 0))
417 if (div < 1) div = 1;
418 ww = w + (sd->w - div * w) / div;
419 hh = ((double)h / (double)w * (double)ww);
423 if (sd->view->zoom == 0)
425 else if (sd->view->zoom == 1)
431 if (div < 1) div = 1;
432 ww += (sd->w - div * ww) / div;
435 if (div < 1) div = 1;
436 hh = ww + (sd->h - div * ww) / div;
439 hh = ww + (sd->h - (div + 1) * ww) / (div + 1);
443 EINA_LIST_FOREACH (sd->items, l, it)
450 if ((x + ww) > mw) mw = x + ww;
451 if ((y + hh) > mh) mh = y + hh;
454 if (x <= (sd->w - ww))
461 if ((sd->view->mode == VIEW_MODE_LIST) ||
462 (sd->view->mode == VIEW_MODE_DETAIL))
465 if ((mw != sd->cw) || (mh != sd->ch))
470 if (sd->cx > (sd->cw - sd->w))
471 sd->cx = sd->cw - sd->w;
472 if (sd->cy > (sd->ch - sd->h))
473 sd->cy = sd->ch - sd->h;
486 _e_smart_reconfigure_do(void *data)
488 Evas_Object *obj = data;
489 Smart_Data *sd = evas_object_smart_data_get(obj);
496 return ECORE_CALLBACK_CANCEL;
498 sd->idle_enter = NULL;
501 return ECORE_CALLBACK_CANCEL;
503 if (sd->view->hiding)
504 return ECORE_CALLBACK_CANCEL;
506 if (sd->cx > (sd->cw - sd->w)) sd->cx = sd->cw - sd->w;
507 if (sd->cy > (sd->ch - sd->h)) sd->cy = sd->ch - sd->h;
508 if (sd->cx < 0) sd->cx = 0;
509 if (sd->cy < 0) sd->cy = 0;
511 if (sd->place && _place_items(sd))
513 evas_object_smart_callback_call(obj, "changed", NULL);
514 return ECORE_CALLBACK_RENEW;
517 time = ecore_time_get();
519 EINA_LIST_FOREACH (sd->items, l, it)
521 xx = sd->x - sd->cx + it->x;
522 yy = sd->y - sd->cy + it->y;
524 if (E_INTERSECTS(xx, yy, it->w, it->h, 0, sd->y - it->h * 3,
525 sd->x + sd->w, sd->y + sd->h + it->h * 6))
528 _item_show(sd->view, it, obj);
530 evas_object_move(it->frame, xx, yy);
531 evas_object_resize(it->frame, it->w, it->h);
533 else if (it->visible)
537 it->changed = EINA_FALSE;
539 if (ecore_time_get() - time > 0.03)
540 return ECORE_CALLBACK_RENEW;
543 sd->idle_enter = NULL;
545 return ECORE_CALLBACK_CANCEL;
549 _e_smart_reconfigure(Evas_Object *obj)
551 Smart_Data *sd = evas_object_smart_data_get(obj);
553 if (sd->idle_enter) return;
554 sd->idle_enter = ecore_idle_enterer_before_add(_e_smart_reconfigure_do, obj);
558 _e_smart_add(Evas_Object *obj)
560 Smart_Data *sd = calloc(1, sizeof(Smart_Data));
563 sd->sx = sd->sy = -1;
564 evas_object_smart_data_set(obj, sd);
568 _e_smart_del(Evas_Object *obj)
570 Smart_Data *sd = evas_object_smart_data_get(obj);
573 ecore_idle_enterer_del(sd->idle_enter);
578 evas_object_smart_data_set(obj, NULL);
582 _e_smart_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
584 Smart_Data *sd = evas_object_smart_data_get(obj);
588 _e_smart_reconfigure(obj);
592 _e_smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h)
594 Smart_Data *sd = evas_object_smart_data_get(obj);
598 sd->place = EINA_TRUE;
599 _e_smart_reconfigure(obj);
600 /* evas_object_smart_callback_call(obj, "changed", NULL); */
604 _e_smart_show(Evas_Object *obj __UNUSED__){}
607 _e_smart_hide(Evas_Object *obj __UNUSED__){}
610 _e_smart_color_set(Evas_Object *obj __UNUSED__, int r __UNUSED__, int g __UNUSED__, int b __UNUSED__, int a __UNUSED__){}
613 _e_smart_clip_set(Evas_Object *obj __UNUSED__, Evas_Object *clip __UNUSED__){}
616 _e_smart_clip_unset(Evas_Object *obj __UNUSED__){}
621 static Evas_Smart *smart = NULL;
622 static const Evas_Smart_Class sc =
625 EVAS_SMART_CLASS_VERSION,
643 smart = evas_smart_class_new(&sc);
644 return evas_object_smart_add(evas, smart);
648 _pan_set(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
650 Smart_Data *sd = evas_object_smart_data_get(obj);
651 if (x > (sd->cw - sd->w)) x = sd->cw - sd->w;
652 if (y > (sd->ch - sd->h)) y = sd->ch - sd->h;
655 if ((sd->cx == x) && (sd->cy == y)) return;
658 _e_smart_reconfigure(obj);
662 _pan_get(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y)
664 Smart_Data *sd = evas_object_smart_data_get(obj);
670 _pan_max_get(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y)
672 Smart_Data *sd = evas_object_smart_data_get(obj);
675 if (sd->w < sd->cw) *x = sd->cw - sd->w;
680 if (sd->h < sd->ch) *y = sd->ch - sd->h;
686 _pan_child_size_get(Evas_Object *obj, Evas_Coord *w, Evas_Coord *h)
688 Smart_Data *sd = evas_object_smart_data_get(obj);
694 _pan_view_set(Evas_Object *obj, View *view)
696 Smart_Data *sd = evas_object_smart_data_get(obj);
701 _pan_item_add(Evas_Object *obj, Evry_Item *item)
703 Smart_Data *sd = evas_object_smart_data_get(obj);
707 if (!it) return NULL;
709 sd->items = eina_list_append(sd->items, it);
712 it->changed = EINA_TRUE;
716 sd->place = EINA_TRUE;
717 _e_smart_reconfigure(obj);
723 _pan_item_remove(Evas_Object *obj, Item *it)
725 Smart_Data *sd = evas_object_smart_data_get(obj);
727 sd->items = eina_list_remove(sd->items, it);
731 evry_item_free(it->item);
733 sd->place = EINA_TRUE;
734 _e_smart_reconfigure(obj);
740 _animator_del(Evas_Object *obj)
742 Smart_Data *sd = evas_object_smart_data_get(obj);
748 _animator(void *data)
750 Smart_Data *sd = evas_object_smart_data_get(data);
751 if (!sd) return ECORE_CALLBACK_CANCEL;
754 double spd = ((25.0 / (double)e_config->framerate) /
755 (double)(1 + sd->view->zoom));
756 if (spd > 0.9) spd = 0.9;
760 if (sd->scroll_align != sd->scroll_align_to)
762 sd->scroll_align = ((sd->scroll_align * (1.0 - spd)) +
763 (sd->scroll_align_to * spd));
765 da = sd->scroll_align - sd->scroll_align_to;
766 if (da < 0.0) da = -da;
768 sd->scroll_align = sd->scroll_align_to;
772 e_scrollframe_child_pos_set(sd->view->sframe,
773 0, sd->scroll_align);
777 return ECORE_CALLBACK_RENEW;
781 return ECORE_CALLBACK_CANCEL;
785 _child_region_get(Evas_Object *obj, Evas_Coord y, Evas_Coord h)
787 Smart_Data *sd = evas_object_smart_data_get(obj);
788 Evas_Coord my = 0, ch = 0, py = 0, ny;
800 else if ((y + h) > (py + (ch - my)))
802 ny = y + h - (ch - my);
812 _pan_item_select(Evas_Object *obj, Item *it, int scroll)
814 Smart_Data *sd = evas_object_smart_data_get(obj);
819 _item_unselect(sd->cur_item);
828 if (evry_conf->scroll_animate)
830 double now = ecore_time_get();
832 if (now - sd->last_select < 0.08)
834 sd->scroll_align = sd->scroll_align_to;
838 sd->last_select = now;
845 if (sd->view->mode == VIEW_MODE_THUMB)
847 if (sd->view->zoom < 2)
848 align = _child_region_get(obj, it->y - it->h, it->h * 3);
850 align = _child_region_get(obj, it->y, it->h);
854 align = _child_region_get(obj, it->y - it->h * 2, it->h * 5);
857 if (scroll && evry_conf->scroll_animate)
859 sd->scroll_align_to = align;
861 if (align != sd->cy && !sd->animator)
862 sd->animator = ecore_animator_add(_animator, obj);
866 sd->scroll_align = sd->scroll_align_to;
870 sd->scroll_align = align;
871 sd->scroll_align_to = align;
872 e_scrollframe_child_pos_set(sd->view->sframe,
873 0, sd->scroll_align);
879 _e_smart_reconfigure(obj);
883 _clear_items(Evas_Object *obj)
885 Smart_Data *sd = evas_object_smart_data_get(obj);
891 EINA_LIST_FOREACH (sd->items, l, it)
896 _view_clear(Evry_View *view)
898 View *v = (View *)view;
899 Smart_Data *sd = evas_object_smart_data_get(v->span);
908 _clear_items(v->span);
912 EINA_LIST_FREE (sd->items, it)
914 evry_item_free(it->item);
919 sd->place = EINA_TRUE;
920 _e_smart_reconfigure(v->span);
922 v->tabs->clear(v->tabs);
926 _sort_cb(const void *data1, const void *data2)
928 const Item *it1 = data1;
929 const Item *it2 = data2;
931 return it1->pos - it2->pos;
935 _update_frame(Evas_Object *obj)
937 Smart_Data *sd = evas_object_smart_data_get(obj);
941 sd->scroll_align = 0;
943 e_scrollframe_child_pos_set(sd->view->sframe, 0, sd->scroll_align);
945 sd->place = EINA_TRUE;
946 _e_smart_reconfigure_do(obj);
948 _pan_item_select(obj, sd->cur_item, 0);
950 _e_smart_reconfigure(obj);
956 _view_update(Evry_View *view)
959 Smart_Data *sd = evas_object_smart_data_get(v->span);
962 Eina_List *l, *ll, *v_remove = NULL, *v_items = NULL;
963 int pos, last_pos, last_vis = 0, first_vis = 0;
964 Eina_Bool update = EINA_FALSE;
965 Evry_Plugin *p = v->state->plugin;
974 v->hiding = EINA_FALSE;
982 if (p != v->plugin && (v->plugin || (v->mode == VIEW_MODE_NONE)))
984 if (p->config->view_mode != v->mode)
986 _clear_items(v->span);
988 if (p->config->view_mode < 0)
989 v->mode = evry_conf->view_mode;
991 v->mode = p->config->view_mode;
995 /* go through current view items */
996 EINA_LIST_FOREACH (sd->items, l, v_it)
998 last_pos = v_it->pos;
1002 /* go through plugins current items */
1003 EINA_LIST_FOREACH (p->items, ll, p_it)
1005 if (v_it->item == p_it)
1007 if (pos != last_pos)
1008 v_it->changed = EINA_TRUE;
1014 sd->cur_item = v_it;
1015 v_it->selected = EINA_TRUE;
1019 if (v_it->selected && v_it->frame)
1020 edje_object_signal_emit
1021 (v_it->frame, "e,state,unselected", "e");
1022 v_it->selected = EINA_FALSE;
1031 if (!first_vis) first_vis = v_it->pos;
1032 last_vis = v_it->pos;
1035 /* view item is in list of current items */
1038 v_items = eina_list_append(v_items, v_it->item);
1040 if (v_it->visible && v_it->changed)
1045 if (v_it->visible) update = EINA_TRUE;
1046 v_remove = eina_list_append(v_remove, v_it);
1050 EINA_LIST_FREE (v_remove, v_it)
1051 _pan_item_remove(v->span, v_it);
1053 /* go through plugins current items */
1055 EINA_LIST_FOREACH (p->items, l, p_it)
1057 /* item is not already in view */
1058 if (!eina_list_data_find_list(v_items, p_it))
1060 v_it = _pan_item_add(v->span, p_it);
1062 if (!v_it) continue;
1066 if (p_it == v->state->cur_item)
1068 sd->cur_item = v_it;
1069 v_it->selected = EINA_TRUE;
1072 if (pos > first_vis && pos < last_vis)
1077 if (v_items) eina_list_free(v_items);
1079 sd->items = eina_list_sort(sd->items, -1, _sort_cb);
1081 if (update || !last_vis || v->plugin != p)
1084 _update_frame(v->span);
1087 v->tabs->update(v->tabs);
1093 _cb_key_down(Evry_View *view, const Ecore_Event_Key *ev)
1095 View *v = (View *)view;
1096 Smart_Data *sd = evas_object_smart_data_get(v->span);
1097 Eina_List *l = NULL, *ll;
1099 const Evry_State *s;
1102 if (!sd || !(s = v->state) || !(s->plugin))
1105 const char *key = ev->key;
1111 if ((ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) &&
1112 (!strcmp(key, "2")))
1114 if (v->mode == VIEW_MODE_LIST)
1115 v->mode = VIEW_MODE_DETAIL;
1117 v->mode = VIEW_MODE_LIST;
1120 _clear_items(v->span);
1121 _update_frame(v->span);
1124 else if (((ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) &&
1125 (!strcmp(key, "3"))) || !strcmp(key, "XF86Forward"))
1127 if (v->mode != VIEW_MODE_THUMB)
1130 v->mode = VIEW_MODE_THUMB;
1131 _clear_items(v->span);
1136 if (v->zoom > 2) v->zoom = 0;
1138 _clear_items(v->span);
1140 _update_frame(v->span);
1143 else if (!strcmp(key, "XF86Back"))
1145 if (v->mode == VIEW_MODE_LIST ||
1146 v->mode == VIEW_MODE_DETAIL)
1149 v->mode = VIEW_MODE_THUMB;
1153 v->mode = VIEW_MODE_DETAIL;
1156 _clear_items(v->span);
1157 _update_frame(v->span);
1161 if (((ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT) ||
1162 (ev->modifiers & ECORE_EVENT_MODIFIER_CTRL)) &&
1163 (!strcmp(key, "Up")))
1165 if (!sd->items) goto end;
1166 it = sd->items->data;
1168 _pan_item_select(v->span, it, 1);
1169 evry_item_select(s, it->item);
1172 else if (((ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT) ||
1173 (ev->modifiers & ECORE_EVENT_MODIFIER_CTRL)) &&
1174 (!strcmp(key, "Down")))
1176 if (!sd->items) goto end;
1178 it = eina_list_last(sd->items)->data;
1179 _pan_item_select(v->span, it, 1);
1180 evry_item_select(s, it->item);
1184 if ((ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) &&
1185 (!strcmp(key, "plus")))
1187 EINA_LIST_FOREACH (sd->items, ll, it)
1189 if (!it->item->marked)
1192 edje_object_signal_emit(it->frame, "e,state,marked", "e");
1193 evry_item_mark(s, it->item, 1);
1198 else if ((ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) &&
1199 (!strcmp(key, "minus")))
1201 EINA_LIST_FOREACH (sd->items, ll, it)
1203 if (it->item->marked)
1206 edje_object_signal_emit(it->frame, "e,state,unmarked", "e");
1207 evry_item_mark(s, it->item, 0);
1212 else if (!strcmp(key, "comma") || !strcmp(key, "semicolon"))
1217 if (!sd->cur_item->item->marked)
1219 edje_object_signal_emit(sd->cur_item->frame, "e,state,marked", "e");
1220 evry_item_mark(s, sd->cur_item->item, 1);
1224 edje_object_signal_emit(sd->cur_item->frame, "e,state,unmarked", "e");
1225 evry_item_mark(s, sd->cur_item->item, 0);
1228 if (v->mode == VIEW_MODE_THUMB)
1230 if (!strcmp(key, "comma"))
1237 if (!strcmp(key, "comma"))
1244 if ((slide = v->tabs->key_down(v->tabs, ev)))
1246 /* _view_update(view, -slide); */
1252 l = eina_list_data_find_list(sd->items, sd->cur_item);
1256 if (v->mode == VIEW_MODE_THUMB && !evry_conf->cycle_mode)
1258 if (!strcmp(key, "Right"))
1265 _pan_item_select(v->span, it, 1);
1266 evry_item_select(s, it->item);
1270 else if (!strcmp(key, "Left"))
1277 _pan_item_select(v->span, it, 1);
1278 evry_item_select(s, it->item);
1283 if (!strcmp(key, "Down"))
1285 if (v->mode == VIEW_MODE_THUMB &&
1286 (!evry_conf->cycle_mode) &&
1289 EINA_LIST_FOREACH (l, ll, it)
1291 if (it->y > sd->cur_item->y &&
1292 it->x >= sd->cur_item->x)
1297 if (!it && l && l->next)
1302 _pan_item_select(v->span, it, 1);
1303 evry_item_select(s, it->item);
1307 else if (!strcmp(key, "Up"))
1309 if (v->mode == VIEW_MODE_THUMB &&
1310 (!evry_conf->cycle_mode) &&
1313 for (ll = l; ll; ll = ll->prev)
1317 if (it->y < sd->cur_item->y &&
1318 it->x <= sd->cur_item->x)
1323 if (!it && l && l->prev)
1328 _pan_item_select(v->span, it, 1);
1329 evry_item_select(s, it->item);
1333 else if ((!strcmp(key, "Prior") || (!strcmp(key, "Next"))))
1336 int next = (!strcmp(key, "Next"));
1338 cur = sd->cur_item->y;
1340 EINA_LIST_FOREACH (sd->items, l, it)
1344 if (it->y >= cur + sd->h) break;
1348 if (it->y + it->h >= cur - sd->h) break;
1357 _pan_item_select(v->span, it, 0);
1358 evry_item_select(s, it->item);
1362 else if (!ev->modifiers && !strcmp(key, "Return"))
1364 if (v->mode == VIEW_MODE_THUMB)
1369 if (evry_browse_item(sd->cur_item->item))
1381 _cb_item_changed(void *data, int type __UNUSED__, void *event)
1383 Evry_Event_Item_Changed *ev = event;
1387 Smart_Data *sd = evas_object_smart_data_get(v->span);
1388 if (!sd) return ECORE_CALLBACK_PASS_ON;
1390 EINA_LIST_FOREACH (sd->items, l, it)
1391 if (it->item == ev->item)
1395 return ECORE_CALLBACK_PASS_ON;
1397 if (ev->changed_selection)
1399 _pan_item_select(v->span, it, 1);
1400 evry_item_select(v->state, ev->item);
1404 return ECORE_CALLBACK_PASS_ON;
1406 edje_object_part_text_set(it->frame, "e.text.label", it->item->label);
1408 if (ev->changed_icon)
1410 if (it->do_thumb) e_thumb_icon_end(it->thumb);
1411 if (it->thumb) evas_object_del(it->thumb);
1412 if (it->image) evas_object_del(it->image);
1417 it->have_thumb = EINA_FALSE;
1418 it->do_thumb = EINA_FALSE;
1421 return ECORE_CALLBACK_PASS_ON;
1425 _cb_action_performed(void *data, int type __UNUSED__, void *event)
1427 Evry_Event_Action_Performed *ev = event;
1433 sd = evas_object_smart_data_get(v->span);
1434 if (!sd) return ECORE_CALLBACK_PASS_ON;
1436 EINA_LIST_FOREACH (sd->items, l, it)
1438 if ((it->item == ev->it1) ||
1439 (it->item == ev->it2))
1443 if (it && it->visible)
1445 evas_object_raise(it->frame);
1446 edje_object_signal_emit(it->frame, "e,action,go", "e");
1449 return ECORE_CALLBACK_PASS_ON;
1453 _view_cb_mouse_wheel(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info)
1455 Evas_Event_Mouse_Wheel *ev = event_info;
1456 Smart_Data *sd = evas_object_smart_data_get(obj);
1461 _item_select(sd->cur_item);
1467 _view_cb_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
1469 Evas_Event_Mouse_Down *ev = event_info;
1470 Smart_Data *sd = evas_object_smart_data_get(data);
1473 sd->mouse_button = ev->button;
1474 sd->mouse_x = ev->canvas.x;
1475 sd->mouse_y = ev->canvas.y;
1479 _view_cb_mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1481 /* Evas_Event_Mouse_Up *ev = event_info; */
1482 Smart_Data *sd = evas_object_smart_data_get(data);
1486 sd->mouse_button = 0;
1487 edje_object_signal_emit(sd->view->bg, "e,action,hide,into", "e");
1488 edje_object_signal_emit(sd->view->bg, "e,action,hide,back", "e");
1491 #define SLIDE_RESISTANCE 80
1494 _view_cb_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
1496 Evas_Event_Mouse_Move *ev = event_info;
1497 Smart_Data *sd = evas_object_smart_data_get(data);
1506 sel = sd->view->state->selector;
1507 if (!sel || !sel->states)
1510 diff_x = abs(ev->cur.canvas.x - sd->mouse_x);
1511 diff_y = abs(ev->cur.canvas.y - sd->mouse_y);
1513 if (diff_y > 15 + (diff_x / 2))
1515 edje_object_signal_emit(sd->view->bg, "e,action,hide,into", "e");
1516 edje_object_signal_emit(sd->view->bg, "e,action,hide,back", "e");
1520 if ((sel->states->next) || (sel != sel->win->selectors[0]))
1521 edje_object_signal_emit(sd->view->bg, "e,action,show,back", "e");
1525 if ((sd->it_down->item->browseable) ||
1526 (sel != sel->win->selectors[2]))
1527 edje_object_signal_emit(sd->view->bg, "e,action,show,into", "e");
1529 if ((sd->cur_item != sd->it_down) && (diff_x > 10))
1531 evry_item_select(sd->view->state, sd->it_down->item);
1532 _pan_item_select(data, sd->it_down, 0);
1536 if (sd->mouse_button == 1)
1538 if (ev->cur.canvas.x - sd->mouse_x > SLIDE_RESISTANCE)
1543 if (sel->states->next)
1544 evry_browse_back(sel);
1546 evry_selectors_switch(sel->win, -1, EINA_TRUE);
1548 else if ((sd->it_down && (sd->cur_item == sd->it_down)) &&
1549 (sd->mouse_x - ev->cur.canvas.x > SLIDE_RESISTANCE))
1551 edje_object_signal_emit(sd->view->bg, "e,action,hide,into", "e");
1552 edje_object_signal_emit(sd->view->bg, "e,action,hide,back", "e");
1554 if (sd->it_down->item->browseable)
1556 evry_browse_item(sd->it_down->item);
1560 evry_selectors_switch(sel->win, 1, EINA_TRUE);
1577 _cb_list_hide(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
1581 v->hiding = EINA_TRUE;
1585 _cb_list_show(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
1589 v->hiding = EINA_FALSE;
1593 _view_create(Evry_View *view, const Evry_State *s, const Evas_Object *swallow)
1595 GET_VIEW(parent, view);
1598 Ecore_Event_Handler *h;
1603 v->evas = evas_object_evas_get(swallow);
1607 if ((s->selector->states->next) &&
1608 ((s->plugin->config->view_mode < 0) ||
1609 (!strcmp(s->plugin->name, N_("All")))))
1610 v->mode = parent->mode;
1611 else if (s->plugin->config->view_mode >= 0)
1612 v->mode = s->plugin->config->view_mode;
1614 v->mode = evry_conf->view_mode;
1618 if (s->selector->states->next)
1619 v->mode = parent->mode;
1621 v->mode = evry_conf->view_mode;
1624 v->plugin = s->plugin;
1625 v->mode_prev = v->mode;
1626 v->zoom = parent->zoom;
1628 v->bg = edje_object_add(v->evas);
1629 e_theme_edje_object_set(v->bg, "base/theme/modules/everything",
1630 "e/modules/everything/thumbview/main/window");
1632 v->span = _pan_add(v->evas);
1633 _pan_view_set(v->span, v);
1634 evas_object_event_callback_add(v->span, EVAS_CALLBACK_MOUSE_WHEEL,
1635 _view_cb_mouse_wheel, NULL);
1637 evas_object_event_callback_add(v->bg, EVAS_CALLBACK_MOUSE_MOVE,
1638 _view_cb_mouse_move, v->span);
1639 evas_object_event_callback_add(v->bg, EVAS_CALLBACK_MOUSE_DOWN,
1640 _view_cb_mouse_down, v->span);
1641 evas_object_event_callback_add(v->bg, EVAS_CALLBACK_MOUSE_UP,
1642 _view_cb_mouse_up, v->span);
1644 // the scrollframe holding the scrolled thumbs
1645 v->sframe = e_scrollframe_add(v->evas);
1646 e_scrollframe_custom_theme_set(v->sframe, "base/theme/modules/everything",
1647 "e/modules/everything/thumbview/main/scrollframe");
1648 e_scrollframe_thumbscroll_force(v->sframe, 1);
1650 e_scrollframe_extern_pan_set(v->sframe, v->span,
1651 _pan_set, _pan_get, _pan_max_get,
1652 _pan_child_size_get);
1653 edje_object_part_swallow(v->bg, "e.swallow.list", v->sframe);
1655 evas_object_show(v->sframe);
1656 evas_object_show(v->span);
1658 v->tabs = evry_tab_view_new(EVRY_VIEW(v), v->state, v->evas);
1660 EVRY_VIEW(v)->o_list = v->bg;
1661 EVRY_VIEW(v)->o_bar = v->tabs->o_tabs;
1663 h = evry_event_handler_add(EVRY_EVENT_ITEM_CHANGED, _cb_item_changed, v);
1664 v->handlers = eina_list_append(v->handlers, h);
1665 h = evry_event_handler_add(EVRY_EVENT_ACTION_PERFORMED, _cb_action_performed, v);
1666 v->handlers = eina_list_append(v->handlers, h);
1668 edje_object_signal_callback_add(v->bg, "e,action,hide,list", "e", _cb_list_hide, v);
1669 edje_object_signal_callback_add(v->bg, "e,action,show,list", "e", _cb_list_show, v);
1670 return EVRY_VIEW(v);
1674 _view_destroy(Evry_View *view)
1676 Ecore_Event_Handler *h;
1682 evas_object_del(v->span);
1683 evas_object_del(v->bg);
1684 evas_object_del(v->sframe);
1686 evry_tab_view_free(v->tabs);
1688 EINA_LIST_FREE (v->handlers, h)
1689 ecore_event_handler_del(h);
1695 evry_view_init(void)
1697 if (!evry_api_version_check(EVRY_API_VERSION))
1700 View *v = E_NEW(View, 1);
1702 v->view.id = EVRY_VIEW(v);
1703 v->view.name = "Icon View";
1704 v->view.create = &_view_create;
1705 v->view.destroy = &_view_destroy;
1706 v->view.update = &_view_update;
1707 v->view.clear = &_view_clear;
1708 v->view.cb_key_down = &_cb_key_down;
1709 v->mode = VIEW_MODE_NONE;
1711 evry_view_register(EVRY_VIEW(v), 1);
1719 evry_view_shutdown(void)
1721 evry_view_unregister(EVRY_VIEW(view));