From e27fa336900482c753e088f6eca720912db24d40 Mon Sep 17 00:00:00 2001 From: Corey Berla Date: Wed, 19 Oct 2022 12:42:56 -0700 Subject: [PATCH] filechooser: Add show-time property The "Show Time" setting does not take immediate effect (only after changing folders) because it's set as a single call to column_view_get_time_visible() on the FileChooserCell creation. Instead create a bind a show-time property that gets updated as the setting is changed. --- gtk/gtkfilechoosercell.c | 30 ++++++++++++++++++++++++++++++ gtk/gtkfilechooserwidget.c | 27 ++++++++++++--------------- gtk/ui/gtkfilechooserwidget.ui | 6 ++---- 3 files changed, 44 insertions(+), 19 deletions(-) diff --git a/gtk/gtkfilechoosercell.c b/gtk/gtkfilechoosercell.c index cb81322234..655f54c46f 100644 --- a/gtk/gtkfilechoosercell.c +++ b/gtk/gtkfilechoosercell.c @@ -40,6 +40,8 @@ struct _GtkFileChooserCell GFileInfo *item; gboolean selected; guint position; + + gboolean show_time; }; struct _GtkFileChooserCellClass @@ -54,6 +56,7 @@ enum PROP_POSITION = 1, PROP_SELECTED, PROP_ITEM, + PROP_SHOW_TIME, }; #define ICON_SIZE 16 @@ -144,6 +147,18 @@ drag_prepare_cb (GtkDragSource *source, return provider; } +static void +gtk_file_chooser_cell_realize (GtkWidget *widget) +{ + GtkFileChooserCell *self = GTK_FILE_CHOOSER_CELL (widget); + GtkFileChooserWidget *impl; + + impl = GTK_FILE_CHOOSER_WIDGET (gtk_widget_get_ancestor (GTK_WIDGET (self), + GTK_TYPE_FILE_CHOOSER_WIDGET)); + + g_object_bind_property (impl, "show-time", self, "show-time", G_BINDING_SYNC_CREATE); +} + static void gtk_file_chooser_cell_init (GtkFileChooserCell *self) { @@ -161,6 +176,8 @@ gtk_file_chooser_cell_init (GtkFileChooserCell *self) drag_source = gtk_drag_source_new (); gtk_widget_add_controller (GTK_WIDGET (self), GTK_EVENT_CONTROLLER (drag_source)); g_signal_connect (drag_source, "prepare", G_CALLBACK (drag_prepare_cb), self); + + g_signal_connect (self, "realize", G_CALLBACK (gtk_file_chooser_cell_realize), NULL); } static void @@ -196,6 +213,10 @@ gtk_file_chooser_cell_set_property (GObject *object, self->item = g_value_get_object (value); break; + case PROP_SHOW_TIME: + self->show_time = g_value_get_boolean (value); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -224,6 +245,10 @@ gtk_file_chooser_cell_get_property (GObject *object, g_value_set_object (value, self->item); break; + case PROP_SHOW_TIME: + g_value_set_boolean (value, self->show_time); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -256,6 +281,11 @@ gtk_file_chooser_cell_class_init (GtkFileChooserCellClass *klass) G_TYPE_FILE_INFO, GTK_PARAM_READWRITE)); + g_object_class_install_property (object_class, PROP_SHOW_TIME, + g_param_spec_boolean ("show-time", NULL, NULL, + FALSE, + GTK_PARAM_READWRITE)); + 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 8cbbb6055f..c289045090 100644 --- a/gtk/gtkfilechooserwidget.c +++ b/gtk/gtkfilechooserwidget.c @@ -125,7 +125,8 @@ G_GNUC_BEGIN_IGNORE_DEPRECATIONS enum { PROP_SEARCH_MODE = 1, - PROP_SUBTITLE + PROP_SUBTITLE, + PROP_SHOW_TIME, }; typedef enum { @@ -1539,6 +1540,7 @@ change_show_time_state (GSimpleAction *action, g_simple_action_set_state (action, state); impl->show_time = g_variant_get_boolean (state); + g_object_notify (G_OBJECT (impl), "show-time"); } /* Shows an error dialog about not being able to select a dragged file */ @@ -2065,19 +2067,6 @@ column_view_get_size (GtkListItem *item, return NULL; } -static gboolean -column_view_get_time_visible (GtkListItem *item) -{ - GtkFileChooserWidget *impl; - - impl = GTK_FILE_CHOOSER_WIDGET (gtk_widget_get_ancestor (gtk_list_item_get_child (item), - GTK_TYPE_FILE_CHOOSER_WIDGET)); - if (!impl) - return FALSE; - - return impl->show_time; -} - static char * column_view_get_tooltip_text (GtkListItem *list_item, GFileInfo *info) @@ -3018,6 +3007,10 @@ gtk_file_chooser_widget_get_property (GObject *object, g_value_take_string (value, gtk_file_chooser_widget_get_subtitle (impl)); break; + case PROP_SHOW_TIME: + g_value_set_boolean (value, impl->show_time); + break; + case GTK_FILE_CHOOSER_PROP_ACTION: g_value_set_enum (value, impl->action); break; @@ -6710,6 +6703,11 @@ gtk_file_chooser_widget_class_init (GtkFileChooserWidgetClass *class) "", GTK_PARAM_READABLE)); + g_object_class_install_property (gobject_class, PROP_SHOW_TIME, + g_param_spec_boolean ("show-time", NULL, NULL, + FALSE, + GTK_PARAM_READABLE)); + _gtk_file_chooser_install_properties (gobject_class); /* Bind class to template */ @@ -6772,7 +6770,6 @@ gtk_file_chooser_widget_class_init (GtkFileChooserWidgetClass *class) gtk_widget_class_bind_template_callback (widget_class, column_view_get_file_type); gtk_widget_class_bind_template_callback (widget_class, column_view_get_location); gtk_widget_class_bind_template_callback (widget_class, column_view_get_size); - gtk_widget_class_bind_template_callback (widget_class, column_view_get_time_visible); gtk_widget_class_bind_template_callback (widget_class, column_view_get_tooltip_text); gtk_widget_class_bind_template_callback (widget_class, column_view_row_activated_cb); diff --git a/gtk/ui/gtkfilechooserwidget.ui b/gtk/ui/gtkfilechooserwidget.ui index 5a12539965..703c956a3c 100644 --- a/gtk/ui/gtkfilechooserwidget.ui +++ b/gtk/ui/gtkfilechooserwidget.ui @@ -360,7 +360,7 @@