diff options
author | Matthias Clasen <mclasen@redhat.com> | 2023-03-10 16:37:41 +0000 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2023-03-10 16:37:41 +0000 |
commit | 5f2421812308c4b5555c8ad830bd5ce356196c49 (patch) | |
tree | e3cbf09643a3f397e1b78548c19507595112df1c /gtk | |
parent | feebd68dd37ae03efab71855eae2993adfde12b0 (diff) | |
parent | 310662516b44d9abf3605d9521d2e8cafca23d9e (diff) | |
download | gtk+-5f2421812308c4b5555c8ad830bd5ce356196c49.tar.gz |
Merge branch 'file-chooser-selectability2' into 'main'
file system model: Store selectability
See merge request GNOME/gtk!5582
Diffstat (limited to 'gtk')
-rw-r--r-- | gtk/gtkcolumnlistitemfactory.c | 13 | ||||
-rw-r--r-- | gtk/gtkfilechoosercell.c | 37 | ||||
-rw-r--r-- | gtk/gtkfilechooserwidget.c | 7 | ||||
-rw-r--r-- | gtk/gtkfilesystemmodel.c | 36 | ||||
-rw-r--r-- | gtk/gtkfilesystemmodelprivate.h | 4 | ||||
-rw-r--r-- | gtk/ui/gtkfilechooserwidget.ui | 6 |
6 files changed, 99 insertions, 4 deletions
diff --git a/gtk/gtkcolumnlistitemfactory.c b/gtk/gtkcolumnlistitemfactory.c index d69bd12e04..8ddffc252c 100644 --- a/gtk/gtkcolumnlistitemfactory.c +++ b/gtk/gtkcolumnlistitemfactory.c @@ -103,6 +103,8 @@ gtk_column_list_item_factory_update (GtkListItemFactory *factory, { GtkListItem *list_item = GTK_LIST_ITEM (item); GtkWidget *child; + gboolean selectable = TRUE; + gboolean activatable = TRUE; GTK_LIST_ITEM_FACTORY_CLASS (gtk_column_list_item_factory_parent_class)->update (factory, item, unbind, bind, func, data); @@ -114,7 +116,18 @@ gtk_column_list_item_factory_update (GtkListItemFactory *factory, gtk_list_item_get_position (list_item), gtk_list_item_get_item (list_item), gtk_list_item_get_selected (list_item)); + + selectable &= gtk_list_item_get_selectable (gtk_list_item_widget_get_list_item (GTK_LIST_ITEM_WIDGET (child))); + activatable &= gtk_list_item_get_activatable (gtk_list_item_widget_get_list_item (GTK_LIST_ITEM_WIDGET (child))); } + + /* This really does not belong here, but doing better + * requires considerable plumbing that we don't have now, + * and something like this is needed to fix the filechooser + * in select_folder mode. + */ + gtk_list_item_set_selectable (list_item, selectable); + gtk_list_item_set_activatable (list_item, activatable); } static void diff --git a/gtk/gtkfilechoosercell.c b/gtk/gtkfilechoosercell.c index 7d20c70f0a..dd003bf93d 100644 --- a/gtk/gtkfilechoosercell.c +++ b/gtk/gtkfilechoosercell.c @@ -31,6 +31,7 @@ #include "gtkselectionmodel.h" #include "gtkfilechooserutils.h" #include "gtkfilechooserwidgetprivate.h" +#include "gtklistitem.h" struct _GtkFileChooserCell { @@ -39,6 +40,7 @@ struct _GtkFileChooserCell GFileInfo *item; gboolean selected; guint position; + GtkListItem *list_item; gboolean show_time; }; @@ -56,6 +58,7 @@ enum PROP_SELECTED, PROP_ITEM, PROP_SHOW_TIME, + PROP_LIST_ITEM, }; #define ICON_SIZE 16 @@ -197,6 +200,22 @@ gtk_file_chooser_cell_dispose (GObject *object) G_OBJECT_CLASS (gtk_file_chooser_cell_parent_class)->dispose (object); } +static gboolean +get_selectable (GtkFileChooserCell *self) +{ + if (self->item) + return g_file_info_get_attribute_boolean (self->item, "filechooser::selectable"); + + return TRUE; +} + +static void +update_list_item (GtkFileChooserCell *self) +{ + if (self->list_item) + gtk_list_item_set_selectable (self->list_item, get_selectable (self)); +} + static void gtk_file_chooser_cell_set_property (GObject *object, guint prop_id, @@ -217,12 +236,25 @@ gtk_file_chooser_cell_set_property (GObject *object, case PROP_ITEM: self->item = g_value_get_object (value); + + if (get_selectable (self)) + gtk_widget_remove_css_class (GTK_WIDGET (self), "dim-label"); + else + gtk_widget_add_css_class (GTK_WIDGET (self), "dim-label"); + + update_list_item (self); break; case PROP_SHOW_TIME: self->show_time = g_value_get_boolean (value); break; + case PROP_LIST_ITEM: + self->list_item = g_value_get_object (value); + + update_list_item (self); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -292,6 +324,11 @@ gtk_file_chooser_cell_class_init (GtkFileChooserCellClass *klass) FALSE, GTK_PARAM_READWRITE)); + g_object_class_install_property (object_class, PROP_LIST_ITEM, + g_param_spec_object ("list-item", NULL, NULL, + GTK_TYPE_LIST_ITEM, + GTK_PARAM_WRITABLE)); + gtk_widget_class_set_css_name (widget_class, I_("filelistcell")); gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BIN_LAYOUT); } diff --git a/gtk/gtkfilechooserwidget.c b/gtk/gtkfilechooserwidget.c index a47a0ea541..933d0cee45 100644 --- a/gtk/gtkfilechooserwidget.c +++ b/gtk/gtkfilechooserwidget.c @@ -3981,10 +3981,10 @@ set_list_model (GtkFileChooserWidget *impl, set_busy_cursor (impl, TRUE); impl->browse_files_model = - _gtk_file_system_model_new_for_directory (impl->current_folder, - MODEL_ATTRIBUTES); + _gtk_file_system_model_new_for_directory (impl->current_folder, MODEL_ATTRIBUTES); _gtk_file_system_model_set_show_hidden (impl->browse_files_model, impl->show_hidden); + _gtk_file_system_model_set_can_select_files (impl->browse_files_model, impl->action != GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER); load_setup_timer (impl); /* This changes the state to LOAD_PRELOAD */ @@ -5820,6 +5820,8 @@ search_setup_model (GtkFileChooserWidget *impl) impl->search_model = _gtk_file_system_model_new (); + _gtk_file_system_model_set_can_select_files (impl->search_model, impl->action != GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER); + set_current_model (impl, G_LIST_MODEL (impl->search_model)); update_columns (impl, TRUE, _("Modified")); } @@ -5986,6 +5988,7 @@ recent_start_loading (GtkFileChooserWidget *impl) impl->recent_model = _gtk_file_system_model_new (); _gtk_file_system_model_set_filter (impl->recent_model, impl->current_filter); + _gtk_file_system_model_set_can_select_files (impl->recent_model, impl->action != GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER); if (!impl->recent_manager) return; diff --git a/gtk/gtkfilesystemmodel.c b/gtk/gtkfilesystemmodel.c index d37237f1c7..c830751642 100644 --- a/gtk/gtkfilesystemmodel.c +++ b/gtk/gtkfilesystemmodel.c @@ -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; +} diff --git a/gtk/gtkfilesystemmodelprivate.h b/gtk/gtkfilesystemmodelprivate.h index 36bf750e86..131063cb9a 100644 --- a/gtk/gtkfilesystemmodelprivate.h +++ b/gtk/gtkfilesystemmodelprivate.h @@ -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__ */ diff --git a/gtk/ui/gtkfilechooserwidget.ui b/gtk/ui/gtkfilechooserwidget.ui index f7a7c9a5ec..a5e4d3ca5d 100644 --- a/gtk/ui/gtkfilechooserwidget.ui +++ b/gtk/ui/gtkfilechooserwidget.ui @@ -193,6 +193,7 @@ <binding name="selected"> <lookup name="selected">GtkListItem</lookup> </binding> + <property name="list-item">GtkListItem</property> <child> <object class="GtkBox"> <binding name="tooltip-text"> @@ -256,6 +257,7 @@ <binding name="selected"> <lookup name="selected">GtkListItem</lookup> </binding> + <property name="list-item">GtkListItem</property> <child> <object class="GtkInscription"> <property name="hexpand">1</property> @@ -305,6 +307,7 @@ <binding name="selected"> <lookup name="selected">GtkListItem</lookup> </binding> + <property name="list-item">GtkListItem</property> <child> <object class="GtkLabel"> <property name="hexpand">1</property> @@ -352,6 +355,7 @@ <binding name="selected"> <lookup name="selected">GtkListItem</lookup> </binding> + <property name="list-item">GtkListItem</property> <child> <object class="GtkLabel"> <property name="hexpand">1</property> @@ -398,6 +402,7 @@ <binding name="selected"> <lookup name="selected">GtkListItem</lookup> </binding> + <property name="list-item">GtkListItem</property> <child> <object class="GtkBox"> <property name="spacing">6</property> @@ -712,6 +717,7 @@ <binding name="selected"> <lookup name="selected">GtkListItem</lookup> </binding> + <property name="list-item">GtkListItem</property> <child> <object class="GtkBox"> <property name="orientation">vertical</property> |