event-widget: Add the timestamp-policy property
This gives some control on what time is displayed on the widget. It will be used to show the time of the end of an event in the agenda view.
This commit is contained in:
committed by
Georges Basile Stavracas Neto
parent
0d27b08803
commit
cb439095a5
+81
-18
@@ -53,7 +53,7 @@ struct _GcalEventWidget
|
||||
/* widgets */
|
||||
GtkWidget *color_box;
|
||||
GtkWidget *horizontal_box;
|
||||
GtkWidget *hour_label;
|
||||
GtkWidget *timestamp_label;
|
||||
GtkWidget *squeezer;
|
||||
GtkWidget *summary_label;
|
||||
GtkWidget *vertical_box;
|
||||
@@ -68,6 +68,8 @@ struct _GcalEventWidget
|
||||
|
||||
GtkOrientation orientation;
|
||||
|
||||
GcalTimestampPolicy timestamp_policy;
|
||||
|
||||
gint old_width;
|
||||
gint old_height;
|
||||
|
||||
@@ -81,6 +83,7 @@ enum
|
||||
PROP_DATE_END,
|
||||
PROP_DATE_START,
|
||||
PROP_EVENT,
|
||||
PROP_TIMESTAMP_POLICY,
|
||||
PROP_ORIENTATION,
|
||||
NUM_PROPS
|
||||
};
|
||||
@@ -376,25 +379,37 @@ gcal_event_widget_set_event_tooltip (GcalEventWidget *self,
|
||||
g_string_free (tooltip_mesg, TRUE);
|
||||
}
|
||||
|
||||
static gchar*
|
||||
get_hour_label (GcalEventWidget *self)
|
||||
static void
|
||||
gcal_event_widget_update_timestamp (GcalEventWidget *self)
|
||||
{
|
||||
g_autoptr (GDateTime) local_start_time;
|
||||
g_autofree gchar *timestamp_str = NULL;
|
||||
|
||||
local_start_time = g_date_time_to_local (gcal_event_get_date_start (self->event));
|
||||
if (GCAL_IS_EVENT (self->event) &&
|
||||
self->timestamp_policy != GCAL_TIMESTAMP_POLICY_NONE)
|
||||
{
|
||||
g_autoptr (GDateTime) time = NULL;
|
||||
|
||||
if (self->clock_format_24h)
|
||||
return g_date_time_format (local_start_time, "%R");
|
||||
else
|
||||
return g_date_time_format (local_start_time, "%I:%M %P");
|
||||
if (self->timestamp_policy == GCAL_TIMESTAMP_POLICY_START)
|
||||
time = g_date_time_to_local (gcal_event_get_date_start (self->event));
|
||||
else
|
||||
time = g_date_time_to_local (gcal_event_get_date_end (self->event));
|
||||
|
||||
if (gcal_event_get_all_day (self->event) || gcal_event_is_multiday (self->event))
|
||||
timestamp_str = g_date_time_format (time, "%a %B %e");
|
||||
else if (self->clock_format_24h)
|
||||
timestamp_str = g_date_time_format (time, "%R");
|
||||
else
|
||||
timestamp_str = g_date_time_format (time, "%I:%M %P");
|
||||
}
|
||||
|
||||
gtk_widget_set_visible (self->timestamp_label, timestamp_str != NULL);
|
||||
gtk_label_set_label (GTK_LABEL (self->timestamp_label), timestamp_str);
|
||||
}
|
||||
|
||||
static void
|
||||
gcal_event_widget_set_event_internal (GcalEventWidget *self,
|
||||
GcalEvent *event)
|
||||
{
|
||||
g_autofree gchar *hour_str = NULL;
|
||||
|
||||
/*
|
||||
* This function is called only once, since the property is
|
||||
* set as CONSTRUCT_ONLY. Any other attempt to set an event
|
||||
@@ -432,18 +447,15 @@ gcal_event_widget_set_event_internal (GcalEventWidget *self,
|
||||
/* Tooltip */
|
||||
gcal_event_widget_set_event_tooltip (self, event);
|
||||
|
||||
/* Hour label */
|
||||
hour_str = get_hour_label (self);
|
||||
|
||||
gtk_widget_set_visible (self->hour_label, !gcal_event_get_all_day (event));
|
||||
gtk_label_set_label (GTK_LABEL (self->hour_label), hour_str);
|
||||
|
||||
/* Summary label */
|
||||
g_object_bind_property (event,
|
||||
"summary",
|
||||
self->summary_label,
|
||||
"label",
|
||||
G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE);
|
||||
|
||||
gcal_event_widget_update_style (self);
|
||||
gcal_event_widget_update_timestamp (self);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -560,10 +572,15 @@ gcal_event_widget_set_property (GObject *object,
|
||||
gcal_event_widget_set_event_internal (self, g_value_get_object (value));
|
||||
break;
|
||||
|
||||
case PROP_TIMESTAMP_POLICY:
|
||||
gcal_event_widget_set_timestamp_policy (self, g_value_get_enum (value));
|
||||
break;
|
||||
|
||||
case PROP_ORIENTATION:
|
||||
self->orientation = g_value_get_enum (value);
|
||||
gtk_widget_set_visible (self->vertical_box, self->orientation == GTK_ORIENTATION_VERTICAL);
|
||||
gcal_event_widget_update_style (self);
|
||||
gcal_event_widget_update_timestamp (self);
|
||||
g_object_notify (object, "orientation");
|
||||
break;
|
||||
|
||||
@@ -598,6 +615,10 @@ gcal_event_widget_get_property (GObject *object,
|
||||
g_value_set_object (value, self->event);
|
||||
break;
|
||||
|
||||
case PROP_TIMESTAMP_POLICY:
|
||||
g_value_set_enum (value, self->timestamp_policy);
|
||||
break;
|
||||
|
||||
case PROP_ORIENTATION:
|
||||
g_value_set_enum (value, self->orientation);
|
||||
break;
|
||||
@@ -704,6 +725,23 @@ gcal_event_widget_class_init (GcalEventWidgetClass *klass)
|
||||
GCAL_TYPE_EVENT,
|
||||
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
|
||||
|
||||
/**
|
||||
* GcalEventWidget::timestamp-policy:
|
||||
*
|
||||
* The policy for this widget's timestamp.
|
||||
*
|
||||
* Whether to show the start time, end time, or no time for the
|
||||
* event. Depending on the event's kind, it will be an hour or a day.
|
||||
*/
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_TIMESTAMP_POLICY,
|
||||
g_param_spec_enum ("timestamp-policy",
|
||||
"Timestamp Policy",
|
||||
"The policy for this widget's timestamp",
|
||||
GCAL_TYPE_TIMESTAMP_POLICY,
|
||||
GCAL_TIMESTAMP_POLICY_NONE,
|
||||
G_PARAM_READWRITE));
|
||||
|
||||
/**
|
||||
* GcalEventWidget::orientation:
|
||||
*
|
||||
@@ -725,7 +763,7 @@ gcal_event_widget_class_init (GcalEventWidgetClass *klass)
|
||||
gtk_widget_class_bind_template_child (widget_class, GcalEventWidget, color_box);
|
||||
gtk_widget_class_bind_template_child (widget_class, GcalEventWidget, drag_source);
|
||||
gtk_widget_class_bind_template_child (widget_class, GcalEventWidget, horizontal_box);
|
||||
gtk_widget_class_bind_template_child (widget_class, GcalEventWidget, hour_label);
|
||||
gtk_widget_class_bind_template_child (widget_class, GcalEventWidget, timestamp_label);
|
||||
gtk_widget_class_bind_template_child (widget_class, GcalEventWidget, squeezer);
|
||||
gtk_widget_class_bind_template_child (widget_class, GcalEventWidget, summary_label);
|
||||
gtk_widget_class_bind_template_child (widget_class, GcalEventWidget, vertical_box);
|
||||
@@ -880,6 +918,31 @@ gcal_event_widget_set_date_start (GcalEventWidget *self,
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* gcal_event_widget_set_timestamp_policy:
|
||||
* @self: a #GcalEventWidget
|
||||
* @policy: the timestamp policy
|
||||
*
|
||||
* Sets whether to show the start time, end time, or no time for the
|
||||
* event. Depending on the event's kind, it will be an hour or a day.
|
||||
*/
|
||||
void
|
||||
gcal_event_widget_set_timestamp_policy (GcalEventWidget *self,
|
||||
GcalTimestampPolicy policy)
|
||||
{
|
||||
g_return_if_fail (GCAL_IS_EVENT_WIDGET (self));
|
||||
g_return_if_fail (policy >= GCAL_TIMESTAMP_POLICY_NONE && policy <= GCAL_TIMESTAMP_POLICY_END);
|
||||
|
||||
if (self->timestamp_policy != policy)
|
||||
{
|
||||
self->timestamp_policy = policy;
|
||||
|
||||
gcal_event_widget_update_timestamp (self);
|
||||
|
||||
g_object_notify (G_OBJECT (self), "timestamp-policy");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* gcal_event_widget_show_preview:
|
||||
* @self: a #GcalEventWidget
|
||||
|
||||
@@ -57,6 +57,9 @@ void gcal_event_widget_set_date_end (GcalEventWidge
|
||||
void gcal_event_widget_set_read_only (GcalEventWidget *event,
|
||||
gboolean read_only);
|
||||
|
||||
void gcal_event_widget_set_timestamp_policy (GcalEventWidget *event,
|
||||
GcalTimestampPolicy timestamp_policy);
|
||||
|
||||
void gcal_event_widget_show_preview (GcalEventWidget *self,
|
||||
GcalEventPreviewCallback callback,
|
||||
gpointer user_data);
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
<property name="request-mode">width-for-height</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="label" bind-source="hour_label" bind-property="label" bind-flags="default" />
|
||||
<property name="label" bind-source="timestamp_label" bind-property="label" bind-flags="default" />
|
||||
<property name="xalign">0.0</property>
|
||||
<style>
|
||||
<class name="dim-label" />
|
||||
@@ -91,7 +91,7 @@
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel" id="hour_label">
|
||||
<object class="GtkLabel" id="timestamp_label">
|
||||
<style>
|
||||
<class name="dim-label" />
|
||||
</style>
|
||||
|
||||
@@ -1860,6 +1860,8 @@ gcal_month_view_add_event (GcalTimelineSubscriber *subscriber,
|
||||
|
||||
event_widget = gcal_event_widget_new (self->context, event);
|
||||
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);
|
||||
|
||||
add_event_widget (self, event_widget);
|
||||
|
||||
@@ -1894,6 +1896,8 @@ gcal_month_view_update_event (GcalTimelineSubscriber *subscriber,
|
||||
|
||||
/* Create and add the new event widget */
|
||||
new_widget = gcal_event_widget_new (self->context, event);
|
||||
if (!gcal_event_get_all_day (event) && !gcal_event_is_multiday (event))
|
||||
gcal_event_widget_set_timestamp_policy (GCAL_EVENT_WIDGET (new_widget), GCAL_TIMESTAMP_POLICY_START);
|
||||
add_event_widget (self, new_widget);
|
||||
|
||||
self->needs_reallocation = TRUE;
|
||||
|
||||
@@ -944,6 +944,7 @@ gcal_week_grid_add_event (GcalWeekGrid *self,
|
||||
"context", self->context,
|
||||
"event", event,
|
||||
"orientation", GTK_ORIENTATION_VERTICAL,
|
||||
"timestamp-policy", GCAL_TIMESTAMP_POLICY_START,
|
||||
NULL);
|
||||
|
||||
gcal_range_tree_add_range (self->events,
|
||||
|
||||
Reference in New Issue
Block a user