file chooser entry: Capture Escape and emit :hide-entry
Make the file chooser entry optionally capture Escape and emit a signal. Make the file chooser widget hide the entry on that signal and go back to the path bar. This gives us a two-level undo: location entry -> path bar -> dialog close. When the location entry is permanently displayed in the header for save mode, we still let the first Escape close the dialog.
This commit is contained in:
@ -31,6 +31,7 @@
|
||||
#include "gtksizerequest.h"
|
||||
#include "gtkwindow.h"
|
||||
#include "gtkintl.h"
|
||||
#include "gtkmarshalers.h"
|
||||
|
||||
typedef struct _GtkFileChooserEntryClass GtkFileChooserEntryClass;
|
||||
|
||||
@ -59,6 +60,7 @@ struct _GtkFileChooserEntry
|
||||
guint current_folder_loaded : 1;
|
||||
guint complete_on_load : 1;
|
||||
guint eat_tabs : 1;
|
||||
guint eat_escape : 1;
|
||||
guint local_only : 1;
|
||||
};
|
||||
|
||||
@ -69,6 +71,14 @@ enum
|
||||
N_COLUMNS
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
HIDE_ENTRY,
|
||||
LAST_SIGNAL
|
||||
};
|
||||
|
||||
static guint signals[LAST_SIGNAL] = { 0 };
|
||||
|
||||
static void gtk_file_chooser_entry_finalize (GObject *object);
|
||||
static void gtk_file_chooser_entry_dispose (GObject *object);
|
||||
static void gtk_file_chooser_entry_grab_focus (GtkWidget *widget);
|
||||
@ -157,6 +167,15 @@ _gtk_file_chooser_entry_class_init (GtkFileChooserEntryClass *class)
|
||||
|
||||
widget_class->grab_focus = gtk_file_chooser_entry_grab_focus;
|
||||
widget_class->focus_out_event = gtk_file_chooser_entry_focus_out_event;
|
||||
|
||||
signals[HIDE_ENTRY] =
|
||||
g_signal_new (I_("hide-entry"),
|
||||
G_OBJECT_CLASS_TYPE (gobject_class),
|
||||
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
|
||||
0,
|
||||
NULL, NULL,
|
||||
_gtk_marshal_VOID__VOID,
|
||||
G_TYPE_NONE, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -397,6 +416,13 @@ gtk_file_chooser_entry_tab_handler (GtkWidget *widget,
|
||||
chooser_entry = GTK_FILE_CHOOSER_ENTRY (widget);
|
||||
editable = GTK_EDITABLE (widget);
|
||||
|
||||
if (event->keyval == GDK_KEY_Escape &&
|
||||
chooser_entry->eat_escape)
|
||||
{
|
||||
g_signal_emit (widget, signals[HIDE_ENTRY], 0);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (!chooser_entry->eat_tabs)
|
||||
return FALSE;
|
||||
|
||||
@ -709,6 +735,7 @@ delete_text_callback (GtkFileChooserEntry *chooser_entry,
|
||||
/**
|
||||
* _gtk_file_chooser_entry_new:
|
||||
* @eat_tabs: If %FALSE, allow focus navigation with the tab key.
|
||||
* @eat_escape: If %TRUE, capture Escape key presses and emit ::hide-entry
|
||||
*
|
||||
* Creates a new #GtkFileChooserEntry object. #GtkFileChooserEntry
|
||||
* is an internal implementation widget for the GTK+ file chooser
|
||||
@ -718,12 +745,14 @@ delete_text_callback (GtkFileChooserEntry *chooser_entry,
|
||||
* Returns: the newly created #GtkFileChooserEntry
|
||||
**/
|
||||
GtkWidget *
|
||||
_gtk_file_chooser_entry_new (gboolean eat_tabs)
|
||||
_gtk_file_chooser_entry_new (gboolean eat_tabs,
|
||||
gboolean eat_escape)
|
||||
{
|
||||
GtkFileChooserEntry *chooser_entry;
|
||||
|
||||
chooser_entry = g_object_new (GTK_TYPE_FILE_CHOOSER_ENTRY, NULL);
|
||||
chooser_entry->eat_tabs = (eat_tabs != FALSE);
|
||||
chooser_entry->eat_escape = (eat_escape != FALSE);
|
||||
|
||||
return GTK_WIDGET (chooser_entry);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user