[gtk/gbsneto/filechooser-column-view: 51/105] filechooserwidget: Move location to column view
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/gbsneto/filechooser-column-view: 51/105] filechooserwidget: Move location to column view
- Date: Wed, 12 Oct 2022 20:42:35 +0000 (UTC)
commit a8c1706e60c0270680ca77fba758d3ce8f0d7a2b
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date: Sat Oct 8 09:01:42 2022 -0300
filechooserwidget: Move location to column view
Move the entire location column, which only contains the location
renderer, to the column view. The code to generate locations from
the current folder is essentially intact.
gtk/gtkfilechooserwidget.c | 161 +++++++++++++++++++----------------------
gtk/ui/gtkfilechooserwidget.ui | 48 ++++++++----
2 files changed, 105 insertions(+), 104 deletions(-)
---
diff --git a/gtk/gtkfilechooserwidget.c b/gtk/gtkfilechooserwidget.c
index 8f5f7d3afd..ad72ed3166 100644
--- a/gtk/gtkfilechooserwidget.c
+++ b/gtk/gtkfilechooserwidget.c
@@ -28,6 +28,7 @@
#include "deprecated/gtkcellrenderertext.h"
#include "gtkdropdown.h"
#include "gtkcolumnview.h"
+#include "gtkcolumnviewcolumn.h"
#include "gtkcssnumbervalueprivate.h"
#include "gtkdragsource.h"
#include "gtkdroptarget.h"
@@ -42,6 +43,7 @@
#include "gtkgrid.h"
#include "gtkicontheme.h"
#include "gtklabel.h"
+#include "gtklistitem.h"
#include "gtkmarshalers.h"
#include "gtkmessagedialog.h"
#include "gtkmountoperation.h"
@@ -278,8 +280,8 @@ struct _GtkFileChooserWidget
GtkCellRenderer *list_size_renderer;
GtkTreeViewColumn *list_type_column;
GtkCellRenderer *list_type_renderer;
- GtkTreeViewColumn *list_location_column;
- GtkCellRenderer *list_location_renderer;
+
+ GtkColumnViewColumn *column_view_location_column;
guint location_changed_id;
@@ -361,7 +363,6 @@ enum {
MODEL_COL_SIZE_TEXT,
MODEL_COL_DATE_TEXT,
MODEL_COL_TIME_TEXT,
- MODEL_COL_LOCATION_TEXT,
MODEL_COL_ELLIPSIZE,
MODEL_COL_NUM_COLUMNS
};
@@ -380,7 +381,6 @@ enum {
G_TYPE_STRING, /* MODEL_COL_SIZE_TEXT */ \
G_TYPE_STRING, /* MODEL_COL_DATE_TEXT */ \
G_TYPE_STRING, /* MODEL_COL_TIME_TEXT */ \
- G_TYPE_STRING, /* MODEL_COL_LOCATION_TEXT */ \
PANGO_TYPE_ELLIPSIZE_MODE /* MODEL_COL_ELLIPSIZE */
#define DEFAULT_RECENT_FILES_LIMIT 50
@@ -2070,6 +2070,70 @@ long_press_cb (GtkGesture *gesture,
file_list_show_popover (impl, x, y);
}
+static char *
+column_view_get_location (GtkListItem *list_item)
+{
+ GtkFileChooserWidget *impl;
+ GtkFileSystemItem *item;
+ GFile *home_location;
+ GFile *dir_location;
+ GFile *file;
+ char *location;
+
+ item = gtk_list_item_get_item (list_item);
+ if (!item)
+ return NULL;
+
+ file = _gtk_file_system_item_get_file (item);
+
+ home_location = g_file_new_for_path (g_get_home_dir ());
+ if (file)
+ dir_location = g_file_get_parent (file);
+ else
+ dir_location = NULL;
+
+ if (dir_location && file_is_recent_uri (dir_location))
+ {
+ const char *target_uri;
+ GFileInfo *info;
+ GFile *target;
+
+ info = _gtk_file_system_item_get_file_info (item);
+ target_uri = g_file_info_get_attribute_string (info, G_FILE_ATTRIBUTE_STANDARD_TARGET_URI);
+ target = g_file_new_for_uri (target_uri);
+ g_object_unref (dir_location);
+ dir_location = g_file_get_parent (target);
+ g_clear_object (&target);
+ }
+
+ impl = GTK_FILE_CHOOSER_WIDGET (gtk_widget_get_ancestor (gtk_list_item_get_child (list_item),
+ GTK_TYPE_FILE_CHOOSER_WIDGET));
+ g_assert (impl != NULL);
+
+ if (!dir_location)
+ location = g_strdup ("/");
+ else if (impl->current_folder && g_file_equal (impl->current_folder, dir_location))
+ location = g_strdup ("");
+ else if (g_file_equal (home_location, dir_location))
+ location = g_strdup (_("Home"));
+ else if (g_file_has_prefix (dir_location, home_location))
+ {
+ char *relative_path;
+
+ relative_path = g_file_get_relative_path (home_location, dir_location);
+ location = g_filename_display_name (relative_path);
+
+ g_free (relative_path);
+ }
+ else
+ location = g_file_get_path (dir_location);
+
+ g_clear_object (&dir_location);
+ g_clear_object (&home_location);
+
+ return g_steal_pointer (&location);
+}
+
typedef struct {
OperationMode operation_mode;
int general_column;
@@ -2088,7 +2152,6 @@ file_list_set_sort_column_ids (GtkFileChooserWidget *impl)
gtk_tree_view_column_set_sort_column_id (impl->list_time_column, MODEL_COL_TIME);
gtk_tree_view_column_set_sort_column_id (impl->list_size_column, MODEL_COL_SIZE);
gtk_tree_view_column_set_sort_column_id (impl->list_type_column, MODEL_COL_TYPE);
- gtk_tree_view_column_set_sort_column_id (impl->list_location_column, MODEL_COL_LOCATION_TEXT);
}
static gboolean
@@ -3601,20 +3664,6 @@ compare_time (GtkFileSystemModel *model,
return ta < tb ? -1 : (ta == tb ? 0 : 1);
}
-static int
-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 int
name_sort_func (GtkTreeModel *model,
@@ -3706,9 +3755,6 @@ recent_sort_func (GtkTreeModel *model,
if (result == 0)
result = compare_name (fs_model, a, b, impl);
- if (result == 0)
- result = compare_location (fs_model, a, b, impl);
-
return result;
}
@@ -3722,10 +3768,7 @@ search_sort_func (GtkTreeModel *model,
GtkFileChooserWidget *impl = user_data;
int result;
- result = compare_location (fs_model, a, b, impl);
-
- if (result == 0)
- result = compare_name (fs_model, a, b, impl);
+ result = compare_name (fs_model, a, b, impl);
if (result == 0)
result = compare_time (fs_model, a, b, impl);
@@ -3776,9 +3819,9 @@ update_columns (GtkFileChooserWidget *impl,
{
gboolean need_resize = FALSE;
- if (gtk_tree_view_column_get_visible (impl->list_location_column) != location_visible)
+ if (gtk_column_view_column_get_visible (impl->column_view_location_column) != location_visible)
{
- gtk_tree_view_column_set_visible (impl->list_location_column, location_visible);
+ gtk_column_view_column_set_visible (impl->column_view_location_column, location_visible);
need_resize = TRUE;
}
@@ -3791,7 +3834,6 @@ update_columns (GtkFileChooserWidget *impl,
if (need_resize)
{
/* This undoes user resizing of columns when the columns change. */
- gtk_tree_view_column_set_expand (impl->list_location_column, TRUE);
gtk_tree_view_columns_autosize (GTK_TREE_VIEW (impl->browse_files_tree_view));
}
}
@@ -4450,55 +4492,6 @@ file_system_model_set (GtkFileSystemModel *model,
case MODEL_COL_ELLIPSIZE:
g_value_set_enum (value, info ? PANGO_ELLIPSIZE_END : PANGO_ELLIPSIZE_NONE);
break;
- case MODEL_COL_LOCATION_TEXT:
- {
- GFile *home_location;
- GFile *dir_location;
- char *location;
-
- home_location = g_file_new_for_path (g_get_home_dir ());
- if (file)
- dir_location = g_file_get_parent (file);
- else
- dir_location = NULL;
-
- if (dir_location && file_is_recent_uri (dir_location))
- {
- const char *target_uri;
- GFile *target;
-
- target_uri = g_file_info_get_attribute_string (info, G_FILE_ATTRIBUTE_STANDARD_TARGET_URI);
- target = g_file_new_for_uri (target_uri);
- g_object_unref (dir_location);
- dir_location = g_file_get_parent (target);
- g_object_unref (target);
- }
-
- if (!dir_location)
- location = g_strdup ("/");
- else if (impl->current_folder && g_file_equal (impl->current_folder, dir_location))
- location = g_strdup ("");
- else if (g_file_equal (home_location, dir_location))
- location = g_strdup (_("Home"));
- else if (g_file_has_prefix (dir_location, home_location))
- {
- char *relative_path;
-
- relative_path = g_file_get_relative_path (home_location, dir_location);
- location = g_filename_display_name (relative_path);
-
- g_free (relative_path);
- }
- else
- location = g_file_get_path (dir_location);
-
- g_value_take_string (value, location);
-
- if (dir_location)
- g_object_unref (dir_location);
- g_object_unref (home_location);
- }
- break;
default:
g_assert_not_reached ();
break;
@@ -6529,7 +6522,6 @@ search_setup_model (GtkFileChooserWidget *impl)
gtk_tree_view_column_set_sort_column_id (impl->list_time_column, -1);
gtk_tree_view_column_set_sort_column_id (impl->list_size_column, -1);
gtk_tree_view_column_set_sort_column_id (impl->list_type_column, -1);
- gtk_tree_view_column_set_sort_column_id (impl->list_location_column, -1);
update_columns (impl, TRUE, _("Modified"));
}
@@ -6768,7 +6760,6 @@ recent_start_loading (GtkFileChooserWidget *impl)
gtk_tree_view_column_set_sort_column_id (impl->list_time_column, -1);
gtk_tree_view_column_set_sort_column_id (impl->list_size_column, -1);
gtk_tree_view_column_set_sort_column_id (impl->list_type_column, -1);
- gtk_tree_view_column_set_sort_column_id (impl->list_location_column, -1);
update_columns (impl, TRUE, _("Accessed"));
}
@@ -6984,12 +6975,6 @@ update_cell_renderer_attributes (GtkFileChooserWidget *impl)
"sensitive", MODEL_COL_IS_SENSITIVE,
NULL);
- gtk_tree_view_column_set_attributes (impl->list_location_column,
- impl->list_location_renderer,
- "text", MODEL_COL_LOCATION_TEXT,
- "sensitive", MODEL_COL_IS_SENSITIVE,
- NULL);
-
update_time_renderer_visible (impl);
}
@@ -7574,6 +7559,7 @@ gtk_file_chooser_widget_class_init (GtkFileChooserWidgetClass *class)
gtk_widget_class_bind_template_child (widget_class, GtkFileChooserWidget, browse_new_folder_button);
gtk_widget_class_bind_template_child (widget_class, GtkFileChooserWidget, browse_path_bar_size_group);
gtk_widget_class_bind_template_child (widget_class, GtkFileChooserWidget, browse_path_bar);
+ gtk_widget_class_bind_template_child (widget_class, GtkFileChooserWidget, column_view_location_column);
gtk_widget_class_bind_template_child (widget_class, GtkFileChooserWidget, filter_combo_hbox);
gtk_widget_class_bind_template_child (widget_class, GtkFileChooserWidget, filter_combo);
gtk_widget_class_bind_template_child (widget_class, GtkFileChooserWidget, extra_align);
@@ -7588,8 +7574,6 @@ gtk_file_chooser_widget_class_init (GtkFileChooserWidgetClass *class)
gtk_widget_class_bind_template_child (widget_class, GtkFileChooserWidget, list_size_renderer);
gtk_widget_class_bind_template_child (widget_class, GtkFileChooserWidget, list_type_column);
gtk_widget_class_bind_template_child (widget_class, GtkFileChooserWidget, list_type_renderer);
- gtk_widget_class_bind_template_child (widget_class, GtkFileChooserWidget, list_location_column);
- gtk_widget_class_bind_template_child (widget_class, GtkFileChooserWidget, list_location_renderer);
gtk_widget_class_bind_template_child (widget_class, GtkFileChooserWidget, new_folder_name_entry);
gtk_widget_class_bind_template_child (widget_class, GtkFileChooserWidget, new_folder_create_button);
gtk_widget_class_bind_template_child (widget_class, GtkFileChooserWidget, new_folder_error_stack);
@@ -7621,6 +7605,7 @@ gtk_file_chooser_widget_class_init (GtkFileChooserWidgetClass *class)
gtk_widget_class_bind_template_callback (widget_class, rename_file_end);
gtk_widget_class_bind_template_callback (widget_class, click_cb);
gtk_widget_class_bind_template_callback (widget_class, long_press_cb);
+ gtk_widget_class_bind_template_callback (widget_class, column_view_get_location);
gtk_widget_class_set_css_name (widget_class, I_("filechooser"));
diff --git a/gtk/ui/gtkfilechooserwidget.ui b/gtk/ui/gtkfilechooserwidget.ui
index e30550be1f..588779cc12 100644
--- a/gtk/ui/gtkfilechooserwidget.ui
+++ b/gtk/ui/gtkfilechooserwidget.ui
@@ -186,6 +186,38 @@
</object>
</child>
+ <child>
+ <object class="GtkColumnViewColumn"
id="column_view_location_column">
+ <property name="title" translatable="yes">Location</property>
+ <property name="resizable">1</property>
+ <property name="visible">0</property>
+ <property name="expand">1</property>
+ <property name="factory">
+ <object class="GtkBuilderListItemFactory">
+ <property name="bytes"><![CDATA[
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <template class="GtkListItem">
+ <property name="child">
+ <object class="GtkInscription">
+ <property name="hexpand">1</property>
+ <property name="xalign">0</property>
+ <property name="min-chars">10</property>
+ <property name="margin-start">6</property>
+ <property name="margin-end">6</property>
+ <binding name="text">
+ <closure type="gchararray" function="column_view_get_location" />
+ </binding>
+ </object>
+ </property>
+ </template>
+</interface>
+ ]]></property>
+ </object>
+ </property>
+ </object>
+ </child>
+
</object>
</child>
</object>
@@ -238,22 +270,6 @@
<signal name="changed" handler="list_selection_changed"
swapped="no"/>
</object>
</child>
- <child>
- <object class="GtkTreeViewColumn" id="list_location_column">
- <property name="title" translatable="yes">Location</property>
- <property name="resizable">1</property>
- <property name="visible">0</property>
- <property name="expand">1</property>
- <child>
- <object class="GtkCellRendererText"
id="list_location_renderer">
- <property name="xalign">0</property>
- <property name="width-chars">10</property>
- <property name="ellipsize">1</property>
- <property name="xpad">6</property>
- </object>
- </child>
- </object>
- </child>
<child>
<object class="GtkTreeViewColumn" id="list_size_column">
<property name="title" translatable="yes">Size</property>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]