diff options
author | Corey Berla <corey@berla.me> | 2023-01-21 08:25:01 -0800 |
---|---|---|
committer | Corey Berla <corey@berla.me> | 2023-05-04 21:32:59 +0000 |
commit | 9c637f228c0aad38c1d8786c2bbe0d2f66490259 (patch) | |
tree | 7854e44bc585019e674c4a09c9ab8cfc55bdecaa | |
parent | 16dc1a33d7e1854b5765e33ffa8a3589fd9a1ef3 (diff) | |
download | nautilus-9c637f228c0aad38c1d8786c2bbe0d2f66490259.tar.gz |
column-chooser: Allow settings custom or default columns
When a folder has custom columns (i.e. the file metadata is set),
then show a banner saying there are custom columns, with a button to
reset to default. If there aren't custom columns, then there won't be
a banner, and instead there will be a switch to allow setting the
columns as custom for the folder instead of default.
Default columns should only be updated on "close" for the window to
prevent user confusion.
-rw-r--r-- | src/nautilus-column-chooser.c | 90 | ||||
-rw-r--r-- | src/resources/ui/nautilus-column-chooser.ui | 35 |
2 files changed, 92 insertions, 33 deletions
diff --git a/src/nautilus-column-chooser.c b/src/nautilus-column-chooser.c index afd46572b..78e892422 100644 --- a/src/nautilus-column-chooser.c +++ b/src/nautilus-column-chooser.c @@ -29,6 +29,8 @@ #include <glib/gi18n.h> #include <nautilus-extension.h> +#include "nautilus-global-preferences.h" +#include "nautilus-metadata.h" #include "nautilus-column-utilities.h" @@ -38,8 +40,10 @@ struct _NautilusColumnChooser GListModel *model; GtkWidget *list_box; - GtkWidget *use_default_button; GtkWidget *window_title; + GtkWidget *banner; + GtkWidget *use_custom_box; + GtkWidget *use_custom_switch; NautilusColumn *drag_column; guint orig_drag_pos; @@ -56,7 +60,6 @@ enum enum { CHANGED, - USE_DEFAULT, LAST_SIGNAL }; static guint signals[LAST_SIGNAL]; @@ -99,6 +102,14 @@ list_changed (NautilusColumnChooser *chooser) g_signal_emit (chooser, signals[CHANGED], 0, column_order, visible_columns); } +static gboolean +is_special_folder (NautilusColumnChooser *chooser) +{ + return (nautilus_file_is_in_trash (chooser->file) || + nautilus_file_is_in_search (chooser->file) || + nautilus_file_is_in_recent (chooser->file)); +} + static void nautilus_column_chooser_set_property (GObject *object, guint param_id, @@ -308,6 +319,34 @@ column_sort_func (gconstpointer a, return a_pos == b_pos ? 0 : a_pos < b_pos ? -1 : 1; } +static gboolean +nautilus_column_chooser_close_request (GtkWindow *window) +{ + NautilusColumnChooser *chooser = NAUTILUS_COLUMN_CHOOSER (window); + g_auto (GStrv) column_order = get_column_names (chooser, FALSE); + g_auto (GStrv) visible_columns = get_column_names (chooser, TRUE); + gboolean has_custom; + + has_custom = gtk_switch_get_active (GTK_SWITCH (chooser->use_custom_switch)); + if (has_custom) + { + nautilus_column_save_metadata (chooser->file, column_order, visible_columns); + } + else + { + g_settings_set_strv (nautilus_list_view_preferences, + NAUTILUS_PREFERENCES_LIST_VIEW_DEFAULT_COLUMN_ORDER, + (const char **) column_order); + g_settings_set_strv (nautilus_list_view_preferences, + NAUTILUS_PREFERENCES_LIST_VIEW_DEFAULT_VISIBLE_COLUMNS, + (const char **) visible_columns); + + nautilus_column_save_metadata (chooser->file, NULL, NULL); + } + + return FALSE; +} + static void set_column_order (NautilusColumnChooser *chooser, char **column_order) @@ -349,6 +388,10 @@ use_default_clicked_callback (GtkWidget *button, set_visible_columns (chooser, default_columns); set_column_order (chooser, default_order); + gtk_widget_set_visible (chooser->use_custom_box, TRUE); + gtk_switch_set_active (GTK_SWITCH (chooser->use_custom_switch), FALSE); + adw_banner_set_revealed (ADW_BANNER (chooser->banner), FALSE); + list_changed (chooser); } @@ -386,6 +429,9 @@ nautilus_column_chooser_constructed (GObject *object) { NautilusColumnChooser *chooser; g_autofree gchar *name = NULL; + g_auto (GStrv) file_visible_columns = NULL; + g_auto (GStrv) file_column_order = NULL; + gboolean has_custom_columns; G_OBJECT_CLASS (nautilus_column_chooser_parent_class)->constructed (object); @@ -395,6 +441,24 @@ nautilus_column_chooser_constructed (GObject *object) adw_window_title_set_subtitle (ADW_WINDOW_TITLE (chooser->window_title), name); populate_list (chooser); + + file_visible_columns = nautilus_file_get_metadata_list (chooser->file, + NAUTILUS_METADATA_KEY_LIST_VIEW_VISIBLE_COLUMNS); + file_column_order = nautilus_file_get_metadata_list (chooser->file, + NAUTILUS_METADATA_KEY_LIST_VIEW_COLUMN_ORDER); + + has_custom_columns = ((file_visible_columns != NULL && file_visible_columns[0] != NULL) || + (file_column_order != NULL && file_column_order[0] != NULL) || + is_special_folder (chooser)); + + gtk_switch_set_active (GTK_SWITCH (chooser->use_custom_switch), has_custom_columns); + gtk_widget_set_visible (chooser->use_custom_box, !has_custom_columns); + adw_banner_set_revealed (ADW_BANNER (chooser->banner), has_custom_columns); + + if (is_special_folder (chooser)) + { + adw_banner_set_button_label (ADW_BANNER (chooser->banner), NULL); + } } static void @@ -410,20 +474,22 @@ nautilus_column_chooser_finalize (GObject *object) static void nautilus_column_chooser_class_init (NautilusColumnChooserClass *chooser_class) { - GtkWidgetClass *widget_class; - GObjectClass *oclass; - - widget_class = GTK_WIDGET_CLASS (chooser_class); - oclass = G_OBJECT_CLASS (chooser_class); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (chooser_class); + GtkWindowClass *win_class = GTK_WINDOW_CLASS (chooser_class); + GObjectClass *oclass = G_OBJECT_CLASS (chooser_class); oclass->set_property = nautilus_column_chooser_set_property; oclass->constructed = nautilus_column_chooser_constructed; oclass->finalize = nautilus_column_chooser_finalize; + win_class->close_request = nautilus_column_chooser_close_request; + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/nautilus/ui/nautilus-column-chooser.ui"); gtk_widget_class_bind_template_child (widget_class, NautilusColumnChooser, list_box); - gtk_widget_class_bind_template_child (widget_class, NautilusColumnChooser, use_default_button); gtk_widget_class_bind_template_child (widget_class, NautilusColumnChooser, window_title); + gtk_widget_class_bind_template_child (widget_class, NautilusColumnChooser, banner); + gtk_widget_class_bind_template_child (widget_class, NautilusColumnChooser, use_custom_box); + gtk_widget_class_bind_template_child (widget_class, NautilusColumnChooser, use_custom_switch); gtk_widget_class_bind_template_callback (widget_class, use_default_clicked_callback); gtk_widget_class_add_binding_action (widget_class, GDK_KEY_Escape, 0, "window.close", NULL); @@ -437,14 +503,6 @@ nautilus_column_chooser_class_init (NautilusColumnChooserClass *chooser_class) G_TYPE_NONE, 2, G_TYPE_STRV, G_TYPE_STRV); - signals[USE_DEFAULT] = g_signal_new - ("use-default", - G_TYPE_FROM_CLASS (chooser_class), - G_SIGNAL_RUN_LAST, - 0, NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - g_object_class_install_property (oclass, PROP_FILE, g_param_spec_object ("file", NULL, NULL, diff --git a/src/resources/ui/nautilus-column-chooser.ui b/src/resources/ui/nautilus-column-chooser.ui index 1323d2428..1f95ef65a 100644 --- a/src/resources/ui/nautilus-column-chooser.ui +++ b/src/resources/ui/nautilus-column-chooser.ui @@ -22,6 +22,13 @@ <object class="GtkBox"> <property name="orientation">vertical</property> <child> + <object class="AdwBanner" id="banner"> + <property name="title" translatable="yes">This folder uses custom settings</property> + <property name="button-label">_Revert</property> + <signal name="button-clicked" handler="use_default_clicked_callback"/> + </object> + </child> + <child> <object class="GtkScrolledWindow"> <property name="child"> <object class="GtkListBox" id="list_box"> @@ -42,29 +49,23 @@ <object class="GtkSeparator"/> </child> <child> - <object class="GtkBox"> - <property name="spacing">12</property> - <child> - <object class="GtkBox"> - <style> - <class name="linked"/> - </style> - </object> - </child> + <object class="GtkListBox" id="use_custom_box"> <child> - <object class="GtkBox"> + <object class="AdwActionRow"> + <property name="hexpand">true</property> + <property name="selectable">false</property> + <property name="activatable_widget">use_custom_switch</property> + <property name="title" translatable="yes">Only Apply to Current Folder</property> <child> - <object class="GtkButton" id="use_default_button"> - <property name="hexpand">true</property> - <property name="halign">end</property> - <property name="label" translatable="yes">Reset to De_fault</property> - <property name="tooltip-text" translatable="yes">Replace the current List Columns settings with the default settings</property> - <property name="use-underline">True</property> - <signal name="clicked" handler="use_default_clicked_callback" swapped="no"/> + <object class="GtkSwitch" id="use_custom_switch"> + <property name="valign">center</property> </object> </child> </object> </child> + <style> + <class name="background"/> + </style> </object> </child> </object> |