/* Interesting places in the shortcuts bar */
typedef enum {
SHORTCUTS_SEARCH,
- SHORTCUTS_SEARCH_SEPARATOR,
SHORTCUTS_RECENT,
SHORTCUTS_RECENT_SEPARATOR,
SHORTCUTS_HOME,
static GSList *search_get_selected_paths (GtkFileChooserDefault *impl);
static void search_entry_activate_cb (GtkEntry *entry,
gpointer data);
+static void search_get_valid_child_iter (GtkFileChooserDefault *impl,
+ GtkTreeIter *child_iter,
+ GtkTreeIter *iter);
static void recent_manager_update (GtkFileChooserDefault *impl);
static void recent_stop_loading (GtkFileChooserDefault *impl);
static gboolean recent_should_respond (GtkFileChooserDefault *impl);
static void recent_switch_to_browse_mode (GtkFileChooserDefault *impl);
static GSList * recent_get_selected_paths (GtkFileChooserDefault *impl);
+static void recent_get_valid_child_iter (GtkFileChooserDefault *impl,
+ GtkTreeIter *child_iter,
+ GtkTreeIter *iter);
+
\f
const GtkFilePath *path,
GError *error)
{
- if (G_LIKELY (error))
+ if (error)
{
char *uri = NULL;
char *text;
n += impl->has_search ? 1 : 0;
- if (where == SHORTCUTS_SEARCH_SEPARATOR)
- goto out;
-
- n += impl->has_search ? 1 : 0;
-
if (where == SHORTCUTS_RECENT)
goto out;
{
GtkTreeIter iter;
- g_assert (where == SHORTCUTS_SEARCH_SEPARATOR ||
- where == SHORTCUTS_RECENT_SEPARATOR ||
+ g_assert (where == SHORTCUTS_RECENT_SEPARATOR ||
where == SHORTCUTS_BOOKMARKS_SEPARATOR ||
where == SHORTCUTS_CURRENT_FOLDER_SEPARATOR);
if (search_is_possible (impl))
{
shortcuts_append_search (impl);
- shortcuts_insert_separator (impl, SHORTCUTS_SEARCH_SEPARATOR);
}
if (impl->recent_manager)
break;
case OPERATION_MODE_SEARCH:
- gtk_tree_model_filter_convert_iter_to_child_iter (impl->search_model_filter,
- &child_iter, iter);
+ search_get_valid_child_iter (impl, &child_iter, iter);
gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), &child_iter,
SEARCH_MODEL_COL_PATH, &file_path,
-1);
break;
case OPERATION_MODE_RECENT:
- gtk_tree_model_filter_convert_iter_to_child_iter (impl->recent_model_filter,
- &child_iter, iter);
+ recent_get_valid_child_iter (impl, &child_iter, iter);
gtk_tree_model_get (GTK_TREE_MODEL (impl->recent_model), &child_iter,
RECENT_MODEL_COL_PATH, &file_path,
-1);
break;
case OPERATION_MODE_SEARCH:
- gtk_tree_model_filter_convert_iter_to_child_iter (closure->impl->search_model_filter, &child_iter, iter);
+ search_get_valid_child_iter (closure->impl, &child_iter, iter);
gtk_tree_model_get (GTK_TREE_MODEL (closure->impl->search_model), &child_iter,
SEARCH_MODEL_COL_IS_FOLDER, &is_folder,
-1);
break;
case OPERATION_MODE_RECENT:
- gtk_tree_model_filter_convert_iter_to_child_iter (closure->impl->recent_model_filter, &child_iter, iter);
+ recent_get_valid_child_iter (closure->impl, &child_iter, iter);
gtk_tree_model_get (GTK_TREE_MODEL (closure->impl->recent_model), &child_iter,
RECENT_MODEL_COL_IS_FOLDER, &is_folder,
-1);
break;
case OPERATION_MODE_SEARCH:
- gtk_tree_model_filter_convert_iter_to_child_iter (closure->impl->search_model_filter, &child_iter, iter);
+ search_get_valid_child_iter (closure->impl, &child_iter, iter);
gtk_tree_model_get (GTK_TREE_MODEL (closure->impl->search_model), &child_iter,
SEARCH_MODEL_COL_PATH, &closure->path,
-1);
break;
case OPERATION_MODE_RECENT:
- gtk_tree_model_filter_convert_iter_to_child_iter (closure->impl->recent_model_filter, &child_iter, iter);
+ recent_get_valid_child_iter (closure->impl, &child_iter, iter);
gtk_tree_model_get (GTK_TREE_MODEL (closure->impl->recent_model), &child_iter,
RECENT_MODEL_COL_PATH, &closure->path,
-1);
break;
case OPERATION_MODE_SEARCH:
- gtk_tree_model_filter_convert_iter_to_child_iter (udata->impl->search_model_filter, &child_iter, iter);
+ search_get_valid_child_iter (udata->impl, &child_iter, iter);
gtk_tree_model_get (GTK_TREE_MODEL (udata->impl->search_model), &child_iter,
SEARCH_MODEL_COL_DISPLAY_NAME, &display_name,
-1);
break;
case OPERATION_MODE_RECENT:
- gtk_tree_model_filter_convert_iter_to_child_iter (udata->impl->recent_model_filter, &child_iter, iter);
+ recent_get_valid_child_iter (udata->impl, &child_iter, iter);
gtk_tree_model_get (GTK_TREE_MODEL (udata->impl->recent_model), &child_iter,
RECENT_MODEL_COL_DISPLAY_NAME, &display_name,
-1);
idx = shortcuts_get_index (impl, SHORTCUTS_SEARCH);
if (idx == indices[0])
retval = FALSE;
- else
- {
- idx = shortcuts_get_index (impl, SHORTCUTS_SEARCH_SEPARATOR);
- if (idx == indices[0])
- retval = FALSE;
- }
}
if (impl->has_recent)
}
else if (impl->operation_mode == OPERATION_MODE_SEARCH)
{
- gtk_tree_model_filter_convert_iter_to_child_iter (impl->search_model_filter,
- &child_iter,
- &closure.first_selected_iter);
+ search_get_valid_child_iter (impl, &child_iter, &closure.first_selected_iter);
gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), &child_iter,
SEARCH_MODEL_COL_DISPLAY_NAME, &file_part,
-1);
}
else if (impl->operation_mode == OPERATION_MODE_RECENT)
{
- gtk_tree_model_filter_convert_iter_to_child_iter (impl->recent_model_filter,
- &child_iter,
- &closure.first_selected_iter);
+ recent_get_valid_child_iter (impl, &child_iter, &closure.first_selected_iter);
gtk_tree_model_get (GTK_TREE_MODEL (impl->recent_model), &child_iter,
RECENT_MODEL_COL_DISPLAY_NAME, &file_part,
-1);
g_object_unref (impl->search_model_filter);
impl->search_model_filter = NULL;
+
+ g_object_unref (impl->search_model_sort);
+ impl->search_model_sort = NULL;
if (remove_from_treeview)
gtk_tree_view_set_model (GTK_TREE_VIEW (impl->browse_files_tree_view), NULL);
SEARCH_MODEL_COL_COLLATION_KEY, &collation_key_b,
-1);
+ if (!collation_key_a)
+ return 1;
+
+ if (!collation_key_b)
+ return -1;
+
/* always show folders first */
if (is_folder_a != is_folder_b)
return is_folder_a ? 1 : -1;
SEARCH_MODEL_COL_IS_FOLDER, &is_folder_b,
SEARCH_MODEL_COL_STAT, &statbuf_b,
-1);
+
+ if (!statbuf_a)
+ return 1;
+
+ if (!statbuf_b)
+ return -1;
if (is_folder_a != is_folder_b)
return is_folder_a ? 1 : -1;
{
g_assert (impl->search_model == NULL);
g_assert (impl->search_model_filter == NULL);
+ g_assert (impl->search_model_sort == NULL);
/* We store these columns in the search model:
*
GDK_TYPE_PIXBUF,
G_TYPE_POINTER,
G_TYPE_BOOLEAN);
- gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (impl->search_model),
+
+ impl->search_model_filter =
+ GTK_TREE_MODEL_FILTER (gtk_tree_model_filter_new (GTK_TREE_MODEL (impl->search_model), NULL));
+ gtk_tree_model_filter_set_visible_func (impl->search_model_filter,
+ search_model_visible_func,
+ impl, NULL);
+
+ impl->search_model_sort =
+ GTK_TREE_MODEL_SORT (gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (impl->search_model_filter)));
+ gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (impl->search_model_sort),
SEARCH_MODEL_COL_PATH,
search_column_path_sort_func,
impl,
NULL);
- gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (impl->search_model),
+ gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (impl->search_model_sort),
SEARCH_MODEL_COL_STAT,
search_column_mtime_sort_func,
impl,
NULL);
-
- gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (impl->search_model),
+ gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (impl->search_model_sort),
SEARCH_MODEL_COL_STAT,
GTK_SORT_DESCENDING);
-
- impl->search_model_filter =
- GTK_TREE_MODEL_FILTER (gtk_tree_model_filter_new (GTK_TREE_MODEL (impl->search_model), NULL));
- gtk_tree_model_filter_set_visible_func (impl->search_model_filter,
- search_model_visible_func,
- impl, NULL);
/* EB: setting the model here will make the hits list update feel
* more "alive" than setting the model at the end of the search
* run
*/
gtk_tree_view_set_model (GTK_TREE_VIEW (impl->browse_files_tree_view),
- GTK_TREE_MODEL (impl->search_model_filter));
+ GTK_TREE_MODEL (impl->search_model_sort));
+}
+
+static void
+search_get_valid_child_iter (GtkFileChooserDefault *impl,
+ GtkTreeIter *child_iter,
+ GtkTreeIter *iter)
+{
+ GtkTreeIter middle;
+
+ if (!impl->search_model)
+ return;
+
+ if (!impl->search_model_filter || !impl->search_model_sort)
+ return;
+
+ /* pass 1: get the iterator in the filter model */
+ gtk_tree_model_sort_convert_iter_to_child_iter (impl->search_model_sort,
+ &middle, iter);
+
+ /* pass 2: get the iterator in the real model */
+ gtk_tree_model_filter_convert_iter_to_child_iter (impl->search_model_filter,
+ child_iter, &middle);
}
/* Creates a new query with the specified text and launches it */
g_object_unref (impl->recent_model_filter);
impl->recent_model_filter = NULL;
+ g_object_unref (impl->recent_model_sort);
+ impl->recent_model_sort = NULL;
+
if (remove_from_treeview)
gtk_tree_view_set_model (GTK_TREE_VIEW (impl->browse_files_tree_view), NULL);
}
RECENT_MODEL_COL_IS_FOLDER, &is_folder_b,
RECENT_MODEL_COL_INFO, &info_b,
-1);
+
+ if (!info_a)
+ return 1;
+
+ if (!info_b)
+ return -1;
/* folders always go first */
if (is_folder_a != is_folder_b)
return 0;
}
+static gint
+recent_column_path_sort_func (GtkTreeModel *model,
+ GtkTreeIter *a,
+ GtkTreeIter *b,
+ gpointer user_data)
+{
+ gchar *name_a, *name_b;
+
+ gtk_tree_model_get (model, a, RECENT_MODEL_COL_DISPLAY_NAME, &name_a, -1);
+ gtk_tree_model_get (model, b, RECENT_MODEL_COL_DISPLAY_NAME, &name_b, -1);
+
+ if (!name_a)
+ return 1;
+
+ if (!name_b);
+ return -1;
+
+ return strcmp (name_a, name_b);
+}
+
static gboolean
recent_get_is_filtered (GtkFileChooserDefault *impl,
const GtkFilePath *path,
{
g_assert (impl->recent_model == NULL);
g_assert (impl->recent_model_filter == NULL);
+ g_assert (impl->recent_model_sort == NULL);
/* We store these columns in the search model:
*
G_TYPE_POINTER,
G_TYPE_BOOLEAN,
G_TYPE_POINTER);
-
- gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (impl->recent_model),
- RECENT_MODEL_COL_INFO,
- recent_column_mtime_sort_func,
- impl,
- NULL);
- gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (impl->recent_model),
- RECENT_MODEL_COL_INFO,
- GTK_SORT_DESCENDING);
impl->recent_model_filter =
GTK_TREE_MODEL_FILTER (gtk_tree_model_filter_new (GTK_TREE_MODEL (impl->recent_model), NULL));
recent_model_visible_func,
impl,
NULL);
+
+ /* this is the model that will actually be added to
+ * the browse_files_tree_view widget; remember: we are
+ * stuffing the real model into a filter model and then
+ * into a sort model; this means we'll have to translate
+ * the child iterator *twice* to get from a path or an
+ * iterator coming from the tree view widget to the
+ * real data inside the model.
+ */
+ impl->recent_model_sort =
+ GTK_TREE_MODEL_SORT (gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (impl->recent_model_filter)));
+ gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (impl->recent_model_sort),
+ RECENT_MODEL_COL_INFO,
+ recent_column_mtime_sort_func,
+ impl, NULL);
+ gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (impl->recent_model_sort),
+ RECENT_MODEL_COL_PATH,
+ recent_column_path_sort_func,
+ impl, NULL);
+ gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (impl->recent_model_sort),
+ RECENT_MODEL_COL_INFO,
+ GTK_SORT_DESCENDING);
}
typedef struct
GtkFileChooserDefault *impl = load_data->impl;
gtk_tree_view_set_model (GTK_TREE_VIEW (impl->browse_files_tree_view),
- GTK_TREE_MODEL (impl->recent_model_filter));
+ GTK_TREE_MODEL (impl->recent_model_sort));
set_busy_cursor (impl, FALSE);
gtk_widget_hide (impl->location_button);
gtk_widget_hide (impl->location_entry_box);
}
-
- /* EB: hide the filter combo? */
}
/* Main entry point to the recent files functions; this gets called when
recent_start_loading (impl);
}
+/* convert an iterator coming from the model bound to
+ * browse_files_tree_view to an interator inside the
+ * real recent_model
+ */
+static void
+recent_get_valid_child_iter (GtkFileChooserDefault *impl,
+ GtkTreeIter *child_iter,
+ GtkTreeIter *iter)
+{
+ GtkTreeIter middle;
+
+ if (!impl->recent_model)
+ return;
+
+ if (!impl->recent_model_filter || !impl->recent_model_sort)
+ return;
+
+ /* pass 1: get the iterator in the filter model */
+ gtk_tree_model_sort_convert_iter_to_child_iter (impl->recent_model_sort,
+ &middle, iter);
+
+ /* pass 2: get the iterator in the real model */
+ gtk_tree_model_filter_convert_iter_to_child_iter (impl->recent_model_filter,
+ child_iter,
+ &middle);
+}
+
static void
set_current_filter (GtkFileChooserDefault *impl,
{
GtkTreeIter iter;
- gtk_tree_model_get_iter (GTK_TREE_MODEL (impl->search_model_filter),
+ gtk_tree_model_get_iter (GTK_TREE_MODEL (impl->search_model_sort),
&iter, cursor_path);
gtk_tree_path_free (cursor_path);
- gtk_tree_model_filter_convert_iter_to_child_iter (impl->search_model_filter,
- &child_iter, &iter);
- gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), &child_iter,
+ search_get_valid_child_iter (impl, &child_iter, &iter);
+ gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), &child_iter,
SEARCH_MODEL_COL_PATH, &new_path,
SEARCH_MODEL_COL_DISPLAY_NAME, &new_display_name,
-1);
{
GtkTreeIter iter;
- gtk_tree_model_get_iter (GTK_TREE_MODEL (impl->recent_model_filter),
+ gtk_tree_model_get_iter (GTK_TREE_MODEL (impl->recent_model_sort),
&iter, cursor_path);
gtk_tree_path_free (cursor_path);
- gtk_tree_model_filter_convert_iter_to_child_iter (impl->recent_model_filter,
- &child_iter, &iter);
-
+ recent_get_valid_child_iter (impl, &child_iter, &iter);
gtk_tree_model_get (GTK_TREE_MODEL (impl->recent_model), &child_iter,
RECENT_MODEL_COL_PATH, &new_path,
RECENT_MODEL_COL_DISPLAY_NAME, &new_display_name,
{
GtkFileChooserDefault *impl = data;
- if (impl->operation_mode == OPERATION_MODE_SEARCH)
- return TRUE;
-
if (impl->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER ||
impl->action == GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER)
{
GtkTreeIter iter, child_iter;
- const GtkFileInfo *info;
- if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (impl->sort_model), &iter, path))
- return FALSE;
-
- gtk_tree_model_sort_convert_iter_to_child_iter (impl->sort_model, &child_iter, &iter);
+ switch (impl->operation_mode)
+ {
+ case OPERATION_MODE_SEARCH:
+ {
+ gboolean is_folder;
- info = _gtk_file_system_model_get_info (impl->browse_files_model, &child_iter);
+ if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (impl->search_model_sort), &iter, path))
+ return FALSE;
- if (info && !gtk_file_info_get_is_folder (info))
- return FALSE;
+ search_get_valid_child_iter (impl, &child_iter, &iter);
+ gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), &child_iter,
+ SEARCH_MODEL_COL_IS_FOLDER, &is_folder,
+ -1);
+ if (!is_folder)
+ return FALSE;
+ }
+ break;
+
+ case OPERATION_MODE_RECENT:
+ {
+ gboolean is_folder;
+
+ if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (impl->recent_model_sort), &iter, path))
+ return FALSE;
+
+ recent_get_valid_child_iter (impl, &child_iter, &iter);
+ gtk_tree_model_get (GTK_TREE_MODEL (impl->recent_model), &child_iter,
+ RECENT_MODEL_COL_IS_FOLDER, &is_folder,
+ -1);
+ if (!is_folder)
+ return FALSE;
+ }
+ break;
+
+ case OPERATION_MODE_BROWSE:
+ {
+ const GtkFileInfo *info;
+
+ if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (impl->sort_model), &iter, path))
+ return FALSE;
+
+ gtk_tree_model_sort_convert_iter_to_child_iter (impl->sort_model, &child_iter, &iter);
+ info = _gtk_file_system_model_get_info (impl->browse_files_model, &child_iter);
+ if (info && !gtk_file_info_get_is_folder (info))
+ return FALSE;
+ }
+ break;
+ }
}
return TRUE;
GtkFilePath *file_path;
gboolean is_folder;
- if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (impl->search_model_filter), &iter, path))
+ if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (impl->search_model_sort), &iter, path))
return;
- gtk_tree_model_filter_convert_iter_to_child_iter (impl->search_model_filter,
- &child_iter, &iter);
+ search_get_valid_child_iter (impl, &child_iter, &iter);
gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), &child_iter,
SEARCH_MODEL_COL_PATH, &file_path,
SEARCH_MODEL_COL_IS_FOLDER, &is_folder,
GtkFilePath *file_path;
gboolean is_folder;
- if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (impl->recent_model_filter), &iter, path))
+ if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (impl->recent_model_sort), &iter, path))
return;
- gtk_tree_model_filter_convert_iter_to_child_iter (impl->recent_model_filter,
- &child_iter, &iter);
-
+ recent_get_valid_child_iter (impl, &child_iter, &iter);
gtk_tree_model_get (GTK_TREE_MODEL (impl->recent_model), &child_iter,
RECENT_MODEL_COL_PATH, &file_path,
RECENT_MODEL_COL_IS_FOLDER, &is_folder,
case OPERATION_MODE_SEARCH:
{
GtkTreeIter child_iter;
+ gboolean is_folder;
- gtk_tree_model_filter_convert_iter_to_child_iter (impl->search_model_filter,
- &child_iter, iter);
+ search_get_valid_child_iter (impl, &child_iter, iter);
gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), &child_iter,
SEARCH_MODEL_COL_PIXBUF, &pixbuf,
+ SEARCH_MODEL_COL_IS_FOLDER, &is_folder,
-1);
- sensitive = TRUE;
+
+ if (impl->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER ||
+ impl->action == GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER)
+ sensitive = is_folder;
}
break;
{
GtkTreeIter child_iter;
GtkRecentInfo *info;
+ gboolean is_folder;
- gtk_tree_model_filter_convert_iter_to_child_iter (impl->recent_model_filter,
- &child_iter, iter);
-
+ recent_get_valid_child_iter (impl, &child_iter, iter);
gtk_tree_model_get (GTK_TREE_MODEL (impl->recent_model), &child_iter,
RECENT_MODEL_COL_INFO, &info,
+ RECENT_MODEL_COL_IS_FOLDER, &is_folder,
-1);
pixbuf = gtk_recent_info_get_icon (info, impl->icon_size);
-
- if (impl->local_only && !gtk_recent_info_is_local (info))
- sensitive = FALSE;
+
+ if (impl->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER ||
+ impl->action == GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER)
+ sensitive = is_folder;
}
break;
{
GtkFileChooserDefault *impl = data;
const GtkFileInfo *info;
- gboolean sensitive;
+ gboolean sensitive = TRUE;
if (impl->operation_mode == OPERATION_MODE_SEARCH)
{
GtkFilePath *file_path;
gchar *display_name, *tmp;
gchar *text;
+ gboolean is_folder;
- gtk_tree_model_filter_convert_iter_to_child_iter (impl->search_model_filter, &child_iter, iter);
+ search_get_valid_child_iter (impl, &child_iter, iter);
gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), &child_iter,
SEARCH_MODEL_COL_PATH, &file_path,
SEARCH_MODEL_COL_DISPLAY_NAME, &display_name,
+ SEARCH_MODEL_COL_IS_FOLDER, &is_folder,
-1);
tmp = gtk_file_system_path_to_filename (impl->file_system, file_path);
text = g_strdup_printf ("<b>%s</b>\n%s", display_name, tmp);
g_free (tmp);
+ if (impl->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER ||
+ impl->action == GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER)
+ {
+ sensitive = is_folder;
+ }
+
g_object_set (cell,
"markup", text,
- "sensitive", TRUE,
+ "sensitive", sensitive,
"ellipsize", PANGO_ELLIPSIZE_END,
NULL);
{
GtkTreeIter child_iter;
GtkRecentInfo *recent_info;
- char *tmp, *text;
-
- gtk_tree_model_filter_convert_iter_to_child_iter (impl->recent_model_filter, &child_iter, iter);
+ gchar *tmp, *text;
+ gboolean is_folder;
+ recent_get_valid_child_iter (impl, &child_iter, iter);
gtk_tree_model_get (GTK_TREE_MODEL (impl->recent_model), &child_iter,
RECENT_MODEL_COL_INFO, &recent_info,
+ RECENT_MODEL_COL_IS_FOLDER, &is_folder,
-1);
tmp = gtk_recent_info_get_short_name (recent_info);
gtk_recent_info_get_uri_display (recent_info));
g_free (tmp);
+ if (impl->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER ||
+ impl->action == GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER)
+ {
+ sensitive = is_folder;
+ }
+
g_object_set (cell,
"markup", text,
- "sensitive", TRUE,
+ "sensitive", sensitive,
"ellipsize", PANGO_ELLIPSIZE_END,
NULL);
g_free (text);
{
GtkTreeIter child_iter;
struct stat *statbuf;
+ gboolean is_folder;
- gtk_tree_model_filter_convert_iter_to_child_iter (impl->search_model_filter, &child_iter, iter);
+ search_get_valid_child_iter (impl, &child_iter, iter);
gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), &child_iter,
- SEARCH_MODEL_COL_STAT, &statbuf,
+ SEARCH_MODEL_COL_STAT, &statbuf,
+ SEARCH_MODEL_COL_IS_FOLDER, &is_folder,
-1);
- time_mtime = statbuf->st_mtime;
+ if (statbuf)
+ time_mtime = statbuf->st_mtime;
+ else
+ time_mtime = 0;
+
+
+ if (impl->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER ||
+ impl->action == GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER)
+ sensitive = is_folder;
}
else if (impl->operation_mode == OPERATION_MODE_RECENT)
{
GtkTreeIter child_iter;
GtkRecentInfo *info;
+ gboolean is_folder;
- gtk_tree_model_filter_convert_iter_to_child_iter (impl->recent_model_filter, &child_iter, iter);
+ recent_get_valid_child_iter (impl, &child_iter, iter);
gtk_tree_model_get (GTK_TREE_MODEL (impl->recent_model), &child_iter,
RECENT_MODEL_COL_INFO, &info,
+ RECENT_MODEL_COL_IS_FOLDER, &is_folder,
-1);
- time_mtime = (GtkFileTime) gtk_recent_info_get_modified (info);
- if (impl->local_only && !gtk_recent_info_is_local (info))
- sensitive = FALSE;
+ if (info)
+ time_mtime = (GtkFileTime) gtk_recent_info_get_modified (info);
+ else
+ time_mtime = 0;
+
+ if (impl->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER ||
+ impl->action == GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER)
+ sensitive = is_folder;
}
else
{