static void _view_clear(Evry_View *view, int slide);
static void _pan_item_select(Evas_Object *obj, Item *it, int scroll);
+static void _animator_del(Evas_Object *obj);
{
Evas_Coord w, h;
Item *it = data;
+ Smart_Data *sd = evas_object_smart_data_get(it->obj);
+ if (sd->clearing)
+ return;
if (!it->frame) return;
Eina_List *l, *ll;
Item *it;
+ if (!sd || sd->clearing)
+ return 1;
+
EINA_LIST_FOREACH_SAFE(sd->queue, l, ll, it)
{
if (!it->image && !it->have_thumb)
Evas_Event_Mouse_Down *ev = event_info;
Item *it = data;
Smart_Data *sd = evas_object_smart_data_get(it->obj);
+ if (!sd || sd->clearing) return;
sd->mouse_act = 1;
+ sd->it_down = it;
if (ev->button == 1)
{
sd->mouse_x = ev->canvas.x;
sd->mouse_y = ev->canvas.y;
- sd->it_down = it;
-
if (sd->selector && evas_object_visible_get(sd->selector))
- {
- evas_object_hide(sd->selector);
- }
+ evas_object_hide(sd->selector);
}
}
}
Evas_Event_Mouse_Up *ev = event_info;
Item *it = data;
Smart_Data *sd = evas_object_smart_data_get(it->obj);
+ if (!sd || sd->clearing) return;
sd->mouse_x = 0;
sd->mouse_y = 0;
+ if (!sd->it_down)
+ return;
+
sd->it_down = NULL;
if (ev->button == 1)
static void
_item_show(View *v, Item *it, Evas_Object *list)
{
-
if (!it->frame)
{
it->frame = edje_object_add(v->evas);
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));
if (it->item->marked)
_item_hide(Item *it)
{
if (it->do_thumb) e_thumb_icon_end(it->thumb);
+
if (it->thumb) evas_object_del(it->thumb);
if (it->image) evas_object_del(it->image);
if (it->frame) evas_object_del(it->frame);
sd->cx = 0;
if (sd->cy < 0)
sd->cy = 0;
+
changed = 1;
}
if (changed)
evas_object_smart_callback_call(obj, "changed", NULL);
- if (!sd->thumb_idler)
+ if (!sd->clearing && !sd->thumb_idler)
sd->thumb_idler = ecore_idle_enterer_add(_thumb_idler, sd);
sd->idle_enter = NULL;
_e_smart_del(Evas_Object *obj)
{
Smart_Data *sd = evas_object_smart_data_get(obj);
- Item *it;
if (sd->idle_enter)
ecore_idle_enterer_del(sd->idle_enter);
+
if (sd->thumb_idler)
ecore_idle_enterer_del(sd->thumb_idler);
- if (sd->animator)
- ecore_animator_del(sd->animator);
- // sd->view is just referenced
- // sd->child_obj is unused
- EINA_LIST_FREE(sd->items, it)
- {
- _item_hide(it);
- evry_item_free(it->item);
- free(it);
- }
- evas_object_del(sd->selector);
+ _animator_del(obj);
+
+ if (sd->selector)
+ evas_object_del(sd->selector);
free(sd);
evas_object_smart_data_set(obj, NULL);
E_FREE(it);
}
+static void
+_animator_del(Evas_Object *obj)
+{
+ Smart_Data *sd = evas_object_smart_data_get(obj);
+ if (sd->clearing)
+ {
+ sd->clearing = EINA_FALSE;
+ _view_clear(EVRY_VIEW(sd->view), 0);
+ }
+
+ sd->animator = NULL;
+}
+
static int
_animator(void *data)
{
Smart_Data *sd = evas_object_smart_data_get(data);
+ if (!sd) return 0;
+
double da;
double spd = ((25.0/ (double)e_config->framerate) /
(double) (1 + sd->view->zoom));
{
sd->slide = sd->slide_to;
sd->sliding = 0;
- if (sd->view->mode == VIEW_MODE_THUMB &&
- sd->cur_item &&sd->cur_item->frame)
- edje_object_signal_emit(sd->cur_item->frame,
- "e,state,selected", "e");
-
- if (sd->clearing)
- {
- _view_clear(EVRY_VIEW(sd->view), 0);
- sd->animator = NULL;
- return 0;
- }
+ if ((sd->view->mode == VIEW_MODE_THUMB) &&
+ (sd->cur_item &&
+ sd->cur_item->frame))
+ edje_object_signal_emit(sd->cur_item->frame,
+ "e,state,selected", "e");
}
else
wait++;
evas_object_move(sd->view->span, sd->slide, sd->y);
}
- if (wait) return 1;
+ if (wait)
+ return 1;
+
+ _animator_del(data);
- sd->animator = NULL;
return 0;
}
if (sd->cur_item)
{
- prev = sd->cur_item->y / sd->cur_item->h;
+ prev = sd->cur_item->y / (1 + sd->cur_item->h);
sd->cur_item->selected = EINA_FALSE;
edje_object_signal_emit(sd->cur_item->frame,
"e,state,unselected", "e");
"e,state,selected", "e");
return;
}
- else if (sd->view->mode == VIEW_MODE_LIST ||
- sd->view->mode == VIEW_MODE_DETAIL)
+ else if (it->h && (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;
align *= it->h;
}
- else
+ else if (sd->view->mode == VIEW_MODE_THUMB)
{
if (sd->view->zoom < 2)
{
edje_object_signal_emit(sd->cur_item->frame,
- "e,state,selected", "e");
+ "e,state,selected", "e");
}
if ((it->y + it->h) - sd->cy > sd->h)
e_scrollframe_child_pos_set(sd->view->sframe,
0, sd->scroll_align);
}
- if (sd->animator)
- ecore_animator_del(sd->animator);
- sd->animator = NULL;
+
+ _animator_del(obj);
}
else
{
Eina_List *l;
Item *it;
- if (sd->animator)
- ecore_animator_del(sd->animator);
- sd->animator = NULL;
+ _animator_del(obj);
EINA_LIST_FOREACH(sd->items, l, it)
_item_hide(it);
View *v = (View*) view;
Smart_Data *sd = evas_object_smart_data_get(v->span);
Item *it;
+ if (!sd) return;
sd->mouse_x = 0;
sd->mouse_y = 0;
}
if (sd->animator)
- ecore_animator_del(sd->animator);
+ {
+ ecore_animator_del(sd->animator);
+ sd->animator = NULL;
+ }
}
- sd->clearing = EINA_FALSE;
+ if (sd->clearing)
+ return;
_clear_items(v->span);
- EINA_LIST_FREE(sd->items, it)
+ if (sd->items)
{
- evry_item_free(it->item);
- E_FREE(it);
+ EINA_LIST_FREE(sd->items, it)
+ {
+ evry_item_free(it->item);
+ E_FREE(it);
+ }
}
_e_smart_reconfigure(v->span);
{
Smart_Data *sd = evas_object_smart_data_get(obj);
- if (sd->animator)
- ecore_animator_del(sd->animator);
- sd->animator = NULL;
+ _animator_del(obj);
sd->scroll_align = 0;
Evry_Plugin *p = v->state->plugin;
sd->cur_item = NULL;
+ sd->it_down = NULL;
sd->mouse_act = 0;
sd->mouse_x = 0;
sd->mouse_y = 0;
{
Evas_Event_Mouse_Wheel *ev = event_info;
Smart_Data *sd = evas_object_smart_data_get(obj);
+ if (sd->clearing) return;
if (ev->z)
{
evas_object_hide(sd->selector);
{
Evas_Event_Mouse_Move *ev = event_info;
Smart_Data *sd = evas_object_smart_data_get(obj);
- int diff_y;
+ int diff_y, diff_x;
+ if (!sd) return;
+
+ if (sd->clearing)
+ goto end;
if (!sd->mouse_x)
- return ;
+ goto end;
if (!sd->it_down)
- return;
+ goto end;
- if ((diff_y = abs(ev->cur.canvas.y - sd->mouse_y) > 30))
+ diff_x = abs(ev->cur.canvas.x - sd->mouse_x);
+ diff_y = abs(ev->cur.canvas.y - sd->mouse_y);
+
+ if (diff_y > (diff_x + 10) * 2)
goto end;
if ((sd->cur_item != sd->it_down) &&
- (abs(ev->cur.canvas.x - sd->mouse_x) > 30 - diff_y))
+ (diff_x > 10))
{
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_x > 150)
- {
- evry_browse_back(NULL);
- goto end;
- }
- else if (sd->mouse_x - ev->cur.canvas.x > 150)
+ if (sd->cur_item == sd->it_down)
{
- evry_browse_item(NULL);
- goto end;
- }
- else
- {
- return;
- }
+ if (ev->cur.canvas.x - sd->mouse_x > 150)
+ {
+ sd->it_down = NULL;
+ sd->mouse_x = 0;
+ sd->mouse_y = 0;
+ evry_browse_back(NULL);
+ }
+ else if (sd->mouse_x - ev->cur.canvas.x > 150)
+ {
+ sd->it_down = NULL;
+ sd->mouse_x = 0;
+ sd->mouse_y = 0;
+ evry_browse_item(NULL);
+ }
+ }
+ return;
end:
sd->it_down = NULL;
static void
_view_destroy(Evry_View *view)
{
+ Ecore_Event_Handler *h;
+
GET_VIEW(v, view);
- Ecore_Event_Handler *h;
+ _view_clear(view, 0);
+ evas_object_del(v->span);
evas_object_del(v->bg);
evas_object_del(v->sframe);
- evas_object_del(v->span);
evry_tab_view_free(v->tabs);