Don't unref an old model; there isn't one. This was a leftover from when

2004-03-01  Federico Mena Quintero  <federico@ximian.com>

	* gtk/gtkfilechooserdefault.c (shortcuts_model_create): Don't
	unref an old model; there isn't one.  This was a leftover from
	when we recreated the model on every change.
	(save_widgets_create): Create the save folder combo.
	(shortcuts_model_create): Don't set the model on the tree view
	here.
	(gtk_file_chooser_default_constructor): Create the shortcuts model
	here, before the rest of the widgets.
	(shortcuts_list_create): Don't call shortcuts_model_create() here;
	just set the model on the tree.
	(save_folder_combo_create): New function, provided by Jonathan
	Blandford.
	(update_appearance): Set the sensitivity of the folder combo.
	(shortcuts_activate_iter): New helper function; code moved from
	shortcuts_row_activated_cb().
	(shortcuts_activate_item): New helper function.
	(shortcuts_row_activated_cb): Use shortcuts_activate_iter().
	(ShortcutsIndex): Renamed SHORTCUTS_SEPARATOR to
	SHORTCUTS_BOOKMARKS_SEPARATOR.
	(struct _GtkFileChooserDefault): New field shortcuts_current_folder_active.
	(shortcuts_insert_separator): Add a position argument.
	(shortcuts_get_index): Handle the SHORTCUTS_CURRENT_FOLDER_SEPARATOR
	and SHORTCUTS_CURRENT_FOLDER positions.
	(shortcut_exists): Ignore the current folder row.
	(struct _GtkFileChooserDefault): New field shortcuts_filter_model.
	(shortcuts_model_create): Create a filter model for the shortcuts list.
	(shortcuts_list_create): Set the model to the shortcuts_filter_model.
	(remove_bookmark_button_clicked_cb): Use the shortcuts_filter_model.
	(bookmarks_check_remove_sensitivity): Likewise.
	(shortcuts_row_activated_cb): Likewise.
	(gtk_file_chooser_default_set_current_folder): New function.
	(gtk_file_chooser_default_set_current_folder): Update the current
	folder row in the shortcuts list.

	* gtk/gtkfilechooserwidget.c
	(gtk_file_chooser_widget_constructor): Cast correctly for
	_gtk_file_chooser_embed_set_delegate().
This commit is contained in:
Federico Mena Quintero
2004-03-02 02:59:02 +00:00
committed by Federico Mena Quintero
parent d52caae6d1
commit 7233e912e2
8 changed files with 452 additions and 77 deletions

View File

@ -1,3 +1,43 @@
2004-03-01 Federico Mena Quintero <federico@ximian.com>
* gtk/gtkfilechooserdefault.c (shortcuts_model_create): Don't
unref an old model; there isn't one. This was a leftover from
when we recreated the model on every change.
(save_widgets_create): Create the save folder combo.
(shortcuts_model_create): Don't set the model on the tree view
here.
(gtk_file_chooser_default_constructor): Create the shortcuts model
here, before the rest of the widgets.
(shortcuts_list_create): Don't call shortcuts_model_create() here;
just set the model on the tree.
(save_folder_combo_create): New function, provided by Jonathan
Blandford.
(update_appearance): Set the sensitivity of the folder combo.
(shortcuts_activate_iter): New helper function; code moved from
shortcuts_row_activated_cb().
(shortcuts_activate_item): New helper function.
(shortcuts_row_activated_cb): Use shortcuts_activate_iter().
(ShortcutsIndex): Renamed SHORTCUTS_SEPARATOR to
SHORTCUTS_BOOKMARKS_SEPARATOR.
(struct _GtkFileChooserDefault): New field shortcuts_current_folder_active.
(shortcuts_insert_separator): Add a position argument.
(shortcuts_get_index): Handle the SHORTCUTS_CURRENT_FOLDER_SEPARATOR
and SHORTCUTS_CURRENT_FOLDER positions.
(shortcut_exists): Ignore the current folder row.
(struct _GtkFileChooserDefault): New field shortcuts_filter_model.
(shortcuts_model_create): Create a filter model for the shortcuts list.
(shortcuts_list_create): Set the model to the shortcuts_filter_model.
(remove_bookmark_button_clicked_cb): Use the shortcuts_filter_model.
(bookmarks_check_remove_sensitivity): Likewise.
(shortcuts_row_activated_cb): Likewise.
(gtk_file_chooser_default_set_current_folder): New function.
(gtk_file_chooser_default_set_current_folder): Update the current
folder row in the shortcuts list.
* gtk/gtkfilechooserwidget.c
(gtk_file_chooser_widget_constructor): Cast correctly for
_gtk_file_chooser_embed_set_delegate().
Mon Mar 1 19:30:25 2004 Owen Taylor <otaylor@redhat.com>
* gtk/gtkdnd.[ch]: Add gtk_drag_source_set/get_target_list().

View File

@ -1,3 +1,43 @@
2004-03-01 Federico Mena Quintero <federico@ximian.com>
* gtk/gtkfilechooserdefault.c (shortcuts_model_create): Don't
unref an old model; there isn't one. This was a leftover from
when we recreated the model on every change.
(save_widgets_create): Create the save folder combo.
(shortcuts_model_create): Don't set the model on the tree view
here.
(gtk_file_chooser_default_constructor): Create the shortcuts model
here, before the rest of the widgets.
(shortcuts_list_create): Don't call shortcuts_model_create() here;
just set the model on the tree.
(save_folder_combo_create): New function, provided by Jonathan
Blandford.
(update_appearance): Set the sensitivity of the folder combo.
(shortcuts_activate_iter): New helper function; code moved from
shortcuts_row_activated_cb().
(shortcuts_activate_item): New helper function.
(shortcuts_row_activated_cb): Use shortcuts_activate_iter().
(ShortcutsIndex): Renamed SHORTCUTS_SEPARATOR to
SHORTCUTS_BOOKMARKS_SEPARATOR.
(struct _GtkFileChooserDefault): New field shortcuts_current_folder_active.
(shortcuts_insert_separator): Add a position argument.
(shortcuts_get_index): Handle the SHORTCUTS_CURRENT_FOLDER_SEPARATOR
and SHORTCUTS_CURRENT_FOLDER positions.
(shortcut_exists): Ignore the current folder row.
(struct _GtkFileChooserDefault): New field shortcuts_filter_model.
(shortcuts_model_create): Create a filter model for the shortcuts list.
(shortcuts_list_create): Set the model to the shortcuts_filter_model.
(remove_bookmark_button_clicked_cb): Use the shortcuts_filter_model.
(bookmarks_check_remove_sensitivity): Likewise.
(shortcuts_row_activated_cb): Likewise.
(gtk_file_chooser_default_set_current_folder): New function.
(gtk_file_chooser_default_set_current_folder): Update the current
folder row in the shortcuts list.
* gtk/gtkfilechooserwidget.c
(gtk_file_chooser_widget_constructor): Cast correctly for
_gtk_file_chooser_embed_set_delegate().
Mon Mar 1 19:30:25 2004 Owen Taylor <otaylor@redhat.com>
* gtk/gtkdnd.[ch]: Add gtk_drag_source_set/get_target_list().

View File

@ -1,3 +1,43 @@
2004-03-01 Federico Mena Quintero <federico@ximian.com>
* gtk/gtkfilechooserdefault.c (shortcuts_model_create): Don't
unref an old model; there isn't one. This was a leftover from
when we recreated the model on every change.
(save_widgets_create): Create the save folder combo.
(shortcuts_model_create): Don't set the model on the tree view
here.
(gtk_file_chooser_default_constructor): Create the shortcuts model
here, before the rest of the widgets.
(shortcuts_list_create): Don't call shortcuts_model_create() here;
just set the model on the tree.
(save_folder_combo_create): New function, provided by Jonathan
Blandford.
(update_appearance): Set the sensitivity of the folder combo.
(shortcuts_activate_iter): New helper function; code moved from
shortcuts_row_activated_cb().
(shortcuts_activate_item): New helper function.
(shortcuts_row_activated_cb): Use shortcuts_activate_iter().
(ShortcutsIndex): Renamed SHORTCUTS_SEPARATOR to
SHORTCUTS_BOOKMARKS_SEPARATOR.
(struct _GtkFileChooserDefault): New field shortcuts_current_folder_active.
(shortcuts_insert_separator): Add a position argument.
(shortcuts_get_index): Handle the SHORTCUTS_CURRENT_FOLDER_SEPARATOR
and SHORTCUTS_CURRENT_FOLDER positions.
(shortcut_exists): Ignore the current folder row.
(struct _GtkFileChooserDefault): New field shortcuts_filter_model.
(shortcuts_model_create): Create a filter model for the shortcuts list.
(shortcuts_list_create): Set the model to the shortcuts_filter_model.
(remove_bookmark_button_clicked_cb): Use the shortcuts_filter_model.
(bookmarks_check_remove_sensitivity): Likewise.
(shortcuts_row_activated_cb): Likewise.
(gtk_file_chooser_default_set_current_folder): New function.
(gtk_file_chooser_default_set_current_folder): Update the current
folder row in the shortcuts list.
* gtk/gtkfilechooserwidget.c
(gtk_file_chooser_widget_constructor): Cast correctly for
_gtk_file_chooser_embed_set_delegate().
Mon Mar 1 19:30:25 2004 Owen Taylor <otaylor@redhat.com>
* gtk/gtkdnd.[ch]: Add gtk_drag_source_set/get_target_list().

View File

@ -1,3 +1,43 @@
2004-03-01 Federico Mena Quintero <federico@ximian.com>
* gtk/gtkfilechooserdefault.c (shortcuts_model_create): Don't
unref an old model; there isn't one. This was a leftover from
when we recreated the model on every change.
(save_widgets_create): Create the save folder combo.
(shortcuts_model_create): Don't set the model on the tree view
here.
(gtk_file_chooser_default_constructor): Create the shortcuts model
here, before the rest of the widgets.
(shortcuts_list_create): Don't call shortcuts_model_create() here;
just set the model on the tree.
(save_folder_combo_create): New function, provided by Jonathan
Blandford.
(update_appearance): Set the sensitivity of the folder combo.
(shortcuts_activate_iter): New helper function; code moved from
shortcuts_row_activated_cb().
(shortcuts_activate_item): New helper function.
(shortcuts_row_activated_cb): Use shortcuts_activate_iter().
(ShortcutsIndex): Renamed SHORTCUTS_SEPARATOR to
SHORTCUTS_BOOKMARKS_SEPARATOR.
(struct _GtkFileChooserDefault): New field shortcuts_current_folder_active.
(shortcuts_insert_separator): Add a position argument.
(shortcuts_get_index): Handle the SHORTCUTS_CURRENT_FOLDER_SEPARATOR
and SHORTCUTS_CURRENT_FOLDER positions.
(shortcut_exists): Ignore the current folder row.
(struct _GtkFileChooserDefault): New field shortcuts_filter_model.
(shortcuts_model_create): Create a filter model for the shortcuts list.
(shortcuts_list_create): Set the model to the shortcuts_filter_model.
(remove_bookmark_button_clicked_cb): Use the shortcuts_filter_model.
(bookmarks_check_remove_sensitivity): Likewise.
(shortcuts_row_activated_cb): Likewise.
(gtk_file_chooser_default_set_current_folder): New function.
(gtk_file_chooser_default_set_current_folder): Update the current
folder row in the shortcuts list.
* gtk/gtkfilechooserwidget.c
(gtk_file_chooser_widget_constructor): Cast correctly for
_gtk_file_chooser_embed_set_delegate().
Mon Mar 1 19:30:25 2004 Owen Taylor <otaylor@redhat.com>
* gtk/gtkdnd.[ch]: Add gtk_drag_source_set/get_target_list().

View File

@ -1,3 +1,43 @@
2004-03-01 Federico Mena Quintero <federico@ximian.com>
* gtk/gtkfilechooserdefault.c (shortcuts_model_create): Don't
unref an old model; there isn't one. This was a leftover from
when we recreated the model on every change.
(save_widgets_create): Create the save folder combo.
(shortcuts_model_create): Don't set the model on the tree view
here.
(gtk_file_chooser_default_constructor): Create the shortcuts model
here, before the rest of the widgets.
(shortcuts_list_create): Don't call shortcuts_model_create() here;
just set the model on the tree.
(save_folder_combo_create): New function, provided by Jonathan
Blandford.
(update_appearance): Set the sensitivity of the folder combo.
(shortcuts_activate_iter): New helper function; code moved from
shortcuts_row_activated_cb().
(shortcuts_activate_item): New helper function.
(shortcuts_row_activated_cb): Use shortcuts_activate_iter().
(ShortcutsIndex): Renamed SHORTCUTS_SEPARATOR to
SHORTCUTS_BOOKMARKS_SEPARATOR.
(struct _GtkFileChooserDefault): New field shortcuts_current_folder_active.
(shortcuts_insert_separator): Add a position argument.
(shortcuts_get_index): Handle the SHORTCUTS_CURRENT_FOLDER_SEPARATOR
and SHORTCUTS_CURRENT_FOLDER positions.
(shortcut_exists): Ignore the current folder row.
(struct _GtkFileChooserDefault): New field shortcuts_filter_model.
(shortcuts_model_create): Create a filter model for the shortcuts list.
(shortcuts_list_create): Set the model to the shortcuts_filter_model.
(remove_bookmark_button_clicked_cb): Use the shortcuts_filter_model.
(bookmarks_check_remove_sensitivity): Likewise.
(shortcuts_row_activated_cb): Likewise.
(gtk_file_chooser_default_set_current_folder): New function.
(gtk_file_chooser_default_set_current_folder): Update the current
folder row in the shortcuts list.
* gtk/gtkfilechooserwidget.c
(gtk_file_chooser_widget_constructor): Cast correctly for
_gtk_file_chooser_embed_set_delegate().
Mon Mar 1 19:30:25 2004 Owen Taylor <otaylor@redhat.com>
* gtk/gtkdnd.[ch]: Add gtk_drag_source_set/get_target_list().

4
NEWS
View File

@ -1,9 +1,9 @@
Overview of Changes from GTK+ 2.3.4 to GTK+ 2.3.5
=================================================
* GtkFileChooser [Federico Mena Quintero]:
- Enable DND in the shortcuts list. [Federico]
- Enable DND to the shortcuts list. [Federico]
- More folder modes. [Jonathan R Blandford]
- Misc. fixes [Jonathan]
- Miscellaneous fixes. [Jonathan, Morten Welinder]
* GtkComboBox
- Memory leak/crash fixes. [Damon Chaplin, Matthias Clasen]
- Always grab when popping the list up. [Damon, Matthias]

View File

@ -22,6 +22,7 @@
#include "gtkalignment.h"
#include "gtkbindings.h"
#include "gtkbutton.h"
#include "gtkcelllayout.h"
#include "gtkcellrendererpixbuf.h"
#include "gtkcellrendererseptext.h"
#include "gtkcellrenderertext.h"
@ -108,7 +109,7 @@ struct _GtkFileChooserDefault
GtkWidget *browse_new_folder_button;
GtkWidget *browse_path_bar;
GtkWidget *browse_extra_align;
GtkTreeModel *browse_shortcuts_model;
GtkFileSystemModel *browse_files_model;
GtkFileSystemModel *browse_directories_model;
@ -119,6 +120,8 @@ struct _GtkFileChooserDefault
GtkWidget *extra_widget;
GtkListStore *shortcuts_model;
GtkTreeModel *shortcuts_filter_model;
GtkTreeModelSort *sort_model;
GtkFileFilter *current_filter;
@ -151,6 +154,7 @@ struct _GtkFileChooserDefault
guint show_hidden : 1;
guint list_sort_ascending : 1;
guint changing_folder : 1;
guint shortcuts_current_folder_active : 1;
};
/* Signal IDs */
@ -199,8 +203,10 @@ typedef enum {
SHORTCUTS_DESKTOP,
SHORTCUTS_VOLUMES,
SHORTCUTS_SHORTCUTS,
SHORTCUTS_SEPARATOR,
SHORTCUTS_BOOKMARKS
SHORTCUTS_BOOKMARKS_SEPARATOR,
SHORTCUTS_BOOKMARKS,
SHORTCUTS_CURRENT_FOLDER_SEPARATOR,
SHORTCUTS_CURRENT_FOLDER
} ShortcutsIndex;
/* Standard icon size */
@ -290,6 +296,10 @@ static gboolean shortcuts_select_func (GtkTreeSelection *selection,
GtkTreePath *path,
gboolean path_currently_selected,
gpointer data);
static void shortcuts_activate_item (GtkFileChooserDefault *impl,
int item_num);
static int shortcuts_get_index (GtkFileChooserDefault *impl,
ShortcutsIndex where);
static void list_selection_changed (GtkTreeSelection *tree_selection,
GtkFileChooserDefault *impl);
@ -886,7 +896,7 @@ shortcuts_get_index (GtkFileChooserDefault *impl,
n += impl->num_shortcuts;
if (where == SHORTCUTS_SEPARATOR)
if (where == SHORTCUTS_BOOKMARKS_SEPARATOR)
goto out;
/* If there are no bookmarks there won't be a separator */
@ -895,6 +905,16 @@ shortcuts_get_index (GtkFileChooserDefault *impl,
if (where == SHORTCUTS_BOOKMARKS)
goto out;
n += impl->num_bookmarks;
if (where == SHORTCUTS_CURRENT_FOLDER_SEPARATOR)
goto out;
n += 1;
if (where == SHORTCUTS_CURRENT_FOLDER)
goto out;
g_assert_not_reached ();
out:
@ -986,14 +1006,17 @@ remove_bookmark_cb (GtkFileChooserDefault *impl, gpointer data)
gtk_file_path_free (path);
}
/* Inserts the bookmarks separator node */
/* Inserts a separator node in the shortcuts list */
static void
shortcuts_insert_separator (GtkFileChooserDefault *impl)
shortcuts_insert_separator (GtkFileChooserDefault *impl,
ShortcutsIndex where)
{
GtkTreeIter iter;
g_assert (where == SHORTCUTS_BOOKMARKS_SEPARATOR || where == SHORTCUTS_CURRENT_FOLDER_SEPARATOR);
gtk_list_store_insert (impl->shortcuts_model, &iter,
shortcuts_get_index (impl, SHORTCUTS_SEPARATOR));
shortcuts_get_index (impl, where));
gtk_list_store_set (impl->shortcuts_model, &iter,
SHORTCUTS_COL_PIXBUF, NULL,
SHORTCUTS_COL_PIXBUF_VISIBLE, FALSE,
@ -1002,7 +1025,6 @@ shortcuts_insert_separator (GtkFileChooserDefault *impl)
-1);
}
/* Creates the GtkTreeStore used as the shortcuts model */
/* Updates the list of bookmarks */
static void
shortcuts_add_bookmarks (GtkFileChooserDefault *impl)
@ -1012,7 +1034,7 @@ shortcuts_add_bookmarks (GtkFileChooserDefault *impl)
if (impl->num_bookmarks > 0)
{
shortcuts_remove_rows (impl,
shortcuts_get_index (impl, SHORTCUTS_SEPARATOR),
shortcuts_get_index (impl, SHORTCUTS_BOOKMARKS_SEPARATOR),
impl->num_bookmarks + 1,
remove_bookmark_cb);
@ -1024,16 +1046,75 @@ shortcuts_add_bookmarks (GtkFileChooserDefault *impl)
if (impl->num_bookmarks > 0)
{
shortcuts_insert_separator (impl);
shortcuts_insert_separator (impl, SHORTCUTS_BOOKMARKS_SEPARATOR);
}
}
/* Appends a separator and a row to the shortcuts list for the current folder */
static void
shortcuts_add_current_folder (GtkFileChooserDefault *impl)
{
int pos;
GtkFilePath *path_copy;
pos = shortcuts_get_index (impl, SHORTCUTS_CURRENT_FOLDER);
path_copy = gtk_file_path_copy (impl->current_folder);
shortcuts_insert_path (impl, pos, FALSE, NULL, path_copy, NULL, FALSE, NULL);
}
/* Used from shortcuts_remove_rows() in shortcuts_update_current_folder() */
static void
remove_current_folder_cb (GtkFileChooserDefault *impl,
gpointer data)
{
GtkFilePath *path;
path = data;
gtk_file_path_free (data);
}
/* Updates the current folder row in the shortcuts model */
static void
shortcuts_update_current_folder (GtkFileChooserDefault *impl,
gboolean has_previous)
{
int pos;
pos = shortcuts_get_index (impl, SHORTCUTS_CURRENT_FOLDER);
if (has_previous)
shortcuts_remove_rows (impl, pos, 1, remove_current_folder_cb);
shortcuts_add_current_folder (impl);
}
/* Filter function used for the shortcuts filter model */
static gboolean
shortcuts_filter_cb (GtkTreeModel *model,
GtkTreeIter *iter,
gpointer data)
{
GtkFileChooserDefault *impl;
GtkTreePath *path;
int pos;
impl = GTK_FILE_CHOOSER_DEFAULT (data);
path = gtk_tree_model_get_path (model, iter);
if (!path)
return FALSE;
pos = *gtk_tree_path_get_indices (path);
gtk_tree_path_free (path);
return (pos < shortcuts_get_index (impl, SHORTCUTS_CURRENT_FOLDER_SEPARATOR));
}
/* Creates the list model for shortcuts */
static void
shortcuts_model_create (GtkFileChooserDefault *impl)
{
if (impl->shortcuts_model)
g_object_unref (impl->shortcuts_model);
/* Keep this order in sync with the SHORCUTS_COL_* enum values */
impl->shortcuts_model = gtk_list_store_new (SHORTCUTS_COL_NUM_COLUMNS,
GDK_TYPE_PIXBUF, /* pixbuf */
@ -1048,9 +1129,15 @@ shortcuts_model_create (GtkFileChooserDefault *impl)
shortcuts_append_desktop (impl);
shortcuts_add_volumes (impl);
shortcuts_add_bookmarks (impl);
shortcuts_insert_separator (impl, SHORTCUTS_CURRENT_FOLDER_SEPARATOR);
}
gtk_tree_view_set_model (GTK_TREE_VIEW (impl->browse_shortcuts_tree_view), GTK_TREE_MODEL (impl->shortcuts_model));
impl->shortcuts_filter_model = gtk_tree_model_filter_new (GTK_TREE_MODEL (impl->shortcuts_model), NULL);
gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (impl->shortcuts_filter_model),
shortcuts_filter_cb,
impl,
NULL);
}
/* Callback used when the "New Folder" toolbar button is clicked */
@ -1215,58 +1302,61 @@ shortcut_exists (GtkFileChooserDefault *impl,
{
gboolean exists;
GtkTreeIter iter;
int i;
int bookmarks_separator_idx;
int current_folder_separator_idx;
int volumes_idx;
int separator_idx;
if (!gtk_tree_model_get_iter_first (GTK_TREE_MODEL (impl->shortcuts_model), &iter))
return FALSE;
exists = FALSE;
if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (impl->shortcuts_model), &iter))
bookmarks_separator_idx = shortcuts_get_index (impl, SHORTCUTS_BOOKMARKS_SEPARATOR);
current_folder_separator_idx = shortcuts_get_index (impl, SHORTCUTS_CURRENT_FOLDER_SEPARATOR);
volumes_idx = shortcuts_get_index (impl, SHORTCUTS_VOLUMES);
i = 0;
for (i = 0; i < current_folder_separator_idx; i++)
{
int i;
gpointer data;
separator_idx = shortcuts_get_index (impl, SHORTCUTS_SEPARATOR);
volumes_idx = shortcuts_get_index (impl, SHORTCUTS_VOLUMES);
if (i == bookmarks_separator_idx)
goto next_iter;
i = 0;
gtk_tree_model_get (GTK_TREE_MODEL (impl->shortcuts_model), &iter, SHORTCUTS_COL_PATH, &data, -1);
do
if (i >= volumes_idx && i < volumes_idx + impl->num_volumes)
{
gpointer data;
GtkFileSystemVolume *volume;
GtkFilePath *base_path;
if (i == separator_idx)
continue;
volume = data;
base_path = gtk_file_system_volume_get_base_path (impl->file_system, volume);
gtk_tree_model_get (GTK_TREE_MODEL (impl->shortcuts_model), &iter, SHORTCUTS_COL_PATH, &data, -1);
exists = strcmp (gtk_file_path_get_string (path),
gtk_file_path_get_string (base_path)) == 0;
g_free (base_path);
if (i >= volumes_idx && i < volumes_idx + impl->num_volumes)
if (exists)
break;
}
else
{
GtkFilePath *model_path;
model_path = data;
if (model_path && gtk_file_path_compare (model_path, path) == 0)
{
GtkFileSystemVolume *volume;
GtkFilePath *base_path;
volume = data;
base_path = gtk_file_system_volume_get_base_path (impl->file_system, volume);
exists = strcmp (gtk_file_path_get_string (path),
gtk_file_path_get_string (base_path)) == 0;
g_free (base_path);
if (exists)
break;
}
else
{
GtkFilePath *model_path;
model_path = data;
if (model_path && gtk_file_path_compare (model_path, path) == 0)
{
exists = TRUE;
break;
}
exists = TRUE;
break;
}
}
while (gtk_tree_model_iter_next (GTK_TREE_MODEL (impl->shortcuts_model), &iter));
next_iter:
gtk_tree_model_iter_next (GTK_TREE_MODEL (impl->shortcuts_model), &iter);
}
return exists;
@ -1370,10 +1460,9 @@ remove_bookmark_button_clicked_cb (GtkButton *button,
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (impl->browse_shortcuts_tree_view));
if (gtk_tree_selection_get_selected (selection, NULL, &iter))
{
gtk_tree_model_get (GTK_TREE_MODEL (impl->shortcuts_model), &iter,
gtk_tree_model_get (impl->shortcuts_filter_model, &iter,
SHORTCUTS_COL_PATH, &path,
SHORTCUTS_COL_REMOVABLE, &removable, -1);
if (!removable)
@ -1477,7 +1566,7 @@ bookmarks_check_remove_sensitivity (GtkFileChooserDefault *impl)
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (impl->browse_shortcuts_tree_view));
if (gtk_tree_selection_get_selected (selection, NULL, &iter))
gtk_tree_model_get (GTK_TREE_MODEL (impl->shortcuts_model), &iter,
gtk_tree_model_get (impl->shortcuts_filter_model, &iter,
SHORTCUTS_COL_REMOVABLE, &removable,
-1);
@ -1590,6 +1679,8 @@ shortcuts_list_create (GtkFileChooserDefault *impl)
impl->browse_shortcuts_tree_view = gtk_tree_view_new ();
gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (impl->browse_shortcuts_tree_view), FALSE);
gtk_tree_view_set_model (GTK_TREE_VIEW (impl->browse_shortcuts_tree_view), impl->shortcuts_filter_model);
gtk_drag_dest_set (impl->browse_shortcuts_tree_view,
GTK_DEST_DEFAULT_ALL,
shortcuts_targets,
@ -1614,10 +1705,6 @@ shortcuts_list_create (GtkFileChooserDefault *impl)
gtk_container_add (GTK_CONTAINER (impl->browse_shortcuts_swin), impl->browse_shortcuts_tree_view);
gtk_widget_show (impl->browse_shortcuts_tree_view);
/* Model */
shortcuts_model_create (impl);
/* Column */
column = gtk_tree_view_column_new ();
@ -1858,6 +1945,49 @@ expander_changed_cb (GtkExpander *expander,
update_appearance (impl);
}
/* Callback used when the selection changes in the save folder combo box */
static void
save_folder_combo_changed_cb (GtkComboBox *combo,
GtkFileChooserDefault *impl)
{
int active;
active = gtk_combo_box_get_active (combo);
if (active == -1)
return;
shortcuts_activate_item (impl, active);
}
/* Creates the combo box with the save folders */
static GtkWidget *
save_folder_combo_create (GtkFileChooserDefault *impl)
{
GtkWidget *combo;
GtkCellRenderer *cell;
combo = gtk_combo_box_new_with_model (GTK_TREE_MODEL (impl->shortcuts_model));
gtk_widget_show (combo);
cell = gtk_cell_renderer_pixbuf_new ();
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), cell, FALSE);
gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo), cell,
"pixbuf", SHORTCUTS_COL_PIXBUF,
"visible", SHORTCUTS_COL_PIXBUF_VISIBLE,
NULL);
cell = _gtk_cell_renderer_sep_text_new ();
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), cell, TRUE);
gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo), cell,
"text", SHORTCUTS_COL_NAME,
NULL);
g_signal_connect (combo, "changed",
G_CALLBACK (save_folder_combo_changed_cb), impl);
return combo;
}
/* Creates the widgets specific to Save mode */
static GtkWidget *
save_widgets_create (GtkFileChooserDefault *impl)
@ -1904,7 +2034,11 @@ save_widgets_create (GtkFileChooserDefault *impl)
0, 0);
gtk_widget_show (impl->save_folder_label);
/* FIXME: create the combo */
impl->save_folder_combo = save_folder_combo_create (impl);
gtk_table_attach (GTK_TABLE (table), impl->save_folder_combo,
1, 2, 1, 2,
GTK_EXPAND | GTK_FILL, GTK_FILL,
0, 0);
/* custom widget */
impl->save_extra_align = gtk_alignment_new (0.0, 0.5, 1.0, 1.0);
@ -1972,6 +2106,10 @@ gtk_file_chooser_default_constructor (GType type,
gtk_widget_push_composite_child ();
/* Shortcuts model */
shortcuts_model_create (impl);
/* Widgets for Save mode */
impl->save_widgets = save_widgets_create (impl);
gtk_box_pack_start (GTK_BOX (impl), impl->save_widgets, FALSE, FALSE, 0);
@ -2118,13 +2256,13 @@ update_appearance (GtkFileChooserDefault *impl)
if (gtk_expander_get_expanded (GTK_EXPANDER (impl->save_expander)))
{
gtk_widget_set_sensitive (impl->save_folder_label, FALSE);
/*gtk_widget_set_sensitive (impl->save_folder_combo, FALSE);*/
gtk_widget_set_sensitive (impl->save_folder_combo, FALSE);
gtk_widget_show (impl->browse_widgets);
}
else
{
gtk_widget_set_sensitive (impl->save_folder_label, TRUE);
/*gtk_widget_set_sensitive (impl->save_folder_combo, TRUE);*/
gtk_widget_set_sensitive (impl->save_folder_combo, TRUE);
gtk_widget_hide (impl->browse_widgets);
}
@ -2661,9 +2799,15 @@ gtk_file_chooser_default_set_current_folder (GtkFileChooser *chooser,
const GtkFilePath *path)
{
GtkFileChooserDefault *impl = GTK_FILE_CHOOSER_DEFAULT (chooser);
gboolean had_current_folder;
if (impl->current_folder)
gtk_file_path_free (impl->current_folder);
{
gtk_file_path_free (impl->current_folder);
had_current_folder = TRUE;
}
else
had_current_folder = FALSE;
impl->current_folder = gtk_file_path_copy (path);
@ -2687,6 +2831,7 @@ gtk_file_chooser_default_set_current_folder (GtkFileChooser *chooser,
/* Refresh controls */
shortcuts_unselect_all (impl);
shortcuts_update_current_folder (impl, had_current_folder);
g_signal_emit_by_name (impl, "current-folder-changed", 0);
@ -3425,29 +3570,31 @@ shortcuts_activate_volume (GtkFileChooserDefault *impl,
gtk_file_path_free (path);
}
/* Callback used when a row in the shortcuts list is activated */
/* Opens the folder or volume at the specified index in the shortcuts list */
static void
shortcuts_row_activated_cb (GtkTreeView *tree_view,
GtkTreePath *path,
GtkTreeViewColumn *column,
GtkFileChooserDefault *impl)
shortcuts_activate_item (GtkFileChooserDefault *impl,
int item_num)
{
GtkTreePath *path;
gboolean result;
GtkTreeIter iter;
int selected, start_row;
gpointer data;
int start_row;
if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (impl->shortcuts_model), &iter, path))
if (item_num == shortcuts_get_index (impl, SHORTCUTS_BOOKMARKS_SEPARATOR))
return;
selected = *gtk_tree_path_get_indices (path);
path = gtk_tree_path_new_from_indices (item_num, -1);
result = gtk_tree_model_get_iter (GTK_TREE_MODEL (impl->shortcuts_model), &iter, path);
gtk_tree_path_free (path);
if (selected == shortcuts_get_index (impl, SHORTCUTS_SEPARATOR))
if (!result)
return;
gtk_tree_model_get (GTK_TREE_MODEL (impl->shortcuts_model), &iter, SHORTCUTS_COL_PATH, &data, -1);
start_row = shortcuts_get_index (impl, SHORTCUTS_VOLUMES);
if (selected >= start_row && selected < start_row + impl->num_volumes)
if (item_num >= start_row && item_num < start_row + impl->num_volumes)
{
GtkFileSystemVolume *volume;
@ -3463,6 +3610,34 @@ shortcuts_row_activated_cb (GtkTreeView *tree_view,
}
}
/* Callback used when a row in the shortcuts list is activated */
static void
shortcuts_row_activated_cb (GtkTreeView *tree_view,
GtkTreePath *path,
GtkTreeViewColumn *column,
GtkFileChooserDefault *impl)
{
int selected;
GtkTreeIter iter;
GtkTreeIter child_iter;
GtkTreePath *child_path;
if (!gtk_tree_model_get_iter (impl->shortcuts_filter_model, &iter, path))
return;
gtk_tree_model_filter_convert_child_iter_to_iter (GTK_TREE_MODEL_FILTER (impl->shortcuts_filter_model),
&child_iter,
&iter);
child_path = gtk_tree_model_get_path (GTK_TREE_MODEL (impl->shortcuts_model), &child_iter);
if (!child_path)
return;
selected = *gtk_tree_path_get_indices (child_path);
gtk_tree_path_free (child_path);
shortcuts_activate_item (impl, selected);
}
static gboolean
shortcuts_select_func (GtkTreeSelection *selection,
GtkTreeModel *model,
@ -3472,7 +3647,7 @@ shortcuts_select_func (GtkTreeSelection *selection,
{
GtkFileChooserDefault *impl = data;
return (*gtk_tree_path_get_indices (path) != shortcuts_get_index (impl, SHORTCUTS_SEPARATOR));
return (*gtk_tree_path_get_indices (path) != shortcuts_get_index (impl, SHORTCUTS_BOOKMARKS_SEPARATOR));
}
static void

View File

@ -163,8 +163,8 @@ gtk_file_chooser_widget_constructor (GType type,
_gtk_file_chooser_set_delegate (GTK_FILE_CHOOSER (object),
GTK_FILE_CHOOSER (priv->impl));
_gtk_file_chooser_embed_set_delegate (GTK_FILE_CHOOSER (object),
GTK_FILE_CHOOSER (priv->impl));
_gtk_file_chooser_embed_set_delegate (GTK_FILE_CHOOSER_EMBED (object),
GTK_FILE_CHOOSER_EMBED (priv->impl));
gtk_widget_pop_composite_child ();