forked from AuroraMiddleware/gtk
d955928bd5
2006-05-03 Federico Mena Quintero <federico@novell.com> Merged the federico-filename-entry branch, to fix bug #136541. Combined ChangeLogs: 2006-04-17 Federico Mena Quintero <federico@novell.com> * gtk/gtkfilechooserdefault.c (pending_select_paths_process): Oops, we *do* need to check that we are in OPEN mode before selecting the first row in the file list. See https://bugzilla.novell.com/show_bug.cgi?id=166906 (gtk_file_chooser_default_get_paths): If we are in the case for the file list, and the list has no selected rows, jump to the case for the filename entry. This is so that 1. The user types a filename in the SAVE filename entry ("foo.txt"). 2. He then double-clicks on a folder ("bar") in the file list. will yield the expected "bar/foo.txt" selection. 2006-03-29 Federico Mena Quintero <federico@novell.com> * gtk/gtkpathbar.c (gtk_path_bar_init): Reduce the inter-button spacing to 0. * gtk/gtkfilechooserdefault.c (browse_widgets_create): Make the location label bold. 2006-03-29 Federico Mena Quintero <federico@novell.com> * gtk/gtkfilechooserdefault.c (location_mode_set): Just change the location_mode field if we are in SAVE/CREATE_FOLDER modes. (gtk_file_chooser_default_get_paths): Get the path based on the currently focused widget, or the last-focused widget. This is what we should have been doing in the beginning, but it worked out fine because we didn't have the possibility of a filename entry in OPEN mode. (gtk_file_chooser_default_should_respond): Handle the case where the last focused widget is the location_entry. 2006-03-28 Federico Mena Quintero <federico@novell.com> * gtk/gtkfilechoosersettings.[ch]: New files with a simple framework for saving/loading settings from the file chooser in $XDG_CONFIG_HOME/gtk-2.0/gtkfilechooser. * gtk/gtkfilechooserdefault.c (gtk_file_chooser_default_unmap): Save the current settings. (settings_save): New helper function. We save the location_mode and show_hidden flags. (gtk_file_chooser_default_map): Load the settings. (settings_load): New helper function. * gtk/gtkfilechooserentry.c (_gtk_file_chooser_entry_set_file_part): Oops, don't modify in_change. Our handlers are what set the file_part, so they *must* be run when we modify the text. 2006-03-27 Federico Mena Quintero <federico@novell.com> * gtk/gtkfilechooserprivate.h (struct _GtkFileChooserDefault): Removed the save_file_name_entry. We'll make this be the same as the location_entry widget. (struct _GtkFileChooserDefault): Leave only location_button, location_entry_box, location_label, location_entry. We'll use a single toggle button for the location entry, which will appear below the path bar. (struct _GtkFileChooserDefault): Added a processing_pending_selections flag. * gtk/gtkfilechooserdefault.c (save_widgets_create): Destroy the old location_entry if necessary, and hide the location toggle widgets. (update_chooser_entry): In multiple selection mode, just clear the location_entry. (check_save_entry): Allow running in OPEN or SELECT_FOLDER modes if we are in LOCATION_MODE_FILENAME_ENTRY. (gtk_file_chooser_default_should_respond): Switch to a folder if the location_entry contains a folder name in OPEN and SAVE mode, not just SAVE mode. If the entry doesn't contain a folder name, but is otherwise well-formed, and we are in OPEN mode, return that we should respond with that filename. (gtk_file_chooser_default_initial_focus): Focus the location_entry if appropriate. (browse_widgets_create): Create the location_entry_box and the location_label here. (update_appearance): Call location_mode_set() when switching back to OPEN/SELECT_FOLDER mode. Hide the location_button when switching to SAVE/CREATE_FOLDER mode. (pending_select_paths_process): Turn the processing_pending_selections flag on and off around changes to the current selection. Don't special-case OPEN mode anymore, since the new flag will take care of things in update_chooser_entry(). (update_chooser_entry): Don't do anything if processing_pending_selections is TRUE. This keeps the entry from being polluted when changing folders. (location_popup_handler): In OPEN/SELECT_FOLDER modes, toggle between the path bar and the entry. In SAVE/CREATE_FOLDER modes, simply focus the location_entry. (update_from_entry): Removed. (location_entry_create): Removed. (open_location_cb): Removed. (file_list_build_popup_menu): Don't add an "Open _Location" menu item. (location_entry_set_initial_text): Don't do anything if current_folder is NULL. * gtk/gtkfilechooserentry.c (_gtk_file_chooser_entry_set_file_part): Turn in_change on and off around the call to gtk_entry_set_text(). This makes completion not happen when the caller has explicitly set a name. 2006-03-24 Federico Mena Quintero <federico@novell.com> * gtk/gtkfilechooserprivate.h (struct _GtkFileChooserDefault): Added fields location_mode_box, location_pathbar_radio, location_filename_radio, location_widget_box, location_label, location_entry. The radio buttons will switch between the pathbar and the location entry; the other boxes are for layout purposes. (enum LocationMode): New enum. (struct _GtkFileChooserDefault): Added a location_mode field. * gtk/gtkfilechooserdefault.c (browse_widgets_create): Create the location radio buttons to switch between the pathbar and the location entry. Pack the browse_path_bar in the new location_widget_box instead of a generic hbox. (location_buttons_create): New function. (gtk_file_chooser_default_init): Initialize impl->location_mode. (location_switch_to_path_bar): New function. (location_switch_to_filename_entry): New function. * gtk/gtkfilechooserbutton.c (model_add_special): The display_name should not be const.
334 lines
9.6 KiB
C
334 lines
9.6 KiB
C
/* GTK - The GIMP Toolkit
|
|
* gtkfilechooserprivate.h: Interface definition for file selector GUIs
|
|
* Copyright (C) 2003, Red Hat, Inc.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the
|
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
* Boston, MA 02111-1307, USA.
|
|
*/
|
|
|
|
#ifndef __GTK_FILE_CHOOSER_PRIVATE_H__
|
|
#define __GTK_FILE_CHOOSER_PRIVATE_H__
|
|
|
|
#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
|
|
|
|
#define GTK_FILE_CHOOSER_GET_IFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GTK_TYPE_FILE_CHOOSER, GtkFileChooserIface))
|
|
|
|
typedef struct _GtkFileChooserIface GtkFileChooserIface;
|
|
|
|
struct _GtkFileChooserIface
|
|
{
|
|
GTypeInterface base_iface;
|
|
|
|
/* Methods
|
|
*/
|
|
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);
|
|
GtkFileChooserConfirmation (*confirm_overwrite) (GtkFileChooser *chooser);
|
|
};
|
|
|
|
GtkFileSystem *_gtk_file_chooser_get_file_system (GtkFileChooser *chooser);
|
|
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);
|
|
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;
|
|
|
|
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 *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 processing_pending_selections : 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
|
|
|
|
#endif /* __GTK_FILE_CHOOSER_PRIVATE_H__ */
|