From e086bd11e69459349034234eac321df7bd123570 Mon Sep 17 00:00:00 2001 From: jralo7 <156215804+jralo7@users.noreply.github.com> Date: Thu, 31 Jul 2025 08:04:17 +0200 Subject: [PATCH 1/4] Add 'Show expanders for empty folders' setting --- gresources/nemo-file-management-properties.glade | 16 ++++++++++++++++ libnemo-private/nemo-global-preferences.h | 1 + libnemo-private/org.nemo.gschema.xml | 4 ++++ src/nemo-file-management-properties.c | 5 +++++ 4 files changed, 26 insertions(+) diff --git a/gresources/nemo-file-management-properties.glade b/gresources/nemo-file-management-properties.glade index 753931c51..744153516 100644 --- a/gresources/nemo-file-management-properties.glade +++ b/gresources/nemo-file-management-properties.glade @@ -930,6 +930,22 @@ along with . If not, see . 1 + + + Show expanders for empty folders + True + True + False + True + 0 + True + + + False + False + 2 + + diff --git a/libnemo-private/nemo-global-preferences.h b/libnemo-private/nemo-global-preferences.h index cc94cb0dd..49d0497ad 100644 --- a/libnemo-private/nemo-global-preferences.h +++ b/libnemo-private/nemo-global-preferences.h @@ -182,6 +182,7 @@ enum #define NEMO_PREFERENCES_LIST_VIEW_DEFAULT_VISIBLE_COLUMNS "default-visible-columns" #define NEMO_PREFERENCES_LIST_VIEW_DEFAULT_COLUMN_ORDER "default-column-order" #define NEMO_PREFERENCES_LIST_VIEW_ENABLE_EXPANSION "enable-folder-expansion" +#define NEMO_PREFERENCES_LIST_VIEW_ALWAYS_SHOW_EXPANDER "always-show-folder-expander" #define NEMO_PREFERENCES_MAX_THUMBNAIL_THREADS "thumbnail-threads" diff --git a/libnemo-private/org.nemo.gschema.xml b/libnemo-private/org.nemo.gschema.xml index 1500a8a79..bc3a256f2 100644 --- a/libnemo-private/org.nemo.gschema.xml +++ b/libnemo-private/org.nemo.gschema.xml @@ -527,6 +527,10 @@ false If true, allow folders with content to be expanded in the current view. + + false + If true, also allow folders without content to be expanded. + diff --git a/src/nemo-file-management-properties.c b/src/nemo-file-management-properties.c index d11e96a37..c7f623c51 100644 --- a/src/nemo-file-management-properties.c +++ b/src/nemo-file-management-properties.c @@ -73,6 +73,7 @@ #define NEMO_FILE_MANAGEMENT_PROPERTIES_OPEN_NEW_WINDOW_WIDGET "new_window_checkbutton" #define NEMO_FILE_MANAGEMENT_PROPERTIES_TREE_VIEW_FOLDERS_WIDGET "treeview_folders_checkbutton" #define NEMO_FILE_MANAGEMENT_PROPERTIES_SHOW_LIST_VIEW_EXPANDERS_WIDGET "list_view_show_expanders_checkbutton" +#define NEMO_FILE_MANAGEMENT_PROPERTIES_SHOW_EMPTY_FOLDER_EXPANDERS_WIDGET "list_view_show_empty_expanders_checkbutton" #define NEMO_FILE_MANAGEMENT_PROPERTIES_SHOW_PREVIOUS_ICON_TOOLBAR_WIDGET "show_previous_icon_toolbar_togglebutton" #define NEMO_FILE_MANAGEMENT_PROPERTIES_SHOW_NEXT_ICON_TOOLBAR_WIDGET "show_next_icon_toolbar_togglebutton" @@ -1110,6 +1111,10 @@ nemo_file_management_properties_dialog_setup (GtkBuilder *builder, NEMO_FILE_MANAGEMENT_PROPERTIES_SHOW_LIST_VIEW_EXPANDERS_WIDGET, NEMO_PREFERENCES_LIST_VIEW_ENABLE_EXPANSION); + bind_builder_bool (builder, nemo_list_view_preferences, + NEMO_FILE_MANAGEMENT_PROPERTIES_SHOW_EMPTY_FOLDER_EXPANDERS_WIDGET, + NEMO_PREFERENCES_LIST_VIEW_ALWAYS_SHOW_EXPANDER); + setup_tooltip_items (builder); connect_tooltip_items (builder); From 5f494896b6bf3278969c9d436087b746d96ef9a1 Mon Sep 17 00:00:00 2001 From: jralo7 <156215804+jralo7@users.noreply.github.com> Date: Thu, 31 Jul 2025 08:11:51 +0200 Subject: [PATCH 2/4] Add helper function for 'Show expanders for empty folders' setting --- libnemo-private/nemo-global-preferences.c | 6 ++++++ libnemo-private/nemo-global-preferences.h | 2 ++ 2 files changed, 8 insertions(+) diff --git a/libnemo-private/nemo-global-preferences.c b/libnemo-private/nemo-global-preferences.c index f57fcbcb4..adb41e649 100644 --- a/libnemo-private/nemo-global-preferences.c +++ b/libnemo-private/nemo-global-preferences.c @@ -132,6 +132,12 @@ nemo_global_preferences_get_size_prefix_preference (void) return 0; } +gboolean +nemo_global_preferences_get_always_show_folder_expander (void) +{ + return g_settings_get_boolean (nemo_list_view_preferences, NEMO_PREFERENCES_LIST_VIEW_ALWAYS_SHOW_EXPANDER); +} + char * nemo_global_preferences_get_desktop_iid (void) { diff --git a/libnemo-private/nemo-global-preferences.h b/libnemo-private/nemo-global-preferences.h index 49d0497ad..59a14bd7c 100644 --- a/libnemo-private/nemo-global-preferences.h +++ b/libnemo-private/nemo-global-preferences.h @@ -300,6 +300,8 @@ gint nemo_global_preferences_get_tooltip_flags (void); gboolean nemo_global_preferences_should_load_plugin (const gchar *name, const gchar *key); gchar **nemo_global_preferences_get_fileroller_mimetypes (void); +gboolean nemo_global_preferences_get_always_show_folder_expander (void); + gchar *nemo_global_preferences_get_mono_system_font (void); gchar *nemo_global_preferences_get_mono_font_family_match (const gchar *in_family); From 9b34f5611ca8c235c18fc906cfc6c3a6709c3f33 Mon Sep 17 00:00:00 2001 From: jralo7 <156215804+jralo7@users.noreply.github.com> Date: Thu, 31 Jul 2025 08:13:23 +0200 Subject: [PATCH 3/4] Implement 'Show expanders for empty folders' logic --- src/nemo-list-model.c | 20 +++++++++++++++++--- src/nemo-list-view.c | 15 +++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/nemo-list-model.c b/src/nemo-list-model.c index d5775f9c5..7fc5026f5 100644 --- a/src/nemo-list-model.c +++ b/src/nemo-list-model.c @@ -38,6 +38,7 @@ #include #include #include +#include enum { SUBDIRECTORY_UNLOADED, @@ -518,6 +519,13 @@ nemo_list_model_iter_has_child (GtkTreeModel *tree_model, GtkTreeIter *iter) file_entry = g_sequence_get (iter->user_data); + /* If the file is a directory and always-show-expander is enabled, always return TRUE */ + if (file_entry->file && nemo_file_is_directory (file_entry->file)) { + if (nemo_global_preferences_get_always_show_folder_expander()) { + return TRUE; + } + } + return (file_entry->files != NULL && g_sequence_get_length (file_entry->files) > 0); } @@ -1079,7 +1087,9 @@ nemo_list_model_add_file (NemoListModel *model, NemoFile *file, got_count = nemo_file_get_directory_item_count (file, &count, &unreadable); - if ((!got_count && !unreadable) || count > 0) { + /* Always add dummy row if always-show-expander is enabled, or if directory has items */ + if (nemo_global_preferences_get_always_show_folder_expander() || + (!got_count && !unreadable) || count > 0) { add_dummy_row (model, file_entry); gtk_tree_model_row_has_child_toggled (GTK_TREE_MODEL (model), path, &iter); @@ -1105,7 +1115,9 @@ update_dummy_row (NemoListModel *model, got_count = nemo_file_get_directory_item_count (file, &count, &unreadable); - if ((got_count && count == 0) || (!got_count && unreadable)) { + /* Only remove dummy row if always-show-expander is disabled and directory is empty */ + if (!nemo_global_preferences_get_always_show_folder_expander() && + ((got_count && count == 0) || (!got_count && unreadable))) { files = file_entry->files; if (g_sequence_get_length (files) == 1) { GSequenceIter *dummy_ptr = g_sequence_get_iter_at_pos (files, 0); @@ -1278,7 +1290,9 @@ nemo_list_model_remove (NemoListModel *model, GtkTreeIter *iter) got_count = nemo_file_get_directory_item_count (parent_file_entry->file, &count, &unreadable); - if ((!got_count && !unreadable) || count > 0) { + /* Always add dummy row if always-show-expander is enabled, or if directory has items */ + if (nemo_global_preferences_get_always_show_folder_expander() || + (!got_count && !unreadable) || count > 0) { add_dummy_row (model, parent_file_entry); } } diff --git a/src/nemo-list-view.c b/src/nemo-list-view.c index 939e273a5..7d9d7cf56 100644 --- a/src/nemo-list-view.c +++ b/src/nemo-list-view.c @@ -292,6 +292,16 @@ expanders_enabled_changed_cb (NemoListView *view) NEMO_PREFERENCES_LIST_VIEW_ENABLE_EXPANSION)); } +static void +always_show_expander_changed_cb (NemoListView *view) +{ + g_return_if_fail (NEMO_IS_LIST_VIEW (view)); + g_return_if_fail (GTK_IS_TREE_VIEW (view->details->tree_view) && view->details->tree_view != NULL); + + /* Force a refresh of the tree view to update expander arrows */ + gtk_widget_queue_draw (GTK_WIDGET(view->details->tree_view)); +} + static void list_selection_changed_callback (GtkTreeSelection *selection, gpointer user_data) { @@ -2537,6 +2547,11 @@ create_and_set_up_tree_view (NemoListView *view) G_CALLBACK (expanders_enabled_changed_cb), view); + g_signal_connect_swapped (nemo_list_view_preferences, + "changed::" NEMO_PREFERENCES_LIST_VIEW_ALWAYS_SHOW_EXPANDER, + G_CALLBACK (always_show_expander_changed_cb), + view); + view->details->columns = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify) g_free, From 064666b3d78d4495bf13bac083b8b87fbd11610e Mon Sep 17 00:00:00 2001 From: jralo7 <156215804+jralo7@users.noreply.github.com> Date: Thu, 31 Jul 2025 08:24:12 +0200 Subject: [PATCH 4/4] Delete refresh logic and add note about manual refresh requirement --- libnemo-private/org.nemo.gschema.xml | 1 + src/nemo-list-view.c | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libnemo-private/org.nemo.gschema.xml b/libnemo-private/org.nemo.gschema.xml index bc3a256f2..70d3eccd4 100644 --- a/libnemo-private/org.nemo.gschema.xml +++ b/libnemo-private/org.nemo.gschema.xml @@ -530,6 +530,7 @@ false If true, also allow folders without content to be expanded. + If true, show expander arrows for all folders, even empty ones. Note: reload once to see changes. diff --git a/src/nemo-list-view.c b/src/nemo-list-view.c index 7d9d7cf56..f44ea3306 100644 --- a/src/nemo-list-view.c +++ b/src/nemo-list-view.c @@ -298,8 +298,7 @@ always_show_expander_changed_cb (NemoListView *view) g_return_if_fail (NEMO_IS_LIST_VIEW (view)); g_return_if_fail (GTK_IS_TREE_VIEW (view->details->tree_view) && view->details->tree_view != NULL); - /* Force a refresh of the tree view to update expander arrows */ - gtk_widget_queue_draw (GTK_WIDGET(view->details->tree_view)); + /* Note: Changes require a manual refresh to take effect */ } static void