Ephoto: Allow images to be drag and dropped in the thumb grid.

This commit is contained in:
Stephen okra Houston 2016-09-01 16:21:37 -05:00
parent 8f9522ce25
commit 4f10741f4f
2 changed files with 136 additions and 7 deletions

View File

@ -110,11 +110,15 @@ _drop_dropcb(void *data EINA_UNUSED, Evas_Object *obj, Elm_Object_Item *it,
while (s)
{
if (evas_object_image_extension_can_load_get(s))
files = eina_list_append(files, s);
files = eina_list_append(files, s);
s = _drag_data_extract(&dd);
}
free(dd);
if (eina_list_count(files) <= 0)
return EINA_TRUE;
if (db->ephoto->config->move_drop)
ephoto_file_move(db->ephoto, files, path);
else
@ -136,12 +140,9 @@ _drop_item_getcb(Evas_Object *obj, Evas_Coord x, Evas_Coord y,
}
static void
_drop_enter(void *data, Evas_Object *obj EINA_UNUSED)
_drop_enter(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED)
{
Ephoto_Directory_Browser *db = data;
if (db->dragging)
elm_object_cursor_set(db->main, ELM_CURSOR_TARGET);
return;
}
static void
@ -151,7 +152,6 @@ _drop_leave(void *data, Evas_Object *obj EINA_UNUSED)
if (db->dragging)
{
elm_object_cursor_set(db->main, ELM_CURSOR_HAND2);
if (db->dir_current)
elm_genlist_item_selected_set(db->dir_current, EINA_TRUE);
}
@ -159,7 +159,7 @@ _drop_leave(void *data, Evas_Object *obj EINA_UNUSED)
static void
_drop_pos(void *data EINA_UNUSED, Evas_Object *cont EINA_UNUSED,
Elm_Object_Item *it EINA_UNUSED, Evas_Coord x EINA_UNUSED,
Elm_Object_Item *it, Evas_Coord x EINA_UNUSED,
Evas_Coord y EINA_UNUSED, int xposret EINA_UNUSED,
int yposret EINA_UNUSED, Elm_Xdnd_Action action EINA_UNUSED)
{

View File

@ -79,6 +79,7 @@ static void _ephoto_thumb_search_cancel(void *data, Evas_Object *obj EINA_UNUSED
void *event_info EINA_UNUSED);
static void _ephoto_thumb_search_start(void *data, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED);
static char * _drag_data_extract(char **drag_data);
/*Common Callbacks*/
static void
@ -120,6 +121,131 @@ _5s_timeout_gone(void *data)
return ECORE_CALLBACK_CANCEL;
}
static Eina_Bool
_drop_dropcb(void *data EINA_UNUSED, Evas_Object *obj, Elm_Object_Item *it EINA_UNUSED,
Elm_Selection_Data *ev, int xposret EINA_UNUSED, int yposret EINA_UNUSED)
{
Eina_List *files = NULL;
Ephoto_Thumb_Browser *tb = evas_object_data_get(obj, "thumb_browser");
const char *path = tb->ephoto->config->directory;
char *dir;
if (!ev->data)
return EINA_FALSE;
if (ev->len <= 0)
return EINA_FALSE;
if (!path)
return EINA_FALSE;
char *dd = strdup(ev->data);
if (!dd)
return EINA_FALSE;
char *s = _drag_data_extract(&dd);
while (s)
{
dir = ecore_file_dir_get(s);
if (!strcmp(path, dir))
{
free(dir);
break;
}
if (evas_object_image_extension_can_load_get(basename(s)))
files = eina_list_append(files, s);
free(dir);
s = _drag_data_extract(&dd);
}
free(dd);
if (eina_list_count(files) <= 0)
return EINA_TRUE;
if (tb->ephoto->config->move_drop)
ephoto_file_move(tb->ephoto, files, path);
else
ephoto_file_copy(tb->ephoto, files, path);
return EINA_TRUE;
}
static Elm_Object_Item *
_drop_item_getcb(Evas_Object *obj EINA_UNUSED, Evas_Coord x EINA_UNUSED,
Evas_Coord y EINA_UNUSED,int *xposret EINA_UNUSED, int *yposret EINA_UNUSED)
{
return NULL;
}
static void
_drop_enter(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED)
{
return;
}
static void
_drop_leave(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED)
{
return;
}
static void
_drop_pos(void *data EINA_UNUSED, Evas_Object *cont EINA_UNUSED,
Elm_Object_Item *it EINA_UNUSED, Evas_Coord x EINA_UNUSED,
Evas_Coord y EINA_UNUSED, int xposret EINA_UNUSED,
int yposret EINA_UNUSED, Elm_Xdnd_Action action EINA_UNUSED)
{
return;
}
static char *
_drag_data_extract(char **drag_data)
{
char *uri = NULL;
if (!drag_data)
return uri;
char *p = *drag_data;
if (!p)
return uri;
char *s = strstr(p, FILESEP);
if (s)
p += FILESEP_LEN;
s = strchr(p, '\n');
uri = p;
if (s)
{
if (s - p > 0)
{
char *s1 = s - 1;
if (s1[0] == '\r')
s1[0] = '\0';
else
{
char *s2 = s + 1;
if (s2[0] == '\r')
{
s[0] = '\0';
s++;
}
else
s[0] = '\0';
}
}
else
s[0] = '\0';
s++;
}
else
p = NULL;
*drag_data = s;
return uri;
}
static void
_dnd_drag_start(void *data EINA_UNUSED, Evas_Object *obj)
{
@ -1299,6 +1425,9 @@ _ephoto_thumb_view_add(Ephoto_Thumb_Browser *tb)
_grid_mouse_wheel, tb);
elm_drag_item_container_add(tb->grid, ANIM_TIME, DRAG_TIMEOUT,
_dnd_item_get, _dnd_item_data_get);
elm_drop_item_container_add(tb->grid, ELM_SEL_FORMAT_TARGETS,
_drop_item_getcb, _drop_enter, tb, _drop_leave, tb, _drop_pos, tb,
_drop_dropcb, NULL);
evas_object_data_set(tb->grid, "thumb_browser", tb);
elm_box_pack_end(tb->gridbox, tb->grid);
evas_object_smart_callback_add(tb->grid, "changed", _grid_changed, tb);