filesystemmodel: Store selectability
authorMatthias Clasen <mclasen@redhat.com>
Wed, 1 Mar 2023 12:53:07 +0000 (07:53 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 10 Mar 2023 14:40:40 +0000 (15:40 +0100)
This will be used later on.

gtk/gtkfilesystemmodel.c
gtk/gtkfilesystemmodelprivate.h

index d37237f1c773add5b4b02715ceec87470444ee64..c830751642db12693f4ff4fb2baea271f54e25fa 100644 (file)
@@ -81,6 +81,7 @@ struct _GtkFileSystemModel
   guint                 show_folders :1;/* whether to show folders */
   guint                 show_files :1;  /* whether to show files */
   guint                 filter_folders :1;/* whether filter applies to folders */
+  guint                 can_select_files : 1;
 };
 
 static void freeze_updates (GtkFileSystemModel *model);
@@ -151,7 +152,8 @@ static void
 node_set_visible_and_filtered_out (GtkFileSystemModel *model,
                                    guint               id,
                                    gboolean            visible,
-                                   gboolean            filtered_out)
+                                   gboolean            filtered_out,
+                                   gboolean            selectable)
 {
   FileModelNode *node = get_node (model, id);
 
@@ -164,6 +166,10 @@ node_set_visible_and_filtered_out (GtkFileSystemModel *model,
       node->filtered_out = filtered_out;
     }
 
+  /* Selectability */
+
+  g_file_info_set_attribute_boolean (node->info, "filechooser::selectable", selectable);
+
   /* Visibility */
 
   g_file_info_set_attribute_boolean (node->info, "filechooser::visible", visible);
@@ -242,17 +248,34 @@ node_should_be_visible (GtkFileSystemModel *model,
   return result;
 }
 
+static gboolean
+node_should_be_selectable (GtkFileSystemModel *model,
+                          guint                id)
+{
+  FileModelNode *node = get_node (model, id);
+
+  if (node->info == NULL)
+    return TRUE;
+
+  if (_gtk_file_info_consider_as_directory (node->info))
+    return TRUE;
+  else
+    return model->can_select_files;
+}
+
 static void
 node_compute_visibility_and_filters (GtkFileSystemModel *model,
                                      guint               id)
 {
   gboolean filtered_out;
   gboolean visible;
+  gboolean selectable;
 
   filtered_out = node_should_be_filtered_out (model, id);
   visible = node_should_be_visible (model, id, filtered_out);
+  selectable = node_should_be_selectable (model, id);
 
-  node_set_visible_and_filtered_out (model, id, visible, filtered_out);
+  node_set_visible_and_filtered_out (model, id, visible, filtered_out, selectable);
 }
 
 static guint
@@ -545,6 +568,7 @@ gtk_file_system_model_init (GtkFileSystemModel *model)
   model->show_folders = TRUE;
   model->show_hidden = FALSE;
   model->filter_folders = FALSE;
+  model->can_select_files = TRUE;
 
   model->file_lookup = g_hash_table_new (g_file_hash, (GEqualFunc) g_file_equal);
   model->cancellable = g_cancellable_new ();
@@ -1096,3 +1120,11 @@ _gtk_file_system_model_get_directory (GtkFileSystemModel *model)
   return model->dir;
 }
 
+void
+_gtk_file_system_model_set_can_select_files (GtkFileSystemModel *model,
+                                             gboolean            can_select)
+{
+  g_return_if_fail (GTK_IS_FILE_SYSTEM_MODEL (model));
+
+  model->can_select_files = can_select;
+}
index 36bf750e8692cefba1f960b0f2499b6e81c44a24..131063cb9a2eb518cf585eb8a092a4a596d6857c 100644 (file)
@@ -21,6 +21,7 @@
 
 #include <gio/gio.h>
 #include <gtk/gtkfilefilter.h>
+#include <gtk/deprecated/gtkfilechooser.h>
 
 G_BEGIN_DECLS
 
@@ -57,6 +58,9 @@ void                _gtk_file_system_model_set_filter_folders (GtkFileSystemMode
 void                _gtk_file_system_model_set_filter       (GtkFileSystemModel *model,
                                                              GtkFileFilter      *filter);
 
+void                _gtk_file_system_model_set_can_select_files (GtkFileSystemModel   *model,
+                                                                 gboolean              can_select);
+
 G_END_DECLS
 
 #endif /* __GTK_FILE_SYSTEM_MODEL_PRIVATE_H__ */