diff options
author | Matthias Clasen <mclasen@redhat.com> | 2016-07-05 22:11:44 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2016-07-08 00:08:28 -0400 |
commit | 5839c138434cd2ba3b0bec400e17b6334a020800 (patch) | |
tree | e3f6298e3cf377a91d6b5b7f1c9e3586525a83c0 | |
parent | 6fc7485077505c946ec8f0878e22e418a46a7679 (diff) | |
download | gtk+-5839c138434cd2ba3b0bec400e17b6334a020800.tar.gz |
Implement combobox apis in GtkFileChooserWidget
https://bugzilla.gnome.org/show_bug.cgi?id=768499
-rw-r--r-- | gtk/gtkfilechooserutils.c | 49 | ||||
-rw-r--r-- | gtk/gtkfilechooserwidget.c | 146 |
2 files changed, 195 insertions, 0 deletions
diff --git a/gtk/gtkfilechooserutils.c b/gtk/gtkfilechooserutils.c index 53246caaba..7965ab0f20 100644 --- a/gtk/gtkfilechooserutils.c +++ b/gtk/gtkfilechooserutils.c @@ -68,6 +68,19 @@ static void delegate_file_activated (GtkFileChooser *choose static GtkFileChooserConfirmation delegate_confirm_overwrite (GtkFileChooser *chooser, gpointer data); +static void delegate_add_choice (GtkFileChooser *chooser, + const char *id, + const char *label, + const char **options, + const char **option_labels); +static void delegate_remove_choice (GtkFileChooser *chooser, + const char *id); +static void delegate_set_choice (GtkFileChooser *chooser, + const char *id, + const char *option); +static const char * delegate_get_choice (GtkFileChooser *chooser, + const char *id); + /** * _gtk_file_chooser_install_properties: @@ -149,6 +162,10 @@ _gtk_file_chooser_delegate_iface_init (GtkFileChooserIface *iface) iface->add_shortcut_folder = delegate_add_shortcut_folder; iface->remove_shortcut_folder = delegate_remove_shortcut_folder; iface->list_shortcut_folders = delegate_list_shortcut_folders; + iface->add_choice = delegate_add_choice; + iface->remove_choice = delegate_remove_choice; + iface->set_choice = delegate_set_choice; + iface->get_choice = delegate_get_choice; } /** @@ -499,3 +516,35 @@ _gtk_file_chooser_label_for_file (GFile *file) return label; } +static void +delegate_add_choice (GtkFileChooser *chooser, + const char *id, + const char *label, + const char **options, + const char **option_labels) +{ + gtk_file_chooser_add_choice (get_delegate (chooser), + id, label, options, option_labels); +} +static void +delegate_remove_choice (GtkFileChooser *chooser, + const char *id) +{ + gtk_file_chooser_remove_choice (get_delegate (chooser), id); +} + +static void +delegate_set_choice (GtkFileChooser *chooser, + const char *id, + const char *option) +{ + gtk_file_chooser_set_choice (get_delegate (chooser), id, option); +} + + +static const char * +delegate_get_choice (GtkFileChooser *chooser, + const char *id) +{ + return gtk_file_chooser_get_choice (get_delegate (chooser), id); +} diff --git a/gtk/gtkfilechooserwidget.c b/gtk/gtkfilechooserwidget.c index 79a099eb35..943a98ea42 100644 --- a/gtk/gtkfilechooserwidget.c +++ b/gtk/gtkfilechooserwidget.c @@ -66,6 +66,7 @@ #include "gtktreeprivate.h" #include "gtktreeselection.h" #include "gtkbox.h" +#include "gtkcheckbutton.h" #include "gtkwindowgroup.h" #include "gtkintl.h" #include "gtkshow.h" @@ -289,6 +290,9 @@ struct _GtkFileChooserWidgetPrivate { GtkWidget *external_entry; + GtkWidget *choice_box; + GHashTable *choices; + /* Handles */ GCancellable *file_list_drag_data_received_cancellable; GCancellable *update_current_folder_cancellable; @@ -507,6 +511,20 @@ static void gtk_file_chooser_widget_get_default_size (GtkFileCho static gboolean gtk_file_chooser_widget_should_respond (GtkFileChooserEmbed *chooser_embed); static void gtk_file_chooser_widget_initial_focus (GtkFileChooserEmbed *chooser_embed); +static void gtk_file_chooser_widget_add_choice (GtkFileChooser *chooser, + const char *id, + const char *label, + const char **options, + const char **option_labels); +static void gtk_file_chooser_widget_remove_choice (GtkFileChooser *chooser, + const char *id); +static void gtk_file_chooser_widget_set_choice (GtkFileChooser *chooser, + const char *id, + const char *option); +static const char *gtk_file_chooser_widget_get_choice (GtkFileChooser *chooser, + const char *id); + + static void add_selection_to_recent_list (GtkFileChooserWidget *impl); static void location_popup_handler (GtkFileChooserWidget *impl, @@ -625,6 +643,10 @@ gtk_file_chooser_widget_iface_init (GtkFileChooserIface *iface) iface->add_shortcut_folder = gtk_file_chooser_widget_add_shortcut_folder; iface->remove_shortcut_folder = gtk_file_chooser_widget_remove_shortcut_folder; iface->list_shortcut_folders = gtk_file_chooser_widget_list_shortcut_folders; + iface->add_choice = gtk_file_chooser_widget_add_choice; + iface->remove_choice = gtk_file_chooser_widget_remove_choice; + iface->set_choice = gtk_file_chooser_widget_set_choice; + iface->get_choice = gtk_file_chooser_widget_get_choice; } static void @@ -660,6 +682,9 @@ gtk_file_chooser_widget_finalize (GObject *object) GtkFileChooserWidget *impl = GTK_FILE_CHOOSER_WIDGET (object); GtkFileChooserWidgetPrivate *priv = impl->priv; + if (priv->choices) + g_hash_table_unref (priv->choices); + if (priv->location_changed_id > 0) g_source_remove (priv->location_changed_id); @@ -8676,3 +8701,124 @@ gtk_file_chooser_widget_new (GtkFileChooserAction action) "action", action, NULL); } + +static void +gtk_file_chooser_widget_add_choice (GtkFileChooser *chooser, + const char *id, + const char *label, + const char **options, + const char **option_labels) +{ + GtkFileChooserWidget *impl = GTK_FILE_CHOOSER_WIDGET (chooser); + GtkFileChooserWidgetPrivate *priv = impl->priv; + GtkWidget *widget; + + if (priv->choices == NULL) + { + priv->choices = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + priv->choice_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12); + set_extra_widget (impl, priv->choice_box); + } + else if (g_hash_table_lookup (priv->choices, id)) + { + g_warning ("Duplicate choice %s", id); + return; + } + + if (options) + { + GtkWidget *box; + GtkWidget *combo; + int i; + + box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); + gtk_container_add (GTK_CONTAINER (box), gtk_label_new (label)); + + combo = gtk_combo_box_text_new (); + g_hash_table_insert (priv->choices, g_strdup (id), combo); + gtk_container_add (GTK_CONTAINER (box), combo); + + for (i = 0; options[i]; i++) + gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), + options[i], option_labels[i]); + + widget = box; + } + else + { + GtkWidget *check; + + check = gtk_check_button_new_with_label (label); + g_hash_table_insert (priv->choices, g_strdup (id), check); + + widget = check; + } + + gtk_widget_show_all (widget); + gtk_container_add (GTK_CONTAINER (priv->choice_box), widget); +} + +static void +gtk_file_chooser_widget_remove_choice (GtkFileChooser *chooser, + const char *id) +{ + GtkFileChooserWidget *impl = GTK_FILE_CHOOSER_WIDGET (chooser); + GtkFileChooserWidgetPrivate *priv = impl->priv; + GtkWidget *widget; + + if (priv->choices == NULL) + return; + + widget = (GtkWidget *)g_hash_table_lookup (priv->choices, id); + g_hash_table_remove (priv->choices, id); + gtk_container_remove (GTK_CONTAINER (priv->choice_box), widget); + + if (g_hash_table_size (priv->choices) == 0) + { + set_extra_widget (impl, NULL); + g_hash_table_unref (priv->choices); + priv->choices = NULL; + priv->choice_box = NULL; + } +} + +static void +gtk_file_chooser_widget_set_choice (GtkFileChooser *chooser, + const char *id, + const char *option) +{ + GtkFileChooserWidget *impl = GTK_FILE_CHOOSER_WIDGET (chooser); + GtkFileChooserWidgetPrivate *priv = impl->priv; + GtkWidget *widget; + + if (priv->choices == NULL) + return; + + widget = (GtkWidget *)g_hash_table_lookup (priv->choices, id); + + if (GTK_IS_COMBO_BOX (widget)) + gtk_combo_box_set_active_id (GTK_COMBO_BOX (widget), option); + else if (GTK_IS_TOGGLE_BUTTON (widget)) + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), g_str_equal (option, "true")); +} + +static const char * +gtk_file_chooser_widget_get_choice (GtkFileChooser *chooser, + const char *id) +{ + GtkFileChooserWidget *impl = GTK_FILE_CHOOSER_WIDGET (chooser); + GtkFileChooserWidgetPrivate *priv = impl->priv; + GtkWidget *widget; + + if (priv->choices == NULL) + return NULL; + + widget = (GtkWidget *)g_hash_table_lookup (priv->choices, id); + if (GTK_IS_COMBO_BOX (widget)) + return gtk_combo_box_get_active_id (GTK_COMBO_BOX (widget)); + else if (GTK_IS_TOGGLE_BUTTON (widget)) + return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)) ? "true" : "false"; + + return NULL; +} + |