X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkfilechooserbutton.c;h=45116dfdf5653a36e38c3d60c950c10ae2ac0353;hb=5a59a1f5421a1d6f64a5be960c27ce076ac4eb35;hp=439e3ded688ca17745faf559cff8bde13ee3388b;hpb=77d4d3cdae0739c0a5643fb23891f8790f05c074;p=~andy%2Fgtk diff --git a/gtk/gtkfilechooserbutton.c b/gtk/gtkfilechooserbutton.c index 439e3ded6..45116dfdf 100644 --- a/gtk/gtkfilechooserbutton.c +++ b/gtk/gtkfilechooserbutton.c @@ -44,7 +44,7 @@ #include "gtkliststore.h" #include "gtkstock.h" #include "gtktreemodelfilter.h" -#include "gtkvseparator.h" +#include "gtkseparator.h" #include "gtkfilechooserdialog.h" #include "gtkfilechooserprivate.h" #include "gtkfilechooserutils.h" @@ -52,16 +52,57 @@ #include "gtkfilechooserbutton.h" +#include "gtkorientable.h" + +#include "gtktypebuiltins.h" #include "gtkprivate.h" -#include "gtkalias.h" + + +/** + * SECTION:gtkfilechooserbutton + * @Short_description: A button to launch a file selection dialog + * @Title: GtkFileChooserButton + * @See_also:#GtkFileChooserDialog + * + * The #GtkFileChooserButton is a widget that lets the user select a + * file. It implements the #GtkFileChooser interface. Visually, it is a + * file name with a button to bring up a #GtkFileChooserDialog. + * The user can then use that dialog to change the file associated with + * that button. This widget does not support setting the + * #GtkFileChooser:select-multiple property to %TRUE. + * + * + * Create a button to let the user select a file in /etc + * + * { + * GtkWidget *button; + * + * button = gtk_file_chooser_button_new (_("Select a file"), + * GTK_FILE_CHOOSER_ACTION_OPEN); + * gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (button), + * "/etc"); + * } + * + * + * + * The #GtkFileChooserButton supports the #GtkFileChooserActions + * %GTK_FILE_CHOOSER_ACTION_OPEN and %GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER. + * + * + * The #GtkFileChooserButton will ellipsize the label, + * and thus will thus request little horizontal space. To give the button + * more space, you should call gtk_widget_get_preferred_size(), + * gtk_file_chooser_button_set_width_chars(), or pack the button in + * such a way that other interface elements give space to the widget. + * + */ + /* **************** * * Private Macros * * **************** */ -#define GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GTK_TYPE_FILE_CHOOSER_BUTTON, GtkFileChooserButtonPrivate)) - -#define DEFAULT_TITLE N_("Select A File") +#define DEFAULT_TITLE N_("Select a File") #define DESKTOP_DISPLAY_NAME N_("Desktop") #define FALLBACK_DISPLAY_NAME N_("(None)") #define FALLBACK_ICON_NAME "stock_unknown" @@ -210,10 +251,8 @@ static void gtk_file_chooser_button_get_property (GObject *ob GParamSpec *pspec); static void gtk_file_chooser_button_finalize (GObject *object); -/* GtkObject Functions */ -static void gtk_file_chooser_button_destroy (GtkObject *object); - /* GtkWidget Functions */ +static void gtk_file_chooser_button_destroy (GtkWidget *widget); static void gtk_file_chooser_button_drag_data_received (GtkWidget *widget, GdkDragContext *context, gint x, @@ -222,14 +261,12 @@ static void gtk_file_chooser_button_drag_data_received (GtkWidget *wi guint type, guint drag_time); static void gtk_file_chooser_button_show_all (GtkWidget *widget); -static void gtk_file_chooser_button_hide_all (GtkWidget *widget); static void gtk_file_chooser_button_show (GtkWidget *widget); static void gtk_file_chooser_button_hide (GtkWidget *widget); static void gtk_file_chooser_button_map (GtkWidget *widget); static gboolean gtk_file_chooser_button_mnemonic_activate (GtkWidget *widget, gboolean group_cycling); -static void gtk_file_chooser_button_style_set (GtkWidget *widget, - GtkStyle *old_style); +static void gtk_file_chooser_button_style_updated (GtkWidget *widget); static void gtk_file_chooser_button_screen_changed (GtkWidget *widget, GdkScreen *old_screen); @@ -307,7 +344,7 @@ static guint file_chooser_button_signals[LAST_SIGNAL] = { 0 }; * GType Declaration * * ******************* */ -G_DEFINE_TYPE_WITH_CODE (GtkFileChooserButton, gtk_file_chooser_button, GTK_TYPE_HBOX, { \ +G_DEFINE_TYPE_WITH_CODE (GtkFileChooserButton, gtk_file_chooser_button, GTK_TYPE_BOX, { \ G_IMPLEMENT_INTERFACE (GTK_TYPE_FILE_CHOOSER, gtk_file_chooser_button_file_chooser_iface_init) \ }) @@ -320,11 +357,9 @@ static void gtk_file_chooser_button_class_init (GtkFileChooserButtonClass * class) { GObjectClass *gobject_class; - GtkObjectClass *gtkobject_class; GtkWidgetClass *widget_class; gobject_class = G_OBJECT_CLASS (class); - gtkobject_class = GTK_OBJECT_CLASS (class); widget_class = GTK_WIDGET_CLASS (class); gobject_class->constructor = gtk_file_chooser_button_constructor; @@ -332,15 +367,13 @@ gtk_file_chooser_button_class_init (GtkFileChooserButtonClass * class) gobject_class->get_property = gtk_file_chooser_button_get_property; gobject_class->finalize = gtk_file_chooser_button_finalize; - gtkobject_class->destroy = gtk_file_chooser_button_destroy; - + widget_class->destroy = gtk_file_chooser_button_destroy; widget_class->drag_data_received = gtk_file_chooser_button_drag_data_received; widget_class->show_all = gtk_file_chooser_button_show_all; - widget_class->hide_all = gtk_file_chooser_button_hide_all; widget_class->show = gtk_file_chooser_button_show; widget_class->hide = gtk_file_chooser_button_hide; widget_class->map = gtk_file_chooser_button_map; - widget_class->style_set = gtk_file_chooser_button_style_set; + widget_class->style_updated = gtk_file_chooser_button_style_updated; widget_class->screen_changed = gtk_file_chooser_button_screen_changed; widget_class->mnemonic_activate = gtk_file_chooser_button_mnemonic_activate; @@ -435,7 +468,9 @@ gtk_file_chooser_button_init (GtkFileChooserButton *button) GtkWidget *box, *image, *sep; GtkTargetList *target_list; - priv = button->priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (button); + priv = button->priv = G_TYPE_INSTANCE_GET_PRIVATE (button, + GTK_TYPE_FILE_CHOOSER_BUTTON, + GtkFileChooserButtonPrivate); priv->icon_size = FALLBACK_ICON_SIZE; priv->focus_on_click = TRUE; @@ -444,12 +479,13 @@ gtk_file_chooser_button_init (GtkFileChooserButton *button) /* Button */ priv->button = gtk_button_new (); - g_signal_connect (priv->button, "clicked", G_CALLBACK (button_clicked_cb), - button); - gtk_container_add (GTK_CONTAINER (button), priv->button); + g_signal_connect (priv->button, "clicked", + G_CALLBACK (button_clicked_cb), button); + gtk_box_pack_start (GTK_BOX (button), priv->button, TRUE, TRUE, 0); + gtk_widget_set_halign (priv->button, GTK_ALIGN_FILL); gtk_widget_show (priv->button); - box = gtk_hbox_new (FALSE, 4); + box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4); gtk_container_add (GTK_CONTAINER (priv->button), box); gtk_widget_show (box); @@ -459,16 +495,17 @@ gtk_file_chooser_button_init (GtkFileChooserButton *button) priv->label = gtk_label_new (_(FALLBACK_DISPLAY_NAME)); gtk_label_set_ellipsize (GTK_LABEL (priv->label), PANGO_ELLIPSIZE_END); - gtk_misc_set_alignment (GTK_MISC (priv->label), 0.0, 0.5); - gtk_container_add (GTK_CONTAINER (box), priv->label); + gtk_widget_set_halign (priv->label, GTK_ALIGN_START); + gtk_widget_set_valign (priv->label, GTK_ALIGN_CENTER); + gtk_box_pack_start (GTK_BOX (box), priv->label, TRUE, TRUE, 0); + //gtk_container_add (GTK_CONTAINER (box), priv->label); gtk_widget_show (priv->label); - sep = gtk_vseparator_new (); + sep = gtk_separator_new (GTK_ORIENTATION_VERTICAL); gtk_box_pack_start (GTK_BOX (box), sep, FALSE, FALSE, 0); gtk_widget_show (sep); - image = gtk_image_new_from_stock (GTK_STOCK_OPEN, - GTK_ICON_SIZE_MENU); + image = gtk_image_new_from_stock (GTK_STOCK_OPEN, GTK_ICON_SIZE_MENU); gtk_box_pack_start (GTK_BOX (box), image, FALSE, FALSE, 0); gtk_widget_show (image); @@ -487,7 +524,8 @@ gtk_file_chooser_button_init (GtkFileChooserButton *button) priv->combo_box_changed_id = g_signal_connect (priv->combo_box, "changed", G_CALLBACK (combo_box_changed_cb), button); - gtk_container_add (GTK_CONTAINER (button), priv->combo_box); + gtk_box_pack_start (GTK_BOX (button), priv->combo_box, TRUE, TRUE, 0); + gtk_widget_set_halign (priv->combo_box, GTK_ALIGN_FILL); priv->icon_cell = gtk_cell_renderer_pixbuf_new (); gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (priv->combo_box), @@ -662,7 +700,7 @@ gtk_file_chooser_button_constructor (GType type, gtk_file_chooser_button_set_title (button, _(DEFAULT_TITLE)); } - else if (!GTK_WINDOW (priv->dialog)->title) + else if (!gtk_window_get_title (GTK_WINDOW (priv->dialog))) { gtk_file_chooser_button_set_title (button, _(DEFAULT_TITLE)); } @@ -884,13 +922,13 @@ gtk_file_chooser_button_finalize (GObject *object) } /* ********************* * - * GtkObject Functions * + * GtkWidget Functions * * ********************* */ static void -gtk_file_chooser_button_destroy (GtkObject *object) +gtk_file_chooser_button_destroy (GtkWidget *widget) { - GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (object); + GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (widget); GtkFileChooserButtonPrivate *priv = button->priv; GtkTreeIter iter; GSList *l; @@ -950,14 +988,9 @@ gtk_file_chooser_button_destroy (GtkObject *object) priv->fs = NULL; } - GTK_OBJECT_CLASS (gtk_file_chooser_button_parent_class)->destroy (object); + GTK_WIDGET_CLASS (gtk_file_chooser_button_parent_class)->destroy (widget); } - -/* ********************* * - * GtkWidget Functions * - * ********************* */ - struct DndSelectFolderData { GtkFileSystem *file_system; @@ -1053,7 +1086,7 @@ gtk_file_chooser_button_drag_data_received (GtkWidget *widget, data, type, drag_time); - if (widget == NULL || context == NULL || data == NULL || data->length < 0) + if (widget == NULL || context == NULL || data == NULL || gtk_selection_data_get_length (data) < 0) return; switch (type) @@ -1111,12 +1144,6 @@ gtk_file_chooser_button_show_all (GtkWidget *widget) gtk_widget_show (widget); } -static void -gtk_file_chooser_button_hide_all (GtkWidget *widget) -{ - gtk_widget_hide (widget); -} - static void gtk_file_chooser_button_show (GtkWidget *widget) { @@ -1365,11 +1392,9 @@ change_icon_theme (GtkFileChooserButton *button) } static void -gtk_file_chooser_button_style_set (GtkWidget *widget, - GtkStyle *old_style) +gtk_file_chooser_button_style_updated (GtkWidget *widget) { - GTK_WIDGET_CLASS (gtk_file_chooser_button_parent_class)->style_set (widget, - old_style); + GTK_WIDGET_CLASS (gtk_file_chooser_button_parent_class)->style_updated (widget); if (gtk_widget_has_screen (widget)) change_icon_theme (GTK_FILE_CHOOSER_BUTTON (widget)); @@ -1419,7 +1444,7 @@ set_info_get_info_cb (GCancellable *cancellable, GdkPixbuf *pixbuf; GtkTreePath *path; GtkTreeIter iter; - GCancellable *model_cancellable; + GCancellable *model_cancellable = NULL; struct SetDisplayNameData *data = callback_data; gboolean is_folder; @@ -1472,7 +1497,8 @@ out: gtk_tree_row_reference_free (data->row_ref); g_free (data); - g_object_unref (cancellable); + if (model_cancellable) + g_object_unref (model_cancellable); } static void @@ -1570,7 +1596,10 @@ model_free_row_data (GtkFileChooserButton *button, -1); if (cancellable) - g_cancellable_cancel (cancellable); + { + g_cancellable_cancel (cancellable); + g_object_unref (cancellable); + } switch (type) { @@ -1598,7 +1627,7 @@ model_add_special_get_info_cb (GCancellable *cancellable, GtkTreeIter iter; GtkTreePath *path; GdkPixbuf *pixbuf; - GCancellable *model_cancellable; + GCancellable *model_cancellable = NULL; struct ChangeIconThemeData *data = user_data; gchar *name; @@ -1651,7 +1680,8 @@ out: gtk_tree_row_reference_free (data->row_ref); g_free (data); - g_object_unref (cancellable); + if (model_cancellable) + g_object_unref (model_cancellable); } static inline void @@ -1704,7 +1734,10 @@ model_add_special (GtkFileChooserButton *button) desktopdir = g_get_user_special_dir (G_USER_DIRECTORY_DESKTOP); - if (desktopdir) + /* "To disable a directory, point it to the homedir." + * See http://freedesktop.org/wiki/Software/xdg-user-dirs + **/ + if (g_strcmp0 (desktopdir, g_get_home_dir ()) != 0) { GtkTreePath *tree_path; GCancellable *cancellable; @@ -1740,21 +1773,19 @@ model_add_special (GtkFileChooserButton *button) static void model_add_volumes (GtkFileChooserButton *button, - GSList *volumes) + GSList *volumes) { GtkListStore *store; gint pos; gboolean local_only; - GtkFileSystem *file_system; GSList *l; - + if (!volumes) return; store = GTK_LIST_STORE (button->priv->model); pos = model_get_type_position (button, ROW_TYPE_VOLUME); local_only = gtk_file_chooser_get_local_only (GTK_FILE_CHOOSER (button->priv->dialog)); - file_system = button->priv->fs; for (l = volumes; l; l = l->next) { @@ -1766,13 +1797,13 @@ model_add_volumes (GtkFileChooserButton *button, volume = l->data; if (local_only) - { - if (_gtk_file_system_volume_is_mounted (volume)) - { - GFile *base_file; + { + if (_gtk_file_system_volume_is_mounted (volume)) + { + GFile *base_file; - base_file = _gtk_file_system_volume_get_root (volume); - if (base_file != NULL) + base_file = _gtk_file_system_volume_get_root (volume); + if (base_file != NULL) { if (!g_file_is_native (base_file)) { @@ -1782,26 +1813,26 @@ model_add_volumes (GtkFileChooserButton *button, else g_object_unref (base_file); } - } - } + } + } pixbuf = _gtk_file_system_volume_render_icon (volume, - GTK_WIDGET (button), - button->priv->icon_size, - NULL); + GTK_WIDGET (button), + button->priv->icon_size, + NULL); display_name = _gtk_file_system_volume_get_display_name (volume); gtk_list_store_insert (store, &iter, pos); gtk_list_store_set (store, &iter, - ICON_COLUMN, pixbuf, - DISPLAY_NAME_COLUMN, display_name, - TYPE_COLUMN, ROW_TYPE_VOLUME, - DATA_COLUMN, _gtk_file_system_volume_ref (volume), - IS_FOLDER_COLUMN, TRUE, - -1); + ICON_COLUMN, pixbuf, + DISPLAY_NAME_COLUMN, display_name, + TYPE_COLUMN, ROW_TYPE_VOLUME, + DATA_COLUMN, _gtk_file_system_volume_ref (volume), + IS_FOLDER_COLUMN, TRUE, + -1); if (pixbuf) - g_object_unref (pixbuf); + g_object_unref (pixbuf); g_free (display_name); button->priv->n_volumes++; @@ -2295,13 +2326,11 @@ static void update_label_and_image (GtkFileChooserButton *button) { GtkFileChooserButtonPrivate *priv = button->priv; - GdkPixbuf *pixbuf; gchar *label_text; GSList *files; files = gtk_file_chooser_get_files (GTK_FILE_CHOOSER (priv->dialog)); label_text = NULL; - pixbuf = NULL; if (priv->update_button_cancellable) { @@ -2318,51 +2347,53 @@ update_label_and_image (GtkFileChooserButton *button) volume = _gtk_file_system_get_volume_for_file (priv->fs, file); if (volume) - { - GFile *base_file; - - base_file = _gtk_file_system_volume_get_root (volume); - if (base_file && g_file_equal (base_file, file)) - { - label_text = _gtk_file_system_volume_get_display_name (volume); - pixbuf = _gtk_file_system_volume_render_icon (volume, - GTK_WIDGET (button), - priv->icon_size, - NULL); - } - - if (base_file) - g_object_unref (base_file); - - _gtk_file_system_volume_unref (volume); - - if (label_text) - goto out; - } + { + GFile *base_file; + + base_file = _gtk_file_system_volume_get_root (volume); + if (base_file && g_file_equal (base_file, file)) + { + GdkPixbuf *pixbuf; + + label_text = _gtk_file_system_volume_get_display_name (volume); + pixbuf = _gtk_file_system_volume_render_icon (volume, + GTK_WIDGET (button), + priv->icon_size, + NULL); + gtk_image_set_from_pixbuf (GTK_IMAGE (priv->image), pixbuf); + if (pixbuf) + g_object_unref (pixbuf); + } + + if (base_file) + g_object_unref (base_file); + + _gtk_file_system_volume_unref (volume); + + if (label_text) + goto out; + } if (g_file_is_native (file)) - { - priv->update_button_cancellable = - _gtk_file_system_get_info (priv->fs, file, - "standard::icon,standard::display-name", - update_label_get_info_cb, - g_object_ref (button)); - } + { + priv->update_button_cancellable = + _gtk_file_system_get_info (priv->fs, file, + "standard::icon,standard::display-name", + update_label_get_info_cb, + g_object_ref (button)); + } else - { - GdkPixbuf *pixbuf; - - label_text = _gtk_file_system_get_bookmark_label (button->priv->fs, file); - - pixbuf = gtk_icon_theme_load_icon (get_icon_theme (GTK_WIDGET (priv->image)), - "text-x-generic", - priv->icon_size, 0, NULL); - - gtk_image_set_from_pixbuf (GTK_IMAGE (priv->image), pixbuf); - - if (pixbuf) - g_object_unref (pixbuf); - } + { + GdkPixbuf *pixbuf; + + label_text = _gtk_file_system_get_bookmark_label (button->priv->fs, file); + pixbuf = gtk_icon_theme_load_icon (get_icon_theme (GTK_WIDGET (priv->image)), + "text-x-generic", + priv->icon_size, 0, NULL); + gtk_image_set_from_pixbuf (GTK_IMAGE (priv->image), pixbuf); + if (pixbuf) + g_object_unref (pixbuf); + } } out: g_slist_foreach (files, (GFunc) g_object_unref, NULL); @@ -2792,7 +2823,7 @@ gtk_file_chooser_button_set_title (GtkFileChooserButton *button, * * Since: 2.6 **/ -G_CONST_RETURN gchar * +const gchar * gtk_file_chooser_button_get_title (GtkFileChooserButton *button) { g_return_val_if_fail (GTK_IS_FILE_CHOOSER_BUTTON (button), NULL); @@ -2890,6 +2921,3 @@ gtk_file_chooser_button_get_focus_on_click (GtkFileChooserButton *button) return button->priv->focus_on_click; } - -#define __GTK_FILE_CHOOSER_BUTTON_C__ -#include "gtkaliasdef.c"