More fixes of the autoscroll/drag and drop behaviour for gadgets in

shelves. Added callback to allow the current drop position to be
dynamically updated as the gadget scrolling is animated.


SVN revision: 27114
This commit is contained in:
metrics 2006-11-15 06:24:30 +00:00 committed by metrics
parent 2f31f34b37
commit 7f9999dbf8
5 changed files with 194 additions and 151 deletions

View File

@ -1349,6 +1349,9 @@ _e_gadcon_cb_client_scroll_animator(void *data)
return 0;
}
if (gcc->scroll_cb.func)
gcc->scroll_cb.func(gcc->scroll_cb.data);
return 1;
}
@ -1397,6 +1400,13 @@ e_gadcon_client_autoscroll_update(E_Gadcon_Client *gcc, Evas_Coord x, Evas_Coord
}
}
EAPI void
e_gadcon_client_autoscroll_cb_set(E_Gadcon_Client *gcc, void (*func)(void *data), void *data)
{
gcc->scroll_cb.func = func;
gcc->scroll_cb.data = data;
}
static void
_e_gadcon_cb_client_frame_moveresize(void *data, Evas *e, Evas_Object *obj, void *event_info)
{

View File

@ -131,6 +131,11 @@ struct _E_Gadcon_Client
Ecore_Animator *scroll_animator;
double scroll_pos;
double scroll_wanted;
struct {
void *data;
void (*func) (void *data);
} scroll_cb;
E_Menu *menu;
const char *style;
unsigned char autoscroll : 1;
@ -139,6 +144,7 @@ struct _E_Gadcon_Client
unsigned char moving : 1;
unsigned char resizing : 1;
Evas_Coord dx, dy;
};
EAPI int e_gadcon_init(void);
@ -176,6 +182,7 @@ EAPI void e_gadcon_client_min_size_set(E_Gadcon_Client *gcc, Evas_Co
EAPI void e_gadcon_client_aspect_set(E_Gadcon_Client *gcc, int w, int h);
EAPI void e_gadcon_client_autoscroll_set(E_Gadcon_Client *gcc, int autoscroll);
EAPI void e_gadcon_client_autoscroll_update(E_Gadcon_Client *gcc, int mx, int my);
EAPI void e_gadcon_client_autoscroll_cb_set(E_Gadcon_Client *gcc, void (*func)(void *data), void *data);
EAPI void e_gadcon_client_resizable_set(E_Gadcon_Client *gcc, int resizable);
EAPI void e_gadcon_client_util_menu_items_append(E_Gadcon_Client *gcc, E_Menu *menu, int flags);

View File

@ -56,6 +56,7 @@ struct _IBar
Evas_List *icons;
int show_label;
int eap_label;
Evas_Coord dnd_x, dnd_y;
};
struct _IBar_Icon
@ -110,6 +111,8 @@ static void _ibar_inst_cb_enter(void *data, const char *type, void *event_info);
static void _ibar_inst_cb_move(void *data, const char *type, void *event_info);
static void _ibar_inst_cb_leave(void *data, const char *type, void *event_info);
static void _ibar_inst_cb_drop(void *data, const char *type, void *event_info);
static void _ibar_drop_position_update(Instance *inst, Evas_Coord x, Evas_Coord y);
static void _ibar_inst_cb_scroll(void *data);
static E_Config_DD *conf_edd = NULL;
static E_Config_DD *conf_item_edd = NULL;
@ -1060,82 +1063,31 @@ _ibar_cb_drop_resize(void *data, Evas *e, Evas_Object *obj, void *event_info)
}
static void
_ibar_inst_cb_enter(void *data, const char *type, void *event_info)
_ibar_inst_cb_scroll(void *data)
{
E_Event_Dnd_Enter *ev;
Instance *inst;
Evas_Object *o, *o2;
IBar_Icon *ic;
Evas_Coord xx, yy;
int x, y;
ev = event_info;
/* Update the position of the dnd to handle for autoscrolling
* gadgets. */
inst = data;
o = edje_object_add(evas_object_evas_get(inst->ibar->o_box));
inst->ibar->o_drop = o;
o2 = edje_object_add(evas_object_evas_get(inst->ibar->o_box));
inst->ibar->o_drop_over = o2;
evas_object_event_callback_add(o, EVAS_CALLBACK_MOVE, _ibar_cb_drop_move, inst->ibar);
evas_object_event_callback_add(o, EVAS_CALLBACK_RESIZE, _ibar_cb_drop_resize, inst->ibar);
e_theme_edje_object_set(o, "base/theme/modules/ibar",
"e/modules/ibar/drop");
e_theme_edje_object_set(o2, "base/theme/modules/ibar",
"e/modules/ibar/drop_overlay");
evas_object_layer_set(o2, 19999);
evas_object_show(o);
evas_object_show(o2);
evas_object_geometry_get(inst->ibar->o_box, &xx, &yy, NULL, NULL);
e_box_align_pixel_offset_get(inst->gcc->o_box, &x, &y);
ic = _ibar_icon_at_coord(inst->ibar, ev->x + xx + x, ev->y + yy + y);
inst->ibar->ic_drop_before = ic;
if (ic)
{
Evas_Coord ix, iy, iw, ih;
int before = 0;
evas_object_geometry_get(ic->o_holder, &ix, &iy, &iw, &ih);
if (e_box_orientation_get(inst->ibar->o_box))
{
if ((ev->x + xx) < (ix + (iw / 2))) before = 1;
}
else
{
if ((ev->y + yy) < (iy + (ih / 2))) before = 1;
}
if (before)
e_box_pack_before(inst->ibar->o_box, inst->ibar->o_drop, ic->o_holder);
else
e_box_pack_after(inst->ibar->o_box, inst->ibar->o_drop, ic->o_holder);
inst->ibar->drop_before = before;
}
else e_box_pack_end(inst->ibar->o_box, o);
e_box_pack_options_set(o,
1, 1, /* fill */
0, 0, /* expand */
0.5, 0.5, /* align */
1, 1, /* min */
-1, -1 /* max */
);
_ibar_resize_handle(inst->ibar);
_gc_orient(inst->gcc);
e_gadcon_client_autoscroll_update(inst->gcc, ev->x, ev->y);
_ibar_drop_position_update(inst, inst->ibar->dnd_x, inst->ibar->dnd_y);
}
static void
_ibar_inst_cb_move(void *data, const char *type, void *event_info)
_ibar_drop_position_update(Instance *inst, Evas_Coord x, Evas_Coord y)
{
E_Event_Dnd_Move *ev;
Instance *inst;
IBar_Icon *ic;
Evas_Coord xx, yy;
int x, y;
ev = event_info;
inst = data;
e_box_unpack(inst->ibar->o_drop);
int ox, oy;
IBar_Icon *ic;
inst->ibar->dnd_x = x;
inst->ibar->dnd_y = y;
if (inst->ibar->o_drop)
e_box_unpack(inst->ibar->o_drop);
evas_object_geometry_get(inst->ibar->o_box, &xx, &yy, NULL, NULL);
e_box_align_pixel_offset_get(inst->gcc->o_box, &x, &y);
ic = _ibar_icon_at_coord(inst->ibar, ev->x + xx + x, ev->y + yy + y);
e_box_align_pixel_offset_get(inst->gcc->o_box, &ox, &oy);
ic = _ibar_icon_at_coord(inst->ibar, x + xx + ox, y + yy + oy);
inst->ibar->ic_drop_before = ic;
if (ic)
{
@ -1145,11 +1097,11 @@ _ibar_inst_cb_move(void *data, const char *type, void *event_info)
evas_object_geometry_get(ic->o_holder, &ix, &iy, &iw, &ih);
if (e_box_orientation_get(inst->ibar->o_box))
{
if ((ev->x + xx) < (ix + (iw / 2))) before = 1;
if ((x + xx) < (ix + (iw / 2))) before = 1;
}
else
{
if ((ev->y + yy) < (iy + (ih / 2))) before = 1;
if ((y + yy) < (iy + (ih / 2))) before = 1;
}
if (before)
e_box_pack_before(inst->ibar->o_box, inst->ibar->o_drop, ic->o_holder);
@ -1167,6 +1119,50 @@ _ibar_inst_cb_move(void *data, const char *type, void *event_info)
);
_ibar_resize_handle(inst->ibar);
_gc_orient(inst->gcc);
}
static void
_ibar_inst_cb_enter(void *data, const char *type, void *event_info)
{
E_Event_Dnd_Enter *ev;
Instance *inst;
Evas_Object *o, *o2;
ev = event_info;
inst = data;
o = edje_object_add(evas_object_evas_get(inst->ibar->o_box));
inst->ibar->o_drop = o;
o2 = edje_object_add(evas_object_evas_get(inst->ibar->o_box));
inst->ibar->o_drop_over = o2;
evas_object_event_callback_add(o, EVAS_CALLBACK_MOVE, _ibar_cb_drop_move, inst->ibar);
evas_object_event_callback_add(o, EVAS_CALLBACK_RESIZE, _ibar_cb_drop_resize, inst->ibar);
e_theme_edje_object_set(o, "base/theme/modules/ibar",
"e/modules/ibar/drop");
e_theme_edje_object_set(o2, "base/theme/modules/ibar",
"e/modules/ibar/drop_overlay");
evas_object_layer_set(o2, 19999);
evas_object_show(o);
evas_object_show(o2);
_ibar_drop_position_update(inst, ev->x, ev->y);
e_gadcon_client_autoscroll_cb_set(inst->gcc, _ibar_inst_cb_scroll, inst);
e_gadcon_client_autoscroll_update(inst->gcc, ev->x, ev->y);
}
static void
_ibar_inst_cb_move(void *data, const char *type, void *event_info)
{
E_Event_Dnd_Move *ev;
Instance *inst;
IBar_Icon *ic;
Evas_Coord xx, yy;
int x, y;
int wx, wy;
ev = event_info;
inst = data;
_ibar_drop_position_update(inst, ev->x, ev->y);
e_gadcon_client_autoscroll_update(inst->gcc, ev->x, ev->y);
}
@ -1184,6 +1180,7 @@ _ibar_inst_cb_leave(void *data, const char *type, void *event_info)
evas_object_del(inst->ibar->o_drop_over);
inst->ibar->o_drop_over = NULL;
_ibar_resize_handle(inst->ibar);
e_gadcon_client_autoscroll_cb_set(inst->gcc, NULL, NULL);
_gc_orient(inst->gcc);
}
@ -1198,6 +1195,7 @@ _ibar_inst_cb_drop(void *data, const char *type, void *event_info)
ev = event_info;
inst = data;
if (!strcmp(type, "enlightenment/eapp"))
{
app = ev->data;
@ -1282,9 +1280,11 @@ _ibar_inst_cb_drop(void *data, const char *type, void *event_info)
inst->ibar->o_drop = NULL;
evas_object_del(inst->ibar->o_drop_over);
inst->ibar->o_drop_over = NULL;
e_gadcon_client_autoscroll_cb_set(inst->gcc, NULL, NULL);
_ibar_empty_handle(inst->ibar);
_ibar_resize_handle(inst->ibar);
_gc_orient(inst->gcc);
}
/***************************************************************************/

View File

@ -57,6 +57,7 @@ struct _IBox
int show_desk;
int icon_label;
E_Zone *zone;
Evas_Coord dnd_x, dnd_y;
};
struct _IBox_Icon
@ -108,6 +109,8 @@ static void _ibox_inst_cb_enter(void *data, const char *type, void *event_info);
static void _ibox_inst_cb_move(void *data, const char *type, void *event_info);
static void _ibox_inst_cb_leave(void *data, const char *type, void *event_info);
static void _ibox_inst_cb_drop(void *data, const char *type, void *event_info);
static void _ibox_drop_position_update(Instance *inst, Evas_Coord x, Evas_Coord y);
static void _ibox_inst_cb_scroll(void *data);
static int _ibox_cb_event_border_add(void *data, int type, void *event);
static int _ibox_cb_event_border_remove(void *data, int type, void *event);
static int _ibox_cb_event_border_iconify(void *data, int type, void *event);
@ -812,6 +815,65 @@ _ibox_cb_drop_resize(void *data, Evas *e, Evas_Object *obj, void *event_info)
evas_object_resize(b->o_drop_over, w, h);
}
static void
_ibox_inst_cb_scroll(void *data)
{
Instance *inst;
/* Update the position of the dnd to handle for autoscrolling
* gadgets. */
inst = data;
_ibox_drop_position_update(inst, inst->ibox->dnd_x, inst->ibox->dnd_y);
}
static void
_ibox_drop_position_update(Instance *inst, Evas_Coord x, Evas_Coord y)
{
Evas_Coord xx, yy;
int ox, oy;
IBox_Icon *ic;
inst->ibox->dnd_x = x;
inst->ibox->dnd_y = y;
if (inst->ibox->o_drop)
e_box_unpack(inst->ibox->o_drop);
evas_object_geometry_get(inst->ibox->o_box, &xx, &yy, NULL, NULL);
e_box_align_pixel_offset_get(inst->gcc->o_box, &ox, &oy);
ic = _ibox_icon_at_coord(inst->ibox, x + xx + ox, y + yy + oy);
inst->ibox->ic_drop_before = ic;
if (ic)
{
Evas_Coord ix, iy, iw, ih;
int before = 0;
evas_object_geometry_get(ic->o_holder, &ix, &iy, &iw, &ih);
if (e_box_orientation_get(inst->ibox->o_box))
{
if ((x + xx) < (ix + (iw / 2))) before = 1;
}
else
{
if ((y + yy) < (iy + (ih / 2))) before = 1;
}
if (before)
e_box_pack_before(inst->ibox->o_box, inst->ibox->o_drop, ic->o_holder);
else
e_box_pack_after(inst->ibox->o_box, inst->ibox->o_drop, ic->o_holder);
inst->ibox->drop_before = before;
}
else e_box_pack_end(inst->ibox->o_box, inst->ibox->o_drop);
e_box_pack_options_set(inst->ibox->o_drop,
1, 1, /* fill */
0, 0, /* expand */
0.5, 0.5, /* align */
1, 1, /* min */
-1, -1 /* max */
);
_ibox_resize_handle(inst->ibox);
_gc_orient(inst->gcc);
}
static void
_ibox_inst_cb_enter(void *data, const char *type, void *event_info)
{
@ -837,40 +899,8 @@ _ibox_inst_cb_enter(void *data, const char *type, void *event_info)
evas_object_layer_set(o2, 19999);
evas_object_show(o);
evas_object_show(o2);
evas_object_geometry_get(inst->ibox->o_box, &xx, &yy, NULL, NULL);
e_box_align_pixel_offset_get(inst->gcc->o_box, &x, &y);
ic = _ibox_icon_at_coord(inst->ibox, ev->x + xx + x, ev->y + yy + y);
inst->ibox->ic_drop_before = ic;
if (ic)
{
Evas_Coord ix, iy, iw, ih;
int before = 0;
evas_object_geometry_get(ic->o_holder, &ix, &iy, &iw, &ih);
if (e_box_orientation_get(inst->ibox->o_box))
{
if ((ev->x + xx) < (ix + (iw / 2))) before = 1;
}
else
{
if ((ev->y + yy) < (iy + (ih / 2))) before = 1;
}
if (before)
e_box_pack_before(inst->ibox->o_box, inst->ibox->o_drop, ic->o_holder);
else
e_box_pack_after(inst->ibox->o_box, inst->ibox->o_drop, ic->o_holder);
inst->ibox->drop_before = before;
}
else e_box_pack_end(inst->ibox->o_box, o);
e_box_pack_options_set(o,
1, 1, /* fill */
0, 0, /* expand */
0.5, 0.5, /* align */
1, 1, /* min */
-1, -1 /* max */
);
_ibox_resize_handle(inst->ibox);
_gc_orient(inst->gcc);
_ibox_drop_position_update(inst, ev->x, ev->y);
e_gadcon_client_autoscroll_cb_set(inst->gcc, _ibox_inst_cb_scroll, inst);
e_gadcon_client_autoscroll_update(inst->gcc, ev->x, ev->y);
}
@ -885,41 +915,7 @@ _ibox_inst_cb_move(void *data, const char *type, void *event_info)
ev = event_info;
inst = data;
e_box_unpack(inst->ibox->o_drop);
evas_object_geometry_get(inst->ibox->o_box, &xx, &yy, NULL, NULL);
e_box_align_pixel_offset_get(inst->gcc->o_box, &x, &y);
ic = _ibox_icon_at_coord(inst->ibox, ev->x + xx + x, ev->y + yy + y);
inst->ibox->ic_drop_before = ic;
if (ic)
{
Evas_Coord ix, iy, iw, ih;
int before = 0;
evas_object_geometry_get(ic->o_holder, &ix, &iy, &iw, &ih);
if (e_box_orientation_get(inst->ibox->o_box))
{
if ((ev->x + xx) < (ix + (iw / 2))) before = 1;
}
else
{
if ((ev->y + yy) < (iy + (ih / 2))) before = 1;
}
if (before)
e_box_pack_before(inst->ibox->o_box, inst->ibox->o_drop, ic->o_holder);
else
e_box_pack_after(inst->ibox->o_box, inst->ibox->o_drop, ic->o_holder);
inst->ibox->drop_before = before;
}
else e_box_pack_end(inst->ibox->o_box, inst->ibox->o_drop);
e_box_pack_options_set(inst->ibox->o_drop,
1, 1, /* fill */
0, 0, /* expand */
0.5, 0.5, /* align */
1, 1, /* min */
-1, -1 /* max */
);
_ibox_resize_handle(inst->ibox);
_gc_orient(inst->gcc);
_ibox_drop_position_update(inst, ev->x, ev->y);
e_gadcon_client_autoscroll_update(inst->gcc, ev->x, ev->y);
}
@ -936,6 +932,7 @@ _ibox_inst_cb_leave(void *data, const char *type, void *event_info)
inst->ibox->o_drop = NULL;
evas_object_del(inst->ibox->o_drop_over);
inst->ibox->o_drop_over = NULL;
e_gadcon_client_autoscroll_cb_set(inst->gcc, NULL, NULL);
_ibox_resize_handle(inst->ibox);
_gc_orient(inst->gcc);
}
@ -1002,6 +999,7 @@ _ibox_inst_cb_drop(void *data, const char *type, void *event_info)
evas_object_del(inst->ibox->o_drop_over);
inst->ibox->o_drop_over = NULL;
_ibox_empty_handle(b);
e_gadcon_client_autoscroll_cb_set(inst->gcc, NULL, NULL);
_ibox_resize_handle(inst->ibox);
_gc_orient(inst->gcc);
}

View File

@ -55,6 +55,7 @@ struct _Pager
E_Drag *drag;
unsigned char dragging : 1;
unsigned char just_dragged : 1;
Evas_Coord dnd_x, dnd_y;
};
struct _Pager_Desk
@ -124,6 +125,8 @@ static void _pager_inst_cb_enter(void *data, const char *type, void *event_info)
static void _pager_inst_cb_move(void *data, const char *type, void *event_info);
static void _pager_inst_cb_leave(void *data, const char *type, void *event_info);
static void _pager_inst_cb_drop(void *data, const char *type, void *event_info);
static void _pager_inst_cb_scroll(void *data);
static void _pager_update_drop_position(Instance *inst, Evas_Coord x, Evas_Coord y);
static void _pager_desk_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info);
static void _pager_desk_cb_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_info);
static void _pager_desk_cb_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info);
@ -1503,30 +1506,27 @@ _pager_window_cb_drag_finished(E_Drag *drag, int dropped)
}
static void
_pager_inst_cb_enter(void *data, const char *type, void *event_info)
_pager_inst_cb_scroll(void *data)
{
E_Event_Dnd_Enter *ev;
Instance *inst;
Instance * inst;
ev = event_info;
inst = data;
_pager_update_drop_position(inst, inst->pager->dnd_x, inst->pager->dnd_y);
}
static void
_pager_inst_cb_move(void *data, const char *type, void *event_info)
_pager_update_drop_position(Instance *inst, Evas_Coord x, Evas_Coord y)
{
E_Event_Dnd_Move *ev;
Instance *inst;
Pager_Desk *pd, *pd2;
Evas_List *l;
Evas_Coord xx, yy;
int x, y;
int ox, oy;
Evas_List *l;
ev = event_info;
inst = data;
inst->pager->dnd_x = x;
inst->pager->dnd_y = y;
evas_object_geometry_get(inst->pager->o_table, &xx, &yy, NULL, NULL);
e_box_align_pixel_offset_get(inst->gcc->o_box, &x, &y);
pd = _pager_desk_at_coord(inst->pager, ev->x + xx + x, ev->y + yy + y);
e_box_align_pixel_offset_get(inst->gcc->o_box, &ox, &oy);
pd = _pager_desk_at_coord(inst->pager, x + xx + ox, y + yy + oy);
/* FIXME: keep track which one its over so we only emit drag in/out
* when it actually goes form one desk to another */
for (l = inst->pager->desks; l; l = l->next)
@ -1537,6 +1537,30 @@ _pager_inst_cb_move(void *data, const char *type, void *event_info)
else
edje_object_signal_emit(pd2->o_desk, "e,action,drag,out", "e");
}
}
static void
_pager_inst_cb_enter(void *data, const char *type, void *event_info)
{
E_Event_Dnd_Enter *ev;
Instance *inst;
ev = event_info;
inst = data;
_pager_update_drop_position(inst, ev->x, ev->y);
e_gadcon_client_autoscroll_cb_set(inst->gcc, _pager_inst_cb_scroll, inst);
e_gadcon_client_autoscroll_update(inst->gcc, ev->x, ev->y);
}
static void
_pager_inst_cb_move(void *data, const char *type, void *event_info)
{
E_Event_Dnd_Move *ev;
Instance *inst;
ev = event_info;
inst = data;
_pager_update_drop_position(inst, ev->x, ev->y);
e_gadcon_client_autoscroll_update(inst->gcc, ev->x, ev->y);
}
@ -1558,6 +1582,8 @@ _pager_inst_cb_leave(void *data, const char *type, void *event_info)
pd = l->data;
edje_object_signal_emit(pd->o_desk, "e,action,drag,out", "e");
}
e_gadcon_client_autoscroll_cb_set(inst->gcc, NULL, NULL);
}
static void
@ -1627,6 +1653,8 @@ _pager_inst_cb_drop(void *data, const char *type, void *event_info)
pd = l->data;
edje_object_signal_emit(pd->o_desk, "e,action,drag,out", "e");
}
e_gadcon_client_autoscroll_cb_set(inst->gcc, NULL, NULL);
}
static void