diff --git a/src/gui/gcal-event-widget.c b/src/gui/gcal-event-widget.c index f6d2f43a..ceab5e85 100644 --- a/src/gui/gcal-event-widget.c +++ b/src/gui/gcal-event-widget.c @@ -62,7 +62,6 @@ struct _GcalEventWidget GtkWidget *preview_popover; /* internal data */ - gboolean read_only : 1; gchar *css_class; GcalEvent *event; @@ -104,6 +103,11 @@ typedef enum static guint signals[NUM_SIGNALS] = { 0, }; +static gboolean read_only_to_propagation_phase_cb (GBinding *binding, + const GValue *from_value, + GValue *to_value, + gpointer user_data); + G_DEFINE_TYPE_WITH_CODE (GcalEventWidget, gcal_event_widget, GTK_TYPE_WIDGET, G_IMPLEMENT_INTERFACE (GTK_TYPE_ORIENTABLE, NULL)); @@ -503,6 +507,16 @@ gcal_event_widget_set_event_internal (GcalEventWidget *self, "text", G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE); + g_object_bind_property_full (gcal_event_get_calendar (event), + "read-only", + self->drag_source, + "propagation-phase", + G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE, + read_only_to_propagation_phase_cb, + NULL, + self, + NULL); + gcal_event_widget_update_style (self); gcal_event_widget_update_timestamp (self); } @@ -583,6 +597,24 @@ on_event_popover_edit_cb (GtkWidget *event_popover, reply_preview_callback (event_popover, data, GCAL_EVENT_PREVIEW_ACTION_EDIT); } +static gboolean +read_only_to_propagation_phase_cb (GBinding *binding, + const GValue *from_value, + GValue *to_value, + gpointer user_data) +{ + GtkPropagationPhase phase; + + if (g_value_get_boolean (from_value)) + phase = GTK_PHASE_NONE; + else + phase = GTK_PHASE_BUBBLE; + + g_value_set_enum (to_value, phase); + + return TRUE; +} + /* * GObject overrides @@ -853,18 +885,6 @@ gcal_event_widget_new (GcalContext *context, NULL); } -void -gcal_event_widget_set_read_only (GcalEventWidget *event, - gboolean read_only) -{ - g_return_if_fail (GCAL_IS_EVENT_WIDGET (event)); - - gtk_event_controller_set_propagation_phase (event->drag_source, - read_only ? GTK_PHASE_NONE : GTK_PHASE_BUBBLE); - - event->read_only = read_only; -} - /** * gcal_event_widget_get_date_end: * @self: a #GcalEventWidget @@ -1044,12 +1064,7 @@ gcal_event_widget_get_event (GcalEventWidget *self) GtkWidget* gcal_event_widget_clone (GcalEventWidget *widget) { - GtkWidget *new_widget; - - new_widget = gcal_event_widget_new (widget->context, widget->event); - gcal_event_widget_set_read_only (GCAL_EVENT_WIDGET (new_widget), widget->read_only); - - return new_widget; + return gcal_event_widget_new (widget->context, widget->event); } /** diff --git a/src/gui/gcal-event-widget.h b/src/gui/gcal-event-widget.h index c57ab91b..2dcdbb75 100644 --- a/src/gui/gcal-event-widget.h +++ b/src/gui/gcal-event-widget.h @@ -54,9 +54,6 @@ GDateTime* gcal_event_widget_get_date_end (GcalEventWidge void gcal_event_widget_set_date_end (GcalEventWidget *self, GDateTime *date_end); -void gcal_event_widget_set_read_only (GcalEventWidget *event, - gboolean read_only); - void gcal_event_widget_set_timestamp_policy (GcalEventWidget *event, GcalTimestampPolicy timestamp_policy); diff --git a/src/gui/views/gcal-month-view-row.c b/src/gui/views/gcal-month-view-row.c index 43e51b8d..2fba197e 100644 --- a/src/gui/views/gcal-month-view-row.c +++ b/src/gui/views/gcal-month-view-row.c @@ -314,7 +314,6 @@ recalculate_layout_blocks (GcalMonthViewRow *self) GtkWidget *event_widget; event_widget = gcal_event_widget_new (self->context, event); - // TODO: gcal_event_widget_set_read_only (GCAL_EVENT_WIDGET (event_widget), gcal_calendar_is_read_only (calendar)); if (!gcal_event_get_all_day (event) && !gcal_event_is_multiday (event)) gcal_event_widget_set_timestamp_policy (GCAL_EVENT_WIDGET (event_widget), GCAL_TIMESTAMP_POLICY_START); setup_child_widget (self, event_widget);