[gnome-commander] Support for single-click open mode



commit 895dbc94c193653f9828483511caf75629885f2f
Author: Christopher Zimmermann <madroach zakweb de>
Date:   Mon May 18 19:17:12 2009 +0200

    Support for single-click open mode
---
 ChangeLog                       |   10 +++++++++
 NEWS                            |    1 +
 doc/C/gnome-commander.xml       |   10 +++++++++
 src/gnome-cmd-data.cc           |    3 ++
 src/gnome-cmd-data.h            |    7 ++++++
 src/gnome-cmd-file-list.cc      |   40 ++++++++++++++++++++++++++++++++++----
 src/gnome-cmd-file-list.h       |    3 ++
 src/gnome-cmd-file-selector.cc  |   13 +++++++++--
 src/gnome-cmd-options-dialog.cc |   20 +++++++++++++++---
 9 files changed, 95 insertions(+), 12 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 6e79cd1..c2bd7a1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2009-05-18  Christopher Zimmermann  <madroach zakweb de>
+
+	* src/gnome-cmd-data.cc:
+	* src/gnome-cmd-data.h:
+	* src/gnome-cmd-file-list.cc:
+	* src/gnome-cmd-file-list.h:
+	* src/gnome-cmd-file-selector.cc:
+	* src/gnome-cmd-options-dialog.cc:
+	Support for single-click open mode
+
 2009-05-16  Piotr Eljasiak  <epiotr use pl>
 
 	* src/gnome-cmd-profile-component.cc:
diff --git a/NEWS b/NEWS
index 32e3e98..61cfb48 100644
--- a/NEWS
+++ b/NEWS
@@ -27,6 +27,7 @@ New features:
  * Revamped advanced file rename tool (regex backreferences ('\number'), profiles,
    upper/lowercase conversion, blanks trimming and much more)
  * Support for metadata tags in internal viewer
+ * Support for single-click open mode
  * Support for row alternate background in colour themes
  * New colour theme: cafezinho
  * New or updated docs: de, en, es
diff --git a/doc/C/gnome-commander.xml b/doc/C/gnome-commander.xml
index 4b3c2a9..580ed17 100644
--- a/doc/C/gnome-commander.xml
+++ b/doc/C/gnome-commander.xml
@@ -5478,6 +5478,13 @@
                                 </row>
                                 <row valign="top">
                                     <entry><para></para></entry>
+                                    <entry><para>left_mouse_button_mode</para></entry>
+                                    <entry><para></para></entry>
+                                    <entry><para></para></entry>
+                                    <entry><para></para></entry>
+                                </row>
+                                <row valign="top">
+                                    <entry><para></para></entry>
                                     <entry><para>left_mouse_button_unselects</para></entry>
                                     <entry><para></para></entry>
                                     <entry><para></para></entry>
@@ -5994,6 +6001,9 @@
                             <para>Support for metadata tags in internal viewer</para>
                         </listitem>
                         <listitem>
+                            <para>Support for single-click open mode</para>
+                        </listitem>
+                        <listitem>
                             <para>Support for row alternate background in colour themes</para>
                         </listitem>
                         <listitem>
diff --git a/src/gnome-cmd-data.cc b/src/gnome-cmd-data.cc
index 32add03..dddecb9 100644
--- a/src/gnome-cmd-data.cc
+++ b/src/gnome-cmd-data.cc
@@ -1049,6 +1049,7 @@ GnomeCmdData::GnomeCmdData()
     confirm_delete = TRUE;
     confirm_copy_overwrite = GNOME_CMD_CONFIRM_OVERWRITE_QUERY;
     confirm_move_overwrite = GNOME_CMD_CONFIRM_OVERWRITE_QUERY;
+    left_mouse_button_mode = LEFT_BUTTON_OPENS_WITH_DOUBLE_CLICK;
     left_mouse_button_unselects = TRUE;
     right_mouse_button_mode = RIGHT_BUTTON_POPUPS_MENU;
     color_mode = GNOME_CMD_COLOR_DEEP_BLUE;
@@ -1282,6 +1283,7 @@ void GnomeCmdData::load()
     priv->list_font = gnome_cmd_data_get_string ("/options/list_font", "-misc-fixed-medium-r-normal-*-10-*-*-*-c-*-iso8859-1");
 
     ext_disp_mode = (GnomeCmdExtDispMode) gnome_cmd_data_get_int ("/options/ext_disp_mode", GNOME_CMD_EXT_DISP_BOTH);
+    left_mouse_button_mode = (LeftMouseButtonMode) gnome_cmd_data_get_int ("/options/left_mouse_button_mode", LEFT_BUTTON_OPENS_WITH_DOUBLE_CLICK);
     left_mouse_button_unselects = gnome_cmd_data_get_bool ("/options/left_mouse_button_unselects", TRUE);
     right_mouse_button_mode = (RightMouseButtonMode) gnome_cmd_data_get_int ("/options/right_mouse_button_mode", RIGHT_BUTTON_POPUPS_MENU);
     icon_size = gnome_cmd_data_get_int ("/options/icon_size", 16);
@@ -1660,6 +1662,7 @@ void GnomeCmdData::save()
     gnome_cmd_data_set_string ("/options/list_font", priv->list_font);
 
     gnome_cmd_data_set_int    ("/options/ext_disp_mode", ext_disp_mode);
+    gnome_cmd_data_set_int    ("/options/left_mouse_button_mode", left_mouse_button_mode);
     gnome_cmd_data_set_bool   ("/options/left_mouse_button_unselects", left_mouse_button_unselects);
     gnome_cmd_data_set_int    ("/options/right_mouse_button_mode", right_mouse_button_mode);
     gnome_cmd_data_set_int    ("/options/icon_size", icon_size);
diff --git a/src/gnome-cmd-data.h b/src/gnome-cmd-data.h
index ca0c4d9..fe99c00 100644
--- a/src/gnome-cmd-data.h
+++ b/src/gnome-cmd-data.h
@@ -36,6 +36,12 @@ struct GnomeCmdConFtp;
 
 struct GnomeCmdData
 {
+    enum LeftMouseButtonMode
+    {
+        LEFT_BUTTON_OPENS_WITH_SINGLE_CLICK,
+        LEFT_BUTTON_OPENS_WITH_DOUBLE_CLICK
+    };
+
     enum RightMouseButtonMode
     {
         RIGHT_BUTTON_POPUPS_MENU,
@@ -146,6 +152,7 @@ struct GnomeCmdData
     gboolean                     confirm_delete;
     GnomeCmdConfirmOverwriteMode confirm_copy_overwrite;
     GnomeCmdConfirmOverwriteMode confirm_move_overwrite;
+    LeftMouseButtonMode          left_mouse_button_mode;
     gboolean                     left_mouse_button_unselects;
     RightMouseButtonMode         right_mouse_button_mode;
     GnomeCmdColorMode            color_mode;
diff --git a/src/gnome-cmd-file-list.cc b/src/gnome-cmd-file-list.cc
index a1af922..3e91bde 100644
--- a/src/gnome-cmd-file-list.cc
+++ b/src/gnome-cmd-file-list.cc
@@ -59,6 +59,7 @@ using namespace std;
 enum
 {
     FILE_CLICKED,        // A file in the list was clicked
+    FILE_RELEASED,       // A file in the list has been clicked and mouse button has been released
     LIST_CLICKED,        // The file list widget was clicked
     EMPTY_SPACE_CLICKED, // The file list was clicked but not on a file
     FILES_CHANGED,       // The visible content of the file list has changed (files have been: selected, created, deleted or modified)
@@ -1084,7 +1085,9 @@ static void on_file_clicked (GnomeCmdFileList *fl, GnomeCmdFile *f, GdkEventButt
     g_return_if_fail (f != NULL);
     g_return_if_fail (event != NULL);
 
-    if (event->type == GDK_2BUTTON_PRESS && event->button == 1)
+    fl->modifier_click = event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK);
+
+    if (event->type == GDK_2BUTTON_PRESS && event->button == 1 && gnome_cmd_data.left_mouse_button_mode == GnomeCmdData::LEFT_BUTTON_OPENS_WITH_DOUBLE_CLICK)
     {
         mime_exec_file (f);
     }
@@ -1100,18 +1103,20 @@ static void on_file_clicked (GnomeCmdFileList *fl, GnomeCmdFile *f, GdkEventButt
             if (event->button == 1)
             {
                 if (event->state & GDK_SHIFT_MASK)
+                {
                     select_file_range (fl, fl->priv->shift_down_row, row);
+                }
                 else
                     if (event->state & GDK_CONTROL_MASK)
                     {
-                        if (!fl->priv->selected_files)
+                        if (fl->priv->selected_files || gnome_cmd_data.left_mouse_button_mode == GnomeCmdData::LEFT_BUTTON_OPENS_WITH_SINGLE_CLICK)
+                            toggle_file_at_row (fl, row);
+                        else
                         {
                             if (prev_row!=row)
                                 select_file (fl, fl->get_file_at_row(prev_row));
                             select_file_at_row (fl, row);
                         }
-                        else
-                            toggle_file_at_row (fl, row);
                     }
             }
             else
@@ -1142,6 +1147,17 @@ static void on_file_clicked (GnomeCmdFileList *fl, GnomeCmdFile *f, GdkEventButt
 }
 
 
+static void on_file_released (GnomeCmdFileList *fl, GnomeCmdFile *f, GdkEventButton *event, gpointer data)
+{
+    g_return_if_fail (GNOME_CMD_IS_FILE_LIST (fl));
+    g_return_if_fail (f != NULL);
+    g_return_if_fail (event != NULL);
+
+    if (event->type == GDK_BUTTON_RELEASE && event->button == 1 && !fl->modifier_click && gnome_cmd_data.left_mouse_button_mode == GnomeCmdData::LEFT_BUTTON_OPENS_WITH_SINGLE_CLICK)
+        mime_exec_file (f);
+}
+
+
 static void on_motion_notify (GtkCList *clist, GdkEventMotion *event, GnomeCmdFileList *fl)
 {
     g_return_if_fail (event != NULL);
@@ -1185,11 +1201,14 @@ static gint on_button_release (GtkWidget *widget, GdkEventButton *event, GnomeCm
     if (row < 0)
         return FALSE;
 
+    GnomeCmdFile *f = fl->get_file_at_row(row);
+
+    gtk_signal_emit (*fl, file_list_signals[FILE_RELEASED], f, event);
+
     if (event->type == GDK_BUTTON_RELEASE)
     {
         if (event->button == 1 && state_is_blank (event->state))
         {
-            GnomeCmdFile *f = fl->get_file_at_row(row);
             if (f && g_list_index (fl->priv->selected_files, f)==-1 && gnome_cmd_data.left_mouse_button_unselects)
                 fl->unselect_all();
             return TRUE;
@@ -1250,6 +1269,15 @@ static void class_init (GnomeCmdFileListClass *klass)
                         GTK_TYPE_NONE,
                         2, GTK_TYPE_POINTER, GTK_TYPE_POINTER);
 
+    file_list_signals[FILE_RELEASED] =
+        gtk_signal_new ("file-released",
+                        GTK_RUN_LAST,
+                        G_OBJECT_CLASS_TYPE (object_class),
+                        GTK_SIGNAL_OFFSET (GnomeCmdFileListClass, file_released),
+                        gtk_marshal_NONE__POINTER_POINTER,
+                        GTK_TYPE_NONE,
+                        2, GTK_TYPE_POINTER, GTK_TYPE_POINTER);
+
     file_list_signals[LIST_CLICKED] =
         gtk_signal_new ("list-clicked",
                         GTK_RUN_LAST,
@@ -1290,6 +1318,7 @@ static void class_init (GnomeCmdFileListClass *klass)
     object_class->destroy = destroy;
     widget_class->map = ::map;
     klass->file_clicked = NULL;
+    klass->file_released = NULL;
     klass->list_clicked = NULL;
     klass->files_changed = NULL;
     klass->dir_changed = NULL;
@@ -1310,6 +1339,7 @@ static void init (GnomeCmdFileList *fl)
 
     gtk_signal_connect_after (*fl, "realize", GTK_SIGNAL_FUNC (on_realize), fl);
     gtk_signal_connect (*fl, "file-clicked", GTK_SIGNAL_FUNC (on_file_clicked), fl);
+    gtk_signal_connect (*fl, "file-released", GTK_SIGNAL_FUNC (on_file_released), fl);
 }
 
 
diff --git a/src/gnome-cmd-file-list.h b/src/gnome-cmd-file-list.h
index bda1e14..1a5b031 100644
--- a/src/gnome-cmd-file-list.h
+++ b/src/gnome-cmd-file-list.h
@@ -65,6 +65,7 @@ struct GnomeCmdFileList
     Private *priv;
 
     gboolean realized;
+    gboolean modifier_click;
 
     void *operator new (size_t size);
     void operator delete (void *p)      {  g_object_unref (p);  }
@@ -164,6 +165,7 @@ struct GnomeCmdFileListClass
     GnomeCmdCListClass parent_class;
 
     void (* file_clicked)        (GnomeCmdFileList *fl, GnomeCmdFile *f, GdkEventButton *button);
+    void (* file_released)       (GnomeCmdFileList *fl, GnomeCmdFile *f, GdkEventButton *button);
     void (* list_clicked)        (GnomeCmdFileList *fl, GdkEventButton *button);
     void (* empty_space_clicked) (GnomeCmdFileList *fl, GdkEventButton *button);
     void (* files_changed)       (GnomeCmdFileList *fl);
@@ -179,6 +181,7 @@ inline void *GnomeCmdFileList::operator new (size_t size)
 inline GnomeCmdFileList::GnomeCmdFileList(GtkSignalFunc handler, GtkObject *object)
 {
     realized = FALSE;
+    modifier_click = FALSE;
     con = NULL;
     cwd = NULL;
     lwd = NULL;
diff --git a/src/gnome-cmd-file-selector.cc b/src/gnome-cmd-file-selector.cc
index 1be3ed2..ec2cda1 100644
--- a/src/gnome-cmd-file-selector.cc
+++ b/src/gnome-cmd-file-selector.cc
@@ -922,9 +922,15 @@ static void on_realize (GnomeCmdFileSelector *fs, gpointer user_data)
 
 static void on_list_file_clicked (GnomeCmdFileList *fl, GnomeCmdFile *f, GdkEventButton *event, GnomeCmdFileSelector *fs)
 {
-    if (event->type == GDK_2BUTTON_PRESS)
-        if (event->button == 1)
-            do_file_specific_action (fs, f);
+    if (event->type == GDK_2BUTTON_PRESS && event->button == 1 && gnome_cmd_data.left_mouse_button_mode == GnomeCmdData::LEFT_BUTTON_OPENS_WITH_DOUBLE_CLICK)
+        do_file_specific_action (fs, f);
+}
+
+
+static void on_list_file_released (GnomeCmdFileList *fl, GnomeCmdFile *f, GdkEventButton *event, GnomeCmdFileSelector *fs)
+{
+    if (event->type == GDK_BUTTON_RELEASE && event->button == 1 && !fl->modifier_click && gnome_cmd_data.left_mouse_button_mode == GnomeCmdData::LEFT_BUTTON_OPENS_WITH_SINGLE_CLICK)
+        do_file_specific_action (fs, f);
 }
 
 
@@ -1239,6 +1245,7 @@ static void init (GnomeCmdFileSelector *fs)
     gtk_signal_connect (GTK_OBJECT (fs->con_combo), "popwin-hidden", GTK_SIGNAL_FUNC (on_combo_popwin_hidden), fs);
 
     gtk_signal_connect (GTK_OBJECT (fs->file_list()), "file-clicked", GTK_SIGNAL_FUNC (on_list_file_clicked), fs);
+    gtk_signal_connect (GTK_OBJECT (fs->file_list()), "file-released", GTK_SIGNAL_FUNC (on_list_file_released), fs);
     gtk_signal_connect (GTK_OBJECT (fs->file_list()), "list-clicked", GTK_SIGNAL_FUNC (on_list_list_clicked), fs);
     gtk_signal_connect (GTK_OBJECT (fs->file_list()), "empty-space-clicked", GTK_SIGNAL_FUNC (on_list_empty_space_clicked), fs);
     gtk_signal_connect (GTK_OBJECT (fs->file_list()), "files-changed", GTK_SIGNAL_FUNC (on_list_files_changed), fs);
diff --git a/src/gnome-cmd-options-dialog.cc b/src/gnome-cmd-options-dialog.cc
index ba380e3..30a6481 100644
--- a/src/gnome-cmd-options-dialog.cc
+++ b/src/gnome-cmd-options-dialog.cc
@@ -72,12 +72,21 @@ static GtkWidget *create_general_tab (GtkWidget *parent)
     gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
 
 
-    // Left click behavior
+    // Left mouse button settings
     cat_box = create_vbox (parent, FALSE, 0);
     cat = create_category (parent, cat_box, _("Left mouse button"));
     gtk_box_pack_start (GTK_BOX (vbox), cat, FALSE, TRUE, 0);
 
-    check = create_check (parent, _("Unselects files"), "lmb_unselect_check");
+    radio = create_radio (parent, NULL, _("Single click to open items"), "lmb_singleclick_radio");
+    gtk_box_pack_start (GTK_BOX (cat_box), radio, FALSE, TRUE, 0);
+    if (gnome_cmd_data.left_mouse_button_mode == GnomeCmdData::LEFT_BUTTON_OPENS_WITH_SINGLE_CLICK)
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio), TRUE);
+    radio = create_radio (parent, get_radio_group(radio), _("Double click to open items"), "lmb_doubleclick_radio");
+    gtk_container_add (GTK_CONTAINER (cat_box), radio);
+    if (gnome_cmd_data.left_mouse_button_mode == GnomeCmdData::LEFT_BUTTON_OPENS_WITH_DOUBLE_CLICK)
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio), TRUE);
+
+    check = create_check (parent, _("Single click unselects files"), "lmb_unselects_check");
     gtk_box_pack_start (GTK_BOX (cat_box), check, FALSE, TRUE, 0);
     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), gnome_cmd_data.left_mouse_button_unselects);
 
@@ -152,14 +161,17 @@ static GtkWidget *create_general_tab (GtkWidget *parent)
 
 inline void store_general_options (GnomeCmdOptionsDialog *dialog)
 {
-    GtkWidget *lmb_unselect_check = lookup_widget (GTK_WIDGET (dialog), "lmb_unselect_check");
+    GtkWidget *lmb_singleclick_radio = lookup_widget (GTK_WIDGET (dialog), "lmb_singleclick_radio");
+    GtkWidget *lmb_unselects_check = lookup_widget (GTK_WIDGET (dialog), "lmb_unselects_check");
     GtkWidget *rmb_popup_radio = lookup_widget (GTK_WIDGET (dialog), "rmb_popup_radio");
     GtkWidget *ft_regex_radio = lookup_widget (GTK_WIDGET (dialog), "ft_regex_radio");
     GtkWidget *case_sens_check = lookup_widget (GTK_WIDGET (dialog), "case_sens_check");
     GtkWidget *dir_cache_size = lookup_widget (GTK_WIDGET (dialog), "dir_cache_size");
     GtkWidget *alt_quick_search = lookup_widget (GTK_WIDGET (dialog), "alt_quick_search");
 
-    gnome_cmd_data.left_mouse_button_unselects = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (lmb_unselect_check));
+    gnome_cmd_data.left_mouse_button_mode = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (lmb_singleclick_radio)) ? GnomeCmdData::LEFT_BUTTON_OPENS_WITH_SINGLE_CLICK : GnomeCmdData::LEFT_BUTTON_OPENS_WITH_DOUBLE_CLICK;
+
+    gnome_cmd_data.left_mouse_button_unselects = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (lmb_unselects_check));
 
     gnome_cmd_data.right_mouse_button_mode = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (rmb_popup_radio)) ? GnomeCmdData::RIGHT_BUTTON_POPUPS_MENU
                                                                                                                 : GnomeCmdData::RIGHT_BUTTON_SELECTS;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]