Mikko Linnalo wrote:
> Hi,
> 
> I was testing the new single click feature and was wondering if it could
> be possible to implement a feature where files get selected by just
> hovering the mouse pointer on them (e.g. ~500msecs). This is how single
> click works atleast in Windows. Now user has to keep Ctrl or Shift
> pressed when selecting even a single file.

See the attached patch for ExoIconView, that should do the trick for the
icon view. For the details view, GtkTreeView offers a hover-selection
setting, but that doesn't work for multi-selection mode and it'll also
select the row right away without any timeout. I could add an
ExoTreeView class, which extends GtkTreeView with the required single
click features.

> Btw, just made a bug for Thunar and I was able to verify the fix half on
> hour later, that's just awesome. I work in a software company as a test
> engineer (~5 years) and I have never seen such speed. Benny is the
> man :)

Well, it depends on the complexity of the bug. The icon view selection
bug was really trivial, I just forgot to check for Control/Shift.

> Br,
> Mikko Linnalo

HTH,
Benedikt
Index: exo-icon-view.c
===================================================================
--- exo-icon-view.c	(revision 20062)
+++ exo-icon-view.c	(working copy)
@@ -46,6 +46,9 @@
 
 
 
+/* the prelit select timeout (in ms) */
+#define EXO_ICON_VIEW_SELECT_PRELIT_TIMEOUT (500)
+
 /* the search dialog timeout (in ms) */
 #define EXO_ICON_VIEW_SEARCH_DIALOG_TIMEOUT (5000)
 
@@ -220,6 +223,8 @@
                                                                           gint                    count);
 static void                 exo_icon_view_scroll_to_item                 (ExoIconView            *icon_view,
                                                                           ExoIconViewItem        *item);
+static gboolean             exo_icon_view_select_prelit_timeout          (gpointer                user_data);
+static void                 exo_icon_view_select_prelit_timeout_destroy  (gpointer                user_data);
 static void                 exo_icon_view_select_item                    (ExoIconView            *icon_view,
                                                                           ExoIconViewItem        *item);
 static void                 exo_icon_view_unselect_item                  (ExoIconView            *icon_view,
@@ -443,6 +448,10 @@
   GtkCellEditable *editable;
   ExoIconViewItem *prelit_item;
 
+  /* automatically select prelited items after a timeout */
+  gboolean         select_prelit_extend; /* whether to extend the selection */
+  gint             select_prelit_timeout_id;
+
   ExoIconViewItem *last_single_clicked;
 
   GList *cell_list;
@@ -1109,6 +1118,8 @@
   icon_view->priv->column_spacing = 6;
   icon_view->priv->margin = 6;
 
+  icon_view->priv->select_prelit_timeout_id = -1;
+
   icon_view->priv->layout_idle_id = -1;
 
   icon_view->priv->enable_search = TRUE;
@@ -1127,6 +1138,10 @@
 {
   ExoIconView *icon_view = EXO_ICON_VIEW (object);
 
+  /* cancel any pending prelit-select timeout */
+  if (G_UNLIKELY (icon_view->priv->select_prelit_timeout_id >= 0))
+    g_source_remove (icon_view->priv->select_prelit_timeout_id);
+
   /* cancel any pending search timeout */
   if (G_UNLIKELY (icon_view->priv->search_timeout_id >= 0))
     g_source_remove (icon_view->priv->search_timeout_id);
@@ -1748,11 +1763,26 @@
                   cursor = gdk_cursor_new (GDK_HAND2);
                   gdk_window_set_cursor (event->window, cursor);
                   gdk_cursor_unref (cursor);
+
+                  /* extend the selection if either control or shift is pressed */
+                  icon_view->priv->select_prelit_extend = ((event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK)) != 0);
+
+                  /* schedule the timeout source if not already pending */
+                  if (G_LIKELY (icon_view->priv->select_prelit_timeout_id < 0))
+                    {
+                      icon_view->priv->select_prelit_timeout_id = g_timeout_add_full (G_PRIORITY_LOW, EXO_ICON_VIEW_SELECT_PRELIT_TIMEOUT,
+                                                                                      exo_icon_view_select_prelit_timeout, icon_view,
+                                                                                      exo_icon_view_select_prelit_timeout_destroy);
+                    }
                 }
               else
                 {
                   /* reset the cursor */
                   gdk_window_set_cursor (event->window, NULL);
+
+                  /* cancel any pending prelit select timeout */
+                  if (icon_view->priv->select_prelit_timeout_id >= 0)
+                    g_source_remove (icon_view->priv->select_prelit_timeout_id);
                 }
             }
         }
@@ -3340,7 +3370,43 @@
 
 
 
+static gboolean
+exo_icon_view_select_prelit_timeout (gpointer user_data)
+{
+  ExoIconView *icon_view = EXO_ICON_VIEW (user_data);
+
+  GDK_THREADS_ENTER ();
+
+  /* check if we're still in single-click mode and have a prelit item */
+  if (icon_view->priv->single_click && icon_view->priv->prelit_item != NULL)
+    {
+      /* grab focus to the icon view widget */
+      gtk_widget_grab_focus (GTK_WIDGET (icon_view));
+
+      /* check if we should extend the selection */
+      if (G_LIKELY (!icon_view->priv->select_prelit_extend))
+        exo_icon_view_unselect_all (icon_view);
+
+      /* select the prelited item */
+      exo_icon_view_select_item (icon_view, icon_view->priv->prelit_item);
+    }
+
+  GDK_THREADS_LEAVE ();
+
+  return FALSE;
+}
+
+
+
 static void
+exo_icon_view_select_prelit_timeout_destroy (gpointer user_data)
+{
+  EXO_ICON_VIEW (user_data)->priv->select_prelit_timeout_id = -1;
+}
+
+
+
+static void
 exo_icon_view_select_item (ExoIconView      *icon_view,
                            ExoIconViewItem  *item)
 {
_______________________________________________
Thunar-dev mailing list
Thunar-dev@xfce.org
http://foo-projects.org/mailman/listinfo/thunar-dev

Reply via email to