[gnome-commander/gcmd-1-3] Support for single-click open mode
- From: Piotr Eljasiak <epiotr src gnome org>
- To: svn-commits-list gnome org
- Subject: [gnome-commander/gcmd-1-3] Support for single-click open mode
- Date: Mon, 18 May 2009 13:30:33 -0400 (EDT)
commit c24af7da705b3a541aae123d987a52ee67368b3d
Author: Christopher Zimmermann <madroach zakweb de>
Date: Mon May 18 19:28:00 2009 +0200
Support for single-click open mode
---
ChangeLog | 10 +++++++++
NEWS | 1 +
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 +++++++++++++++---
8 files changed, 85 insertions(+), 12 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 874d8cd..cbea103 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 177ac7c..9aac538 100644
--- a/NEWS
+++ b/NEWS
@@ -24,6 +24,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/src/gnome-cmd-data.cc b/src/gnome-cmd-data.cc
index 0af323a..d093e73 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;
@@ -1285,6 +1286,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);
@@ -1664,6 +1666,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 e765bb1..75d9a16 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,
@@ -147,6 +153,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 5168bc8..08f1c47 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 0b97f94..ec92745 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]