This is an automated email from the git hooks/post-receive script.
git pushed a commit to branch master
in repository efm2.
View the commit online.
commit c3b108097ad0205fc7e375ee694a1cc648d22e7b
Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com>
AuthorDate: Tue Jul 9 07:35:04 2024 +0100
handle sel drag on an icon with shift+ctrl and prep for ask dnd
---
TODO.md | 2 +-
src/backends/default/open.c | 12 +---
src/efm/efm.c | 82 +++----------------------
src/efm/efm_dnd.c | 51 ++++++++++------
src/efm/efm_dnd.h | 9 ++-
src/efm/efm_util.c | 146 ++++++++++++++++++++++++++++++++++++++++++--
src/efm/efm_util.h | 5 ++
7 files changed, 200 insertions(+), 107 deletions(-)
diff --git a/TODO.md b/TODO.md
index 8e84c2f..cd82a39 100644
--- a/TODO.md
+++ b/TODO.md
@@ -13,7 +13,7 @@
* DND auto-open dir on hover-over
* File properties dialog
* File Ops
- * mv
+ * mv <- done
* cp
* rm
* trash (mv to trash dir)
diff --git a/src/backends/default/open.c b/src/backends/default/open.c
index f9a5b44..f281e9b 100644
--- a/src/backends/default/open.c
+++ b/src/backends/default/open.c
@@ -1345,19 +1345,13 @@ _handle_drop_paste(const char *over, const char *action, Eina_List *files)
_op_run("mv", files, mondir);
}
else if (!strcmp(action, "ask"))
- { // XXX: implement
- }
- else if (!strcmp(action, "list"))
- { // XXX: implement
+ { // XXX: we should never get this - handled by front end right now
}
else if (!strcmp(action, "link"))
{ // XXX: implement
}
- else if (!strcmp(action, "description"))
- { // XXX: implement
- }
- else
- { // XXX: implement
+ else // "list", "description", or anything else
+ { // actully we should never get this
}
}
}
diff --git a/src/efm/efm.c b/src/efm/efm.c
index 3a0c173..9800b06 100644
--- a/src/efm/efm.c
+++ b/src/efm/efm.c
@@ -366,11 +366,10 @@ _cb_back_mouse_down(void *data, Evas *e EINA_UNUSED,
elm_object_focus_set(sd->o_scroller, EINA_TRUE);
if (ev->button == 1)
{
- sd->back_down = EINA_TRUE;
+ sd->back_down = EINA_TRUE;
sd->back_down_x = ev->canvas.x;
sd->back_down_y = ev->canvas.y;
- sd->sel_x1 = sd->back_down_x - sd->geom.x;
- sd->sel_y1 = sd->back_down_y - sd->geom.y;
+ _efm_sel_store_start(sd, ev->canvas.x, ev->canvas.y);
}
if (sd->rename_icon) _icon_rename_end(sd->rename_icon);
_icon_focus_hide(sd);
@@ -403,32 +402,7 @@ _cb_back_mouse_up(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
_unselect_all(sd);
}
}
- else
- {
- Eina_List *bl, *il;
- Icon *icon;
- Block *block;
- Eina_Rectangle r = _efm_sel_rect_get(sd);
-
- EINA_LIST_FOREACH(sd->blocks, bl, block)
- {
- if (eina_rectangles_intersect(&r, &(block->bounds)))
- {
- EINA_LIST_FOREACH(block->icons, il, icon)
- {
- if (eina_rectangles_intersect(&r, &(icon->geom)))
- _icon_select(icon);
- }
- }
- }
- sd->sel_show = EINA_FALSE;
- evas_object_hide(sd->o_sel);
- if (sd->scroll_timer)
- {
- ecore_timer_del(sd->scroll_timer);
- sd->scroll_timer = NULL;
- }
- }
+ else _efm_sel_end(sd);
}
else if (ev->button == 3)
{ // right mouse click
@@ -437,31 +411,6 @@ _cb_back_mouse_up(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
}
}
-static Eina_Bool
-_cb_sel_bounds_scroll_timer(void *data)
-{
- Smart_Data *sd = data;
-
- if (sd->o_scroller)
- {
- Evas_Coord sx, sy, sw, sh;
-
- evas_object_geometry_get(sd->o_scroller, &sx, &sy, &sw, &sh);
- if ((sd->back_x < sx) || (sd->back_y < sy) || (sd->back_x >= (sx + sw))
- || (sd->back_y >= (sy + sh)))
- {
- elm_scroller_region_bring_in(sd->o_scroller, sd->sel_x2, sd->sel_y2,
- 1, 1);
- }
- else
- {
- sd->scroll_timer = NULL;
- return EINA_FALSE;
- }
- }
- return EINA_TRUE;
-}
-
static void
_cb_back_mouse_move(void *data, Evas *e EINA_UNUSED,
Evas_Object *obj EINA_UNUSED, void *event_info)
@@ -480,21 +429,9 @@ _cb_back_mouse_move(void *data, Evas *e EINA_UNUSED,
if ((!evas_key_modifier_is_set(ev->modifiers, "Shift"))
&& (!evas_key_modifier_is_set(ev->modifiers, "Control")))
_unselect_all(sd);
- if (!sd->sel_show)
- {
- _icon_focus_hide(sd);
- sd->sel_show = EINA_TRUE;
- evas_object_show(sd->o_sel);
- evas_object_raise(sd->o_sel);
- }
- sd->back_x = ev->cur.canvas.x;
- sd->back_y = ev->cur.canvas.y;
- sd->sel_x2 = ev->cur.canvas.x - sd->geom.x;
- sd->sel_y2 = ev->cur.canvas.y - sd->geom.y;
+ if (!sd->sel_show) _efm_sel_start(sd);
+ _efm_sel_store_end(sd, ev->cur.canvas.x, ev->cur.canvas.y);
_efm_sel_position(sd);
- if (!sd->scroll_timer)
- sd->scroll_timer
- = ecore_timer_add(SCROLL_SEL_TIMER, _cb_sel_bounds_scroll_timer, sd);
}
static void
@@ -1052,12 +989,11 @@ _smart_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
evas_object_move(sd->o_list_detailed_dummy, x, y);
if (sd->sel_show)
{
- sd->sel_x2 = sd->back_x - sd->geom.x;
- sd->sel_y2 = sd->back_y - sd->geom.y;
+ _efm_sel_store_end(sd, sd->back_x, sd->back_y);
_efm_sel_position(sd);
- if (!sd->scroll_timer)
- sd->scroll_timer
- = ecore_timer_add(SCROLL_SEL_TIMER, _cb_sel_bounds_scroll_timer, sd);
+// if (!sd->scroll_timer)
+// sd->scroll_timer
+// = ecore_timer_add(SCROLL_SEL_TIMER, _cb_sel_bounds_scroll_timer, sd);
}
}
diff --git a/src/efm/efm_dnd.c b/src/efm/efm_dnd.c
index a563f5d..f24cbfd 100644
--- a/src/efm/efm_dnd.c
+++ b/src/efm/efm_dnd.c
@@ -143,12 +143,16 @@ _cb_drop(void *data, Evas_Object *o EINA_UNUSED, Elm_Selection_Data *ev)
switch (ev->action)
{
case ELM_XDND_ACTION_COPY:
+ fprintf(stderr, "XXX: COPY\n");
cmd_strbuf_append(buf, "action", "copy");
break;
case ELM_XDND_ACTION_MOVE:
+ fprintf(stderr, "XXX: MOVE\n");
cmd_strbuf_append(buf, "action", "move");
break;
case ELM_XDND_ACTION_ASK:
+ // XXX: ask - copy or move...
+ fprintf(stderr, "XXX: ASK DROP! - dont ask backend\n");
cmd_strbuf_append(buf, "action", "ask");
break;
case ELM_XDND_ACTION_LIST:
@@ -343,7 +347,8 @@ static void
_cb_drag_pos(void *data EINA_UNUSED, Evas_Object *obj_drag EINA_UNUSED,
Evas_Coord x, Evas_Coord y, Elm_Xdnd_Action action)
{
- printf("DND: %i %i act=%i\n", x, y, action);
+ // get shift/ctrl/mouse button?
+ printf("DND: pos %i %i act=%i\n", x, y, action);
}
static void
@@ -376,12 +381,15 @@ _cb_drag_done(void *data, Evas_Object *obj_drag EINA_UNUSED)
}
void
-_drag_start(Icon *icon)
+_drag_start(Icon *icon, Efm_Action action)
{
Eina_Strbuf *strbuf;
Icon *icon_dup;
+ const char *action_str = "move";
+ Elm_Xdnd_Action action_xdnd = ELM_XDND_ACTION_MOVE;
- strbuf = eina_strbuf_new();
+ strbuf
+ = eina_strbuf_new();
if (!strbuf) return;
icon_dup = _icon_dup(icon);
if (!icon_dup) goto err;
@@ -396,23 +404,32 @@ _drag_start(Icon *icon)
{
Eina_Strbuf *buf = cmd_strbuf_new("dnd-drag-begin");
- if (buf)
+ switch (action)
{
- cmd_strbuf_append(buf, "action", "move");
- _uri_list_cmd_strbuf_append(buf, "path",
- eina_strbuf_string_get(strbuf));
- cmd_strbuf_exe_consume(buf, icon->sd->exe_open);
+ case EFM_ACTION_MOVE:
+ action_str = "move";
+ action_xdnd = ELM_XDND_ACTION_MOVE;
+ break;
+ case EFM_ACTION_COPY:
+ action_str = "copy";
+ action_xdnd = ELM_XDND_ACTION_COPY;
+ break;
+ case EFM_ACTION_ASK:
+ action_str = "ask";
+ action_xdnd = ELM_XDND_ACTION_ASK;
+ break;
+ default:
+ break;
}
- // begin the drag with that list of files
- // XXX: if you use no modifier - do default (move)
- // XXX: if you hold ctrl then do copy
- // XXX: on win ... to/from removable drive it copies always
- // XXX: if you hold shift then do move
- // XXX; on mac option key forces a copy normally except from
- // removable device then it forces a move
- // XXX: this "except to/from removable drive" is bad/inconsistent imho
+ if (buf)
+ {
+ cmd_strbuf_append(buf, "action", action_str);
+ _uri_list_cmd_strbuf_append(buf, "path",
+ eina_strbuf_string_get(strbuf));
+ cmd_strbuf_exe_consume(buf, icon->sd->exe_open);
+ }
elm_drag_start(icon_dup->sd->o_scroller, ELM_SEL_FORMAT_URILIST,
- eina_strbuf_string_get(strbuf), ELM_XDND_ACTION_MOVE,
+ eina_strbuf_string_get(strbuf), action_xdnd,
_cb_drag_icon_add, icon_dup, _cb_drag_pos, icon_dup,
_cb_drag_accept, icon_dup, _cb_drag_done, icon_dup);
}
diff --git a/src/efm/efm_dnd.h b/src/efm/efm_dnd.h
index a20c0e4..705e160 100644
--- a/src/efm/efm_dnd.h
+++ b/src/efm/efm_dnd.h
@@ -4,7 +4,14 @@
#include <Elementary.h>
#include "efm_structs.h"
+typedef enum
+{
+ EFM_ACTION_MOVE,
+ EFM_ACTION_COPY,
+ EFM_ACTION_ASK
+} Efm_Action;
+
void _drop_init(Smart_Data *sd);
-void _drag_start(Icon *icon);
+void _drag_start(Icon *icon, Efm_Action action);
#endif
diff --git a/src/efm/efm_util.c b/src/efm/efm_util.c
index a5d6a9e..ca84986 100644
--- a/src/efm/efm_util.c
+++ b/src/efm/efm_util.c
@@ -763,7 +763,7 @@ _cb_icon_mouse_down(void *data, Evas *e EINA_UNUSED,
icon->sd->just_dragged = EINA_FALSE;
_icon_focus_hide(icon->sd);
if (ev->button == 1)
- {
+ { // left mouse
evas_object_raise(icon->o_base);
if (icon->longpress_timer) ecore_timer_del(icon->longpress_timer);
icon->longpress_timer
@@ -803,6 +803,19 @@ _cb_icon_mouse_down(void *data, Evas *e EINA_UNUSED,
}
}
}
+ else if (ev->button == 3)
+ { // right mouse
+ evas_object_raise(icon->o_base);
+ if (ev->flags == EVAS_BUTTON_NONE)
+ { // a click - not double-clicked. regular click
+ icon->down = EINA_TRUE;
+ icon->down_x = ev->canvas.x;
+ icon->down_y = ev->canvas.y;
+ evas_object_geometry_get(icon->o_base, &x, &y, NULL, NULL);
+ icon->down_rel_x = icon->down_x - x;
+ icon->down_rel_y = icon->down_y - y;
+ }
+ }
}
static void
@@ -993,7 +1006,9 @@ _cb_icon_mouse_up(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
Eina_Bool dragged = EINA_FALSE;
if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) goto done;
- if ((ev->button == 1) && (icon->down))
+ if ((ev->button == 1) && (icon->sd->sel_show))
+ _efm_sel_end(icon->sd);
+ else if ((ev->button == 1) && (icon->down))
{ // click + release
dx = ev->canvas.x - icon->down_x;
dy = ev->canvas.y - icon->down_y;
@@ -1032,10 +1047,18 @@ _cb_icon_mouse_up(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
icon->sd->last_focused = icon;
icon->drag = EINA_FALSE;
}
- else if (ev->button == 3)
+ else if ((ev->button == 3) && (icon->down))
{ // right mouse click
// XXX: handle right mouse click on an icon
- printf("XXX: right mouse\n");
+ dx = ev->canvas.x - icon->down_x;
+ dy = ev->canvas.y - icon->down_y;
+ if (((dx * dx) + (dy * dy)) > (5 * 5)) dragged = EINA_TRUE;
+ if (!dragged)
+ {
+ printf("XXX: right mouse\n");
+ }
+ icon->sd->last_focused = icon;
+ icon->drag = EINA_FALSE;
}
_icon_focus_hide(icon->sd);
done:
@@ -1077,6 +1100,83 @@ _icon_dup(Icon *icon)
return icon2;
}
+static Eina_Bool
+_cb_sel_bounds_scroll_timer(void *data)
+{
+ Smart_Data *sd = data;
+ Evas_Coord sx, sy, sw, sh;
+
+ if (!sd->o_scroller) return EINA_TRUE;
+ evas_object_geometry_get(sd->o_scroller, &sx, &sy, &sw, &sh);
+ if ((sd->back_x < sx) || (sd->back_y < sy) || (sd->back_x >= (sx + sw))
+ || (sd->back_y >= (sy + sh)))
+ {
+ elm_scroller_region_bring_in(sd->o_scroller, sd->sel_x2, sd->sel_y2, 1,
+ 1);
+ }
+ return EINA_TRUE;
+}
+
+void
+_efm_sel_store_start(Smart_Data *sd, Evas_Coord x, Evas_Coord y)
+{
+ sd->sel_x1 = x - sd->geom.x;
+ sd->sel_y1 = y - sd->geom.y;
+ sd->back_x = x;
+ sd->back_y = y;
+}
+
+void
+_efm_sel_store_end(Smart_Data *sd, Evas_Coord x, Evas_Coord y)
+{
+ sd->sel_x2 = x - sd->geom.x;
+ sd->sel_y2 = y - sd->geom.y;
+ sd->back_x = x;
+ sd->back_y = y;
+}
+
+void
+_efm_sel_start(Smart_Data *sd)
+{
+ if (sd->sel_show) return;
+ sd->sel_show = EINA_TRUE;
+ _icon_focus_hide(sd);
+ evas_object_show(sd->o_sel);
+ evas_object_raise(sd->o_sel);
+ if (!sd->scroll_timer)
+ sd->scroll_timer
+ = ecore_timer_add(SCROLL_SEL_TIMER, _cb_sel_bounds_scroll_timer, sd);
+}
+
+void
+_efm_sel_end(Smart_Data *sd)
+{
+ Eina_List *bl, *il;
+ Icon *icon;
+ Block *block;
+ Eina_Rectangle r = _efm_sel_rect_get(sd);
+
+ if (!sd->sel_show) return;
+ sd->sel_show = EINA_FALSE;
+
+ EINA_LIST_FOREACH(sd->blocks, bl, block)
+ {
+ if (eina_rectangles_intersect(&r, &(block->bounds)))
+ {
+ EINA_LIST_FOREACH(block->icons, il, icon)
+ {
+ if (eina_rectangles_intersect(&r, &(icon->geom))) _icon_select(icon);
+ }
+ }
+ }
+ evas_object_hide(sd->o_sel);
+ if (sd->scroll_timer)
+ {
+ ecore_timer_del(sd->scroll_timer);
+ sd->scroll_timer = NULL;
+ }
+}
+
static void
_cb_icon_mouse_move(void *data, Evas *e EINA_UNUSED,
Evas_Object *obj EINA_UNUSED, void *event_info)
@@ -1085,12 +1185,36 @@ _cb_icon_mouse_move(void *data, Evas *e EINA_UNUSED,
Icon *icon = data;
Evas_Coord dx, dy;
Eina_Bool dragged = EINA_FALSE;
+ Efm_Action action = ""
- if (!icon->down) return;
+ if (!icon->down) return;
dx = ev->cur.canvas.x - icon->down_x;
dy = ev->cur.canvas.y - icon->down_y;
if (((dx * dx) + (dy * dy)) > (5 * 5)) dragged = EINA_TRUE;
if (!dragged) return;
+ if (ev->buttons & (1 << 0)) // left mouse pressed
+ {
+ Smart_Data *sd = icon->sd;
+
+ if (sd->sel_show)
+ {
+ _efm_sel_store_end(sd, ev->cur.canvas.x, ev->cur.canvas.y);
+ _efm_sel_position(sd);
+ return;
+ }
+ else if ((evas_key_modifier_is_set(ev->modifiers, "Control")) ||
+ (evas_key_modifier_is_set(ev->modifiers, "Shift")))
+ { // start shift/ctrl drag band
+ if (!sd->sel_show)
+ {
+ _efm_sel_store_start(sd, ev->cur.canvas.x, ev->cur.canvas.y);
+ _efm_sel_store_end(sd, ev->cur.canvas.x, ev->cur.canvas.y);
+ _efm_sel_start(sd);
+ }
+ _efm_sel_position(sd);
+ return;
+ }
+ }
if (icon->sd->drag) return;
if (icon->longpress_timer)
{
@@ -1112,7 +1236,17 @@ _cb_icon_mouse_move(void *data, Evas *e EINA_UNUSED,
icon->last_x = ev->cur.canvas.x;
icon->last_y = ev->cur.canvas.y;
icon->drag = EINA_TRUE;
- _drag_start(icon);
+ // begin the drag with that list of files
+ // XXX: if you use no modifier - do default (move)
+ // XXX: if you hold ctrl then do copy
+ // XXX: on win ... to/from removable drive it copies always
+ // XXX: if you hold shift then do move
+ // XXX; on mac option key forces a copy normally except from
+ // removable device then it forces a move
+ // XXX: this "except to/from removable drive" is bad/inconsistent imho
+ if (ev->buttons & (1 << 2)) // right mouse pressed
+ action = ""
+ _drag_start(icon, action);
}
static void
diff --git a/src/efm/efm_util.h b/src/efm/efm_util.h
index 9b2e17f..0b4d291 100644
--- a/src/efm/efm_util.h
+++ b/src/efm/efm_util.h
@@ -35,6 +35,11 @@ Eina_Bool _unselect_all(Smart_Data *sd);
void _select_range(Icon *icon_from, Icon *icon_to);
Icon *_icon_dup(Icon *icon);
+void _efm_sel_store_start(Smart_Data *sd, Evas_Coord x, Evas_Coord y);
+void _efm_sel_store_end(Smart_Data *sd, Evas_Coord x, Evas_Coord y);
+void _efm_sel_start(Smart_Data *sd);
+void _efm_sel_end(Smart_Data *sd);
+
void _icon_focus(Smart_Data *sd);
void _icon_focus_show(Smart_Data *sd);
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.