forked from enlightenment/enlightenment
parent
93448944f2
commit
322d9adcf3
|
@ -148,7 +148,7 @@ e_drag_new(E_Container *container, int x, int y,
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* No need to create a drag object without type */
|
/* No need to create a drag object without type */
|
||||||
if (!num_types) return NULL;
|
if ((!types) || (!num_types)) return NULL;
|
||||||
drag = E_OBJECT_ALLOC(E_Drag, E_DRAG_TYPE, _e_drag_free);
|
drag = E_OBJECT_ALLOC(E_Drag, E_DRAG_TYPE, _e_drag_free);
|
||||||
if (!drag) return NULL;
|
if (!drag) return NULL;
|
||||||
|
|
||||||
|
@ -369,6 +369,15 @@ e_drop_handler_geometry_set(E_Drop_Handler *handler, int x, int y, int w, int h)
|
||||||
handler->h = h;
|
handler->h = h;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EAPI int
|
||||||
|
e_drop_inside(E_Drop_Handler *handler, int x, int y)
|
||||||
|
{
|
||||||
|
int dx, dy, dw, dh;
|
||||||
|
|
||||||
|
_e_drag_coords_update(handler, &dx, &dy, &dw, &dh);
|
||||||
|
return E_INSIDE(x, y, dx, dy, dw, dh);
|
||||||
|
}
|
||||||
|
|
||||||
EAPI void
|
EAPI void
|
||||||
e_drop_handler_del(E_Drop_Handler *handler)
|
e_drop_handler_del(E_Drop_Handler *handler)
|
||||||
{
|
{
|
||||||
|
@ -611,7 +620,7 @@ _e_drag_update(int x, int y)
|
||||||
_e_drag_move(_drag_current, x, y);
|
_e_drag_move(_drag_current, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((_drag_current) && (_drag_current->types))
|
if (_drag_current)
|
||||||
{
|
{
|
||||||
for (l = _drop_handlers; l; l = l->next)
|
for (l = _drop_handlers; l; l = l->next)
|
||||||
{
|
{
|
||||||
|
@ -622,6 +631,7 @@ _e_drag_update(int x, int y)
|
||||||
_e_drag_coords_update(h, &dx, &dy, &dw, &dh);
|
_e_drag_coords_update(h, &dx, &dy, &dw, &dh);
|
||||||
enter_ev.x = x - dx;
|
enter_ev.x = x - dx;
|
||||||
enter_ev.y = y - dy;
|
enter_ev.y = y - dy;
|
||||||
|
enter_ev.data = NULL;
|
||||||
move_ev.x = x - dx;
|
move_ev.x = x - dx;
|
||||||
move_ev.y = y - dy;
|
move_ev.y = y - dy;
|
||||||
leave_ev.x = x - dx;
|
leave_ev.x = x - dx;
|
||||||
|
@ -632,7 +642,16 @@ _e_drag_update(int x, int y)
|
||||||
if (!h->entered)
|
if (!h->entered)
|
||||||
{
|
{
|
||||||
if (h->cb.enter)
|
if (h->cb.enter)
|
||||||
h->cb.enter(h->cb.data, h->active_type, &enter_ev);
|
{
|
||||||
|
if (_drag_current->cb.convert)
|
||||||
|
{
|
||||||
|
enter_ev.data = _drag_current->cb.convert(_drag_current,
|
||||||
|
h->active_type);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
enter_ev.data = _drag_current->data;
|
||||||
|
h->cb.enter(h->cb.data, h->active_type, &enter_ev);
|
||||||
|
}
|
||||||
h->entered = 1;
|
h->entered = 1;
|
||||||
}
|
}
|
||||||
if (h->cb.move)
|
if (h->cb.move)
|
||||||
|
|
|
@ -81,6 +81,7 @@ struct _E_Drop_Handler
|
||||||
|
|
||||||
struct _E_Event_Dnd_Enter
|
struct _E_Event_Dnd_Enter
|
||||||
{
|
{
|
||||||
|
void *data;
|
||||||
int x, y;
|
int x, y;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -130,6 +131,7 @@ EAPI E_Drop_Handler *e_drop_handler_add(E_Object *obj,
|
||||||
const char **types, unsigned int num_types,
|
const char **types, unsigned int num_types,
|
||||||
int x, int y, int w, int h);
|
int x, int y, int w, int h);
|
||||||
EAPI void e_drop_handler_geometry_set(E_Drop_Handler *handler, int x, int y, int w, int h);
|
EAPI void e_drop_handler_geometry_set(E_Drop_Handler *handler, int x, int y, int w, int h);
|
||||||
|
EAPI int e_drop_inside(E_Drop_Handler *handler, int x, int y);
|
||||||
EAPI void e_drop_handler_del(E_Drop_Handler *handler);
|
EAPI void e_drop_handler_del(E_Drop_Handler *handler);
|
||||||
EAPI int e_drop_xdnd_register_set(Ecore_X_Window win, int reg);
|
EAPI int e_drop_xdnd_register_set(Ecore_X_Window win, int reg);
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,8 @@ static int _e_gadcon_cb_client_scroll_animator(void *data);
|
||||||
static void _e_gadcon_cb_client_frame_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info);
|
static void _e_gadcon_cb_client_frame_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info);
|
||||||
static void _e_gadcon_cb_client_frame_moveresize(void *data, Evas *e, Evas_Object *obj, void *event_info);
|
static void _e_gadcon_cb_client_frame_moveresize(void *data, Evas *e, Evas_Object *obj, void *event_info);
|
||||||
static void _e_gadcon_client_save(E_Gadcon_Client *gcc);
|
static void _e_gadcon_client_save(E_Gadcon_Client *gcc);
|
||||||
|
static void _e_gadcon_client_drag_begin(E_Gadcon_Client *gcc, int x, int y);
|
||||||
|
static void _e_gadcon_client_inject(E_Gadcon *gc, E_Gadcon_Client *gcc, int x, int y);
|
||||||
|
|
||||||
static void _e_gadcon_cb_min_size_request(void *data, Evas_Object *obj, void *event_info);
|
static void _e_gadcon_cb_min_size_request(void *data, Evas_Object *obj, void *event_info);
|
||||||
static void _e_gadcon_cb_size_request(void *data, Evas_Object *obj, void *event_info);
|
static void _e_gadcon_cb_size_request(void *data, Evas_Object *obj, void *event_info);
|
||||||
|
@ -397,6 +399,7 @@ e_gadcon_populate(E_Gadcon *gc)
|
||||||
gcc->client_class->func.orient(gcc);
|
gcc->client_class->func.orient(gcc);
|
||||||
|
|
||||||
_e_gadcon_client_save(gcc);
|
_e_gadcon_client_save(gcc);
|
||||||
|
if (gc->editing) e_gadcon_client_edit_begin(gcc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -467,6 +470,7 @@ e_gadcon_populate_class(E_Gadcon *gc, const E_Gadcon_Client_Class *cc)
|
||||||
gcc->client_class->func.orient(gcc);
|
gcc->client_class->func.orient(gcc);
|
||||||
|
|
||||||
_e_gadcon_client_save(gcc);
|
_e_gadcon_client_save(gcc);
|
||||||
|
if (gc->editing) e_gadcon_client_edit_begin(gcc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -908,8 +912,6 @@ e_gadcon_client_edit_begin(E_Gadcon_Client *gcc)
|
||||||
|
|
||||||
evas_object_show(gcc->o_event);
|
evas_object_show(gcc->o_event);
|
||||||
evas_object_show(gcc->o_control);
|
evas_object_show(gcc->o_control);
|
||||||
|
|
||||||
gcc->gadcon->editing = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EAPI void
|
EAPI void
|
||||||
|
@ -938,8 +940,44 @@ e_gadcon_client_edit_end(E_Gadcon_Client *gcc)
|
||||||
gcc->o_event = NULL;
|
gcc->o_event = NULL;
|
||||||
if (gcc->o_control) evas_object_del(gcc->o_control);
|
if (gcc->o_control) evas_object_del(gcc->o_control);
|
||||||
gcc->o_control = NULL;
|
gcc->o_control = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
gcc->gadcon->editing = 0;
|
EAPI void
|
||||||
|
e_gadcon_client_show(E_Gadcon_Client *gcc)
|
||||||
|
{
|
||||||
|
if (!gcc->hidden) return;
|
||||||
|
if (gcc->o_box) evas_object_show(gcc->o_box);
|
||||||
|
if (gcc->o_frame) evas_object_show(gcc->o_frame);
|
||||||
|
if (gcc->o_base) evas_object_show(gcc->o_base);
|
||||||
|
if (gcc->o_control) evas_object_show(gcc->o_control);
|
||||||
|
if (gcc->o_event) evas_object_show(gcc->o_event);
|
||||||
|
if (gcc->o_frame)
|
||||||
|
{
|
||||||
|
e_gadcon_layout_pack(gcc->gadcon->o_container, gcc->o_frame);
|
||||||
|
e_gadcon_layout_pack_options_set(gcc->o_frame, gcc);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
e_gadcon_layout_pack(gcc->gadcon->o_container, gcc->o_base);
|
||||||
|
e_gadcon_layout_pack_options_set(gcc->o_base, gcc);
|
||||||
|
}
|
||||||
|
gcc->hidden = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
EAPI void
|
||||||
|
e_gadcon_client_hide(E_Gadcon_Client *gcc)
|
||||||
|
{
|
||||||
|
if (gcc->hidden) return;
|
||||||
|
if (gcc->o_box) evas_object_hide(gcc->o_box);
|
||||||
|
if (gcc->o_frame) evas_object_hide(gcc->o_frame);
|
||||||
|
if (gcc->o_base) evas_object_hide(gcc->o_base);
|
||||||
|
if (gcc->o_control) evas_object_hide(gcc->o_control);
|
||||||
|
if (gcc->o_event) evas_object_hide(gcc->o_event);
|
||||||
|
if (gcc->o_frame)
|
||||||
|
e_gadcon_layout_unpack(gcc->o_frame);
|
||||||
|
else
|
||||||
|
e_gadcon_layout_unpack(gcc->o_base);
|
||||||
|
gcc->hidden = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
EAPI void
|
EAPI void
|
||||||
|
@ -1240,10 +1278,10 @@ e_gadcon_client_util_menu_items_append(E_Gadcon_Client *gcc, E_Menu *menu, int f
|
||||||
mi = e_menu_item_new(menu);
|
mi = e_menu_item_new(menu);
|
||||||
e_menu_item_separator_set(mi, 1);
|
e_menu_item_separator_set(mi, 1);
|
||||||
|
|
||||||
if (!gcc->gadcon->editing)
|
if (!gcc->o_control)
|
||||||
{
|
{
|
||||||
mi = e_menu_item_new(menu);
|
mi = e_menu_item_new(menu);
|
||||||
e_menu_item_label_set(mi, _("Move/Resize this gadget"));
|
e_menu_item_label_set(mi, _("Begin move/resize this gadget"));
|
||||||
e_util_menu_item_edje_icon_set(mi, "enlightenment/edit");
|
e_util_menu_item_edje_icon_set(mi, "enlightenment/edit");
|
||||||
e_menu_item_callback_set(mi, _e_gadcon_client_cb_menu_edit, gcc);
|
e_menu_item_callback_set(mi, _e_gadcon_client_cb_menu_edit, gcc);
|
||||||
}
|
}
|
||||||
|
@ -1319,7 +1357,7 @@ e_gadcon_client_util_menu_attach(E_Gadcon_Client *gcc)
|
||||||
}
|
}
|
||||||
|
|
||||||
EAPI E_Gadcon_Client *
|
EAPI E_Gadcon_Client *
|
||||||
e_gadcon_client_find(E_Gadcon *gc, const char *name, const char *id)
|
e_gadcon_client_find(E_Gadcon *gc, const char *id)
|
||||||
{
|
{
|
||||||
Evas_List *l;
|
Evas_List *l;
|
||||||
|
|
||||||
|
@ -1328,8 +1366,7 @@ e_gadcon_client_find(E_Gadcon *gc, const char *name, const char *id)
|
||||||
E_Gadcon_Client *gcc;
|
E_Gadcon_Client *gcc;
|
||||||
|
|
||||||
gcc = l->data;
|
gcc = l->data;
|
||||||
if ((gcc->name) && (gcc->id) &&
|
if ((gcc->id) && (!strcmp(id, gcc->id)))
|
||||||
(!strcmp(name, gcc->name)) && (!strcmp(id, gcc->id)))
|
|
||||||
return gcc;
|
return gcc;
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -1512,7 +1549,6 @@ _e_gadcon_client_save(E_Gadcon_Client *gcc)
|
||||||
cf_gc = e_gadcon_config_get(gcc->gadcon->name, gcc->gadcon->id);
|
cf_gc = e_gadcon_config_get(gcc->gadcon->name, gcc->gadcon->id);
|
||||||
if (!cf_gc) return;
|
if (!cf_gc) return;
|
||||||
cf_gcc = e_gadcon_client_config_get(gcc->gadcon, gcc->id);
|
cf_gcc = e_gadcon_client_config_get(gcc->gadcon, gcc->id);
|
||||||
if (!cf_gcc) e_gadcon_client_config_new(gcc->gadcon, gcc->name);
|
|
||||||
if (!cf_gcc) return;
|
if (!cf_gcc) return;
|
||||||
|
|
||||||
cf_gcc->geom.pos = gcc->config.pos;
|
cf_gcc->geom.pos = gcc->config.pos;
|
||||||
|
@ -1530,6 +1566,112 @@ _e_gadcon_client_save(E_Gadcon_Client *gcc)
|
||||||
e_config_save_queue();
|
e_config_save_queue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_e_gadcon_client_drag_begin(E_Gadcon_Client *gcc, int x, int y)
|
||||||
|
{
|
||||||
|
E_Drag *drag;
|
||||||
|
Evas_Object *o = NULL;
|
||||||
|
Evas_Coord w, h;
|
||||||
|
const char *drag_types[] = { "enlightenment/gadcon_client" };
|
||||||
|
|
||||||
|
e_object_ref(E_OBJECT(gcc));
|
||||||
|
/* Delete the config, it will be recreated on drop */
|
||||||
|
e_gadcon_client_config_del(gcc->gadcon, gcc->id);
|
||||||
|
gcc->state_info.state = E_LAYOUT_ITEM_STATE_NONE;
|
||||||
|
gcc->state_info.resist = 0;
|
||||||
|
|
||||||
|
if (!e_drop_inside(gcc->gadcon->drop_handler, x, y))
|
||||||
|
e_gadcon_client_hide(gcc);
|
||||||
|
/* Set id on gcc to something we can recognize later */
|
||||||
|
evas_stringshare_del(gcc->id);
|
||||||
|
gcc->id = evas_stringshare_add("drag");
|
||||||
|
|
||||||
|
drag = e_drag_new(gcc->gadcon->zone->container, gcc->drag.x, gcc->drag.y,
|
||||||
|
drag_types, 1, gcc, -1, NULL, _e_gadcon_cb_drag_finished);
|
||||||
|
o = gcc->client_class->func.icon(drag->evas);
|
||||||
|
evas_object_geometry_get(o, NULL, NULL, &w, &h);
|
||||||
|
if (!o)
|
||||||
|
{
|
||||||
|
/* FIXME: fallback icon for drag */
|
||||||
|
o = evas_object_rectangle_add(drag->evas);
|
||||||
|
evas_object_color_set(o, 255, 255, 255, 255);
|
||||||
|
}
|
||||||
|
e_drag_object_set(drag, o);
|
||||||
|
|
||||||
|
e_drag_move(drag, gcc->drag.x - w/2, gcc->drag.y - h/2);
|
||||||
|
e_drag_resize(drag, w, h);
|
||||||
|
e_drag_start(drag, gcc->drag.x, gcc->drag.y);
|
||||||
|
e_util_evas_fake_mouse_up_later(gcc->gadcon->evas, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_e_gadcon_client_inject(E_Gadcon *gc, E_Gadcon_Client *gcc, int x, int y)
|
||||||
|
{
|
||||||
|
Evas_List *l;
|
||||||
|
Evas_Coord cx, cy, cw, ch;
|
||||||
|
int seq = 1;
|
||||||
|
|
||||||
|
/* Check if the gadcon client is in place */
|
||||||
|
if (!gcc->hidden)
|
||||||
|
{
|
||||||
|
if (gcc->o_frame)
|
||||||
|
evas_object_geometry_get(gcc->o_frame, &cx, &cy, &cw, &ch);
|
||||||
|
else
|
||||||
|
evas_object_geometry_get(gcc->o_base, &cx, &cy, &cw, &ch);
|
||||||
|
if (E_INSIDE(x, y, cx, cy, cw, ch)) return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If x, y is not inside any gadcon client, seq will be 0 and it's position
|
||||||
|
* will later be used for placement. */
|
||||||
|
gcc->state_info.seq = 0;
|
||||||
|
for (l = gc->clients; l; l = l->next)
|
||||||
|
{
|
||||||
|
E_Gadcon_Client *gcc2;
|
||||||
|
|
||||||
|
gcc2 = l->data;
|
||||||
|
if (gcc == gcc2) continue;
|
||||||
|
if (gcc2->hidden) continue;
|
||||||
|
if (gcc2->o_frame)
|
||||||
|
evas_object_geometry_get(gcc2->o_frame, &cx, &cy, &cw, &ch);
|
||||||
|
else
|
||||||
|
evas_object_geometry_get(gcc2->o_base, &cx, &cy, &cw, &ch);
|
||||||
|
if (e_gadcon_layout_orientation_get(gc->o_container))
|
||||||
|
{
|
||||||
|
if (E_INSIDE(x, y, cx, cy, cw / 2, ch))
|
||||||
|
{
|
||||||
|
gcc->state_info.seq = seq++;
|
||||||
|
gcc2->state_info.seq = seq++;
|
||||||
|
}
|
||||||
|
else if (E_INSIDE(x, y, cx + cw / 2, cy, cw / 2, ch))
|
||||||
|
{
|
||||||
|
gcc2->state_info.seq = seq++;
|
||||||
|
gcc->state_info.seq = seq++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gcc2->state_info.seq = seq++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (E_INSIDE(x, y, cx, cy, cw, ch / 2))
|
||||||
|
{
|
||||||
|
gcc->state_info.seq = seq++;
|
||||||
|
gcc2->state_info.seq = seq++;
|
||||||
|
}
|
||||||
|
else if (E_INSIDE(x, y, cx, cy + ch / 2, cw, ch / 2))
|
||||||
|
{
|
||||||
|
gcc2->state_info.seq = seq++;
|
||||||
|
gcc->state_info.seq = seq++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gcc2->state_info.seq = seq++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_e_gadcon_cb_min_size_request(void *data, Evas_Object *obj, void *event_info)
|
_e_gadcon_cb_min_size_request(void *data, Evas_Object *obj, void *event_info)
|
||||||
{
|
{
|
||||||
|
@ -1591,14 +1733,17 @@ _e_gadcon_cb_client_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *e
|
||||||
gcc);
|
gcc);
|
||||||
gcc->menu = mn;
|
gcc->menu = mn;
|
||||||
|
|
||||||
|
mi = e_menu_item_new(mn);
|
||||||
|
e_menu_item_label_set(mi, _("Stop move/resize this gadget"));
|
||||||
|
e_util_menu_item_edje_icon_set(mi, "enlightenment/edit");
|
||||||
|
e_menu_item_callback_set(mi, _e_gadcon_client_cb_menu_edit, gcc);
|
||||||
|
|
||||||
if (gcc->gadcon->menu_attach.func)
|
if (gcc->gadcon->menu_attach.func)
|
||||||
gcc->gadcon->menu_attach.func(gcc->gadcon->menu_attach.data, mn);
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
mi = e_menu_item_new(mn);
|
mi = e_menu_item_new(mn);
|
||||||
e_menu_item_label_set(mi, _("Stop editing"));
|
e_menu_item_separator_set(mi, 1);
|
||||||
e_util_menu_item_edje_icon_set(mi, "enlightenment/edit");
|
|
||||||
e_menu_item_callback_set(mi, _e_gadcon_client_cb_menu_edit, gcc);
|
gcc->gadcon->menu_attach.func(gcc->gadcon->menu_attach.data, mn);
|
||||||
}
|
}
|
||||||
|
|
||||||
e_gadcon_canvas_zone_geometry_get(gcc->gadcon, &cx, &cy, &cw, &ch);
|
e_gadcon_canvas_zone_geometry_get(gcc->gadcon, &cx, &cy, &cw, &ch);
|
||||||
|
@ -1702,44 +1847,21 @@ _e_gadcon_cb_signal_move_go(void *data, Evas_Object *obj, const char *emission,
|
||||||
{
|
{
|
||||||
E_Gadcon_Client *gcc;
|
E_Gadcon_Client *gcc;
|
||||||
Evas_Coord x, y, w, h;
|
Evas_Coord x, y, w, h;
|
||||||
|
int cx, cy;
|
||||||
|
|
||||||
gcc = data;
|
gcc = data;
|
||||||
if (!gcc->moving) return;
|
if (!gcc->moving) return;
|
||||||
evas_pointer_canvas_xy_get(gcc->gadcon->evas, &x, &y);
|
evas_pointer_canvas_xy_get(gcc->gadcon->evas, &cx, &cy);
|
||||||
x = x - gcc->dx;
|
x = cx - gcc->dx;
|
||||||
y = y - gcc->dy;
|
y = cy - gcc->dy;
|
||||||
|
|
||||||
gcc->state_info.flags = E_GADCON_LAYOUT_ITEM_LOCK_POSITION | E_GADCON_LAYOUT_ITEM_LOCK_ABSOLUTE;
|
gcc->state_info.flags = E_GADCON_LAYOUT_ITEM_LOCK_POSITION | E_GADCON_LAYOUT_ITEM_LOCK_ABSOLUTE;
|
||||||
_e_gadcon_client_current_position_sync(gcc);
|
_e_gadcon_client_current_position_sync(gcc);
|
||||||
if (e_gadcon_layout_orientation_get(gcc->gadcon->o_container))
|
if (e_gadcon_layout_orientation_get(gcc->gadcon->o_container))
|
||||||
{
|
{
|
||||||
if (abs((y + gcc->dy) - gcc->drag.y) > e_config->drag_resist)
|
if (abs(cy - gcc->drag.y) > e_config->drag_resist)
|
||||||
{
|
{
|
||||||
E_Drag *drag;
|
_e_gadcon_client_drag_begin(gcc, cx, cy);
|
||||||
Evas_Object *o = NULL;
|
|
||||||
Evas_Coord w, h;
|
|
||||||
const char *drag_types[] = { "enlightenment/gadcon_client" };
|
|
||||||
|
|
||||||
e_object_ref(E_OBJECT(gcc));
|
|
||||||
/* Delete the config, it will be recreated on drop */
|
|
||||||
e_gadcon_client_config_del(gcc->gadcon, gcc->id);
|
|
||||||
|
|
||||||
drag = e_drag_new(gcc->gadcon->zone->container, gcc->drag.x, gcc->drag.y,
|
|
||||||
drag_types, 1, gcc, -1, NULL, _e_gadcon_cb_drag_finished);
|
|
||||||
o = gcc->client_class->func.icon(drag->evas);
|
|
||||||
evas_object_geometry_get(o, NULL, NULL, &w, &h);
|
|
||||||
if (!o)
|
|
||||||
{
|
|
||||||
/* FIXME: fallback icon for drag */
|
|
||||||
o = evas_object_rectangle_add(drag->evas);
|
|
||||||
evas_object_color_set(o, 255, 255, 255, 255);
|
|
||||||
}
|
|
||||||
e_drag_object_set(drag, o);
|
|
||||||
|
|
||||||
e_drag_move(drag, gcc->drag.x - w/2, gcc->drag.y - h/2);
|
|
||||||
e_drag_resize(drag, w, h);
|
|
||||||
e_drag_start(drag, gcc->drag.x, gcc->drag.y);
|
|
||||||
e_util_evas_fake_mouse_up_later(gcc->gadcon->evas, 1);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if (x > 0)
|
else if (x > 0)
|
||||||
|
@ -1757,33 +1879,9 @@ _e_gadcon_cb_signal_move_go(void *data, Evas_Object *obj, const char *emission,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (abs((x + gcc->dx) - gcc->drag.x) > e_config->drag_resist)
|
if (abs(cx - gcc->drag.x) > e_config->drag_resist)
|
||||||
{
|
{
|
||||||
E_Drag *drag;
|
_e_gadcon_client_drag_begin(gcc, cx, cy);
|
||||||
Evas_Object *o = NULL;
|
|
||||||
Evas_Coord w, h;
|
|
||||||
const char *drag_types[] = { "enlightenment/gadcon_client" };
|
|
||||||
|
|
||||||
e_object_ref(E_OBJECT(gcc));
|
|
||||||
/* Delete the config, it will be recreated on drop */
|
|
||||||
e_gadcon_client_config_del(gcc->gadcon, gcc->id);
|
|
||||||
|
|
||||||
drag = e_drag_new(gcc->gadcon->zone->container, gcc->drag.x, gcc->drag.y,
|
|
||||||
drag_types, 1, gcc, -1, NULL, _e_gadcon_cb_drag_finished);
|
|
||||||
o = gcc->client_class->func.icon(drag->evas);
|
|
||||||
evas_object_geometry_get(o, NULL, NULL, &w, &h);
|
|
||||||
if (!o)
|
|
||||||
{
|
|
||||||
/* FIXME: fallback icon for drag */
|
|
||||||
o = evas_object_rectangle_add(drag->evas);
|
|
||||||
evas_object_color_set(o, 255, 255, 255, 255);
|
|
||||||
}
|
|
||||||
e_drag_object_set(drag, o);
|
|
||||||
|
|
||||||
e_drag_move(drag, gcc->drag.x - w/2, gcc->drag.y - h/2);
|
|
||||||
e_drag_resize(drag, w, h);
|
|
||||||
e_drag_start(drag, gcc->drag.x, gcc->drag.y);
|
|
||||||
e_util_evas_fake_mouse_up_later(gcc->gadcon->evas, 1);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if (y > 0)
|
else if (y > 0)
|
||||||
|
@ -2017,40 +2115,159 @@ _e_gadcon_cb_signal_resize_right_go(void *data, Evas_Object *obj, const char *em
|
||||||
static void
|
static void
|
||||||
_e_gadcon_cb_drag_finished(E_Drag *drag, int dropped)
|
_e_gadcon_cb_drag_finished(E_Drag *drag, int dropped)
|
||||||
{
|
{
|
||||||
// TODO: Need to check if we drop on the same gadcon as the drag begins.
|
|
||||||
// This should result in a reorder, not a remove.
|
|
||||||
E_Gadcon_Client *gcc;
|
E_Gadcon_Client *gcc;
|
||||||
E_Gadcon *gc;
|
|
||||||
int editing;
|
|
||||||
|
|
||||||
gcc = drag->data;
|
gcc = drag->data;
|
||||||
gc = gcc->gadcon;
|
if (!strcmp(gcc->id, "drag"))
|
||||||
/* We must store this flag as changes to gadcon clients might change it */
|
{
|
||||||
editing = gc->editing;
|
/* This gadcon client was not dropped on the starting gadcon, delete it */
|
||||||
e_object_unref(E_OBJECT(drag->data));
|
e_object_del(E_OBJECT(gcc));
|
||||||
|
}
|
||||||
e_gadcon_unpopulate(gc);
|
e_object_unref(E_OBJECT(gcc));
|
||||||
e_gadcon_populate(gc);
|
|
||||||
if (editing) e_gadcon_edit_begin(gc);
|
|
||||||
e_config_save_queue();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_e_gadcon_cb_dnd_enter(void *data, const char *type, void *event)
|
_e_gadcon_cb_dnd_enter(void *data, const char *type, void *event)
|
||||||
{
|
{
|
||||||
// TODO: Need a marker to show where the drop is going to be
|
E_Event_Dnd_Enter *ev;
|
||||||
|
E_Gadcon *gc;
|
||||||
|
E_Gadcon_Client *gcc;
|
||||||
|
|
||||||
|
ev = event;
|
||||||
|
gc = data;
|
||||||
|
e_gadcon_layout_freeze(gc->o_container);
|
||||||
|
|
||||||
|
gcc = e_gadcon_client_find(gc, "drag");
|
||||||
|
if (gcc)
|
||||||
|
{
|
||||||
|
/* We have re-entered the gadcon we left, revive gadcon client */
|
||||||
|
Evas_Coord dx, dy;
|
||||||
|
Evas_Object *o;
|
||||||
|
|
||||||
|
if (e_gadcon_layout_orientation_get(gc->o_container))
|
||||||
|
gcc->config.pos = ev->x - gcc->config.size / 2;
|
||||||
|
else
|
||||||
|
gcc->config.pos = ev->y - gcc->config.size / 2;
|
||||||
|
gcc->state_info.prev_pos = gcc->config.pos;
|
||||||
|
|
||||||
|
evas_object_geometry_get(gc->o_container, &dx, &dy, NULL, NULL);
|
||||||
|
_e_gadcon_client_inject(gc, gcc, ev->x + dx, ev->y + dy);
|
||||||
|
e_gadcon_client_show(gcc);
|
||||||
|
|
||||||
|
o = gcc->o_frame ? gcc->o_frame : gcc->o_base;
|
||||||
|
if (e_gadcon_layout_orientation_get(gc->o_container))
|
||||||
|
e_gadcon_layout_pack_request_set(o, gcc->config.pos, gcc->config.size);
|
||||||
|
else
|
||||||
|
e_gadcon_layout_pack_request_set(o, gcc->config.pos, gcc->config.size);
|
||||||
|
gcc->state_info.resist = 1;
|
||||||
|
}
|
||||||
|
else if (ev->data)
|
||||||
|
{
|
||||||
|
/* Create a new gadcon to show where the gadcon will end up */
|
||||||
|
E_Gadcon_Client *gcc2;
|
||||||
|
E_Gadcon_Client_Class *cc;
|
||||||
|
|
||||||
|
gcc = ev->data;
|
||||||
|
cc = evas_hash_find(providers, gcc->name);
|
||||||
|
if (cc)
|
||||||
|
{
|
||||||
|
if (!gcc->style)
|
||||||
|
{
|
||||||
|
gcc2 = cc->func.init(gc, gcc->name, "new",
|
||||||
|
cc->default_style);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
gcc2 = cc->func.init(gc, gcc->name, "new",
|
||||||
|
gcc->style);
|
||||||
|
|
||||||
|
if (gcc2)
|
||||||
|
{
|
||||||
|
gcc2->client_class = cc;
|
||||||
|
gcc2->config.pos = gcc->config.pos;
|
||||||
|
gcc2->config.size = gcc->config.size;
|
||||||
|
gcc2->config.res = gcc->config.res;
|
||||||
|
gcc2->state_info.seq = gcc->state_info.seq;
|
||||||
|
gcc2->state_info.flags = gcc->state_info.flags;
|
||||||
|
if (gcc2->o_frame)
|
||||||
|
e_gadcon_layout_pack_options_set(gcc2->o_frame, gcc2);
|
||||||
|
else
|
||||||
|
e_gadcon_layout_pack_options_set(gcc2->o_base, gcc2);
|
||||||
|
|
||||||
|
e_gadcon_client_autoscroll_set(gcc2, gcc->autoscroll);
|
||||||
|
e_gadcon_client_resizable_set(gcc2, gcc->resizable);
|
||||||
|
if (gcc2->client_class->func.orient)
|
||||||
|
gcc2->client_class->func.orient(gcc2);
|
||||||
|
gcc2->state_info.resist = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* TODO: Create a placeholder to show where the gadcon will end up */
|
||||||
|
}
|
||||||
|
e_gadcon_layout_thaw(gc->o_container);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_e_gadcon_cb_dnd_move(void *data, const char *type, void *event)
|
_e_gadcon_cb_dnd_move(void *data, const char *type, void *event)
|
||||||
{
|
{
|
||||||
// TODO: Need a marker to show where the drop is going to be
|
E_Event_Dnd_Move *ev;
|
||||||
|
E_Gadcon *gc;
|
||||||
|
E_Gadcon_Client *gcc;
|
||||||
|
|
||||||
|
ev = event;
|
||||||
|
gc = data;
|
||||||
|
|
||||||
|
gcc = e_gadcon_client_find(gc, "drag");
|
||||||
|
if (!gcc) gcc = e_gadcon_client_find(gc, "new");
|
||||||
|
if (gcc)
|
||||||
|
{
|
||||||
|
Evas_Coord dx, dy;
|
||||||
|
Evas_Object *o;
|
||||||
|
|
||||||
|
if (gcc->state_info.resist > 0)
|
||||||
|
{
|
||||||
|
gcc->state_info.resist--;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
e_gadcon_layout_freeze(gc->o_container);
|
||||||
|
|
||||||
|
/* We have re-entered the gadcon we left, revive gadcon client */
|
||||||
|
if (e_gadcon_layout_orientation_get(gc->o_container))
|
||||||
|
gcc->config.pos = ev->x - gcc->config.size / 2;
|
||||||
|
else
|
||||||
|
gcc->config.pos = ev->y - gcc->config.size / 2;
|
||||||
|
gcc->state_info.prev_pos = gcc->config.pos;
|
||||||
|
|
||||||
|
evas_object_geometry_get(gc->o_container, &dx, &dy, NULL, NULL);
|
||||||
|
_e_gadcon_client_inject(gc, gcc, ev->x + dx, ev->y + dy);
|
||||||
|
|
||||||
|
o = gcc->o_frame ? gcc->o_frame : gcc->o_base;
|
||||||
|
if (e_gadcon_layout_orientation_get(gc->o_container))
|
||||||
|
e_gadcon_layout_pack_request_set(o, gcc->config.pos, gcc->config.size);
|
||||||
|
else
|
||||||
|
e_gadcon_layout_pack_request_set(o, gcc->config.pos, gcc->config.size);
|
||||||
|
e_gadcon_layout_thaw(gc->o_container);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_e_gadcon_cb_dnd_leave(void *data, const char *type, void *event)
|
_e_gadcon_cb_dnd_leave(void *data, const char *type, void *event)
|
||||||
{
|
{
|
||||||
// TODO: Need a marker to show where the drop is going to be
|
E_Event_Dnd_Leave *ev;
|
||||||
|
E_Gadcon *gc;
|
||||||
|
E_Gadcon_Client *gcc;
|
||||||
|
|
||||||
|
ev = event;
|
||||||
|
gc = data;
|
||||||
|
|
||||||
|
/* If we exit the starting container hide the gadcon visual */
|
||||||
|
gcc = e_gadcon_client_find(gc, "drag");
|
||||||
|
if (gcc) e_gadcon_client_hide(gcc);
|
||||||
|
|
||||||
|
/* Delete temporary object */
|
||||||
|
gcc = e_gadcon_client_find(gc, "new");
|
||||||
|
if (gcc) e_object_del(E_OBJECT(gcc));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -2059,29 +2276,21 @@ _e_gadcon_cb_drop(void *data, const char *type, void *event)
|
||||||
E_Event_Dnd_Drop *ev;
|
E_Event_Dnd_Drop *ev;
|
||||||
E_Gadcon *gc;
|
E_Gadcon *gc;
|
||||||
E_Gadcon_Client *gcc;
|
E_Gadcon_Client *gcc;
|
||||||
int editing;
|
|
||||||
|
|
||||||
E_Config_Gadcon_Client *cf_gcc;
|
E_Config_Gadcon_Client *cf_gcc;
|
||||||
|
|
||||||
ev = event;
|
ev = event;
|
||||||
gc = data;
|
gc = data;
|
||||||
/* We must store this flag as changes to gadcon clients might change it */
|
gcc = e_gadcon_client_find(gc, "drag");
|
||||||
editing = gc->editing;
|
if (!gcc) gcc = e_gadcon_client_find(gc, "new");
|
||||||
gcc = ev->data;
|
if (!gcc) return;
|
||||||
|
|
||||||
|
/* Create config for new gadcon client */
|
||||||
cf_gcc = e_gadcon_client_config_new(gc, gcc->name);
|
cf_gcc = e_gadcon_client_config_new(gc, gcc->name);
|
||||||
if (!cf_gcc) return;
|
evas_stringshare_del(gcc->id);
|
||||||
// TODO: This placement only works if the gadcon is not shrinked.
|
gcc->id = evas_stringshare_add(cf_gcc->id);
|
||||||
if (e_gadcon_layout_orientation_get(gcc->gadcon->o_container))
|
|
||||||
cf_gcc->geom.pos = ev->x - gcc->config.size / 2;
|
|
||||||
else
|
|
||||||
cf_gcc->geom.pos = ev->y - gcc->config.size / 2;
|
|
||||||
cf_gcc->geom.res = gcc->config.res;
|
|
||||||
cf_gcc->geom.size = gcc->config.size;
|
|
||||||
e_gadcon_unpopulate(gc);
|
|
||||||
e_gadcon_populate(gc);
|
|
||||||
|
|
||||||
if (editing) e_gadcon_edit_begin(gc);
|
if (gc->editing) e_gadcon_client_edit_begin(gcc);
|
||||||
e_config_save_queue();
|
e_config_save_queue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2293,7 +2502,7 @@ e_gadcon_layout_pack(Evas_Object *obj, Evas_Object *child)
|
||||||
sd = evas_object_smart_data_get(obj);
|
sd = evas_object_smart_data_get(obj);
|
||||||
if (!sd) return 0;
|
if (!sd) return 0;
|
||||||
_e_gadcon_layout_smart_adopt(sd, child);
|
_e_gadcon_layout_smart_adopt(sd, child);
|
||||||
sd->items = evas_list_prepend(sd->items, child);
|
sd->items = evas_list_append(sd->items, child);
|
||||||
_e_gadcon_layout_smart_reconfigure(sd);
|
_e_gadcon_layout_smart_reconfigure(sd);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -150,6 +150,8 @@ struct _E_Gadcon_Client
|
||||||
struct {
|
struct {
|
||||||
int x, y;
|
int x, y;
|
||||||
} drag;
|
} drag;
|
||||||
|
|
||||||
|
unsigned char hidden : 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
EAPI int e_gadcon_init(void);
|
EAPI int e_gadcon_init(void);
|
||||||
|
@ -186,6 +188,8 @@ EAPI void e_gadcon_client_config_del(E_Gadcon *gc, const char *id);
|
||||||
EAPI E_Gadcon_Client *e_gadcon_client_new(E_Gadcon *gc, const char *name, const char *id, const char *style, Evas_Object *base_obj);
|
EAPI E_Gadcon_Client *e_gadcon_client_new(E_Gadcon *gc, const char *name, const char *id, const char *style, Evas_Object *base_obj);
|
||||||
EAPI void e_gadcon_client_edit_begin(E_Gadcon_Client *gcc);
|
EAPI void e_gadcon_client_edit_begin(E_Gadcon_Client *gcc);
|
||||||
EAPI void e_gadcon_client_edit_end(E_Gadcon_Client *gcc);
|
EAPI void e_gadcon_client_edit_end(E_Gadcon_Client *gcc);
|
||||||
|
EAPI void e_gadcon_client_show(E_Gadcon_Client *gcc);
|
||||||
|
EAPI void e_gadcon_client_hide(E_Gadcon_Client *gcc);
|
||||||
EAPI void e_gadcon_client_size_request(E_Gadcon_Client *gcc, Evas_Coord w, Evas_Coord h);
|
EAPI void e_gadcon_client_size_request(E_Gadcon_Client *gcc, Evas_Coord w, Evas_Coord h);
|
||||||
EAPI void e_gadcon_client_min_size_set(E_Gadcon_Client *gcc, Evas_Coord w, Evas_Coord h);
|
EAPI void e_gadcon_client_min_size_set(E_Gadcon_Client *gcc, Evas_Coord w, Evas_Coord h);
|
||||||
EAPI void e_gadcon_client_aspect_set(E_Gadcon_Client *gcc, int w, int h);
|
EAPI void e_gadcon_client_aspect_set(E_Gadcon_Client *gcc, int w, int h);
|
||||||
|
@ -197,7 +201,7 @@ EAPI void e_gadcon_client_resizable_set(E_Gadcon_Client *gcc, int re
|
||||||
EAPI void e_gadcon_client_util_menu_items_append(E_Gadcon_Client *gcc, E_Menu *menu, int flags);
|
EAPI void e_gadcon_client_util_menu_items_append(E_Gadcon_Client *gcc, E_Menu *menu, int flags);
|
||||||
EAPI void e_gadcon_client_util_menu_attach(E_Gadcon_Client *gcc);
|
EAPI void e_gadcon_client_util_menu_attach(E_Gadcon_Client *gcc);
|
||||||
|
|
||||||
EAPI E_Gadcon_Client *e_gadcon_client_find(E_Gadcon *gc, const char *name, const char *id);
|
EAPI E_Gadcon_Client *e_gadcon_client_find(E_Gadcon *gc, const char *id);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue