[gtk+] file chooser: Set fixed sort functions for recent and search
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] file chooser: Set fixed sort functions for recent and search
- Date: Sat, 4 Jul 2015 04:42:47 +0000 (UTC)
commit 31a022175f9ba67d0a69f41ca29ac627919cb469
Author: Matthias Clasen <mclasen redhat com>
Date: Thu Jul 2 22:35:49 2015 -0700
file chooser: Set fixed sort functions for recent and search
gtk/gtkfilechooserwidget.c | 226 +++++++++++++++++++++++++++++---------------
1 files changed, 150 insertions(+), 76 deletions(-)
---
diff --git a/gtk/gtkfilechooserwidget.c b/gtk/gtkfilechooserwidget.c
index 90a80c0..bd1a633 100644
--- a/gtk/gtkfilechooserwidget.c
+++ b/gtk/gtkfilechooserwidget.c
@@ -3585,17 +3585,89 @@ gtk_file_chooser_widget_unmap (GtkWidget *widget)
GTK_WIDGET_CLASS (gtk_file_chooser_widget_parent_class)->unmap (widget);
}
-#define COMPARE_DIRECTORIES
\
- GtkFileChooserWidget *impl = user_data;
\
- GtkFileChooserWidgetPrivate *priv = impl->priv;
\
- GtkFileSystemModel *fs_model = GTK_FILE_SYSTEM_MODEL (model);
\
- gboolean dir_a, dir_b;
\
-
\
- dir_a = g_value_get_boolean (_gtk_file_system_model_get_value (fs_model, a, MODEL_COL_IS_FOLDER));
\
- dir_b = g_value_get_boolean (_gtk_file_system_model_get_value (fs_model, b, MODEL_COL_IS_FOLDER));
\
-
\
- if (priv->sort_directories_first && dir_a != dir_b)
\
- return priv->list_sort_ascending ? (dir_a ? -1 : 1) : (dir_a ? 1 : -1) /* Directories *always* go first
*/
+static gint
+compare_directory (GtkFileSystemModel *model,
+ GtkTreeIter *a,
+ GtkTreeIter *b,
+ GtkFileChooserWidget *impl)
+{
+ GtkFileChooserWidgetPrivate *priv = impl->priv;
+ gboolean dir_a, dir_b;
+
+ dir_a = g_value_get_boolean (_gtk_file_system_model_get_value (model, a, MODEL_COL_IS_FOLDER));
+ dir_b = g_value_get_boolean (_gtk_file_system_model_get_value (model, b, MODEL_COL_IS_FOLDER));
+
+ if (priv->sort_directories_first && dir_a != dir_b)
+ return priv->list_sort_ascending ? (dir_a ? -1 : 1) : (dir_a ? 1 : -1);
+
+ return 0;
+}
+
+static gint
+compare_name (GtkFileSystemModel *model,
+ GtkTreeIter *a,
+ GtkTreeIter *b,
+ GtkFileChooserWidget *impl)
+{
+ const char *key_a, *key_b;
+ gint result;
+
+ key_a = g_value_get_string (_gtk_file_system_model_get_value (model, a, MODEL_COL_NAME_COLLATED));
+ key_b = g_value_get_string (_gtk_file_system_model_get_value (model, b, MODEL_COL_NAME_COLLATED));
+
+ if (key_a && key_b)
+ result = strcmp (key_a, key_b);
+ else if (key_a)
+ result = 1;
+ else if (key_b)
+ result = -1;
+ else
+ result = 0;
+
+ return result;
+}
+
+static gint
+compare_size (GtkFileSystemModel *model,
+ GtkTreeIter *a,
+ GtkTreeIter *b,
+ GtkFileChooserWidget *impl)
+{
+ gint64 size_a, size_b;
+
+ size_a = g_value_get_int64 (_gtk_file_system_model_get_value (model, a, MODEL_COL_SIZE));
+ size_b = g_value_get_int64 (_gtk_file_system_model_get_value (model, b, MODEL_COL_SIZE));
+
+ return size_a < size_b ? -1 : (size_a == size_b ? 0 : 1);
+}
+
+static gint
+compare_time (GtkFileSystemModel *model,
+ GtkTreeIter *a,
+ GtkTreeIter *b,
+ GtkFileChooserWidget *impl)
+{
+ glong ta, tb;
+
+ ta = g_value_get_long (_gtk_file_system_model_get_value (model, a, MODEL_COL_TIME));
+ tb = g_value_get_long (_gtk_file_system_model_get_value (model, b, MODEL_COL_TIME));
+
+ return ta < tb ? -1 : (ta == tb ? 0 : 1);
+}
+
+static gint
+compare_location (GtkFileSystemModel *model,
+ GtkTreeIter *a,
+ GtkTreeIter *b,
+ GtkFileChooserWidget *impl)
+{
+ const char *key_a, *key_b;
+
+ key_a = g_value_get_string (_gtk_file_system_model_get_value (model, a, MODEL_COL_LOCATION_TEXT));
+ key_b = g_value_get_string (_gtk_file_system_model_get_value (model, b, MODEL_COL_LOCATION_TEXT));
+
+ return g_strcmp0 (key_a, key_b);
+}
/* Sort callback for the filename column */
static gint
@@ -3604,26 +3676,16 @@ name_sort_func (GtkTreeModel *model,
GtkTreeIter *b,
gpointer user_data)
{
- COMPARE_DIRECTORIES;
- else
- {
- const char *key_a, *key_b;
- gint result;
+ GtkFileSystemModel *fs_model = GTK_FILE_SYSTEM_MODEL (model);
+ GtkFileChooserWidget *impl = user_data;
+ gint result;
- key_a = g_value_get_string (_gtk_file_system_model_get_value (fs_model, a, MODEL_COL_NAME_COLLATED));
- key_b = g_value_get_string (_gtk_file_system_model_get_value (fs_model, b, MODEL_COL_NAME_COLLATED));
+ result = compare_directory (fs_model, a, b, impl);
- if (key_a && key_b)
- result = strcmp (key_a, key_b);
- else if (key_a)
- result = 1;
- else if (key_b)
- result = -1;
- else
- result = 0;
+ if (result == 0)
+ result = compare_name (fs_model, a, b, impl);
- return result;
- }
+ return result;
}
/* Sort callback for the size column */
@@ -3633,16 +3695,16 @@ size_sort_func (GtkTreeModel *model,
GtkTreeIter *b,
gpointer user_data)
{
- COMPARE_DIRECTORIES;
- else
- {
- gint64 size_a, size_b;
+ GtkFileSystemModel *fs_model = GTK_FILE_SYSTEM_MODEL (model);
+ GtkFileChooserWidget *impl = user_data;
+ gint result;
- size_a = g_value_get_int64 (_gtk_file_system_model_get_value (fs_model, a, MODEL_COL_SIZE));
- size_b = g_value_get_int64 (_gtk_file_system_model_get_value (fs_model, b, MODEL_COL_SIZE));
+ result = compare_directory (fs_model, a, b, impl);
- return size_a < size_b ? -1 : (size_a == size_b ? 0 : 1);
- }
+ if (result == 0)
+ result = compare_size (fs_model, a, b, impl);
+
+ return result;
}
/* Sort callback for the time column */
@@ -3652,34 +3714,58 @@ time_sort_func (GtkTreeModel *model,
GtkTreeIter *b,
gpointer user_data)
{
- COMPARE_DIRECTORIES;
- else
- {
- glong ta, tb;
+ GtkFileSystemModel *fs_model = GTK_FILE_SYSTEM_MODEL (model);
+ GtkFileChooserWidget *impl = user_data;
+ gint result;
- ta = g_value_get_long (_gtk_file_system_model_get_value (fs_model, a, MODEL_COL_TIME));
- tb = g_value_get_long (_gtk_file_system_model_get_value (fs_model, b, MODEL_COL_TIME));
+ result = compare_directory (fs_model, a, b, impl);
- return ta < tb ? -1 : (ta == tb ? 0 : 1);
- }
+ if (result == 0)
+ result = compare_time (fs_model, a, b, impl);
+
+ return result;
}
static gint
-location_sort_func (GtkTreeModel *model,
- GtkTreeIter *a,
- GtkTreeIter *b,
- gpointer user_data)
+recent_sort_func (GtkTreeModel *model,
+ GtkTreeIter *a,
+ GtkTreeIter *b,
+ gpointer user_data)
{
- COMPARE_DIRECTORIES;
- else
- {
- const char *key_a, *key_b;
+ GtkFileSystemModel *fs_model = GTK_FILE_SYSTEM_MODEL (model);
+ GtkFileChooserWidget *impl = user_data;
+ gint result;
- key_a = g_value_get_string (_gtk_file_system_model_get_value (fs_model, a, MODEL_COL_LOCATION_TEXT));
- key_b = g_value_get_string (_gtk_file_system_model_get_value (fs_model, b, MODEL_COL_LOCATION_TEXT));
+ result = compare_time (fs_model, a, b, impl);
- return g_strcmp0 (key_a, key_b);
- }
+ if (result == 0)
+ result = compare_name (fs_model, a, b, impl);
+
+ if (result == 0)
+ result = compare_location (fs_model, a, b, impl);
+
+ return result;
+}
+
+static gint
+search_sort_func (GtkTreeModel *model,
+ GtkTreeIter *a,
+ GtkTreeIter *b,
+ gpointer user_data)
+{
+ GtkFileSystemModel *fs_model = GTK_FILE_SYSTEM_MODEL (model);
+ GtkFileChooserWidget *impl = user_data;
+ gint result;
+
+ result = compare_location (fs_model, a, b, impl);
+
+ if (result == 0)
+ result = compare_name (fs_model, a, b, impl);
+
+ if (result == 0)
+ result = compare_time (fs_model, a, b, impl);
+
+ return result;
}
/* Callback used when the sort column changes. We cache the sort order for use
@@ -4497,7 +4583,6 @@ set_list_model (GtkFileChooserWidget *impl,
gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (priv->browse_files_model), MODEL_COL_NAME,
name_sort_func, impl, NULL);
gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (priv->browse_files_model), MODEL_COL_SIZE,
size_sort_func, impl, NULL);
gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (priv->browse_files_model), MODEL_COL_TIME,
time_sort_func, impl, NULL);
- gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (priv->browse_files_model), MODEL_COL_LOCATION_TEXT,
location_sort_func, impl, NULL);
gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (priv->browse_files_model), NULL, NULL, NULL);
set_sort_column (impl);
priv->list_sort_ascending = TRUE;
@@ -6575,24 +6660,8 @@ search_setup_model (GtkFileChooserWidget *impl)
impl,
MODEL_COLUMN_TYPES);
- gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (priv->search_model),
- MODEL_COL_NAME,
- name_sort_func,
- impl, NULL);
- gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (priv->search_model),
- MODEL_COL_TIME,
- time_sort_func,
- impl, NULL);
- gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (priv->search_model),
- MODEL_COL_SIZE,
- size_sort_func,
- impl, NULL);
- gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (priv->search_model),
- MODEL_COL_LOCATION_TEXT,
- location_sort_func,
- impl, NULL);
gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (priv->search_model),
- location_sort_func,
+ search_sort_func,
impl, NULL);
gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (priv->search_model),
GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID,
@@ -6604,7 +6673,12 @@ search_setup_model (GtkFileChooserWidget *impl)
*/
gtk_tree_view_set_model (GTK_TREE_VIEW (priv->browse_files_tree_view),
GTK_TREE_MODEL (priv->search_model));
- file_list_set_sort_column_ids (impl);
+
+ gtk_tree_view_column_set_sort_column_id (priv->list_name_column, -1);
+ gtk_tree_view_column_set_sort_column_id (priv->list_time_column, -1);
+ gtk_tree_view_column_set_sort_column_id (priv->list_size_column, -1);
+ gtk_tree_view_column_set_sort_column_id (priv->list_location_column, -1);
+
gtk_tree_view_column_set_visible (priv->list_location_column, TRUE);
gtk_tree_view_column_set_title (priv->list_time_column, _("Modified"));
gtk_tree_view_columns_autosize (GTK_TREE_VIEW (priv->browse_files_tree_view));
@@ -6782,7 +6856,7 @@ recent_setup_model (GtkFileChooserWidget *impl)
_gtk_file_system_model_set_filter (priv->recent_model,
priv->current_filter);
gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (priv->recent_model),
- time_sort_func,
+ recent_sort_func,
impl, NULL);
gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (priv->recent_model),
GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]