diff --git a/src/gui/gcal-event-popover.c b/src/gui/gcal-event-popover.c index 7cbe1caa75ce39ae5e29ce49884eeb259fb579c2..8fd7e4fab6b30f3abfa564b18493b146edb175a5 100644 --- a/src/gui/gcal-event-popover.c +++ b/src/gui/gcal-event-popover.c @@ -42,6 +42,9 @@ struct _GcalEventPopover GcalContext *context; GcalEvent *event; + + /* flags */ + gboolean writable; }; static void on_join_meeting_cb (GcalMeetingRow *meeting_row, @@ -55,6 +58,7 @@ enum PROP_0, PROP_CONTEXT, PROP_EVENT, + PROP_WRITABLE, N_PROPS }; @@ -495,9 +499,21 @@ set_event_internal (GcalEventPopover *self, update_placeholder_label (self); update_date_time_label (self); - gtk_widget_grab_focus (self->edit_button); + if (self->writable) + gtk_widget_grab_focus (self->edit_button); } +static void +set_writable (GcalEventPopover *self, + gboolean writable) +{ + if (self->writable == writable) + return; + + self->writable = writable; + + g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_WRITABLE]); +} /* * Callbacks @@ -574,7 +590,7 @@ gcal_event_popover_map (GtkWidget *widget) if (first_meeting_row) gtk_widget_grab_focus (GTK_WIDGET (first_meeting_row)); - else + else if (self->writable) gtk_widget_grab_focus (self->edit_button); } @@ -612,6 +628,10 @@ gcal_event_popover_get_property (GObject *object, g_value_set_object (value, self->event); break; + case PROP_WRITABLE: + g_value_set_boolean (value, self->writable); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } @@ -642,6 +662,10 @@ gcal_event_popover_set_property (GObject *object, set_event_internal (self, g_value_get_object (value)); break; + case PROP_WRITABLE: + set_writable (self, g_value_get_boolean (value)); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } @@ -680,6 +704,17 @@ gcal_event_popover_class_init (GcalEventPopoverClass *klass) GCAL_TYPE_EVENT, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); + /** + * GcalEventPopover::writable: + * + * Whether the current event can be edited or not. + */ + properties[PROP_WRITABLE] = g_param_spec_boolean ("writable", + "Whether the current event can be edited", + "Whether the current event can be edited or not", + TRUE, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + g_object_class_install_properties (object_class, N_PROPS, properties); signals[EDIT] = g_signal_new ("edit", @@ -708,6 +743,8 @@ gcal_event_popover_class_init (GcalEventPopoverClass *klass) static void gcal_event_popover_init (GcalEventPopover *self) { + self->writable = TRUE; + gtk_widget_init_template (GTK_WIDGET (self)); if (gtk_widget_get_direction (GTK_WIDGET (self)) == GTK_TEXT_DIR_RTL) @@ -718,10 +755,12 @@ gcal_event_popover_init (GcalEventPopover *self) GtkWidget* gcal_event_popover_new (GcalContext *context, - GcalEvent *event) + GcalEvent *event, + gboolean writable) { return g_object_new (GCAL_TYPE_EVENT_POPOVER, "context", context, "event", event, + "writable", writable, NULL); } diff --git a/src/gui/gcal-event-popover.h b/src/gui/gcal-event-popover.h index 03f3bc7ea8bd66fdce6f43a8fc89acbe6c35ed76..f4f09a2aa36709f0fb4529d2adb343ce3a76dd31 100644 --- a/src/gui/gcal-event-popover.h +++ b/src/gui/gcal-event-popover.h @@ -31,6 +31,7 @@ G_BEGIN_DECLS G_DECLARE_FINAL_TYPE (GcalEventPopover, gcal_event_popover, GCAL, EVENT_POPOVER, GtkPopover) GtkWidget* gcal_event_popover_new (GcalContext *context, - GcalEvent *event); + GcalEvent *event, + gboolean writable); G_END_DECLS diff --git a/src/gui/gcal-event-popover.ui b/src/gui/gcal-event-popover.ui index 8259d0288b1c8aedcbf72360badb7934e0723a69..85b83bfd96d4b99c4c6bae5bf3537ee5025861c6 100644 --- a/src/gui/gcal-event-popover.ui +++ b/src/gui/gcal-event-popover.ui @@ -169,6 +169,7 @@ 12 12 Edit… + diff --git a/src/gui/gcal-event-widget.c b/src/gui/gcal-event-widget.c index bc7863c2e4b33600a46aef967b5e1fa741da6e4d..00753d9e5c8c160f7a5565d97f9eb0f7d5f4e683 100644 --- a/src/gui/gcal-event-widget.c +++ b/src/gui/gcal-event-widget.c @@ -959,20 +959,26 @@ gcal_event_widget_show_preview (GcalEventWidget *self, GcalEventPreviewCallback callback, gpointer user_data) { + GcalCalendar *calendar; PreviewData *data; GtkWidget *event_popover; GCAL_ENTRY; + calendar = gcal_event_get_calendar (self->event); + data = g_new0 (PreviewData, 1); data->event_widget = self; data->callback = callback; data->user_data = user_data; - event_popover = gcal_event_popover_new (self->context, self->event); + event_popover = gcal_event_popover_new (self->context, self->event, !gcal_calendar_is_read_only (calendar)); gtk_widget_set_parent (event_popover, GTK_WIDGET (self)); g_signal_connect (event_popover, "closed", G_CALLBACK (on_event_popover_closed_cb), data); - g_signal_connect (event_popover, "edit", G_CALLBACK (on_event_popover_edit_cb), data); + + if (!gcal_calendar_is_read_only (calendar)) + g_signal_connect (event_popover, "edit", G_CALLBACK (on_event_popover_edit_cb), data); + gtk_popover_popup (GTK_POPOVER (event_popover)); GCAL_EXIT;