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.

Reply via email to