diff options
author | Federico Mena Quintero <federico@gnome.org> | 2013-04-15 18:30:10 -0500 |
---|---|---|
committer | Federico Mena Quintero <federico@gnome.org> | 2013-04-15 18:30:10 -0500 |
commit | 0ba4952eb1aa57acd76e2627985ce28f0d431614 (patch) | |
tree | 85a1029bfa00415acd43b2bf3f26e8338a40e201 | |
parent | 74f5c44efc2e855d4b1c7898a4549f001a651309 (diff) | |
download | gtk+-merge-places-sidebar.tar.gz |
Fix compilationmerge-places-sidebar
Signed-off-by: Federico Mena Quintero <federico@gnome.org>
-rw-r--r-- | gtk/gtkfilechooserdefault.c | 765 | ||||
-rw-r--r-- | gtk/gtkfilechooserdefault.ui | 7 |
2 files changed, 380 insertions, 392 deletions
diff --git a/gtk/gtkfilechooserdefault.c b/gtk/gtkfilechooserdefault.c index 55a928d1fc..c6bea3946f 100644 --- a/gtk/gtkfilechooserdefault.c +++ b/gtk/gtkfilechooserdefault.c @@ -275,6 +275,7 @@ typedef struct { GtkTreeViewColumn *list_name_column; GtkCellRenderer *list_name_renderer; + GtkCellRenderer *list_pixbuf_renderer; GtkTreeViewColumn *list_mtime_column; GtkTreeViewColumn *list_size_column; @@ -541,7 +542,6 @@ static GSList * recent_get_selected_files (GtkFileChooserDefault *impl); static void set_file_system_backend (GtkFileChooserDefault *impl); static void unset_file_system_backend (GtkFileChooserDefault *impl); - G_DEFINE_TYPE_WITH_CODE (GtkFileChooserDefault, _gtk_file_chooser_default, GTK_TYPE_BOX, @@ -550,282 +550,6 @@ G_DEFINE_TYPE_WITH_CODE (GtkFileChooserDefault, _gtk_file_chooser_default, GTK_T G_IMPLEMENT_INTERFACE (GTK_TYPE_FILE_CHOOSER_EMBED, gtk_file_chooser_embed_default_iface_init)); - -static void -add_normal_and_shifted_binding (GtkBindingSet *binding_set, - guint keyval, - GdkModifierType modifiers, - const gchar *signal_name) -{ - gtk_binding_entry_add_signal (binding_set, - keyval, modifiers, - signal_name, 0); - - gtk_binding_entry_add_signal (binding_set, - keyval, modifiers | GDK_SHIFT_MASK, - signal_name, 0); -} - -/******************************************************************** - * Class/Instance Initializer * - ********************************************************************/ - -static void -_gtk_file_chooser_default_class_init (GtkFileChooserDefaultClass *class) -{ - static const guint quick_bookmark_keyvals[10] = { - GDK_KEY_1, GDK_KEY_2, GDK_KEY_3, GDK_KEY_4, GDK_KEY_5, GDK_KEY_6, GDK_KEY_7, GDK_KEY_8, GDK_KEY_9, GDK_KEY_0 - }; - GObjectClass *gobject_class = G_OBJECT_CLASS (class); - GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class); - GtkBindingSet *binding_set; - int i; - - gobject_class->finalize = gtk_file_chooser_default_finalize; - gobject_class->constructor = gtk_file_chooser_default_constructor; - gobject_class->set_property = gtk_file_chooser_default_set_property; - gobject_class->get_property = gtk_file_chooser_default_get_property; - gobject_class->dispose = gtk_file_chooser_default_dispose; - - widget_class->show_all = gtk_file_chooser_default_show_all; - widget_class->realize = gtk_file_chooser_default_realize; - widget_class->map = gtk_file_chooser_default_map; - widget_class->unmap = gtk_file_chooser_default_unmap; - widget_class->hierarchy_changed = gtk_file_chooser_default_hierarchy_changed; - widget_class->style_updated = gtk_file_chooser_default_style_updated; - widget_class->screen_changed = gtk_file_chooser_default_screen_changed; - - signals[LOCATION_POPUP] = - g_signal_new_class_handler (I_("location-popup"), - G_OBJECT_CLASS_TYPE (class), - G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, - G_CALLBACK (location_popup_handler), - NULL, NULL, - _gtk_marshal_VOID__STRING, - G_TYPE_NONE, 1, G_TYPE_STRING); - - signals[LOCATION_POPUP_ON_PASTE] = - g_signal_new_class_handler (I_("location-popup-on-paste"), - G_OBJECT_CLASS_TYPE (class), - G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, - G_CALLBACK (location_popup_on_paste_handler), - NULL, NULL, - _gtk_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - signals[LOCATION_TOGGLE_POPUP] = - g_signal_new_class_handler (I_("location-toggle-popup"), - G_OBJECT_CLASS_TYPE (class), - G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, - G_CALLBACK (location_toggle_popup_handler), - NULL, NULL, - _gtk_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - signals[UP_FOLDER] = - g_signal_new_class_handler (I_("up-folder"), - G_OBJECT_CLASS_TYPE (class), - G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, - G_CALLBACK (up_folder_handler), - NULL, NULL, - _gtk_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - signals[DOWN_FOLDER] = - g_signal_new_class_handler (I_("down-folder"), - G_OBJECT_CLASS_TYPE (class), - G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, - G_CALLBACK (down_folder_handler), - NULL, NULL, - _gtk_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - signals[HOME_FOLDER] = - g_signal_new_class_handler (I_("home-folder"), - G_OBJECT_CLASS_TYPE (class), - G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, - G_CALLBACK (home_folder_handler), - NULL, NULL, - _gtk_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - signals[DESKTOP_FOLDER] = - g_signal_new_class_handler (I_("desktop-folder"), - G_OBJECT_CLASS_TYPE (class), - G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, - G_CALLBACK (desktop_folder_handler), - NULL, NULL, - _gtk_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - signals[QUICK_BOOKMARK] = - g_signal_new_class_handler (I_("quick-bookmark"), - G_OBJECT_CLASS_TYPE (class), - G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, - G_CALLBACK (quick_bookmark_handler), - NULL, NULL, - _gtk_marshal_VOID__INT, - G_TYPE_NONE, 1, G_TYPE_INT); - - signals[SHOW_HIDDEN] = - g_signal_new_class_handler (I_("show-hidden"), - G_OBJECT_CLASS_TYPE (class), - G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, - G_CALLBACK (show_hidden_handler), - NULL, NULL, - _gtk_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - signals[SEARCH_SHORTCUT] = - g_signal_new_class_handler (I_("search-shortcut"), - G_OBJECT_CLASS_TYPE (class), - G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, - G_CALLBACK (search_shortcut_handler), - NULL, NULL, - _gtk_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - signals[RECENT_SHORTCUT] = - g_signal_new_class_handler (I_("recent-shortcut"), - G_OBJECT_CLASS_TYPE (class), - G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, - G_CALLBACK (recent_shortcut_handler), - NULL, NULL, - _gtk_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - binding_set = gtk_binding_set_by_class (class); - - gtk_binding_entry_add_signal (binding_set, - GDK_KEY_l, GDK_CONTROL_MASK, - "location-toggle-popup", - 0); - - gtk_binding_entry_add_signal (binding_set, - GDK_KEY_slash, 0, - "location-popup", - 1, G_TYPE_STRING, "/"); - gtk_binding_entry_add_signal (binding_set, - GDK_KEY_KP_Divide, 0, - "location-popup", - 1, G_TYPE_STRING, "/"); - -#ifdef G_OS_UNIX - gtk_binding_entry_add_signal (binding_set, - GDK_KEY_asciitilde, 0, - "location-popup", - 1, G_TYPE_STRING, "~"); -#endif - - gtk_binding_entry_add_signal (binding_set, - GDK_KEY_v, GDK_CONTROL_MASK, - "location-popup-on-paste", - 0); - - add_normal_and_shifted_binding (binding_set, - GDK_KEY_Up, GDK_MOD1_MASK, - "up-folder"); - - add_normal_and_shifted_binding (binding_set, - GDK_KEY_KP_Up, GDK_MOD1_MASK, - "up-folder"); - - add_normal_and_shifted_binding (binding_set, - GDK_KEY_Down, GDK_MOD1_MASK, - "down-folder"); - add_normal_and_shifted_binding (binding_set, - GDK_KEY_KP_Down, GDK_MOD1_MASK, - "down-folder"); - - gtk_binding_entry_add_signal (binding_set, - GDK_KEY_Home, GDK_MOD1_MASK, - "home-folder", - 0); - gtk_binding_entry_add_signal (binding_set, - GDK_KEY_KP_Home, GDK_MOD1_MASK, - "home-folder", - 0); - gtk_binding_entry_add_signal (binding_set, - GDK_KEY_d, GDK_MOD1_MASK, - "desktop-folder", - 0); - gtk_binding_entry_add_signal (binding_set, - GDK_KEY_h, GDK_CONTROL_MASK, - "show-hidden", - 0); - gtk_binding_entry_add_signal (binding_set, - GDK_KEY_s, GDK_MOD1_MASK, - "search-shortcut", - 0); - gtk_binding_entry_add_signal (binding_set, - GDK_KEY_r, GDK_MOD1_MASK, - "recent-shortcut", - 0); - - for (i = 0; i < 10; i++) - gtk_binding_entry_add_signal (binding_set, - quick_bookmark_keyvals[i], GDK_MOD1_MASK, - "quick-bookmark", - 1, G_TYPE_INT, i); - - _gtk_file_chooser_install_properties (gobject_class); - - g_type_class_add_private (gobject_class, sizeof (GtkFileChooserDefaultPrivate)); - - /* Bind class to template */ - - gtk_widget_class_set_template_from_resource (widget_class, - "/org/gtk/libgtk/gtkfilechooserdefault.ui"); - - /* A *lot* of widgets that we need to handle .... */ - - gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, browse_widgets_box); - gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, browse_widgets_hpaned); - gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, browse_header_box); - gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, browse_widgets_box); - gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, browse_files_tree_view); - gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, browse_new_folder_button); - gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, browse_path_bar_hbox); - gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, browse_path_bar_size_group); - gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, browse_path_bar); - gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, browse_special_mode_icon); - gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, browse_special_mode_label); - gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, browse_select_a_folder_info_bar); - gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, browse_select_a_folder_label); - gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, browse_select_a_folder_icon); - gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, filter_combo_hbox); - gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, filter_combo); - gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, preview_box); - gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, extra_align); - gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, location_button); - gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, location_entry_box); - gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, location_label); - gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, list_name_column); - gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, list_pixbuf_renderer); - gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, list_name_renderer); - gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, list_mtime_column); - gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, list_size_column); - - /* And a *lot* of callbacks to bind ... */ - gtk_widget_class_bind_callback (widget_class, browse_files_key_press_event_cb); - gtk_widget_class_bind_callback (widget_class, file_list_drag_drop_cb); - gtk_widget_class_bind_callback (widget_class, file_list_drag_data_received_cb); - gtk_widget_class_bind_callback (widget_class, list_popup_menu_cb); - gtk_widget_class_bind_callback (widget_class, file_list_query_tooltip_cb); - gtk_widget_class_bind_callback (widget_class, list_button_press_event_cb); - gtk_widget_class_bind_callback (widget_class, list_row_activated); - gtk_widget_class_bind_callback (widget_class, file_list_drag_motion_cb); - gtk_widget_class_bind_callback (widget_class, list_selection_changed); - gtk_widget_class_bind_callback (widget_class, renderer_editing_canceled_cb); - gtk_widget_class_bind_callback (widget_class, renderer_edited_cb); - gtk_widget_class_bind_callback (widget_class, filter_combo_changed); - gtk_widget_class_bind_callback (widget_class, location_button_toggled_cb); - gtk_widget_class_bind_callback (widget_class, new_folder_button_clicked); - gtk_widget_class_bind_callback (widget_class, path_bar_clicked); - gtk_widget_class_bind_callback (widget_class, places_sidebar_open_location_cb); - gtk_widget_class_bind_callback (widget_class, places_sidebar_show_error_message_cb); -} - static void gtk_file_chooser_default_iface_init (GtkFileChooserIface *iface) { @@ -856,114 +580,6 @@ gtk_file_chooser_embed_default_iface_init (GtkFileChooserEmbedIface *iface) } static void -post_process_ui (GtkFileChooserDefault *impl) -{ - GtkTreeSelection *selection; - GtkStyleContext *context; - GtkCellRenderer *cell; - GList *cells; - - /* Some qdata, qdata can't be set with GtkBuilder */ - g_object_set_data (G_OBJECT (impl->priv->browse_files_tree_view), "fmq-name", "file_list"); - g_object_set_data (G_OBJECT (impl->priv->browse_files_tree_view), I_("GtkFileChooserDefault"), impl); - - /* Setup file list treeview */ - selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (impl->priv->browse_files_tree_view)); - gtk_tree_selection_set_select_function (selection, - list_select_func, - impl, NULL); - gtk_tree_view_enable_model_drag_source (GTK_TREE_VIEW (impl->priv->browse_files_tree_view), - GDK_BUTTON1_MASK, - NULL, 0, - GDK_ACTION_COPY | GDK_ACTION_MOVE); - gtk_drag_source_add_uri_targets (impl->priv->browse_files_tree_view); - - gtk_drag_dest_set (impl->priv->browse_files_tree_view, - GTK_DEST_DEFAULT_ALL, - NULL, 0, - GDK_ACTION_COPY | GDK_ACTION_MOVE); - gtk_drag_dest_add_uri_targets (impl->priv->browse_files_tree_view); - - /* File browser treemodel columns are shared between GtkFileChooser implementations, - * so we don't set cell renderer attributes in GtkBuilder, but rather keep that - * in code. - */ - file_list_set_sort_column_ids (impl); - update_cell_renderer_attributes (impl); - - /* Get the combo's text renderer and set ellipsize parameters, - * perhaps GtkComboBoxText should declare the cell renderer - * as an 'internal-child', then we could configure it in GtkBuilder - * instead of hard coding it here. - */ - cells = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (impl->priv->filter_combo)); - g_assert (cells); - cell = cells->data; - g_object_set (G_OBJECT (cell), - "ellipsize", PANGO_ELLIPSIZE_END, - NULL); - - g_list_free (cells); - - /* Set the GtkPathBar file system backend */ - _gtk_path_bar_set_file_system (GTK_PATH_BAR (impl->priv->browse_path_bar), impl->priv->file_system); - - /* Set the fixed size icon renderer, this requires - * that priv->icon_size be already setup. - */ - set_icon_cell_renderer_fixed_size (impl); -} - -static void -_gtk_file_chooser_default_init (GtkFileChooserDefault *impl) -{ - GtkFileChooserDefaultPrivate *priv; - - profile_start ("start", NULL); -#ifdef PROFILE_FILE_CHOOSER - access ("MARK: *** CREATE FILE CHOOSER", F_OK); -#endif - impl->priv = G_TYPE_INSTANCE_GET_PRIVATE (impl, - GTK_TYPE_FILE_CHOOSER_DEFAULT, - GtkFileChooserDefaultPrivate); - priv = impl->priv; - - priv->local_only = TRUE; - priv->preview_widget_active = TRUE; - priv->use_preview_label = TRUE; - priv->select_multiple = FALSE; - priv->show_hidden = FALSE; - priv->show_size_column = TRUE; - priv->icon_size = FALLBACK_ICON_SIZE; - priv->load_state = LOAD_EMPTY; - priv->reload_state = RELOAD_EMPTY; - priv->pending_select_files = NULL; - priv->location_mode = LOCATION_MODE_PATH_BAR; - priv->operation_mode = OPERATION_MODE_BROWSE; - priv->sort_column = MODEL_COL_NAME; - priv->sort_order = GTK_SORT_ASCENDING; - priv->recent_manager = gtk_recent_manager_get_default (); - priv->create_folders = TRUE; - - /* Ensure GTK+ private types used by the template - * definition before calling gtk_widget_init_template() - */ - g_type_ensure (GTK_TYPE_PATH_BAR); - gtk_widget_init_template (GTK_WIDGET (impl)); - - set_file_system_backend (impl); - - priv->bookmarks_manager = _gtk_bookmarks_manager_new (NULL, NULL); - - /* Setup various attributes and callbacks in the UI - * which cannot be done with GtkBuilder. - */ - post_process_ui (impl); - - profile_end ("end", NULL); -} - -static void pending_select_files_free (GtkFileChooserDefault *impl) { GtkFileChooserDefaultPrivate *priv = impl->priv; @@ -7623,3 +7239,382 @@ show_hidden_handler (GtkFileChooserDefault *impl) "show-hidden", !priv->show_hidden, NULL); } + +static void +add_normal_and_shifted_binding (GtkBindingSet *binding_set, + guint keyval, + GdkModifierType modifiers, + const gchar *signal_name) +{ + gtk_binding_entry_add_signal (binding_set, + keyval, modifiers, + signal_name, 0); + + gtk_binding_entry_add_signal (binding_set, + keyval, modifiers | GDK_SHIFT_MASK, + signal_name, 0); +} + +static void +_gtk_file_chooser_default_class_init (GtkFileChooserDefaultClass *class) +{ + static const guint quick_bookmark_keyvals[10] = { + GDK_KEY_1, GDK_KEY_2, GDK_KEY_3, GDK_KEY_4, GDK_KEY_5, GDK_KEY_6, GDK_KEY_7, GDK_KEY_8, GDK_KEY_9, GDK_KEY_0 + }; + GObjectClass *gobject_class = G_OBJECT_CLASS (class); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class); + GtkBindingSet *binding_set; + int i; + + gobject_class->finalize = gtk_file_chooser_default_finalize; + gobject_class->constructor = gtk_file_chooser_default_constructor; + gobject_class->set_property = gtk_file_chooser_default_set_property; + gobject_class->get_property = gtk_file_chooser_default_get_property; + gobject_class->dispose = gtk_file_chooser_default_dispose; + + widget_class->show_all = gtk_file_chooser_default_show_all; + widget_class->realize = gtk_file_chooser_default_realize; + widget_class->map = gtk_file_chooser_default_map; + widget_class->unmap = gtk_file_chooser_default_unmap; + widget_class->hierarchy_changed = gtk_file_chooser_default_hierarchy_changed; + widget_class->style_updated = gtk_file_chooser_default_style_updated; + widget_class->screen_changed = gtk_file_chooser_default_screen_changed; + + signals[LOCATION_POPUP] = + g_signal_new_class_handler (I_("location-popup"), + G_OBJECT_CLASS_TYPE (class), + G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, + G_CALLBACK (location_popup_handler), + NULL, NULL, + _gtk_marshal_VOID__STRING, + G_TYPE_NONE, 1, G_TYPE_STRING); + + signals[LOCATION_POPUP_ON_PASTE] = + g_signal_new_class_handler (I_("location-popup-on-paste"), + G_OBJECT_CLASS_TYPE (class), + G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, + G_CALLBACK (location_popup_on_paste_handler), + NULL, NULL, + _gtk_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + signals[LOCATION_TOGGLE_POPUP] = + g_signal_new_class_handler (I_("location-toggle-popup"), + G_OBJECT_CLASS_TYPE (class), + G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, + G_CALLBACK (location_toggle_popup_handler), + NULL, NULL, + _gtk_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + signals[UP_FOLDER] = + g_signal_new_class_handler (I_("up-folder"), + G_OBJECT_CLASS_TYPE (class), + G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, + G_CALLBACK (up_folder_handler), + NULL, NULL, + _gtk_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + signals[DOWN_FOLDER] = + g_signal_new_class_handler (I_("down-folder"), + G_OBJECT_CLASS_TYPE (class), + G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, + G_CALLBACK (down_folder_handler), + NULL, NULL, + _gtk_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + signals[HOME_FOLDER] = + g_signal_new_class_handler (I_("home-folder"), + G_OBJECT_CLASS_TYPE (class), + G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, + G_CALLBACK (home_folder_handler), + NULL, NULL, + _gtk_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + signals[DESKTOP_FOLDER] = + g_signal_new_class_handler (I_("desktop-folder"), + G_OBJECT_CLASS_TYPE (class), + G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, + G_CALLBACK (desktop_folder_handler), + NULL, NULL, + _gtk_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + signals[QUICK_BOOKMARK] = + g_signal_new_class_handler (I_("quick-bookmark"), + G_OBJECT_CLASS_TYPE (class), + G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, + G_CALLBACK (quick_bookmark_handler), + NULL, NULL, + _gtk_marshal_VOID__INT, + G_TYPE_NONE, 1, G_TYPE_INT); + + signals[SHOW_HIDDEN] = + g_signal_new_class_handler (I_("show-hidden"), + G_OBJECT_CLASS_TYPE (class), + G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, + G_CALLBACK (show_hidden_handler), + NULL, NULL, + _gtk_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + signals[SEARCH_SHORTCUT] = + g_signal_new_class_handler (I_("search-shortcut"), + G_OBJECT_CLASS_TYPE (class), + G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, + G_CALLBACK (search_shortcut_handler), + NULL, NULL, + _gtk_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + signals[RECENT_SHORTCUT] = + g_signal_new_class_handler (I_("recent-shortcut"), + G_OBJECT_CLASS_TYPE (class), + G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, + G_CALLBACK (recent_shortcut_handler), + NULL, NULL, + _gtk_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + binding_set = gtk_binding_set_by_class (class); + + gtk_binding_entry_add_signal (binding_set, + GDK_KEY_l, GDK_CONTROL_MASK, + "location-toggle-popup", + 0); + + gtk_binding_entry_add_signal (binding_set, + GDK_KEY_slash, 0, + "location-popup", + 1, G_TYPE_STRING, "/"); + gtk_binding_entry_add_signal (binding_set, + GDK_KEY_KP_Divide, 0, + "location-popup", + 1, G_TYPE_STRING, "/"); + +#ifdef G_OS_UNIX + gtk_binding_entry_add_signal (binding_set, + GDK_KEY_asciitilde, 0, + "location-popup", + 1, G_TYPE_STRING, "~"); +#endif + + gtk_binding_entry_add_signal (binding_set, + GDK_KEY_v, GDK_CONTROL_MASK, + "location-popup-on-paste", + 0); + + add_normal_and_shifted_binding (binding_set, + GDK_KEY_Up, GDK_MOD1_MASK, + "up-folder"); + + add_normal_and_shifted_binding (binding_set, + GDK_KEY_KP_Up, GDK_MOD1_MASK, + "up-folder"); + + add_normal_and_shifted_binding (binding_set, + GDK_KEY_Down, GDK_MOD1_MASK, + "down-folder"); + add_normal_and_shifted_binding (binding_set, + GDK_KEY_KP_Down, GDK_MOD1_MASK, + "down-folder"); + + gtk_binding_entry_add_signal (binding_set, + GDK_KEY_Home, GDK_MOD1_MASK, + "home-folder", + 0); + gtk_binding_entry_add_signal (binding_set, + GDK_KEY_KP_Home, GDK_MOD1_MASK, + "home-folder", + 0); + gtk_binding_entry_add_signal (binding_set, + GDK_KEY_d, GDK_MOD1_MASK, + "desktop-folder", + 0); + gtk_binding_entry_add_signal (binding_set, + GDK_KEY_h, GDK_CONTROL_MASK, + "show-hidden", + 0); + gtk_binding_entry_add_signal (binding_set, + GDK_KEY_s, GDK_MOD1_MASK, + "search-shortcut", + 0); + gtk_binding_entry_add_signal (binding_set, + GDK_KEY_r, GDK_MOD1_MASK, + "recent-shortcut", + 0); + + for (i = 0; i < 10; i++) + gtk_binding_entry_add_signal (binding_set, + quick_bookmark_keyvals[i], GDK_MOD1_MASK, + "quick-bookmark", + 1, G_TYPE_INT, i); + + _gtk_file_chooser_install_properties (gobject_class); + + g_type_class_add_private (gobject_class, sizeof (GtkFileChooserDefaultPrivate)); + + /* Bind class to template */ + + gtk_widget_class_set_template_from_resource (widget_class, + "/org/gtk/libgtk/gtkfilechooserdefault.ui"); + + /* A *lot* of widgets that we need to handle .... */ + + gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, browse_widgets_box); + gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, browse_widgets_hpaned); + gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, browse_header_box); + gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, browse_widgets_box); + gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, places_sidebar); + gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, browse_files_tree_view); + gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, browse_new_folder_button); + gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, browse_path_bar_hbox); + gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, browse_path_bar_size_group); + gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, browse_path_bar); + gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, browse_special_mode_icon); + gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, browse_special_mode_label); + gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, browse_select_a_folder_info_bar); + gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, browse_select_a_folder_label); + gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, browse_select_a_folder_icon); + gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, filter_combo_hbox); + gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, filter_combo); + gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, preview_box); + gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, extra_align); + gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, location_button); + gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, location_entry_box); + gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, location_label); + gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, list_name_column); + gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, list_pixbuf_renderer); + gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, list_name_renderer); + gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, list_mtime_column); + gtk_widget_class_bind_child (widget_class, GtkFileChooserDefaultPrivate, list_size_column); + + /* And a *lot* of callbacks to bind ... */ + gtk_widget_class_bind_callback (widget_class, browse_files_key_press_event_cb); + gtk_widget_class_bind_callback (widget_class, file_list_drag_drop_cb); + gtk_widget_class_bind_callback (widget_class, file_list_drag_data_received_cb); + gtk_widget_class_bind_callback (widget_class, list_popup_menu_cb); + gtk_widget_class_bind_callback (widget_class, file_list_query_tooltip_cb); + gtk_widget_class_bind_callback (widget_class, list_button_press_event_cb); + gtk_widget_class_bind_callback (widget_class, list_row_activated); + gtk_widget_class_bind_callback (widget_class, file_list_drag_motion_cb); + gtk_widget_class_bind_callback (widget_class, list_selection_changed); + gtk_widget_class_bind_callback (widget_class, renderer_editing_canceled_cb); + gtk_widget_class_bind_callback (widget_class, renderer_edited_cb); + gtk_widget_class_bind_callback (widget_class, filter_combo_changed); + gtk_widget_class_bind_callback (widget_class, location_button_toggled_cb); + gtk_widget_class_bind_callback (widget_class, new_folder_button_clicked); + gtk_widget_class_bind_callback (widget_class, path_bar_clicked); + gtk_widget_class_bind_callback (widget_class, places_sidebar_open_location_cb); + gtk_widget_class_bind_callback (widget_class, places_sidebar_show_error_message_cb); +} + +static void +post_process_ui (GtkFileChooserDefault *impl) +{ + GtkTreeSelection *selection; + GtkCellRenderer *cell; + GList *cells; + + /* Some qdata, qdata can't be set with GtkBuilder */ + g_object_set_data (G_OBJECT (impl->priv->browse_files_tree_view), "fmq-name", "file_list"); + g_object_set_data (G_OBJECT (impl->priv->browse_files_tree_view), I_("GtkFileChooserDefault"), impl); + + /* Setup file list treeview */ + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (impl->priv->browse_files_tree_view)); + gtk_tree_selection_set_select_function (selection, + list_select_func, + impl, NULL); + gtk_tree_view_enable_model_drag_source (GTK_TREE_VIEW (impl->priv->browse_files_tree_view), + GDK_BUTTON1_MASK, + NULL, 0, + GDK_ACTION_COPY | GDK_ACTION_MOVE); + gtk_drag_source_add_uri_targets (impl->priv->browse_files_tree_view); + + gtk_drag_dest_set (impl->priv->browse_files_tree_view, + GTK_DEST_DEFAULT_ALL, + NULL, 0, + GDK_ACTION_COPY | GDK_ACTION_MOVE); + gtk_drag_dest_add_uri_targets (impl->priv->browse_files_tree_view); + + /* File browser treemodel columns are shared between GtkFileChooser implementations, + * so we don't set cell renderer attributes in GtkBuilder, but rather keep that + * in code. + */ + file_list_set_sort_column_ids (impl); + update_cell_renderer_attributes (impl); + + /* Get the combo's text renderer and set ellipsize parameters, + * perhaps GtkComboBoxText should declare the cell renderer + * as an 'internal-child', then we could configure it in GtkBuilder + * instead of hard coding it here. + */ + cells = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (impl->priv->filter_combo)); + g_assert (cells); + cell = cells->data; + g_object_set (G_OBJECT (cell), + "ellipsize", PANGO_ELLIPSIZE_END, + NULL); + + g_list_free (cells); + + /* Set the GtkPathBar file system backend */ + _gtk_path_bar_set_file_system (GTK_PATH_BAR (impl->priv->browse_path_bar), impl->priv->file_system); + + /* Set the fixed size icon renderer, this requires + * that priv->icon_size be already setup. + */ + set_icon_cell_renderer_fixed_size (impl); +} + +static void +_gtk_file_chooser_default_init (GtkFileChooserDefault *impl) +{ + GtkFileChooserDefaultPrivate *priv; + + profile_start ("start", NULL); +#ifdef PROFILE_FILE_CHOOSER + access ("MARK: *** CREATE FILE CHOOSER", F_OK); +#endif + impl->priv = G_TYPE_INSTANCE_GET_PRIVATE (impl, + GTK_TYPE_FILE_CHOOSER_DEFAULT, + GtkFileChooserDefaultPrivate); + priv = impl->priv; + + priv->local_only = TRUE; + priv->preview_widget_active = TRUE; + priv->use_preview_label = TRUE; + priv->select_multiple = FALSE; + priv->show_hidden = FALSE; + priv->show_size_column = TRUE; + priv->icon_size = FALLBACK_ICON_SIZE; + priv->load_state = LOAD_EMPTY; + priv->reload_state = RELOAD_EMPTY; + priv->pending_select_files = NULL; + priv->location_mode = LOCATION_MODE_PATH_BAR; + priv->operation_mode = OPERATION_MODE_BROWSE; + priv->sort_column = MODEL_COL_NAME; + priv->sort_order = GTK_SORT_ASCENDING; + priv->recent_manager = gtk_recent_manager_get_default (); + priv->create_folders = TRUE; + + /* Ensure GTK+ private types used by the template + * definition before calling gtk_widget_init_template() + */ + g_type_ensure (GTK_TYPE_PATH_BAR); + gtk_widget_init_template (GTK_WIDGET (impl)); + + set_file_system_backend (impl); + + priv->bookmarks_manager = _gtk_bookmarks_manager_new (NULL, NULL); + + /* Setup various attributes and callbacks in the UI + * which cannot be done with GtkBuilder. + */ + post_process_ui (impl); + + profile_end ("end", NULL); +} diff --git a/gtk/gtkfilechooserdefault.ui b/gtk/gtkfilechooserdefault.ui index 0e4f1f5837..5cf2ef3896 100644 --- a/gtk/gtkfilechooserdefault.ui +++ b/gtk/gtkfilechooserdefault.ui @@ -412,11 +412,4 @@ <widget name="browse_new_folder_button"/> </widgets> </object> - <object class="GtkSizeGroup" id="paned_size_group"> - <property name="mode">vertical</property> - <widgets> - <widget name="browse_shortcuts_swin"/> - <widget name="browse_files_swin"/> - </widgets> - </object> </interface> |