[gedit] Bug 697433 - Allow directly typing a path in file browser
- From: Garrett Regier <gregier src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gedit] Bug 697433 - Allow directly typing a path in file browser
- Date: Sun, 16 Jun 2013 12:44:14 +0000 (UTC)
commit 568bb9b4d7a4dfaf909358c659660c96da58859e
Author: Garrett Regier <garrettregier gmail com>
Date: Sun Jun 16 04:42:07 2013 -0700
Bug 697433 - Allow directly typing a path in file browser
The path can be either absolute, uri, or relative. The entry is initially
hidden and is only displayed when ~, /, \ or Ctrl+L are pressed and
will be hidden if Escape is pressed.
plugins/filebrowser/gedit-file-browser-widget.c | 154 ++++++++++++++++++++++
plugins/filebrowser/gedit-file-browser-widget.ui | 20 +++-
2 files changed, 171 insertions(+), 3 deletions(-)
---
diff --git a/plugins/filebrowser/gedit-file-browser-widget.c b/plugins/filebrowser/gedit-file-browser-widget.c
index 92a7314..7b87514 100644
--- a/plugins/filebrowser/gedit-file-browser-widget.c
+++ b/plugins/filebrowser/gedit-file-browser-widget.c
@@ -127,6 +127,8 @@ struct _GeditFileBrowserWidgetPrivate
GtkWidget *combo;
GtkTreeStore *combo_model;
+ GtkWidget *location_entry;
+
GtkWidget *filter_entry;
GSimpleActionGroup *action_group;
@@ -168,6 +170,16 @@ static gboolean on_file_store_no_trash (GeditFileBrowserStore *store,
GeditFileBrowserWidget *obj);
static void on_combo_changed (GtkComboBox *combo,
GeditFileBrowserWidget *obj);
+static void on_location_entry_activate (GtkEntry *entry,
+ GeditFileBrowserWidget *obj);
+static gboolean
+ on_location_entry_focus_out_event (GtkWidget *entry,
+ GdkEvent *event,
+ GeditFileBrowserWidget *obj);
+static gboolean
+ on_location_entry_key_press_event (GtkWidget *entry,
+ GdkEventKey *event,
+ GeditFileBrowserWidget *obj);
static gboolean on_treeview_popup_menu (GeditFileBrowserView *treeview,
GeditFileBrowserWidget *obj);
static gboolean on_treeview_button_press_event (GeditFileBrowserView *treeview,
@@ -534,6 +546,7 @@ gedit_file_browser_widget_class_init (GeditFileBrowserWidgetClass *klass)
"/org/gnome/gedit/plugins/file-browser/ui/gedit-file-browser-widget.ui");
gtk_widget_class_bind_child (widget_class, GeditFileBrowserWidgetPrivate, combo);
gtk_widget_class_bind_child (widget_class, GeditFileBrowserWidgetPrivate, combo_model);
+ gtk_widget_class_bind_child (widget_class, GeditFileBrowserWidgetPrivate, location_entry);
gtk_widget_class_bind_child (widget_class, GeditFileBrowserWidgetPrivate, treeview);
gtk_widget_class_bind_child (widget_class, GeditFileBrowserWidgetPrivate, filter_entry);
@@ -980,6 +993,13 @@ gedit_file_browser_widget_init (GeditFileBrowserWidget *obj)
g_signal_connect (obj->priv->combo, "changed",
G_CALLBACK (on_combo_changed), obj);
+ g_signal_connect (obj->priv->location_entry, "activate",
+ G_CALLBACK (on_location_entry_activate), obj);
+ g_signal_connect (obj->priv->location_entry, "focus-out-event",
+ G_CALLBACK (on_location_entry_focus_out_event), obj);
+ g_signal_connect (obj->priv->location_entry, "key-press-event",
+ G_CALLBACK (on_location_entry_key_press_event), obj);
+
/* tree view */
obj->priv->file_store = gedit_file_browser_store_new (NULL);
obj->priv->bookmarks_store = gedit_file_bookmarks_store_new ();
@@ -1297,6 +1317,24 @@ delete_selected_files (GeditFileBrowserWidget *obj,
return result == GEDIT_FILE_BROWSER_STORE_RESULT_OK;
}
+static void
+show_location_entry (GeditFileBrowserWidget *obj,
+ const gchar *location)
+{
+ g_warn_if_fail (location != NULL);
+
+ gtk_entry_set_text (GTK_ENTRY (obj->priv->location_entry), location);
+
+ gtk_widget_show (obj->priv->location_entry);
+ gtk_widget_grab_focus (obj->priv->location_entry);
+
+ /* grab_focus() causes the entry's text to become
+ * selected so, unselect it and move the cursor to the end.
+ */
+ gtk_editable_set_position (GTK_EDITABLE (obj->priv->location_entry),
+ -1);
+}
+
static gboolean
on_file_store_no_trash (GeditFileBrowserStore *store,
GList *files,
@@ -2429,6 +2467,100 @@ on_combo_changed (GtkComboBox *combo,
}
}
+static void
+on_location_entry_activate (GtkEntry *entry,
+ GeditFileBrowserWidget *obj)
+{
+ gchar *location;
+ GFile *root;
+ gchar *cwd;
+ GFile *new_root;
+
+ location = g_strdup (gtk_entry_get_text (entry));
+
+ if (g_str_has_prefix (location, "~/"))
+ {
+ gchar *tmp = location;
+
+ location = g_strdup_printf ("%s/%s",
+ g_get_home_dir (),
+ tmp + strlen ("~/"));
+
+ g_free (tmp);
+ }
+
+ root = gedit_file_browser_store_get_virtual_root (obj->priv->file_store);
+ cwd = g_file_get_path (root);
+
+ if (cwd == NULL)
+ {
+ cwd = g_file_get_uri (root);
+ }
+
+ new_root = g_file_new_for_commandline_arg_and_cwd (location, cwd);
+
+ if (g_file_query_file_type (new_root,
+ G_FILE_QUERY_INFO_NONE,
+ NULL) != G_FILE_TYPE_DIRECTORY)
+ {
+ gchar *display_name, *msg;
+
+ display_name = g_file_get_parse_name (new_root);
+ msg = g_strdup_printf (_("Error when loading '%s': "
+ "No such directory"),
+ display_name);
+
+ g_signal_emit (obj, signals[ERROR], 0,
+ GEDIT_FILE_BROWSER_ERROR_LOAD_DIRECTORY,
+ msg);
+
+ g_free (msg);
+ g_free (display_name);
+ }
+ else
+ {
+ gtk_widget_grab_focus (GTK_WIDGET (obj->priv->treeview));
+ gtk_widget_hide (obj->priv->location_entry);
+
+ gedit_file_browser_store_set_root (obj->priv->file_store,
+ new_root);
+ }
+
+ g_object_unref (new_root);
+ g_free (cwd);
+ g_object_unref (root);
+ g_free (location);
+}
+
+static gboolean
+on_location_entry_focus_out_event (GtkWidget *entry,
+ GdkEvent *event,
+ GeditFileBrowserWidget *obj)
+{
+ gtk_widget_hide (entry);
+ return FALSE;
+}
+
+static gboolean
+on_location_entry_key_press_event (GtkWidget *entry,
+ GdkEventKey *event,
+ GeditFileBrowserWidget *obj)
+{
+ guint modifiers;
+
+ modifiers = gtk_accelerator_get_default_mod_mask ();
+
+ if (event->keyval == GDK_KEY_Escape &&
+ (event->state & modifiers) == 0)
+ {
+ gtk_widget_grab_focus (GTK_WIDGET (obj->priv->treeview));
+ gtk_widget_hide (entry);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
static gboolean
on_treeview_popup_menu (GeditFileBrowserView *treeview,
GeditFileBrowserWidget *obj)
@@ -2542,6 +2674,28 @@ on_treeview_key_press_event (GeditFileBrowserView *treeview,
return TRUE;
}
+ if (event->keyval == GDK_KEY_l &&
+ (event->state & modifiers) == GDK_CONTROL_MASK)
+ {
+ show_location_entry (obj, "");
+ return TRUE;
+ }
+
+ if (event->keyval == GDK_KEY_slash ||
+ event->keyval == GDK_KEY_KP_Divide ||
+#ifdef G_OS_WIN32
+ event->keyval == GDK_KEY_backslash ||
+#endif
+ event->keyval == GDK_KEY_asciitilde)
+ {
+ gchar location[2] = {'\0', '\0'};
+
+ location[0] = gdk_keyval_to_unicode (event->keyval);
+
+ show_location_entry (obj, location);
+ return TRUE;
+ }
+
return FALSE;
}
diff --git a/plugins/filebrowser/gedit-file-browser-widget.ui
b/plugins/filebrowser/gedit-file-browser-widget.ui
index 94a27a1..b0acb0e 100644
--- a/plugins/filebrowser/gedit-file-browser-widget.ui
+++ b/plugins/filebrowser/gedit-file-browser-widget.ui
@@ -17,7 +17,7 @@
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
- <object class="GtkToolbar" id="toolbar1">
+ <object class="GtkToolbar" id="toolbar">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="toolbar_style">icons</property>
@@ -171,6 +171,20 @@
</packing>
</child>
<child>
+ <object class="GtkSearchEntry" id="location_entry">
+ <property name="visible">False</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">●</property>
+ <property name="primary_icon_name">folder-symbolic</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
<object class="GtkScrolledWindow" id="scrolledwindow1">
<property name="visible">True</property>
<property name="can_focus">True</property>
@@ -188,7 +202,7 @@
</object>
<packing>
<property name="left_attach">0</property>
- <property name="top_attach">2</property>
+ <property name="top_attach">3</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
@@ -202,7 +216,7 @@
</object>
<packing>
<property name="left_attach">0</property>
- <property name="top_attach">3</property>
+ <property name="top_attach">4</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]