diff --git a/main/src/ui/conversation_content_view/date_separator_populator.vala b/main/src/ui/conversation_content_view/date_separator_populator.vala
index 91485f25..ff3b962d 100644
--- a/main/src/ui/conversation_content_view/date_separator_populator.vala
+++ b/main/src/ui/conversation_content_view/date_separator_populator.vala
@@ -62,30 +62,58 @@ public class MetaDateItem : Plugins.MetaConversationItem {
}
public override Object? get_widget(Plugins.WidgetType widget_type) {
- Box box = new Box(Orientation.HORIZONTAL, 10) { width_request=300, halign=Align.CENTER, visible=true };
- box.add(new Separator(Orientation.HORIZONTAL) { valign=Align.CENTER, hexpand=true, visible=true });
- string date_str = get_relative_time(date);
- Label label = new Label(@"$date_str") { use_markup=true, halign=Align.CENTER, hexpand=false, visible=true };
- label.get_style_context().add_class("dim-label");
- box.add(label);
- box.add(new Separator(Orientation.HORIZONTAL) { valign=Align.CENTER, hexpand=true, visible=true });
- return box;
+ return new DateSeparatorWidget(date);
}
public override Gee.List? get_item_actions(Plugins.WidgetType type) { return null; }
+
+}
+
+public class DateSeparatorWidget : Box {
+
+ private DateTime date;
+ private Label label;
+ private uint time_update_timeout = 0;
+
+ public DateSeparatorWidget(DateTime date) {
+ Object(orientation:Orientation.HORIZONTAL, spacing:10);
+ width_request = 300;
+ halign = Align.CENTER;
+ visible = true;
+ this.date = date;
+
+ label = new Label("") { use_markup=true, halign=Align.CENTER, hexpand=false, visible=true };
+ label.get_style_context().add_class("dim-label");
+
+ this.add(new Separator(Orientation.HORIZONTAL) { valign=Align.CENTER, hexpand=true, visible=true });
+ this.add(label);
+ this.add(new Separator(Orientation.HORIZONTAL) { valign=Align.CENTER, hexpand=true, visible=true });
+
+ update_time();
+ }
+
+ private void update_time() {
+ label.label = @"$(get_relative_time(date))";
+ time_update_timeout = Timeout.add_seconds((int) get_next_time_change(), () => {
+ if (this.parent == null) return false;
+ update_time();
+ return false;
+ });
+ }
+
private static string get_relative_time(DateTime time) {
DateTime time_local = time.to_local();
DateTime now_local = new DateTime.now_local();
if (time_local.get_year() == now_local.get_year() &&
- time_local.get_month() == now_local.get_month() &&
- time_local.get_day_of_month() == now_local.get_day_of_month()) {
+ time_local.get_month() == now_local.get_month() &&
+ time_local.get_day_of_month() == now_local.get_day_of_month()) {
return _("Today");
}
DateTime now_local_minus = now_local.add_days(-1);
if (time_local.get_year() == now_local_minus.get_year() &&
- time_local.get_month() == now_local_minus.get_month() &&
- time_local.get_day_of_month() == now_local_minus.get_day_of_month()) {
+ time_local.get_month() == now_local_minus.get_month() &&
+ time_local.get_day_of_month() == now_local_minus.get_day_of_month()) {
return _("Yesterday");
}
if (time_local.get_year() != now_local.get_year()) {
@@ -98,6 +126,20 @@ public class MetaDateItem : Plugins.MetaConversationItem {
return time_local.format(_("%b %d"));
}
}
+
+ private int get_next_time_change() {
+ DateTime now = new DateTime.now_local();
+ return (23 - now.get_hour()) * 3600 + (59 - now.get_minute()) * 60 + (59 - now.get_second()) + 1;
+ }
+
+ public override void dispose() {
+ base.dispose();
+
+ if (time_update_timeout != 0) {
+ Source.remove(time_update_timeout);
+ time_update_timeout = 0;
+ }
+ }
}
}