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;