From d6a216d0fa21d6111391c2969df6176d1ec7f4d8 Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Sun, 5 Mar 2023 11:41:35 -0300 Subject: [PATCH] gui: Propagate context to GcalSearchButton The people who introduced this code were not careful enough to make sure the code they removed from GcalWindow was added back in GcalToolbarEnd. They also simply commented out some code instead of properly reimplementing that. I regret having trusted their code :( Closes https://gitlab.gnome.org/GNOME/gnome-calendar/-/issues/880 --- src/gui/gcal-toolbar-end.c | 97 +++++++++++++++++++++++++++++++++++-- src/gui/gcal-toolbar-end.ui | 2 +- src/gui/gcal-window.c | 3 ++ src/gui/gcal-window.ui | 2 +- 4 files changed, 97 insertions(+), 7 deletions(-) diff --git a/src/gui/gcal-toolbar-end.c b/src/gui/gcal-toolbar-end.c index 99fe39a2..5461a090 100644 --- a/src/gui/gcal-toolbar-end.c +++ b/src/gui/gcal-toolbar-end.c @@ -18,24 +18,111 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ -#include "gcal-toolbar-end.h" - +#include "gcal-context.h" #include "gcal-search-button.h" +#include "gcal-toolbar-end.h" struct _GcalToolbarEnd { - AdwBin parent_instance; + AdwBin parent_instance; + + GcalSearchButton *search_button; + + GcalContext *context; }; G_DEFINE_FINAL_TYPE (GcalToolbarEnd, gcal_toolbar_end, ADW_TYPE_BIN) +enum +{ + PROP_0, + PROP_CONTEXT, + N_PROPS +}; + +static GParamSpec *properties [N_PROPS]; + + +/* + * GObject overrides + */ + +static void +gcal_toolbar_end_finalize (GObject *object) +{ + GcalToolbarEnd *self = (GcalToolbarEnd *)object; + + g_clear_object (&self->context); + + G_OBJECT_CLASS (gcal_toolbar_end_parent_class)->finalize (object); +} + +static void +gcal_toolbar_end_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GcalToolbarEnd *self = GCAL_TOOLBAR_END (object); + + switch (prop_id) + { + case PROP_CONTEXT: + g_value_set_object (value, self->context); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +gcal_toolbar_end_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GcalToolbarEnd *self = GCAL_TOOLBAR_END (object); + + switch (prop_id) + { + case PROP_CONTEXT: + g_assert (self->context == NULL); + self->context = g_value_dup_object (value); + g_object_bind_property (self, "context", self->search_button, "context", G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + static void gcal_toolbar_end_class_init (GcalToolbarEndClass *klass) { + GObjectClass *object_class = G_OBJECT_CLASS (klass); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); - gtk_widget_class_set_template_from_resource (widget_class, - "/org/gnome/calendar/ui/gui/gcal-toolbar-end.ui"); + object_class->finalize = gcal_toolbar_end_finalize; + object_class->get_property = gcal_toolbar_end_get_property; + object_class->set_property = gcal_toolbar_end_set_property; + + /** + * GcalToolbarEnd::context: + * + * The #GcalContext of the application. + */ + properties[PROP_CONTEXT] = g_param_spec_object ("context", + "Context of the application", + "The context of the application", + GCAL_TYPE_CONTEXT, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, N_PROPS, properties); + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/calendar/ui/gui/gcal-toolbar-end.ui"); + + gtk_widget_class_bind_template_child (widget_class, GcalToolbarEnd, search_button); } static void diff --git a/src/gui/gcal-toolbar-end.ui b/src/gui/gcal-toolbar-end.ui index a94caf1d..8389bba6 100644 --- a/src/gui/gcal-toolbar-end.ui +++ b/src/gui/gcal-toolbar-end.ui @@ -5,7 +5,7 @@ 6 - + Search for events diff --git a/src/gui/gcal-window.c b/src/gui/gcal-window.c index baf10c18..f80578fd 100644 --- a/src/gui/gcal-window.c +++ b/src/gui/gcal-window.c @@ -106,6 +106,7 @@ struct _GcalWindow GtkWidget *agenda_view; GtkWidget *date_chooser; GtkWidget *action_bar; + GcalToolbarEnd *toolbar_end; /* header_bar widets */ GtkWidget *calendars_button; @@ -855,6 +856,7 @@ gcal_window_constructed (GObject *object) g_object_bind_property (self, "context", self->date_chooser, "context", G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE); g_object_bind_property (self, "context", self->event_editor, "context", G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE); g_object_bind_property (self, "context", self->quick_add_popover, "context", G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE); + g_object_bind_property (self, "context", self->toolbar_end, "context", G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE); /* CSS */ load_css_providers (self); @@ -1044,6 +1046,7 @@ gcal_window_class_init (GcalWindowClass *klass) gtk_widget_class_bind_template_child (widget_class, GcalWindow, quick_add_popover); gtk_widget_class_bind_template_child (widget_class, GcalWindow, calendar_management_dialog); gtk_widget_class_bind_template_child (widget_class, GcalWindow, overlay); + gtk_widget_class_bind_template_child (widget_class, GcalWindow, toolbar_end); gtk_widget_class_bind_template_child (widget_class, GcalWindow, views_stack); gtk_widget_class_bind_template_child (widget_class, GcalWindow, views_switcher); gtk_widget_class_bind_template_child (widget_class, GcalWindow, weather_settings); diff --git a/src/gui/gcal-window.ui b/src/gui/gcal-window.ui index 91bc7c17..5d2748bf 100644 --- a/src/gui/gcal-window.ui +++ b/src/gui/gcal-window.ui @@ -200,7 +200,7 @@ - +