_("Whether the application supplied widget for custom previews should be shown."),
TRUE,
G_PARAM_READWRITE));
+ g_object_interface_install_property (g_iface,
+ g_param_spec_object ("extra-widget",
+ _("Extra widget"),
+ _("Application supplied widget for extra options."),
+ GTK_TYPE_WIDGET,
+ G_PARAM_READWRITE));
g_object_interface_install_property (g_iface,
g_param_spec_boolean ("select-multiple",
_("Select Multiple"),
return result;
}
+/**
+ * gtk_file_chooser_set_extra_widget:
+ * @chooser: a #GtkFileChooser
+ * @extra_widget: widget for extra options
+ *
+ * Sets an application-supplied widget to provide extra options to the user.
+ **/
+void
+gtk_file_chooser_set_extra_widget (GtkFileChooser *chooser,
+ GtkWidget *extra_widget)
+{
+ g_return_if_fail (GTK_IS_FILE_CHOOSER (chooser));
+
+ g_object_set (chooser, "extra-widget", extra_widget, NULL);
+}
+
+/**
+ * gtk_file_chooser_get_extra_widget:
+ * @chooser: a #GtkFileChooser
+ *
+ * Gets the current preview widget; see
+ * gtk_file_chooser_set_extra_widget().
+ *
+ * Return value: the current extra widget, or %NULL
+ **/
+GtkWidget *
+gtk_file_chooser_get_extra_widget (GtkFileChooser *chooser)
+{
+ GtkWidget *extra_widget;
+
+ g_return_val_if_fail (GTK_IS_FILE_CHOOSER (chooser), NULL);
+
+ g_object_get (chooser, "extra-widget", &extra_widget, NULL);
+
+ /* Horrid hack; g_object_get() refs returned objects but
+ * that contradicts the memory management conventions
+ * for accessors.
+ */
+ if (extra_widget)
+ g_object_unref (extra_widget);
+
+ return extra_widget;
+}
+
/**
* gtk_file_chooser_add_filter:
* @chooser: a #GtkFileChooser
char *gtk_file_chooser_get_preview_filename (GtkFileChooser *file_chooser);
char *gtk_file_chooser_get_preview_uri (GtkFileChooser *file_chooser);
+/* Extra widget
+ */
+void gtk_file_chooser_set_extra_widget (GtkFileChooser *chooser,
+ GtkWidget *extra_widget);
+GtkWidget *gtk_file_chooser_get_extra_widget (GtkFileChooser *chooser);
+
/* List of user selectable filters
*/
void gtk_file_chooser_add_filter (GtkFileChooser *chooser,
GtkWidget *list;
GtkWidget *entry;
GtkWidget *preview_widget;
+ GtkWidget *extra_widget;
};
static void gtk_file_chooser_impl_default_class_init (GtkFileChooserImplDefaultClass *class);
return;
if (impl->preview_widget)
- {
- g_object_unref (impl->preview_widget);
- impl->preview_widget = NULL;
-
- gtk_container_remove (GTK_CONTAINER (impl->preview_frame),
- impl->preview_widget);
- }
+ gtk_container_remove (GTK_CONTAINER (impl->preview_frame),
+ impl->preview_widget);
impl->preview_widget = preview_widget;
if (impl->preview_widget)
{
- g_object_ref (impl->preview_widget);
- gtk_object_sink (GTK_OBJECT (impl->preview_widget));
-
gtk_widget_show (impl->preview_widget);
gtk_container_add (GTK_CONTAINER (impl->preview_frame),
impl->preview_widget);
return object;
}
+/* Sets the extra_widget by packing it in the appropriate place */
+static void
+set_extra_widget (GtkFileChooserImplDefault *impl,
+ GtkWidget *extra_widget)
+{
+ if (extra_widget == impl->extra_widget)
+ return;
+
+ if (impl->extra_widget)
+ gtk_container_remove (GTK_CONTAINER (impl), impl->extra_widget);
+
+ impl->extra_widget = extra_widget;
+ if (impl->extra_widget)
+ {
+ gtk_widget_show (impl->extra_widget);
+ gtk_box_pack_end (GTK_BOX (impl), impl->extra_widget, FALSE, FALSE, 0);
+ }
+}
+
static void
gtk_file_chooser_impl_default_set_property (GObject *object,
guint prop_id,
impl->preview_widget_active = g_value_get_boolean (value);
update_preview_widget_visibility (impl);
break;
+ case GTK_FILE_CHOOSER_PROP_EXTRA_WIDGET:
+ set_extra_widget (impl, g_value_get_object (value));
+ break;
case GTK_FILE_CHOOSER_PROP_SELECT_MULTIPLE:
{
gboolean select_multiple = g_value_get_boolean (value);
case GTK_FILE_CHOOSER_PROP_PREVIEW_WIDGET_ACTIVE:
g_value_set_boolean (value, impl->preview_widget_active);
break;
+ case GTK_FILE_CHOOSER_PROP_EXTRA_WIDGET:
+ g_value_set_object (value, impl->extra_widget);
+ break;
case GTK_FILE_CHOOSER_PROP_SELECT_MULTIPLE:
g_value_set_boolean (value, impl->select_multiple);
break;
g_param_spec_override ("preview-widget-active",
G_TYPE_BOOLEAN,
G_PARAM_READWRITE));
+ g_object_class_install_property (klass,
+ GTK_FILE_CHOOSER_PROP_EXTRA_WIDGET,
+ g_param_spec_override ("extra-widget",
+ GTK_TYPE_WIDGET,
+ G_PARAM_READWRITE));
g_object_class_install_property (klass,
GTK_FILE_CHOOSER_PROP_SELECT_MULTIPLE,
g_param_spec_override ("select-multiple",
GTK_FILE_CHOOSER_PROP_LOCAL_ONLY,
GTK_FILE_CHOOSER_PROP_PREVIEW_WIDGET,
GTK_FILE_CHOOSER_PROP_PREVIEW_WIDGET_ACTIVE,
+ GTK_FILE_CHOOSER_PROP_EXTRA_WIDGET,
GTK_FILE_CHOOSER_PROP_SELECT_MULTIPLE,
GTK_FILE_CHOOSER_PROP_SHOW_HIDDEN,
GTK_FILE_CHOOSER_PROP_LAST = GTK_FILE_CHOOSER_PROP_SHOW_HIDDEN,
GtkFileSystem *file_system;
GtkFileFilter *filter;
GtkWidget *preview_vbox;
+ GtkWidget *extra;
gtk_init (&argc, &argv);
update_preview_cb (GTK_FILE_CHOOSER (dialog));
g_signal_connect (dialog, "update-preview",
G_CALLBACK (update_preview_cb), NULL);
+
+ /* Extra widget */
+ extra = gtk_check_button_new_with_mnemonic ("_Frobnicate the file");
+ gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER (dialog), extra);
gtk_window_set_default_size (GTK_WINDOW (dialog), 600, 400);
/* show_all() to reveal bugs in composite widget handling */