summaryrefslogtreecommitdiff
path: root/gtk/gtkfilechooserdefault.c
diff options
context:
space:
mode:
Diffstat (limited to 'gtk/gtkfilechooserdefault.c')
-rw-r--r--gtk/gtkfilechooserdefault.c145
1 files changed, 140 insertions, 5 deletions
diff --git a/gtk/gtkfilechooserdefault.c b/gtk/gtkfilechooserdefault.c
index 5055850463..2d8eecafde 100644
--- a/gtk/gtkfilechooserdefault.c
+++ b/gtk/gtkfilechooserdefault.c
@@ -29,6 +29,7 @@
#include "gtkentry.h"
#include "gtkexpander.h"
#include "gtkfilechooserdefault.h"
+#include "gtkfilechooserembed.h"
#include "gtkfilechooserentry.h"
#include "gtkfilechooserutils.h"
#include "gtkfilechooser.h"
@@ -71,6 +72,8 @@ typedef struct _GtkFileChooserDefaultClass GtkFileChooserDefaultClass;
#define GTK_IS_FILE_CHOOSER_DEFAULT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_FILE_CHOOSER_DEFAULT))
#define GTK_FILE_CHOOSER_DEFAULT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_FILE_CHOOSER_DEFAULT, GtkFileChooserDefaultClass))
+#define PREVIEW_HBOX_SPACING 12
+
struct _GtkFileChooserDefaultClass
{
GtkVBoxClass parent_class;
@@ -204,9 +207,10 @@ typedef enum {
/* FIXME: maybe this should correspond to the font size in the tree views... */
#define ICON_SIZE 20
-static void gtk_file_chooser_default_class_init (GtkFileChooserDefaultClass *class);
-static void gtk_file_chooser_default_iface_init (GtkFileChooserIface *iface);
-static void gtk_file_chooser_default_init (GtkFileChooserDefault *impl);
+static void gtk_file_chooser_default_class_init (GtkFileChooserDefaultClass *class);
+static void gtk_file_chooser_default_iface_init (GtkFileChooserIface *iface);
+static void gtk_file_chooser_embed_default_iface_init (GtkFileChooserEmbedIface *iface);
+static void gtk_file_chooser_default_init (GtkFileChooserDefault *impl);
static GObject* gtk_file_chooser_default_constructor (GType type,
guint n_construct_properties,
@@ -221,7 +225,11 @@ static void gtk_file_chooser_default_get_property (GObject *ob
GValue *value,
GParamSpec *pspec);
static void gtk_file_chooser_default_dispose (GObject *object);
-static void gtk_file_chooser_default_show_all (GtkWidget *widget);
+static void gtk_file_chooser_default_show_all (GtkWidget *widget);
+static void gtk_file_chooser_default_style_set (GtkWidget *widget,
+ GtkStyle *previous_style);
+static void gtk_file_chooser_default_screen_changed (GtkWidget *widget,
+ GdkScreen *previous_screen);
static void gtk_file_chooser_default_set_current_folder (GtkFileChooser *chooser,
const GtkFilePath *path);
@@ -249,6 +257,12 @@ static gboolean gtk_file_chooser_default_remove_shortcut_folder (GtkFileCh
const GtkFilePath *path,
GError **error);
static GSList * gtk_file_chooser_default_list_shortcut_folders (GtkFileChooser *chooser);
+static void gtk_file_chooser_default_get_default_size (GtkFileChooserEmbed *chooser_embed,
+ gint *default_width,
+ gint *default_height);
+static void gtk_file_chooser_default_get_resizable_hints (GtkFileChooserEmbed *chooser_embed,
+ gboolean *resize_horizontally,
+ gboolean *resize_vertically);
static void location_popup_handler (GtkFileChooserDefault *impl);
static void up_folder_handler (GtkFileChooserDefault *impl);
@@ -347,11 +361,22 @@ _gtk_file_chooser_default_get_type (void)
NULL /* interface_data */
};
+ static const GInterfaceInfo file_chooser_embed_info =
+ {
+ (GInterfaceInitFunc) gtk_file_chooser_embed_default_iface_init, /* interface_init */
+ NULL, /* interface_finalize */
+ NULL /* interface_data */
+ };
+
file_chooser_default_type = g_type_register_static (GTK_TYPE_VBOX, "GtkFileChooserDefault",
&file_chooser_default_info, 0);
+
g_type_add_interface_static (file_chooser_default_type,
GTK_TYPE_FILE_CHOOSER,
&file_chooser_info);
+ g_type_add_interface_static (file_chooser_default_type,
+ GTK_TYPE_FILE_CHOOSER_EMBED,
+ &file_chooser_embed_info);
}
return file_chooser_default_type;
@@ -373,6 +398,8 @@ gtk_file_chooser_default_class_init (GtkFileChooserDefaultClass *class)
gobject_class->dispose = gtk_file_chooser_default_dispose;
widget_class->show_all = gtk_file_chooser_default_show_all;
+ widget_class->style_set = gtk_file_chooser_default_style_set;
+ widget_class->screen_changed = gtk_file_chooser_default_screen_changed;
signals[LOCATION_POPUP] =
_gtk_binding_signal_new ("location-popup",
@@ -449,6 +476,12 @@ gtk_file_chooser_default_iface_init (GtkFileChooserIface *iface)
}
static void
+gtk_file_chooser_embed_default_iface_init (GtkFileChooserEmbedIface *iface)
+{
+ iface->get_default_size = gtk_file_chooser_default_get_default_size;
+ iface->get_resizable_hints = gtk_file_chooser_default_get_resizable_hints;
+}
+static void
gtk_file_chooser_default_init (GtkFileChooserDefault *impl)
{
impl->local_only = TRUE;
@@ -593,6 +626,8 @@ update_preview_widget_visibility (GtkFileChooserDefault *impl)
gtk_widget_show (impl->preview_frame);
else
gtk_widget_hide (impl->preview_frame);
+
+ g_signal_emit_by_name (impl, "default-size-changed");
}
static void
@@ -1751,7 +1786,7 @@ file_pane_create (GtkFileChooserDefault *impl,
/* Box for lists and preview */
- hbox = gtk_hbox_new (FALSE, 12);
+ hbox = gtk_hbox_new (FALSE, PREVIEW_HBOX_SPACING);
gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
gtk_widget_show (hbox);
@@ -2129,6 +2164,7 @@ update_appearance (GtkFileChooserDefault *impl)
gtk_widget_hide (impl->save_extra_align);
gtk_widget_hide (impl->browse_extra_align);
}
+ g_signal_emit_by_name (impl, "default-size-changed");
}
static void
@@ -2274,6 +2310,26 @@ gtk_file_chooser_default_show_all (GtkWidget *widget)
}
static void
+gtk_file_chooser_default_style_set (GtkWidget *widget,
+ GtkStyle *previous_style)
+{
+ if (GTK_WIDGET_CLASS (parent_class)->style_set)
+ GTK_WIDGET_CLASS (parent_class)->style_set (widget, previous_style);
+
+ g_signal_emit_by_name (widget, "default-size-changed");
+}
+
+static void
+gtk_file_chooser_default_screen_changed (GtkWidget *widget,
+ GdkScreen *previous_screen)
+{
+ if (GTK_WIDGET_CLASS (parent_class)->screen_changed)
+ GTK_WIDGET_CLASS (parent_class)->screen_changed (widget, previous_screen);
+
+ g_signal_emit_by_name (widget, "default-size-changed");
+}
+
+static void
expand_and_select_func (GtkFileSystemModel *model,
GtkTreePath *path,
GtkTreeIter *iter,
@@ -3009,6 +3065,85 @@ gtk_file_chooser_default_list_shortcut_folders (GtkFileChooser *chooser)
return g_slist_reverse (list);
}
+#define NUM_LINES 40
+#define NUM_CHARS 50
+
+/* Guesses a size based upon font sizes */
+static void
+find_good_size_from_style (GtkWidget *widget,
+ gint *width,
+ gint *height)
+{
+ GtkFileChooserDefault *impl;
+ gint default_width, default_height;
+ int font_size;
+ GtkRequisition req;
+ GtkRequisition preview_req;
+
+ g_assert (widget->style != NULL);
+ impl = GTK_FILE_CHOOSER_DEFAULT (widget);
+
+ font_size = pango_font_description_get_size (widget->style->font_desc);
+ font_size = PANGO_PIXELS (font_size);
+
+ default_width = font_size * NUM_CHARS;
+ default_height = font_size * NUM_LINES;
+
+ /* Use at least the requisition size not including the preview widget */
+ gtk_widget_size_request (widget, &req);
+
+ if (impl->preview_widget_active && impl->preview_widget)
+ gtk_widget_size_request (impl->preview_frame, &preview_req);
+ else
+ preview_req.width = 0;
+
+ default_width = MAX (default_width, (req.width - (preview_req.width + PREVIEW_HBOX_SPACING)));
+ default_height = MAX (default_height, req.height);
+
+ *width = default_width;
+ *height = default_height;
+}
+
+static void
+gtk_file_chooser_default_get_default_size (GtkFileChooserEmbed *chooser_embed,
+ gint *default_width,
+ gint *default_height)
+{
+ GtkFileChooserDefault *impl;
+
+ impl = GTK_FILE_CHOOSER_DEFAULT (chooser_embed);
+
+ find_good_size_from_style (GTK_WIDGET (chooser_embed), default_width, default_height);
+
+ if (impl->preview_widget_active && impl->preview_widget)
+ *default_width += impl->preview_widget->requisition.width + PREVIEW_HBOX_SPACING;
+}
+
+static void
+gtk_file_chooser_default_get_resizable_hints (GtkFileChooserEmbed *chooser_embed,
+ gboolean *resize_horizontally,
+ gboolean *resize_vertically)
+{
+ GtkFileChooserDefault *impl;
+
+ impl = GTK_FILE_CHOOSER_DEFAULT (chooser_embed);
+
+ if (*resize_horizontally)
+ *resize_horizontally = TRUE;
+
+ if (resize_vertically)
+ {
+ *resize_vertically = TRUE;
+
+ if (impl->action == GTK_FILE_CHOOSER_ACTION_SAVE ||
+ impl->action == GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER)
+ {
+ if (! gtk_expander_get_expanded (GTK_EXPANDER (impl->save_expander)))
+ *resize_vertically = FALSE;
+ }
+ }
+}
+
static void
set_current_filter (GtkFileChooserDefault *impl,
GtkFileFilter *filter)