modify in such a way that it can also negatively update the count on

2005-12-19  Kristian Rietveld  <kris@imendio.com>

	* gtk/gtkfilechooserdefault.c (shortcuts_update_count): modify
	in such a way that it can also negatively update the count on
	failures,
	(get_file_info_finished): handle failures, update save folder
	combo box on success,
	(shortcuts_insert_path): change the boolean return value into a
	void one, also refilter the model and update the save folder combo
	box for the non-asynchronous case,
	(shortcuts_append_home), (shortcuts_append_desktop),
	(shortcuts_add_volumes), (shortcuts_add_current_folder),
	(add_shortcuts_get_info_cb): adapt to shortcuts_insert_path() updates.
This commit is contained in:
Kristian Rietveld
2005-12-19 21:25:00 +00:00
committed by Kristian Rietveld
parent 6d05ff46d0
commit 5671cd6e72
3 changed files with 176 additions and 96 deletions

View File

@@ -1,3 +1,17 @@
2005-12-19 Kristian Rietveld <kris@imendio.com>
* gtk/gtkfilechooserdefault.c (shortcuts_update_count): modify
in such a way that it can also negatively update the count on
failures,
(get_file_info_finished): handle failures, update save folder
combo box on success,
(shortcuts_insert_path): change the boolean return value into a
void one, also refilter the model and update the save folder combo
box for the non-asynchronous case,
(shortcuts_append_home), (shortcuts_append_desktop),
(shortcuts_add_volumes), (shortcuts_add_current_folder),
(add_shortcuts_get_info_cb): adapt to shortcuts_insert_path() updates.
2005-12-19 Kristian Rietveld <kris@imendio.com>
* gtk/gtkpathbar.[ch]: add handle fields to ButtonData and

View File

@@ -1,3 +1,17 @@
2005-12-19 Kristian Rietveld <kris@imendio.com>
* gtk/gtkfilechooserdefault.c (shortcuts_update_count): modify
in such a way that it can also negatively update the count on
failures,
(get_file_info_finished): handle failures, update save folder
combo box on success,
(shortcuts_insert_path): change the boolean return value into a
void one, also refilter the model and update the save folder combo
box for the non-asynchronous case,
(shortcuts_append_home), (shortcuts_append_desktop),
(shortcuts_add_volumes), (shortcuts_add_current_folder),
(add_shortcuts_get_info_cb): adapt to shortcuts_insert_path() updates.
2005-12-19 Kristian Rietveld <kris@imendio.com>
* gtk/gtkpathbar.[ch]: add handle fields to ButtonData and

View File

@@ -380,6 +380,8 @@ static void add_bookmark_button_clicked_cb (GtkButton *button,
GtkFileChooserDefault *impl);
static void remove_bookmark_button_clicked_cb (GtkButton *button,
GtkFileChooserDefault *impl);
static void save_folder_combo_changed_cb (GtkComboBox *combo,
GtkFileChooserDefault *impl);
static void list_icon_data_func (GtkTreeViewColumn *tree_column,
GtkCellRenderer *cell,
@@ -1263,6 +1265,76 @@ check_is_folder (GtkFileSystem *file_system,
#endif
}
/* Removes the specified number of rows from the shortcuts list */
static void
shortcuts_remove_rows (GtkFileChooserDefault *impl,
int start_row,
int n_rows)
{
GtkTreePath *path;
path = gtk_tree_path_new_from_indices (start_row, -1);
for (; n_rows; n_rows--)
{
GtkTreeIter iter;
if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (impl->shortcuts_model), &iter, path))
g_assert_not_reached ();
shortcuts_free_row_data (impl, &iter);
gtk_list_store_remove (impl->shortcuts_model, &iter);
}
gtk_tree_path_free (path);
}
static void
shortcuts_update_count (GtkFileChooserDefault *impl,
ShortcutsIndex type,
gint value)
{
switch (type)
{
case SHORTCUTS_HOME:
if (value < 0)
impl->has_home = FALSE;
else
impl->has_home = TRUE;
break;
case SHORTCUTS_DESKTOP:
if (value < 0)
impl->has_desktop = FALSE;
else
impl->has_desktop = TRUE;
break;
case SHORTCUTS_VOLUMES:
impl->num_volumes += value;
break;
case SHORTCUTS_SHORTCUTS:
impl->num_shortcuts += value;
break;
case SHORTCUTS_BOOKMARKS:
impl->num_bookmarks += value;
break;
case SHORTCUTS_CURRENT_FOLDER:
if (value < 0)
impl->shortcuts_current_folder_active = FALSE;
else
impl->shortcuts_current_folder_active = TRUE;
break;
default:
/* nothing */
break;
}
}
struct ShortcutsInsertRequest
{
GtkFileChooserDefault *impl;
@@ -1282,6 +1354,7 @@ get_file_info_finished (GtkFileSystemHandle *handle,
const GError *error,
gpointer data)
{
gint pos = -1;
gboolean cancelled = handle->cancelled;
gboolean is_volume = FALSE;
GdkPixbuf *pixbuf;
@@ -1295,6 +1368,7 @@ get_file_info_finished (GtkFileSystemHandle *handle,
/* Handle doesn't exist anymore in the model */
goto out;
pos = gtk_tree_path_get_indices (path)[0];
gtk_tree_model_get_iter (GTK_TREE_MODEL (request->impl->shortcuts_model),
&iter, path);
gtk_tree_path_free (path);
@@ -1312,8 +1386,32 @@ get_file_info_finished (GtkFileSystemHandle *handle,
SHORTCUTS_COL_HANDLE, NULL,
-1);
if (cancelled || !info)
if (cancelled)
goto out;
if (!info)
{
gtk_list_store_remove (request->impl->shortcuts_model, &iter);
shortcuts_update_count (request->impl, request->type, -1);
if (request->type == SHORTCUTS_HOME)
{
const char *home = g_get_home_dir ();
GtkFilePath *home_path;
home_path = gtk_file_system_filename_to_path (request->impl->file_system, home);
error_getting_info_dialog (request->impl, home_path, g_error_copy (error));
gtk_file_path_free (home_path);
}
else if (request->type == SHORTCUTS_CURRENT_FOLDER)
{
/* Remove the current folder separator */
gint separator_pos = shortcuts_get_index (request->impl, SHORTCUTS_CURRENT_FOLDER_SEPARATOR);
shortcuts_remove_rows (request->impl, separator_pos, 1);
}
goto out;
}
if (!request->label_copy)
request->label_copy = g_strdup (gtk_file_info_get_display_name (info));
@@ -1331,6 +1429,22 @@ get_file_info_finished (GtkFileSystemHandle *handle,
if (request->impl->shortcuts_filter_model)
gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (request->impl->shortcuts_filter_model));
if (request->type == SHORTCUTS_CURRENT_FOLDER
&& request->impl->save_folder_combo != NULL)
{
/* The current folder is updated via _activate_iter(), don't
* have save_folder_combo_changed_cb() call _activate_iter()
* again.
*/
g_signal_handlers_block_by_func (request->impl->save_folder_combo,
G_CALLBACK (save_folder_combo_changed_cb),
request->impl);
gtk_combo_box_set_active (GTK_COMBO_BOX (request->impl->save_folder_combo), pos);
g_signal_handlers_unblock_by_func (request->impl->save_folder_combo,
G_CALLBACK (save_folder_combo_changed_cb),
request->impl);
}
if (pixbuf)
g_object_unref (pixbuf);
@@ -1343,46 +1457,10 @@ out:
g_free (request);
}
static void
shortcuts_update_count (GtkFileChooserDefault *impl,
ShortcutsIndex type)
{
switch (type)
{
case SHORTCUTS_HOME:
impl->has_home = TRUE;
break;
case SHORTCUTS_DESKTOP:
impl->has_desktop = TRUE;
break;
case SHORTCUTS_VOLUMES:
impl->num_volumes++;
break;
case SHORTCUTS_SHORTCUTS:
impl->num_shortcuts++;
break;
case SHORTCUTS_BOOKMARKS:
impl->num_bookmarks++;
break;
case SHORTCUTS_CURRENT_FOLDER:
impl->shortcuts_current_folder_active = TRUE;
break;
default:
/* nothing */
break;
}
}
/* Inserts a path in the shortcuts tree, making a copy of it; alternatively,
* inserts a volume. A position of -1 indicates the end of the tree.
*/
static gboolean
static void
shortcuts_insert_path (GtkFileChooserDefault *impl,
int pos,
gboolean is_volume,
@@ -1390,8 +1468,7 @@ shortcuts_insert_path (GtkFileChooserDefault *impl,
const GtkFilePath *path,
const char *label,
gboolean removable,
ShortcutsIndex type,
GError **error)
ShortcutsIndex type)
{
char *label_copy;
GdkPixbuf *pixbuf = NULL;
@@ -1442,9 +1519,9 @@ shortcuts_insert_path (GtkFileChooserDefault *impl,
SHORTCUTS_COL_HANDLE, handle,
-1);
shortcuts_update_count (impl, type);
shortcuts_update_count (impl, type, 1);
return TRUE;
return;
}
if (!data)
@@ -1455,7 +1532,7 @@ shortcuts_insert_path (GtkFileChooserDefault *impl,
else
gtk_list_store_insert (impl->shortcuts_model, &iter, pos);
shortcuts_update_count (impl, type);
shortcuts_update_count (impl, type, 1);
gtk_list_store_set (impl->shortcuts_model, &iter,
SHORTCUTS_COL_PIXBUF, pixbuf,
@@ -1467,14 +1544,31 @@ shortcuts_insert_path (GtkFileChooserDefault *impl,
SHORTCUTS_COL_HANDLE, NULL,
-1);
if (impl->shortcuts_filter_model)
gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (impl->shortcuts_filter_model));
if (type == SHORTCUTS_CURRENT_FOLDER && impl->save_folder_combo != NULL)
{
/* The current folder is updated via _activate_iter(), don't
* have save_folder_combo_changed_cb() call _activate_iter()
* again.
*/
gint combo_pos = shortcuts_get_index (impl, SHORTCUTS_CURRENT_FOLDER);
g_signal_handlers_block_by_func (impl->save_folder_combo,
G_CALLBACK (save_folder_combo_changed_cb),
impl);
gtk_combo_box_set_active (GTK_COMBO_BOX (impl->save_folder_combo), combo_pos);
g_signal_handlers_unblock_by_func (impl->save_folder_combo,
G_CALLBACK (save_folder_combo_changed_cb),
impl);
}
g_free (label_copy);
if (pixbuf)
g_object_unref (pixbuf);
profile_end ("end", NULL);
return TRUE;
}
/* Appends an item for the user's home directory to the shortcuts model */
@@ -1483,7 +1577,6 @@ shortcuts_append_home (GtkFileChooserDefault *impl)
{
const char *home;
GtkFilePath *home_path;
GError *error;
profile_start ("start", NULL);
@@ -1496,10 +1589,7 @@ shortcuts_append_home (GtkFileChooserDefault *impl)
home_path = gtk_file_system_filename_to_path (impl->file_system, home);
error = NULL;
shortcuts_insert_path (impl, -1, FALSE, NULL, home_path, NULL, FALSE, SHORTCUTS_HOME, &error);
if (!impl->has_home)
error_getting_info_dialog (impl, home_path, error);
shortcuts_insert_path (impl, -1, FALSE, NULL, home_path, NULL, FALSE, SHORTCUTS_HOME);
gtk_file_path_free (home_path);
@@ -1532,7 +1622,7 @@ shortcuts_append_desktop (GtkFileChooserDefault *impl)
path = gtk_file_system_filename_to_path (impl->file_system, name);
g_free (name);
shortcuts_insert_path (impl, -1, FALSE, NULL, path, _("Desktop"), FALSE, SHORTCUTS_DESKTOP, NULL);
shortcuts_insert_path (impl, -1, FALSE, NULL, path, _("Desktop"), FALSE, SHORTCUTS_DESKTOP);
/* We do not actually pop up an error dialog if there is no desktop directory
* because some people may really not want to have one.
*/
@@ -1571,7 +1661,7 @@ shortcuts_append_paths (GtkFileChooserDefault *impl,
label = gtk_file_system_get_bookmark_label (impl->file_system, path);
/* NULL GError, but we don't really want to show error boxes here */
shortcuts_insert_path (impl, start_row + num_inserted, FALSE, NULL, path, label, TRUE, SHORTCUTS_BOOKMARKS, NULL);
shortcuts_insert_path (impl, start_row + num_inserted, FALSE, NULL, path, label, TRUE, SHORTCUTS_BOOKMARKS);
num_inserted++;
g_free (label);
@@ -1637,30 +1727,6 @@ shortcuts_get_index (GtkFileChooserDefault *impl,
return n;
}
/* Removes the specified number of rows from the shortcuts list */
static void
shortcuts_remove_rows (GtkFileChooserDefault *impl,
int start_row,
int n_rows)
{
GtkTreePath *path;
path = gtk_tree_path_new_from_indices (start_row, -1);
for (; n_rows; n_rows--)
{
GtkTreeIter iter;
if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (impl->shortcuts_model), &iter, path))
g_assert_not_reached ();
shortcuts_free_row_data (impl, &iter);
gtk_list_store_remove (impl->shortcuts_model, &iter);
}
gtk_tree_path_free (path);
}
/* Adds all the file system volumes to the shortcuts model */
static void
shortcuts_add_volumes (GtkFileChooserDefault *impl)
@@ -1710,10 +1776,8 @@ shortcuts_add_volumes (GtkFileChooserDefault *impl)
}
}
if (shortcuts_insert_path (impl, start_row + n, TRUE, volume, NULL, NULL, FALSE, SHORTCUTS_VOLUMES, NULL))
n++;
else
gtk_file_system_volume_free (impl->file_system, volume);
shortcuts_insert_path (impl, start_row + n, TRUE, volume, NULL, NULL, FALSE, SHORTCUTS_VOLUMES);
n++;
}
impl->num_volumes = n;
@@ -1865,27 +1929,15 @@ shortcuts_add_current_folder (GtkFileChooserDefault *impl)
if (base_path &&
strcmp (gtk_file_path_get_string (base_path), gtk_file_path_get_string (impl->current_folder)) == 0)
{
success = shortcuts_insert_path (impl, pos, TRUE, volume, NULL, NULL, FALSE, SHORTCUTS_CURRENT_FOLDER, NULL);
if (success)
volume = NULL;
shortcuts_insert_path (impl, pos, TRUE, volume, NULL, NULL, FALSE, SHORTCUTS_CURRENT_FOLDER);
}
else
success = shortcuts_insert_path (impl, pos, FALSE, NULL, impl->current_folder, NULL, FALSE, SHORTCUTS_CURRENT_FOLDER, NULL);
if (volume)
gtk_file_system_volume_free (impl->file_system, volume);
shortcuts_insert_path (impl, pos, FALSE, NULL, impl->current_folder, NULL, FALSE, SHORTCUTS_CURRENT_FOLDER);
if (base_path)
gtk_file_path_free (base_path);
if (!success)
shortcuts_remove_rows (impl, pos - 1, 1); /* remove the separator */
impl->shortcuts_current_folder_active = success;
}
/* FIXME */
if (success && impl->save_folder_combo != NULL)
else if (impl->save_folder_combo != NULL)
gtk_combo_box_set_active (GTK_COMBO_BOX (impl->save_folder_combo), pos);
}
@@ -6172,7 +6224,7 @@ add_shortcut_get_info_cb (GtkFileSystemHandle *handle,
pos = shortcuts_get_pos_for_shortcut_folder (data->impl, data->impl->num_shortcuts);
shortcuts_insert_path (data->impl, pos, FALSE, NULL, data->path, NULL, FALSE, SHORTCUTS_SHORTCUTS, NULL);
shortcuts_insert_path (data->impl, pos, FALSE, NULL, data->path, NULL, FALSE, SHORTCUTS_SHORTCUTS);
out:
g_object_unref (data->impl);