edit-dialog: Make date & time rows expandable
Add a human-readable label and move the widgets to the expandable section.
This commit is contained in:
@@ -28,6 +28,7 @@
|
|||||||
#include "gcal-event.h"
|
#include "gcal-event.h"
|
||||||
#include "gcal-recurrence.h"
|
#include "gcal-recurrence.h"
|
||||||
|
|
||||||
|
#include <dazzle.h>
|
||||||
#include <libecal/libecal.h>
|
#include <libecal/libecal.h>
|
||||||
#include <glib/gi18n.h>
|
#include <glib/gi18n.h>
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
@@ -71,7 +72,9 @@ struct _GcalEditDialog
|
|||||||
GtkWidget *summary_entry;
|
GtkWidget *summary_entry;
|
||||||
|
|
||||||
GtkWidget *start_date_selector;
|
GtkWidget *start_date_selector;
|
||||||
|
GtkLabel *event_start_label;
|
||||||
GtkWidget *end_date_selector;
|
GtkWidget *end_date_selector;
|
||||||
|
GtkLabel *event_end_label;
|
||||||
GtkSwitch *all_day_switch;
|
GtkSwitch *all_day_switch;
|
||||||
GtkWidget *start_time_selector;
|
GtkWidget *start_time_selector;
|
||||||
GtkWidget *end_time_selector;
|
GtkWidget *end_time_selector;
|
||||||
@@ -390,6 +393,114 @@ remove_recurrence_properties (GcalEvent *event)
|
|||||||
e_cal_component_set_rrules (comp, NULL);
|
e_cal_component_set_rrules (comp, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gchar*
|
||||||
|
format_datetime_for_display (GDateTime *date,
|
||||||
|
GcalTimeFormat format,
|
||||||
|
gboolean all_day)
|
||||||
|
{
|
||||||
|
g_autofree gchar *formatted_date = NULL;
|
||||||
|
g_autoptr (GDateTime) now = NULL;
|
||||||
|
GString *string;
|
||||||
|
gint days_diff;
|
||||||
|
|
||||||
|
string = g_string_new ("");
|
||||||
|
|
||||||
|
now = g_date_time_new_now_local ();
|
||||||
|
days_diff = gcal_date_time_compare_date (now, date);
|
||||||
|
|
||||||
|
switch (days_diff)
|
||||||
|
{
|
||||||
|
case -7:
|
||||||
|
case -6:
|
||||||
|
case -5:
|
||||||
|
case -4:
|
||||||
|
case -3:
|
||||||
|
case -2:
|
||||||
|
/* Translators: %A is the weekday name (e.g. Sunday, Monday, etc) */
|
||||||
|
formatted_date = g_date_time_format (date, _("Last %A"));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case -1:
|
||||||
|
formatted_date = g_strdup (_("Yesterday"));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0:
|
||||||
|
formatted_date = g_strdup (_("Today"));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
formatted_date = g_strdup (_("Tomorrow"));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
case 3:
|
||||||
|
case 4:
|
||||||
|
case 5:
|
||||||
|
case 6:
|
||||||
|
case 7:
|
||||||
|
/* Translators: %A is the weekday name (e.g. Sunday, Monday, etc) */
|
||||||
|
formatted_date = g_date_time_format (date, _("This %A"));
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
formatted_date = g_date_time_format (date, "%x");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!all_day)
|
||||||
|
{
|
||||||
|
g_autofree gchar *formatted_time = NULL;
|
||||||
|
|
||||||
|
switch (format)
|
||||||
|
{
|
||||||
|
case GCAL_TIME_FORMAT_12H:
|
||||||
|
formatted_time = g_date_time_format (date, "%I:%M %P");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GCAL_TIME_FORMAT_24H:
|
||||||
|
formatted_time = g_date_time_format (date, "%R");
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
g_assert_not_reached ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translators: %1$s is the formatted date (e.g. Today, Sunday, or even 2019-10-11) and %2$s is the
|
||||||
|
* formatted time (e.g. 03:14 PM, or 21:29)
|
||||||
|
*/
|
||||||
|
g_string_printf (string, _("%1$s, %2$s"), formatted_date, formatted_time);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_string_printf (string, "%s", formatted_date);
|
||||||
|
}
|
||||||
|
|
||||||
|
return g_string_free (string, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
update_date_labels (GcalEditDialog *self)
|
||||||
|
{
|
||||||
|
g_autofree gchar *start_label = NULL;
|
||||||
|
g_autofree gchar *end_label = NULL;
|
||||||
|
g_autoptr (GDateTime) start = NULL;
|
||||||
|
g_autoptr (GDateTime) end = NULL;
|
||||||
|
GcalTimeFormat time_format;
|
||||||
|
gboolean all_day;
|
||||||
|
|
||||||
|
time_format = gcal_context_get_time_format (self->context);
|
||||||
|
|
||||||
|
all_day = gtk_switch_get_active (self->all_day_switch);
|
||||||
|
start = get_date_start (self);
|
||||||
|
end = get_date_end (self);
|
||||||
|
start_label = format_datetime_for_display (start, time_format, all_day);
|
||||||
|
end_label = format_datetime_for_display (end, time_format, all_day);
|
||||||
|
|
||||||
|
gtk_label_set_label (self->event_start_label, start_label);
|
||||||
|
gtk_label_set_label (self->event_end_label, end_label);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
sync_datetimes (GcalEditDialog *self,
|
sync_datetimes (GcalEditDialog *self,
|
||||||
GParamSpec *pspec,
|
GParamSpec *pspec,
|
||||||
@@ -449,6 +560,8 @@ out:
|
|||||||
g_clear_pointer (&start, g_date_time_unref);
|
g_clear_pointer (&start, g_date_time_unref);
|
||||||
g_clear_pointer (&end, g_date_time_unref);
|
g_clear_pointer (&end, g_date_time_unref);
|
||||||
|
|
||||||
|
update_date_labels (self);
|
||||||
|
|
||||||
GCAL_EXIT;
|
GCAL_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -942,6 +1055,8 @@ on_all_day_switch_active_changed_cb (GtkSwitch *all_day_switch,
|
|||||||
|
|
||||||
gtk_widget_set_sensitive (self->start_time_selector, !active);
|
gtk_widget_set_sensitive (self->start_time_selector, !active);
|
||||||
gtk_widget_set_sensitive (self->end_time_selector, !active);
|
gtk_widget_set_sensitive (self->end_time_selector, !active);
|
||||||
|
|
||||||
|
update_date_labels (self);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -1294,6 +1409,8 @@ gcal_edit_dialog_class_init (GcalEditDialogClass *klass)
|
|||||||
gtk_widget_class_bind_template_child (widget_class, GcalEditDialog, end_time_selector);
|
gtk_widget_class_bind_template_child (widget_class, GcalEditDialog, end_time_selector);
|
||||||
gtk_widget_class_bind_template_child (widget_class, GcalEditDialog, end_date_selector);
|
gtk_widget_class_bind_template_child (widget_class, GcalEditDialog, end_date_selector);
|
||||||
gtk_widget_class_bind_template_child (widget_class, GcalEditDialog, location_entry);
|
gtk_widget_class_bind_template_child (widget_class, GcalEditDialog, location_entry);
|
||||||
|
gtk_widget_class_bind_template_child (widget_class, GcalEditDialog, event_start_label);
|
||||||
|
gtk_widget_class_bind_template_child (widget_class, GcalEditDialog, event_end_label);
|
||||||
/* Other */
|
/* Other */
|
||||||
gtk_widget_class_bind_template_child (widget_class, GcalEditDialog, alarms_listbox);
|
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, notes_text);
|
||||||
@@ -1521,6 +1638,8 @@ gcal_edit_dialog_set_event (GcalEditDialog *self,
|
|||||||
/* all_day */
|
/* all_day */
|
||||||
gtk_switch_set_active (self->all_day_switch, all_day);
|
gtk_switch_set_active (self->all_day_switch, all_day);
|
||||||
|
|
||||||
|
update_date_labels (self);
|
||||||
|
|
||||||
/* recurrence_changed */
|
/* recurrence_changed */
|
||||||
self->recurrence_changed = FALSE;
|
self->recurrence_changed = FALSE;
|
||||||
|
|
||||||
|
|||||||
@@ -207,22 +207,33 @@
|
|||||||
|
|
||||||
<!-- Start -->
|
<!-- Start -->
|
||||||
<child>
|
<child>
|
||||||
<object class="HdyActionRow">
|
<object class="HdyExpanderRow">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="title" translatable="yes">Starts</property>
|
<property name="title" translatable="yes">Starts</property>
|
||||||
<property name="activatable-widget">start_date_selector</property>
|
|
||||||
|
|
||||||
<child type="action">
|
<child type="action">
|
||||||
|
<object class="GtkLabel" id="event_start_label">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="xalign">1.0</property>
|
||||||
|
<property name="label" translatable="yes">Check this out!</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
|
||||||
|
<child>
|
||||||
<object class="GtkBox">
|
<object class="GtkBox">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="valign">center</property>
|
<property name="hexpand">True</property>
|
||||||
|
<property name="halign">center</property>
|
||||||
|
<property name="margin">12</property>
|
||||||
<property name="spacing">6</property>
|
<property name="spacing">6</property>
|
||||||
|
|
||||||
<child>
|
<child>
|
||||||
<object class="GcalDateSelector" id="start_date_selector">
|
<object class="GcalDateSelector" id="start_date_selector">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">True</property>
|
<property name="can_focus">True</property>
|
||||||
|
<property name="valign">center</property>
|
||||||
<property name="input-hints">no-emoji</property>
|
<property name="input-hints">no-emoji</property>
|
||||||
<signal name="notify::date" handler="sync_datetimes" object="GcalEditDialog" swapped="yes" />
|
<signal name="notify::date" handler="sync_datetimes" object="GcalEditDialog" swapped="yes" />
|
||||||
</object>
|
</object>
|
||||||
@@ -244,22 +255,33 @@
|
|||||||
|
|
||||||
<!-- End -->
|
<!-- End -->
|
||||||
<child>
|
<child>
|
||||||
<object class="HdyActionRow">
|
<object class="HdyExpanderRow">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="title" translatable="yes">Ends</property>
|
<property name="title" translatable="yes">Ends</property>
|
||||||
<property name="activatable-widget">end_date_selector</property>
|
|
||||||
|
|
||||||
<child type="action">
|
<child type="action">
|
||||||
|
<object class="GtkLabel" id="event_end_label">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="xalign">1.0</property>
|
||||||
|
<property name="label" translatable="yes">Check this out!</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
|
||||||
|
<child>
|
||||||
<object class="GtkBox">
|
<object class="GtkBox">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="valign">center</property>
|
<property name="hexpand">True</property>
|
||||||
|
<property name="halign">center</property>
|
||||||
|
<property name="margin">12</property>
|
||||||
<property name="spacing">6</property>
|
<property name="spacing">6</property>
|
||||||
|
|
||||||
<child>
|
<child>
|
||||||
<object class="GcalDateSelector" id="end_date_selector">
|
<object class="GcalDateSelector" id="end_date_selector">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">True</property>
|
<property name="can_focus">True</property>
|
||||||
|
<property name="valign">center</property>
|
||||||
<property name="input-hints">no-emoji</property>
|
<property name="input-hints">no-emoji</property>
|
||||||
<signal name="notify::date" handler="sync_datetimes" object="GcalEditDialog" swapped="yes" />
|
<signal name="notify::date" handler="sync_datetimes" object="GcalEditDialog" swapped="yes" />
|
||||||
</object>
|
</object>
|
||||||
|
|||||||
Reference in New Issue
Block a user