Compare commits

...

3 Commits

Author SHA1 Message Date
Timothy Arceri
70c9c654af Implement single click in the file chooser
The settings are to be shared with Nautilus.

Based on the original patch by Christian Neumair.

https://bugzilla.gnome.org/show_bug.cgi?id=121113
2013-03-05 17:30:41 -06:00
Timothy Arceri
e510cf22a9 Add an org.gtk.settings.FileChooser.ClickPolicy configuration key
Possible values are 'single' and 'double'.
2013-03-05 17:27:27 -06:00
Christian Neumair
107d553d5b Single-click activate for GtkTreeView 2013-03-05 17:24:40 -06:00
5 changed files with 119 additions and 1 deletions

View File

@@ -195,6 +195,12 @@ typedef enum {
SHORTCUT_TYPE_RECENT SHORTCUT_TYPE_RECENT
} ShortcutType; } ShortcutType;
enum
{
CLICK_POLICY_SINGLE,
CLICK_POLICY_DOUBLE
};
#define MODEL_ATTRIBUTES "standard::name,standard::type,standard::display-name," \ #define MODEL_ATTRIBUTES "standard::name,standard::type,standard::display-name," \
"standard::is-hidden,standard::is-backup,standard::size," \ "standard::is-hidden,standard::is-backup,standard::size," \
"standard::content-type,time::modified" "standard::content-type,time::modified"
@@ -732,6 +738,7 @@ _gtk_file_chooser_default_init (GtkFileChooserDefault *impl)
impl->sort_order = GTK_SORT_ASCENDING; impl->sort_order = GTK_SORT_ASCENDING;
impl->recent_manager = gtk_recent_manager_get_default (); impl->recent_manager = gtk_recent_manager_get_default ();
impl->create_folders = TRUE; impl->create_folders = TRUE;
impl->single_click_activate = FALSE;
gtk_orientable_set_orientation (GTK_ORIENTABLE (impl), gtk_orientable_set_orientation (GTK_ORIENTABLE (impl),
GTK_ORIENTATION_VERTICAL); GTK_ORIENTATION_VERTICAL);
@@ -4320,6 +4327,43 @@ list_button_press_event_cb (GtkWidget *widget,
return TRUE; return TRUE;
} }
/* When single-click is enabled, display a hand when cursor
* is above a file */
static gboolean
list_motion_cb (GtkWidget *widget,
GdkEventMotion *event,
GtkFileChooserDefault *impl)
{
static GdkCursor *hand_cursor = NULL;
GdkDisplay *current_display;
if (!impl->single_click_activate || impl->has_busy_cursor)
return FALSE;
current_display = gtk_widget_get_display (widget);
g_assert (current_display != NULL);
if (hand_cursor != NULL &&
gdk_cursor_get_display (hand_cursor) != current_display)
{
g_object_unref (hand_cursor);
hand_cursor = NULL;
}
if (hand_cursor == NULL)
hand_cursor = gdk_cursor_new_for_display (current_display,
GDK_HAND2);
if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (widget),
event->x, event->y,
NULL, NULL, NULL, NULL))
gdk_window_set_cursor (gtk_widget_get_window (widget), hand_cursor);
else
gdk_window_set_cursor (gtk_widget_get_window (widget), NULL);
return FALSE;
}
typedef struct { typedef struct {
OperationMode operation_mode; OperationMode operation_mode;
gint general_column; gint general_column;
@@ -4438,6 +4482,8 @@ create_file_list (GtkFileChooserDefault *impl)
G_CALLBACK (list_popup_menu_cb), impl); G_CALLBACK (list_popup_menu_cb), impl);
g_signal_connect (impl->browse_files_tree_view, "button-press-event", g_signal_connect (impl->browse_files_tree_view, "button-press-event",
G_CALLBACK (list_button_press_event_cb), impl); G_CALLBACK (list_button_press_event_cb), impl);
g_signal_connect (impl->browse_files_tree_view, "motion_notify_event",
G_CALLBACK (list_motion_cb), impl);
g_signal_connect (impl->browse_files_tree_view, "drag-data-received", g_signal_connect (impl->browse_files_tree_view, "drag-data-received",
G_CALLBACK (file_list_drag_data_received_cb), impl); G_CALLBACK (file_list_drag_data_received_cb), impl);
@@ -6016,6 +6062,7 @@ settings_load (GtkFileChooserDefault *impl)
LocationMode location_mode; LocationMode location_mode;
gboolean show_hidden; gboolean show_hidden;
gboolean show_size_column; gboolean show_size_column;
int click_policy
gint sort_column; gint sort_column;
GtkSortType sort_order; GtkSortType sort_order;
gint sidebar_width; gint sidebar_width;
@@ -6024,6 +6071,7 @@ settings_load (GtkFileChooserDefault *impl)
settings = _gtk_file_chooser_get_settings_for_widget (GTK_WIDGET (impl)); settings = _gtk_file_chooser_get_settings_for_widget (GTK_WIDGET (impl));
location_mode = g_settings_get_enum (settings, SETTINGS_KEY_LOCATION_MODE); location_mode = g_settings_get_enum (settings, SETTINGS_KEY_LOCATION_MODE);
click_policy = g_settings_get_enum (impl->settings, SETTINGS_KEY_CLICK_POLICY);
show_hidden = g_settings_get_boolean (settings, SETTINGS_KEY_SHOW_HIDDEN); show_hidden = g_settings_get_boolean (settings, SETTINGS_KEY_SHOW_HIDDEN);
show_size_column = g_settings_get_boolean (settings, SETTINGS_KEY_SHOW_SIZE_COLUMN); show_size_column = g_settings_get_boolean (settings, SETTINGS_KEY_SHOW_SIZE_COLUMN);
sort_column = g_settings_get_enum (settings, SETTINGS_KEY_SORT_COLUMN); sort_column = g_settings_get_enum (settings, SETTINGS_KEY_SORT_COLUMN);
@@ -6034,6 +6082,10 @@ settings_load (GtkFileChooserDefault *impl)
gtk_file_chooser_set_show_hidden (GTK_FILE_CHOOSER (impl), show_hidden); gtk_file_chooser_set_show_hidden (GTK_FILE_CHOOSER (impl), show_hidden);
impl->single_click_activate = click_policy == CLICK_POLICY_SINGLE;
_gtk_tree_view_set_single_click_activate (GTK_TREE_VIEW (impl->browse_files_tree_view),
impl->single_click_activate);
impl->show_size_column = show_size_column; impl->show_size_column = show_size_column;
gtk_tree_view_column_set_visible (impl->list_size_column, show_size_column); gtk_tree_view_column_set_visible (impl->list_size_column, show_size_column);
@@ -6258,6 +6310,8 @@ set_busy_cursor (GtkFileChooserDefault *impl,
if (cursor) if (cursor)
g_object_unref (cursor); g_object_unref (cursor);
impl->has_busy_cursor = busy;
} }
/* Creates a sort model to wrap the file system model and sets it on the tree view */ /* Creates a sort model to wrap the file system model and sets it on the tree view */

View File

@@ -35,6 +35,7 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#define SETTINGS_KEY_LOCATION_MODE "location-mode" #define SETTINGS_KEY_LOCATION_MODE "location-mode"
#define SETTINGS_KEY_CLICK_POLICY "click-policy"
#define SETTINGS_KEY_SHOW_HIDDEN "show-hidden" #define SETTINGS_KEY_SHOW_HIDDEN "show-hidden"
#define SETTINGS_KEY_SHOW_SIZE_COLUMN "show-size-column" #define SETTINGS_KEY_SHOW_SIZE_COLUMN "show-size-column"
#define SETTINGS_KEY_SORT_COLUMN "sort-column" #define SETTINGS_KEY_SORT_COLUMN "sort-column"
@@ -289,6 +290,7 @@ struct _GtkFileChooserDefault
guint use_preview_label : 1; guint use_preview_label : 1;
guint select_multiple : 1; guint select_multiple : 1;
guint show_hidden : 1; guint show_hidden : 1;
guint single_click_activate : 1;
guint do_overwrite_confirmation : 1; guint do_overwrite_confirmation : 1;
guint list_sort_ascending : 1; guint list_sort_ascending : 1;
guint changing_folder : 1; guint changing_folder : 1;
@@ -299,6 +301,7 @@ struct _GtkFileChooserDefault
guint has_recent: 1; guint has_recent: 1;
guint show_size_column : 1; guint show_size_column : 1;
guint create_folders : 1; guint create_folders : 1;
guint has_busy_cursor : 1;
#if 0 #if 0
guint shortcuts_drag_outside : 1; guint shortcuts_drag_outside : 1;

View File

@@ -153,6 +153,8 @@ gint _gtk_tree_view_column_get_drag_x (GtkTreeViewColumn
GtkCellAreaContext *_gtk_tree_view_column_get_context (GtkTreeViewColumn *column); GtkCellAreaContext *_gtk_tree_view_column_get_context (GtkTreeViewColumn *column);
void _gtk_tree_view_reset_header_styles (GtkTreeView *tree_view); void _gtk_tree_view_reset_header_styles (GtkTreeView *tree_view);
void _gtk_tree_view_set_single_click_activate (GtkTreeView *tree_view,
gboolean single_click_activate);
G_END_DECLS G_END_DECLS

View File

@@ -509,6 +509,8 @@ struct _GtkTreeViewPrivate
guint draw_keyfocus : 1; guint draw_keyfocus : 1;
guint model_setup : 1; guint model_setup : 1;
guint in_column_drag : 1; guint in_column_drag : 1;
guint single_click_activate : 1;
}; };
@@ -3399,6 +3401,44 @@ button_event_modifies_selection (GdkEventButton *event)
return (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK)) != 0; return (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK)) != 0;
} }
static gboolean
gtk_tree_view_button_release_single_click (GtkTreeView *tree_view,
GdkEventButton *event)
{
gboolean retval = FALSE;
if (tree_view->priv->single_click_activate &&
(gtk_tree_selection_get_mode (tree_view->priv->selection) != GTK_SELECTION_MULTIPLE ||
(event->state & (GDK_SHIFT_MASK | GDK_CONTROL_MASK)) == 0))
{
GtkTreePath *path;
GtkTreeViewColumn *column;
gtk_tree_view_get_path_at_pos (tree_view,
event->x, event->y,
&path,
&column,
NULL,
NULL);
if (path != NULL)
{
GtkRBTree *tree = NULL;
GtkRBNode *node = NULL;
_gtk_tree_view_find_node (tree_view, path, &tree, &node);
if (node != NULL && (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_SELECTED)))
{
gtk_tree_view_row_activated (tree_view, path, column);
retval = TRUE;
}
}
gtk_tree_path_free (path);
}
return retval;
}
static gboolean static gboolean
gtk_tree_view_button_release (GtkWidget *widget, gtk_tree_view_button_release (GtkWidget *widget,
GdkEventButton *event) GdkEventButton *event)
@@ -3418,7 +3458,7 @@ gtk_tree_view_button_release (GtkWidget *widget,
return gtk_tree_view_button_release_column_resize (widget, event); return gtk_tree_view_button_release_column_resize (widget, event);
if (tree_view->priv->button_pressed_node == NULL) if (tree_view->priv->button_pressed_node == NULL)
return FALSE; return gtk_tree_view_button_release_single_click (tree_view, event);
if (event->button == GDK_BUTTON_PRIMARY if (event->button == GDK_BUTTON_PRIMARY
&& tree_view->priv->button_pressed_node == tree_view->priv->prelight_node) && tree_view->priv->button_pressed_node == tree_view->priv->prelight_node)
@@ -6989,6 +7029,15 @@ _gtk_tree_view_column_autosize (GtkTreeView *tree_view,
gtk_widget_queue_resize (GTK_WIDGET (tree_view)); gtk_widget_queue_resize (GTK_WIDGET (tree_view));
} }
void
_gtk_tree_view_set_single_click_activate (GtkTreeView *tree_view,
gboolean single_click_activate)
{
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
tree_view->priv->single_click_activate = single_click_activate;
}
/* Drag-and-drop */ /* Drag-and-drop */
static void static void

View File

@@ -33,10 +33,20 @@
<value nick='descending' value='1'/> <value nick='descending' value='1'/>
</enum> </enum>
<enum id="org.gtk.Settings.FileChooser.ClickPolicy">
<value nick="single" value="0"/>
<value nick="double" value="1"/>
</enum>
<schema id='org.gtk.Settings.FileChooser' path='/org/gtk/settings/file-chooser/'> <schema id='org.gtk.Settings.FileChooser' path='/org/gtk/settings/file-chooser/'>
<key name='last-folder-uri' type='s'> <key name='last-folder-uri' type='s'>
<default>""</default> <default>""</default>
</key> </key>
<key name="click-policy" enum="org.gtk.Settings.FileChooser.ClickPolicy">
<default>'double'</default>
<summary>Type of click used to launch/open files</summary>
<description>Possible values are "single" to launch files on a single click, or "double" to launch them on a double click.</description>
</key>
<key name='location-mode' enum='org.gtk.Settings.FileChooser.LocationMode'> <key name='location-mode' enum='org.gtk.Settings.FileChooser.LocationMode'>
<default>'path-bar'</default> <default>'path-bar'</default>
</key> </key>