X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkfilechooserprivate.h;h=24f57e05912ee2941e40a79bbabbbedcd286b597;hb=10862a344aa8fb44e6045343ddf65eb0d14cc1b2;hp=aeb79ee89d8835a7edca82997c55ccf07bd9ec56;hpb=aa22566e6c98745e38b777b2c099bdc799857f59;p=~andy%2Fgtk diff --git a/gtk/gtkfilechooserprivate.h b/gtk/gtkfilechooserprivate.h index aeb79ee89..24f57e059 100644 --- a/gtk/gtkfilechooserprivate.h +++ b/gtk/gtkfilechooserprivate.h @@ -23,6 +23,13 @@ #include "gtkfilechooser.h" #include "gtkfilesystem.h" +#include "gtkfilesystemmodel.h" +#include "gtkliststore.h" +#include "gtktooltips.h" +#include "gtktreemodelsort.h" +#include "gtktreestore.h" +#include "gtktreeview.h" +#include "gtkvbox.h" G_BEGIN_DECLS @@ -36,45 +43,292 @@ struct _GtkFileChooserIface /* Methods */ - void (*set_current_folder) (GtkFileChooser *chooser, - const GtkFilePath *path); - GtkFilePath * (*get_current_folder) (GtkFileChooser *chooser); - void (*set_current_name) (GtkFileChooser *chooser, - const gchar *name); - void (*select_path) (GtkFileChooser *chooser, - const GtkFilePath *path); - void (*unselect_path) (GtkFileChooser *chooser, - const GtkFilePath *path); - void (*select_all) (GtkFileChooser *chooser); - void (*unselect_all) (GtkFileChooser *chooser); - GSList * (*get_paths) (GtkFileChooser *chooser); - GtkFilePath * (*get_preview_path) (GtkFileChooser *chooser); - GtkFileSystem *(*get_file_system) (GtkFileChooser *chooser); - void (*add_filter) (GtkFileChooser *chooser, - GtkFileFilter *filter); - void (*remove_filter) (GtkFileChooser *chooser, - GtkFileFilter *filter); - GSList * (*list_filters) (GtkFileChooser *chooser); - + gboolean (*set_current_folder) (GtkFileChooser *chooser, + const GtkFilePath *path, + GError **error); + GtkFilePath * (*get_current_folder) (GtkFileChooser *chooser); + void (*set_current_name) (GtkFileChooser *chooser, + const gchar *name); + gboolean (*select_path) (GtkFileChooser *chooser, + const GtkFilePath *path, + GError **error); + void (*unselect_path) (GtkFileChooser *chooser, + const GtkFilePath *path); + void (*select_all) (GtkFileChooser *chooser); + void (*unselect_all) (GtkFileChooser *chooser); + GSList * (*get_paths) (GtkFileChooser *chooser); + GtkFilePath * (*get_preview_path) (GtkFileChooser *chooser); + GtkFileSystem *(*get_file_system) (GtkFileChooser *chooser); + void (*add_filter) (GtkFileChooser *chooser, + GtkFileFilter *filter); + void (*remove_filter) (GtkFileChooser *chooser, + GtkFileFilter *filter); + GSList * (*list_filters) (GtkFileChooser *chooser); + gboolean (*add_shortcut_folder) (GtkFileChooser *chooser, + const GtkFilePath *path, + GError **error); + gboolean (*remove_shortcut_folder) (GtkFileChooser *chooser, + const GtkFilePath *path, + GError **error); + GSList * (*list_shortcut_folders) (GtkFileChooser *chooser); /* Signals */ void (*current_folder_changed) (GtkFileChooser *chooser); void (*selection_changed) (GtkFileChooser *chooser); void (*update_preview) (GtkFileChooser *chooser); - void (*file_activated) (GtkFileChooser *chooser); + void (*file_activated) (GtkFileChooser *chooser); + GtkFileChooserConfirmation (*confirm_overwrite) (GtkFileChooser *chooser); }; GtkFileSystem *_gtk_file_chooser_get_file_system (GtkFileChooser *chooser); -void _gtk_file_chooser_set_current_folder_path (GtkFileChooser *chooser, - const GtkFilePath *path); +gboolean _gtk_file_chooser_set_current_folder_path (GtkFileChooser *chooser, + const GtkFilePath *path, + GError **error); GtkFilePath * _gtk_file_chooser_get_current_folder_path (GtkFileChooser *chooser); -void _gtk_file_chooser_select_path (GtkFileChooser *chooser, - const GtkFilePath *path); +gboolean _gtk_file_chooser_select_path (GtkFileChooser *chooser, + const GtkFilePath *path, + GError **error); void _gtk_file_chooser_unselect_path (GtkFileChooser *chooser, const GtkFilePath *path); GSList * _gtk_file_chooser_get_paths (GtkFileChooser *chooser); GtkFilePath * _gtk_file_chooser_get_preview_path (GtkFileChooser *chooser); +gboolean _gtk_file_chooser_add_shortcut_folder (GtkFileChooser *chooser, + const GtkFilePath *path, + GError **error); +gboolean _gtk_file_chooser_remove_shortcut_folder (GtkFileChooser *chooser, + const GtkFilePath *path, + GError **error); + +/* GtkFileChooserDialog private */ + +struct _GtkFileChooserDialogPrivate +{ + GtkWidget *widget; + + char *file_system; + + /* for use with GtkFileChooserEmbed */ + gint default_width; + gint default_height; + gboolean resize_horizontally; + gboolean resize_vertically; + gboolean response_requested; +}; + + +/* GtkFileChooserWidget private */ + +struct _GtkFileChooserWidgetPrivate +{ + GtkWidget *impl; + + char *file_system; +}; + + +/* GtkFileChooserDefault private */ + +typedef enum { + LOAD_EMPTY, /* There is no model */ + LOAD_PRELOAD, /* Model is loading and a timer is running; model isn't inserted into the tree yet */ + LOAD_LOADING, /* Timeout expired, model is inserted into the tree, but not fully loaded yet */ + LOAD_FINISHED /* Model is fully loaded and inserted into the tree */ +} LoadState; + +typedef enum { + RELOAD_EMPTY, /* No folder has been set */ + RELOAD_HAS_FOLDER, /* We have a folder, although it may not be completely loaded yet; no need to reload */ + RELOAD_WAS_UNMAPPED /* We had a folder but got unmapped; reload is needed */ +} ReloadState; + +typedef enum { + LOCATION_MODE_PATH_BAR, + LOCATION_MODE_FILENAME_ENTRY +} LocationMode; + +struct _GtkFileChooserDefault +{ + GtkVBox parent_instance; + + GtkFileChooserAction action; + + GtkFileSystem *file_system; + + /* Save mode widgets */ + GtkWidget *save_widgets; + + GtkWidget *save_folder_label; + GtkWidget *save_folder_combo; + GtkWidget *save_expander; + + /* The file browsing widgets */ + GtkWidget *browse_widgets; + GtkWidget *browse_shortcuts_tree_view; + GtkWidget *browse_shortcuts_add_button; + GtkWidget *browse_shortcuts_remove_button; + GtkWidget *browse_shortcuts_popup_menu; + GtkWidget *browse_shortcuts_popup_menu_remove_item; + GtkWidget *browse_shortcuts_popup_menu_rename_item; + GtkWidget *browse_files_tree_view; + GtkWidget *browse_files_popup_menu; + GtkWidget *browse_files_popup_menu_add_shortcut_item; + GtkWidget *browse_files_popup_menu_hidden_files_item; + GtkWidget *browse_new_folder_button; + GtkWidget *browse_path_bar; + + GtkFileSystemModel *browse_files_model; + char *browse_files_last_selected_name; + + GtkWidget *filter_combo_hbox; + GtkWidget *filter_combo; + GtkWidget *preview_box; + GtkWidget *preview_label; + GtkWidget *preview_widget; + GtkWidget *extra_align; + GtkWidget *extra_widget; + + GtkWidget *location_button; + GtkWidget *location_entry_box; + GtkWidget *location_label; + GtkWidget *location_entry; + LocationMode location_mode; + + GtkListStore *shortcuts_model; + GtkTreeModel *shortcuts_filter_model; + + GtkTreeModelSort *sort_model; + + /* Handles */ + GSList *loading_shortcuts; + GSList *reload_icon_handles; + GtkFileSystemHandle *file_list_drag_data_received_handle; + GtkFileSystemHandle *update_current_folder_handle; + GtkFileSystemHandle *show_and_select_paths_handle; + GtkFileSystemHandle *should_respond_get_info_handle; + GtkFileSystemHandle *file_exists_get_info_handle; + GtkFileSystemHandle *update_from_entry_handle; + GtkFileSystemHandle *shortcuts_activate_iter_handle; + GSList *pending_handles; + + LoadState load_state; + ReloadState reload_state; + guint load_timeout_id; + + GSList *pending_select_paths; + + GtkFileFilter *current_filter; + GSList *filters; + + GtkTooltips *tooltips; + + gboolean has_home; + gboolean has_desktop; + + int num_volumes; + int num_shortcuts; + int num_bookmarks; + + gulong volumes_changed_id; + gulong bookmarks_changed_id; + + GtkFilePath *current_volume_path; + GtkFilePath *current_folder; + GtkFilePath *preview_path; + char *preview_display_name; + + GtkTreeViewColumn *list_name_column; + GtkCellRenderer *list_name_renderer; + + GSource *edited_idle; + char *edited_new_text; + + gulong settings_signal_id; + int icon_size; + + gulong toplevel_set_focus_id; + GtkWidget *toplevel_last_focus_widget; + +#if 0 + GdkDragContext *shortcuts_drag_context; + GSource *shortcuts_drag_outside_idle; +#endif + + /* Flags */ + + guint local_only : 1; + guint preview_widget_active : 1; + guint use_preview_label : 1; + guint select_multiple : 1; + guint show_hidden : 1; + guint do_overwrite_confirmation : 1; + guint list_sort_ascending : 1; + guint changing_folder : 1; + guint shortcuts_current_folder_active : 1; + guint expand_folders : 1; + +#if 0 + guint shortcuts_drag_outside : 1; +#endif +}; + + +/* GtkFileSystemModel private */ + +typedef struct _FileModelNode FileModelNode; + +struct _GtkFileSystemModel +{ + GObject parent_instance; + + GtkFileSystem *file_system; + GtkFileInfoType types; + FileModelNode *roots; + GtkFileFolder *root_folder; + GtkFilePath *root_path; + + GtkFileSystemModelFilter filter_func; + gpointer filter_data; + + GSList *idle_clears; + GSource *idle_clear_source; + + gushort max_depth; + + GSList *pending_handles; + + guint show_hidden : 1; + guint show_folders : 1; + guint show_files : 1; + guint folders_only : 1; + guint has_editable : 1; +}; + +struct _FileModelNode +{ + GtkFilePath *path; + FileModelNode *next; + + GtkFileInfo *info; + GtkFileFolder *folder; + + FileModelNode *children; + FileModelNode *parent; + GtkFileSystemModel *model; + + guint ref_count; + guint n_referenced_children; + + gushort depth; + + guint has_dummy : 1; + guint is_dummy : 1; + guint is_visible : 1; + guint loaded : 1; + guint idle_clear : 1; + guint load_pending : 1; +}; + G_END_DECLS