From 4cb4aa10299d434e66e4797c28e85d5c8b954fa5 Mon Sep 17 00:00:00 2001 From: Corey Berla Date: Tue, 5 Sep 2023 11:49:07 -0700 Subject: [PATCH 1/3] gtkfilechooserwidget: Bind column visibility to settings It's less hacky and lets us drop even more code in the next commit. --- gtk/gtkfilechooserwidget.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/gtk/gtkfilechooserwidget.c b/gtk/gtkfilechooserwidget.c index 4eb64048be..e0cc553fe7 100644 --- a/gtk/gtkfilechooserwidget.c +++ b/gtk/gtkfilechooserwidget.c @@ -3178,8 +3178,6 @@ static void settings_load (GtkFileChooserWidget *impl) { gboolean show_hidden; - gboolean show_size_column; - gboolean show_type_column; gboolean sort_directories_first; DateFormat date_format; TypeFormat type_format; @@ -3193,8 +3191,6 @@ settings_load (GtkFileChooserWidget *impl) settings = _gtk_file_chooser_get_settings_for_widget (GTK_WIDGET (impl)); show_hidden = g_settings_get_boolean (settings, SETTINGS_KEY_SHOW_HIDDEN); - show_size_column = g_settings_get_boolean (settings, SETTINGS_KEY_SHOW_SIZE_COLUMN); - show_type_column = g_settings_get_boolean (settings, SETTINGS_KEY_SHOW_TYPE_COLUMN); sort_column = g_settings_get_enum (settings, SETTINGS_KEY_SORT_COLUMN); sort_order = g_settings_get_enum (settings, SETTINGS_KEY_SORT_ORDER); sidebar_width = g_settings_get_int (settings, SETTINGS_KEY_SIDEBAR_WIDTH); @@ -3206,10 +3202,8 @@ settings_load (GtkFileChooserWidget *impl) set_show_hidden (impl, show_hidden); - impl->show_size_column = show_size_column; - gtk_column_view_column_set_visible (impl->column_view_size_column, show_size_column); - impl->show_type_column = show_type_column; - gtk_column_view_column_set_visible (impl->column_view_type_column, show_type_column); + g_settings_bind (settings, SETTINGS_KEY_SHOW_SIZE_COLUMN, impl->column_view_size_column, "visible", G_SETTINGS_BIND_DEFAULT); + g_settings_bind (settings, SETTINGS_KEY_SHOW_TYPE_COLUMN, impl->column_view_type_column, "visible", G_SETTINGS_BIND_DEFAULT); impl->sort_column = sort_column; impl->sort_order = sort_order; @@ -3248,8 +3242,6 @@ settings_save (GtkFileChooserWidget *impl) g_settings_set_enum (settings, SETTINGS_KEY_LOCATION_MODE, impl->location_mode); g_settings_set_boolean (settings, SETTINGS_KEY_SHOW_HIDDEN, impl->show_hidden); - g_settings_set_boolean (settings, SETTINGS_KEY_SHOW_SIZE_COLUMN, impl->show_size_column); - g_settings_set_boolean (settings, SETTINGS_KEY_SHOW_TYPE_COLUMN, impl->show_type_column); g_settings_set_boolean (settings, SETTINGS_KEY_SORT_DIRECTORIES_FIRST, impl->sort_directories_first); g_settings_set_enum (settings, SETTINGS_KEY_SORT_COLUMN, impl->sort_column); g_settings_set_enum (settings, SETTINGS_KEY_SORT_ORDER, impl->sort_order); From 6f07c6a3f138042c180d0c46351af2a6c4c95266 Mon Sep 17 00:00:00 2001 From: Corey Berla Date: Tue, 5 Sep 2023 11:51:18 -0700 Subject: [PATCH 2/3] gtkfilechooserwidget: Use property actions for column visibility It's a lot less code --- gtk/gtkfilechooserwidget.c | 53 +++++--------------------------------- 1 file changed, 7 insertions(+), 46 deletions(-) diff --git a/gtk/gtkfilechooserwidget.c b/gtk/gtkfilechooserwidget.c index e0cc553fe7..be1e9f4e1a 100644 --- a/gtk/gtkfilechooserwidget.c +++ b/gtk/gtkfilechooserwidget.c @@ -328,8 +328,6 @@ struct _GtkFileChooserWidget guint sort_directories_first : 1; guint show_time : 1; guint shortcuts_current_folder_active : 1; - guint show_size_column : 1; - guint show_type_column : 1; guint create_folders : 1; guint auto_selecting_first_row : 1; guint browse_files_interaction_frozen : 1; @@ -1421,36 +1419,6 @@ change_show_hidden_state (GSimpleAction *action, set_show_hidden (impl, g_variant_get_boolean (state)); } -/* Callback used when the "Show Size Column" menu item is toggled */ -static void -change_show_size_state (GSimpleAction *action, - GVariant *state, - gpointer data) -{ - GtkFileChooserWidget *impl = data; - - g_simple_action_set_state (action, state); - impl->show_size_column = g_variant_get_boolean (state); - - gtk_column_view_column_set_visible (impl->column_view_size_column, - impl->show_size_column); -} - -/* Callback used when the "Show Type Column" menu item is toggled */ -static void -change_show_type_state (GSimpleAction *action, - GVariant *state, - gpointer data) -{ - GtkFileChooserWidget *impl = data; - - g_simple_action_set_state (action, state); - impl->show_type_column = g_variant_get_boolean (state); - - gtk_column_view_column_set_visible (impl->column_view_type_column, - impl->show_type_column); -} - static void change_sort_directories_first_state (GSimpleAction *action, GVariant *state, @@ -1774,8 +1742,6 @@ static GActionEntry entries[] = { { "trash", trash_file_cb, NULL, NULL, NULL }, { "popup-file-list-menu", popup_file_list_menu, "(udd)", NULL, NULL }, { "toggle-show-hidden", NULL, NULL, "false", change_show_hidden_state }, - { "toggle-show-size", NULL, NULL, "false", change_show_size_state }, - { "toggle-show-type", NULL, NULL, "false", change_show_type_state }, { "toggle-show-time", NULL, NULL, "false", change_show_time_state }, { "toggle-sort-dirs-first", NULL, NULL, "false", change_sort_directories_first_state }, { "toggle-view", toggle_view_cb, NULL, NULL, NULL }, @@ -1830,12 +1796,10 @@ file_list_build_popover (GtkFileChooserWidget *impl) g_object_unref (item); item = g_menu_item_new (_("Show _Size Column"), "item.toggle-show-size"); - g_menu_item_set_attribute (item, "hidden-when", "s", "action-disabled"); g_menu_append_item (section, item); g_object_unref (item); item = g_menu_item_new (_("Show T_ype Column"), "item.toggle-show-type"); - g_menu_item_set_attribute (item, "hidden-when", "s", "action-disabled"); g_menu_append_item (section, item); g_object_unref (item); @@ -1892,14 +1856,6 @@ file_list_update_popover (GtkFileChooserWidget *impl) action = g_action_map_lookup_action (G_ACTION_MAP (impl->item_actions), "toggle-show-hidden"); g_simple_action_set_state (G_SIMPLE_ACTION (action), g_variant_new_boolean (impl->show_hidden)); - action = g_action_map_lookup_action (G_ACTION_MAP (impl->item_actions), "toggle-show-size"); - g_simple_action_set_enabled (G_SIMPLE_ACTION (action), (impl->view_type == VIEW_TYPE_LIST)); - g_simple_action_set_state (G_SIMPLE_ACTION (action), g_variant_new_boolean (impl->show_size_column)); - - action = g_action_map_lookup_action (G_ACTION_MAP (impl->item_actions), "toggle-show-type"); - g_simple_action_set_enabled (G_SIMPLE_ACTION (action), (impl->view_type == VIEW_TYPE_LIST)); - g_simple_action_set_state (G_SIMPLE_ACTION (action), g_variant_new_boolean (impl->show_type_column)); - action = g_action_map_lookup_action (G_ACTION_MAP (impl->item_actions), "toggle-show-time"); g_simple_action_set_enabled (G_SIMPLE_ACTION (action), (impl->view_type == VIEW_TYPE_LIST)); g_simple_action_set_state (G_SIMPLE_ACTION (action), g_variant_new_boolean (impl->show_time)); @@ -6859,6 +6815,7 @@ post_process_ui (GtkFileChooserWidget *impl) GtkShortcutTrigger *trigger; GtkShortcutAction *action; GtkShortcut *shortcut; + GAction *gaction; target = gtk_drop_target_new (GDK_TYPE_FILE_LIST, GDK_ACTION_COPY | GDK_ACTION_MOVE); g_signal_connect (target, "drop", G_CALLBACK (file_list_drag_drop_cb), impl); @@ -6875,6 +6832,12 @@ post_process_ui (GtkFileChooserWidget *impl) g_action_map_add_action_entries (G_ACTION_MAP (impl->item_actions), entries, G_N_ELEMENTS (entries), impl); + gaction = G_ACTION (g_property_action_new ("toggle-show-size", impl->column_view_size_column, "visible")); + g_action_map_add_action (G_ACTION_MAP (impl->item_actions), gaction); + g_object_unref (gaction); + gaction = G_ACTION (g_property_action_new ("toggle-show-type", impl->column_view_type_column, "visible")); + g_action_map_add_action (G_ACTION_MAP (impl->item_actions), gaction); + g_object_unref (gaction); gtk_widget_insert_action_group (GTK_WIDGET (impl), "item", impl->item_actions); @@ -7445,8 +7408,6 @@ gtk_file_chooser_widget_init (GtkFileChooserWidget *impl) impl->select_multiple = FALSE; impl->sort_directories_first = FALSE; impl->show_hidden = FALSE; - impl->show_size_column = TRUE; - impl->show_type_column = TRUE; impl->type_format = TYPE_FORMAT_MIME; impl->load_state = LOAD_EMPTY; impl->reload_state = RELOAD_EMPTY; From f429dff03e7d8ff0fd9c5481d4c25360f8344f80 Mon Sep 17 00:00:00 2001 From: Corey Berla Date: Tue, 5 Sep 2023 12:21:40 -0700 Subject: [PATCH 3/3] gtkfilechooserwidget: Move column menu items to the column header menu The main menu is too long and the column options belong in the column header menu to begin with. Since this is only available in column view, we should always show the menu items. --- gtk/gtkfilechooserwidget.c | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/gtk/gtkfilechooserwidget.c b/gtk/gtkfilechooserwidget.c index be1e9f4e1a..36fd4ee596 100644 --- a/gtk/gtkfilechooserwidget.c +++ b/gtk/gtkfilechooserwidget.c @@ -1795,19 +1795,6 @@ file_list_build_popover (GtkFileChooserWidget *impl) g_menu_append_item (section, item); g_object_unref (item); - item = g_menu_item_new (_("Show _Size Column"), "item.toggle-show-size"); - g_menu_append_item (section, item); - g_object_unref (item); - - item = g_menu_item_new (_("Show T_ype Column"), "item.toggle-show-type"); - g_menu_append_item (section, item); - g_object_unref (item); - - item = g_menu_item_new (_("Show _Time"), "item.toggle-show-time"); - g_menu_item_set_attribute (item, "hidden-when", "s", "action-disabled"); - g_menu_append_item (section, item); - g_object_unref (item); - item = g_menu_item_new (_("Sort _Folders Before Files"), "item.toggle-sort-dirs-first"); g_menu_append_item (section, item); g_object_unref (item); @@ -1857,7 +1844,6 @@ file_list_update_popover (GtkFileChooserWidget *impl) g_simple_action_set_state (G_SIMPLE_ACTION (action), g_variant_new_boolean (impl->show_hidden)); action = g_action_map_lookup_action (G_ACTION_MAP (impl->item_actions), "toggle-show-time"); - g_simple_action_set_enabled (G_SIMPLE_ACTION (action), (impl->view_type == VIEW_TYPE_LIST)); g_simple_action_set_state (G_SIMPLE_ACTION (action), g_variant_new_boolean (impl->show_time)); action = g_action_map_lookup_action (G_ACTION_MAP (impl->item_actions), "toggle-sort-dirs-first"); @@ -7357,6 +7343,22 @@ setup_columns (GtkColumnView *view, GtkFileChooserWidget *impl) { GtkListItemFactory *factory; + GMenu *menu; + GMenuItem *item; + + menu = g_menu_new (); + + item = g_menu_item_new (_("_Size"), "item.toggle-show-size"); + g_menu_append_item (menu, item); + g_object_unref (item); + + item = g_menu_item_new (_("T_ype"), "item.toggle-show-type"); + g_menu_append_item (menu, item); + g_object_unref (item); + + item = g_menu_item_new (_("_Time"), "item.toggle-show-time"); + g_menu_append_item (menu, item); + g_object_unref (item); factory = gtk_signal_list_item_factory_new (); g_signal_connect_swapped (factory, "bind", G_CALLBACK (bind_name_cell), impl); @@ -7364,6 +7366,7 @@ setup_columns (GtkColumnView *view, gtk_column_view_column_set_expand (impl->column_view_name_column, TRUE); gtk_column_view_column_set_resizable (impl->column_view_name_column, TRUE); gtk_column_view_append_column (view, impl->column_view_name_column); + gtk_column_view_column_set_header_menu (impl->column_view_name_column, G_MENU_MODEL (menu)); factory = gtk_signal_list_item_factory_new (); g_signal_connect_swapped (factory, "bind", G_CALLBACK (bind_location_cell), impl); @@ -7372,22 +7375,28 @@ setup_columns (GtkColumnView *view, gtk_column_view_column_set_resizable (impl->column_view_location_column, TRUE); gtk_column_view_column_set_visible (impl->column_view_location_column, FALSE); gtk_column_view_append_column (view, impl->column_view_location_column); + gtk_column_view_column_set_header_menu (impl->column_view_location_column, G_MENU_MODEL (menu)); factory = gtk_signal_list_item_factory_new (); g_signal_connect_swapped (factory, "bind", G_CALLBACK (bind_size_cell), impl); impl->column_view_size_column = gtk_column_view_column_new (_("Size"), factory); gtk_column_view_append_column (view, impl->column_view_size_column); + gtk_column_view_column_set_header_menu (impl->column_view_size_column, G_MENU_MODEL (menu)); factory = gtk_signal_list_item_factory_new (); g_signal_connect_swapped (factory, "bind", G_CALLBACK (bind_type_cell), impl); impl->column_view_type_column = gtk_column_view_column_new (_("Type"), factory); gtk_column_view_column_set_resizable (impl->column_view_type_column, TRUE); gtk_column_view_append_column (view, impl->column_view_type_column); + gtk_column_view_column_set_header_menu (impl->column_view_type_column, G_MENU_MODEL (menu)); factory = gtk_signal_list_item_factory_new (); g_signal_connect_swapped (factory, "bind", G_CALLBACK (bind_time_cell), impl); impl->column_view_time_column = gtk_column_view_column_new (_("Modified"), factory); gtk_column_view_append_column (view, impl->column_view_time_column); + gtk_column_view_column_set_header_menu (impl->column_view_time_column, G_MENU_MODEL (menu)); + + g_object_unref (menu); } static void