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
} ShortcutType;
enum
{
CLICK_POLICY_SINGLE,
CLICK_POLICY_DOUBLE
};
#define MODEL_ATTRIBUTES "standard::name,standard::type,standard::display-name," \
"standard::is-hidden,standard::is-backup,standard::size," \
"standard::content-type,time::modified"
@@ -732,6 +738,7 @@ _gtk_file_chooser_default_init (GtkFileChooserDefault *impl)
impl->sort_order = GTK_SORT_ASCENDING;
impl->recent_manager = gtk_recent_manager_get_default ();
impl->create_folders = TRUE;
impl->single_click_activate = FALSE;
gtk_orientable_set_orientation (GTK_ORIENTABLE (impl),
GTK_ORIENTATION_VERTICAL);
@@ -4320,6 +4327,43 @@ list_button_press_event_cb (GtkWidget *widget,
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 {
OperationMode operation_mode;
gint general_column;
@@ -4438,6 +4482,8 @@ create_file_list (GtkFileChooserDefault *impl)
G_CALLBACK (list_popup_menu_cb), impl);
g_signal_connect (impl->browse_files_tree_view, "button-press-event",
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_CALLBACK (file_list_drag_data_received_cb), impl);
@@ -6016,6 +6062,7 @@ settings_load (GtkFileChooserDefault *impl)
LocationMode location_mode;
gboolean show_hidden;
gboolean show_size_column;
int click_policy
gint sort_column;
GtkSortType sort_order;
gint sidebar_width;
@@ -6024,6 +6071,7 @@ settings_load (GtkFileChooserDefault *impl)
settings = _gtk_file_chooser_get_settings_for_widget (GTK_WIDGET (impl));
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_size_column = g_settings_get_boolean (settings, SETTINGS_KEY_SHOW_SIZE_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);
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;
gtk_tree_view_column_set_visible (impl->list_size_column, show_size_column);
@@ -6258,6 +6310,8 @@ set_busy_cursor (GtkFileChooserDefault *impl,
if (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 */

View File

@@ -35,6 +35,7 @@
G_BEGIN_DECLS
#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_SIZE_COLUMN "show-size-column"
#define SETTINGS_KEY_SORT_COLUMN "sort-column"
@@ -289,6 +290,7 @@ struct _GtkFileChooserDefault
guint use_preview_label : 1;
guint select_multiple : 1;
guint show_hidden : 1;
guint single_click_activate : 1;
guint do_overwrite_confirmation : 1;
guint list_sort_ascending : 1;
guint changing_folder : 1;
@@ -299,6 +301,7 @@ struct _GtkFileChooserDefault
guint has_recent: 1;
guint show_size_column : 1;
guint create_folders : 1;
guint has_busy_cursor : 1;
#if 0
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);
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

View File

@@ -509,6 +509,8 @@ struct _GtkTreeViewPrivate
guint draw_keyfocus : 1;
guint model_setup : 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;
}
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
gtk_tree_view_button_release (GtkWidget *widget,
GdkEventButton *event)
@@ -3418,7 +3458,7 @@ gtk_tree_view_button_release (GtkWidget *widget,
return gtk_tree_view_button_release_column_resize (widget, event);
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
&& 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));
}
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 */
static void

View File

@@ -33,10 +33,20 @@
<value nick='descending' value='1'/>
</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/'>
<key name='last-folder-uri' type='s'>
<default>""</default>
</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'>
<default>'path-bar'</default>
</key>