diff --git a/data/Makefile.am b/data/Makefile.am index 8f24732d..54b4c986 100644 --- a/data/Makefile.am +++ b/data/Makefile.am @@ -49,6 +49,7 @@ EXTRA_DIST= \ org.gnome.Calendar.desktop \ calendar.gresource.xml \ shell-search-provider-dbus-interfaces.xml \ + ui/alarm-row.ui \ ui/calendar-row.ui \ ui/date-selector.ui \ ui/edit-dialog.ui \ diff --git a/data/calendar.gresource.xml b/data/calendar.gresource.xml index bae71e8c..f083f3f9 100644 --- a/data/calendar.gresource.xml +++ b/data/calendar.gresource.xml @@ -1,6 +1,7 @@ + ui/alarm-row.ui ui/calendar-row.ui ui/date-selector.ui ui/edit-dialog.ui diff --git a/data/ui/alarm-row.ui b/data/ui/alarm-row.ui new file mode 100644 index 00000000..acf8bd9c --- /dev/null +++ b/data/ui/alarm-row.ui @@ -0,0 +1,73 @@ + + + + + True + False + + + True + False + True + True + True + + + True + False + end + 0 + + + + + False + True + 0 + + + + + True + True + True + Toggles the sound of the alarm + + + True + False + audio-volume-high-symbolic + + + + + False + True + 1 + + + + + True + True + True + Remove the alarm + + + True + False + window-close-symbolic + + + + + False + True + 2 + + + + + diff --git a/data/ui/edit-dialog.ui b/data/ui/edit-dialog.ui index f1e59dbb..4bdc2fb2 100644 --- a/data/ui/edit-dialog.ui +++ b/data/ui/edit-dialog.ui @@ -101,6 +101,21 @@ 2 + + + True + end + Reminders + end + + + + 0 + 3 + + True @@ -113,7 +128,7 @@ 0 - 4 + 5 @@ -127,7 +142,7 @@ 0 - 3 + 4 @@ -188,7 +203,7 @@ 1 - 3 + 4 4 @@ -213,7 +228,7 @@ 1 - 4 + 5 4 @@ -285,6 +300,60 @@ 2 + + + True + False + 6 + True + vertical + + + False + False + none + + + + + + True + True + True + + + True + False + horizontal + + + True + False + True + 0.0 + Add reminder… + + + + + True + False + pan-down-symbolic + + + + + + + + + 1 + 3 + 4 + + True @@ -303,7 +372,7 @@ 0 - 5 + 6 diff --git a/src/gcal-edit-dialog.c b/src/gcal-edit-dialog.c index b2a510a5..66f34c65 100644 --- a/src/gcal-edit-dialog.c +++ b/src/gcal-edit-dialog.c @@ -16,6 +16,7 @@ * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ +#include "config.h" #include "gcal-edit-dialog.h" #include "gcal-time-selector.h" @@ -54,6 +55,8 @@ struct _GcalEditDialog GtkWidget *location_entry; GtkWidget *notes_text; + GtkWidget *alarms_listbox; + /* actions */ GMenu *sources_menu; GSimpleActionGroup *action_group; @@ -356,6 +359,7 @@ gcal_edit_dialog_class_init (GcalEditDialogClass *klass) gtk_widget_class_bind_template_child (widget_class, GcalEditDialog, end_date_selector); gtk_widget_class_bind_template_child (widget_class, GcalEditDialog, location_entry); /* Other */ + gtk_widget_class_bind_template_child (widget_class, GcalEditDialog, alarms_listbox); gtk_widget_class_bind_template_child (widget_class, GcalEditDialog, notes_text); gtk_widget_class_bind_template_child (widget_class, GcalEditDialog, all_day_check); gtk_widget_class_bind_template_child (widget_class, GcalEditDialog, titlebar); @@ -544,6 +548,189 @@ gcal_edit_dialog_all_day_changed (GtkWidget *widget, gtk_widget_set_sensitive (dialog->end_time_selector, !active); } +/* + * Alarm related functions + */ +static void +remove_button_clicked (GtkButton *button, + GtkWidget *row) +{ + ECalComponentAlarm *alarm; + GcalEditDialog *self; + GcalEvent *event; + gint trigger_minutes; + + self = GCAL_EDIT_DIALOG (gtk_widget_get_toplevel (row)); + alarm = g_object_get_data (G_OBJECT (row), "alarm"); + event = g_object_get_data (G_OBJECT (row), "event"); + trigger_minutes = get_alarm_trigger_minutes (event, alarm); + + gcal_event_remove_alarm (event, trigger_minutes); + + gcal_manager_update_event (self->manager, event); + + gtk_widget_destroy (row); +} + +static void +sound_toggle_changed (GtkToggleButton *button, + GtkWidget *row) +{ + ECalComponentAlarmAction action; + ECalComponentAlarm *alarm; + GtkWidget *image; + gboolean has_sound; + + alarm = g_object_get_data (G_OBJECT (row), "alarm"); + image = gtk_bin_get_child (GTK_BIN (button)); + has_sound = gtk_toggle_button_get_active (button); + + /* Setup the alarm action */ + action = has_sound ? E_CAL_COMPONENT_ALARM_AUDIO : E_CAL_COMPONENT_ALARM_DISPLAY; + + e_cal_component_alarm_set_action (alarm, action); + + /* Update the volume icon */ + gtk_image_set_from_icon_name (GTK_IMAGE (image), + has_sound ? "audio-volume-high-symbolic" : "audio-volume-muted-symbolic", + GTK_ICON_SIZE_BUTTON); + +} + +static GtkWidget* +create_row_for_alarm (GcalEvent *event, + ECalComponentAlarm *alarm) +{ + ECalComponentAlarmAction action; + GtkBuilder *builder; + GtkWidget *label, *main_box, *row, *remove_button; + GtkWidget *volume_button, *volume_icon; + gboolean has_sound; + gchar *text; + gint trigger_minutes; + + trigger_minutes = get_alarm_trigger_minutes (event, alarm); + + /* Something bad happened */ + if (trigger_minutes < 0) + return NULL; + + if (trigger_minutes < 60) + { + text = g_strdup_printf (g_dngettext (GETTEXT_PACKAGE, + "%d minute before", + "%d minutes before", + trigger_minutes), + trigger_minutes); + } + else if (trigger_minutes < 1440) + { + text = g_strdup_printf (g_dngettext (GETTEXT_PACKAGE, + "%d hour before", + "%d hours before", + trigger_minutes / 60), + trigger_minutes / 60); + } + else if (trigger_minutes < 10080) + { + text = g_strdup_printf (g_dngettext (GETTEXT_PACKAGE, + "%d day before", + "%d days before", + trigger_minutes / 1440), + trigger_minutes / 1440); + } + else + { + text = g_strdup_printf (g_dngettext (GETTEXT_PACKAGE, + "%d week before", + "%d weeks before", + trigger_minutes / 10080), + trigger_minutes / 10080); + } + + /* The row */ + row = gtk_list_box_row_new (); + + g_object_set_data (G_OBJECT (row), "alarm", alarm); + g_object_set_data (G_OBJECT (row), "event", event); + + /* Build the UI */ + builder = gtk_builder_new_from_resource ("/org/gnome/calendar/alarm-row.ui"); + +#define WID(x) (GTK_WIDGET (gtk_builder_get_object (builder, x))) + + label = WID ("label"); + gtk_label_set_label (GTK_LABEL (label), text); + + /* Retrieves the actions associated to the alarm */ + e_cal_component_alarm_get_action (alarm, &action); + + /* Updates the volume button to match the action */ + has_sound = action == E_CAL_COMPONENT_ALARM_AUDIO; + + volume_button = WID ("volume_button"); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (volume_button), has_sound); + + volume_icon = WID ("volume_icon"); + gtk_image_set_from_icon_name (GTK_IMAGE (volume_icon), + has_sound ? "audio-volume-high-symbolic" : "audio-volume-muted-symbolic", + GTK_ICON_SIZE_BUTTON); + + g_signal_connect (volume_button, + "toggled", + G_CALLBACK (sound_toggle_changed), + row); + + /* Remove button */ + remove_button = WID ("remove_button"); + + g_signal_connect (remove_button, + "clicked", + G_CALLBACK (remove_button_clicked), + row); + + main_box = WID ("main_box"); + gtk_container_add (GTK_CONTAINER (row), main_box); + + gtk_widget_show_all (row); + + g_clear_object (&builder); + g_free (text); + +#undef WID + + return row; +} + +static void +setup_alarms (GcalEditDialog *self) +{ + GList *alarms, *l; + + gtk_widget_set_visible (self->alarms_listbox, gcal_event_has_alarms (self->event)); + + alarms = gcal_event_get_alarms (self->event); + + /* Remove previous alarms */ + gtk_container_foreach (GTK_CONTAINER (self->alarms_listbox), + (GtkCallback) gtk_widget_destroy, + NULL); + + for (l = alarms; l != NULL; l = l->next) + { + GtkWidget *row; + + row = create_row_for_alarm (self->event, l->data); + + if (!row) + continue; + + gtk_container_add (GTK_CONTAINER (self->alarms_listbox), row); + } + + g_list_free (alarms); +} + /* Public API */ GtkWidget* gcal_edit_dialog_new (void) @@ -670,6 +857,9 @@ gcal_edit_dialog_set_event (GcalEditDialog *dialog, g_clear_pointer (&date_start, g_date_time_unref); g_clear_pointer (&date_end, g_date_time_unref); + /* Setup the alarms */ + setup_alarms (dialog); + out: g_object_notify (G_OBJECT (dialog), "event");