summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorKonstantinos Sideris <sideris.konstantin@gmail.com>2017-12-25 23:02:33 +0200
committerKonstantinos Sideris <sideris.konstantin@gmail.com>2017-12-25 23:02:33 +0200
commit1ab55d4732a875d6f4004c57ab49fee157fa28e5 (patch)
tree0a0639fe8e80c182ec4997b6e51668ee297c9cd9 /src
parentUse a better regex to identify URLs (diff)
downloadnheko-1ab55d4732a875d6f4004c57ab49fee157fa28e5.tar.xz
Add date separator in the timeline
fixes #157
Diffstat (limited to 'src')
-rw-r--r--src/timeline/TimelineItem.cc25
-rw-r--r--src/timeline/TimelineView.cc63
2 files changed, 72 insertions, 16 deletions
diff --git a/src/timeline/TimelineItem.cc b/src/timeline/TimelineItem.cc

index 3ebbbee0..a42edbb7 100644 --- a/src/timeline/TimelineItem.cc +++ b/src/timeline/TimelineItem.cc
@@ -73,10 +73,9 @@ TimelineItem::TimelineItem(mtx::events::MessageType ty, if (ty == mtx::events::MessageType::Emote) { body = QString("* %1 %2").arg(displayName).arg(body); - descriptionMsg_ = {"", userid, body, descriptiveTime(timestamp)}; + descriptionMsg_ = {"", userid, body, descriptiveTime(timestamp), timestamp}; } else { - descriptionMsg_ = { - "You: ", userid, body, descriptiveTime(QDateTime::currentDateTime())}; + descriptionMsg_ = {"You: ", userid, body, descriptiveTime(timestamp), timestamp}; } body = body.toHtmlEscaped(); @@ -189,16 +188,16 @@ TimelineItem::TimelineItem(const mtx::events::RoomEvent<mtx::events::msg::Notice { init(); - event_id_ = QString::fromStdString(event.event_id); - const auto sender = QString::fromStdString(event.sender); + event_id_ = QString::fromStdString(event.event_id); + const auto sender = QString::fromStdString(event.sender); + const auto timestamp = QDateTime::fromMSecsSinceEpoch(event.origin_server_ts); + auto body = QString::fromStdString(event.content.body).trimmed().toHtmlEscaped(); descriptionMsg_ = {TimelineViewManager::displayName(sender), sender, " sent a notification", - descriptiveTime(QDateTime::fromMSecsSinceEpoch(event.origin_server_ts))}; - - auto body = QString::fromStdString(event.content.body).trimmed().toHtmlEscaped(); - auto timestamp = QDateTime::fromMSecsSinceEpoch(event.origin_server_ts); + descriptiveTime(timestamp), + timestamp}; generateTimestamp(timestamp); @@ -241,10 +240,7 @@ TimelineItem::TimelineItem(const mtx::events::RoomEvent<mtx::events::msg::Emote> auto displayName = TimelineViewManager::displayName(sender); auto emoteMsg = QString("* %1 %2").arg(displayName).arg(body); - descriptionMsg_ = {"", - sender, - emoteMsg, - descriptiveTime(QDateTime::fromMSecsSinceEpoch(event.origin_server_ts))}; + descriptionMsg_ = {"", sender, emoteMsg, descriptiveTime(timestamp), timestamp}; generateTimestamp(timestamp); emoteMsg = emoteMsg.toHtmlEscaped(); @@ -286,7 +282,8 @@ TimelineItem::TimelineItem(const mtx::events::RoomEvent<mtx::events::msg::Text> descriptionMsg_ = {sender == settings.value("auth/user_id") ? "You" : displayName, sender, QString(": %1").arg(body), - descriptiveTime(QDateTime::fromMSecsSinceEpoch(event.origin_server_ts))}; + descriptiveTime(timestamp), + timestamp}; generateTimestamp(timestamp); diff --git a/src/timeline/TimelineView.cc b/src/timeline/TimelineView.cc
index dccc6f37..29da24b3 100644 --- a/src/timeline/TimelineView.cc +++ b/src/timeline/TimelineView.cc
@@ -19,6 +19,7 @@ #include <QFileInfo> #include <QTimer> +#include "Config.h" #include "FloatingButton.h" #include "RoomMessages.h" @@ -368,10 +369,38 @@ TimelineView::isSenderRendered(const QString &user_id, TimelineDirection directi void TimelineView::addTimelineItem(TimelineItem *item, TimelineDirection direction) { - if (direction == TimelineDirection::Bottom) + const auto newDate = item->descriptionMessage().datetime; + + if (direction == TimelineDirection::Bottom) { + const auto lastItemPosition = scroll_layout_->count() - 1; + auto lastItem = + static_cast<TimelineItem *>(scroll_layout_->itemAt(lastItemPosition)->widget()); + + if (lastItem) { + auto oldDate = lastItem->descriptionMessage().datetime; + + if (oldDate.daysTo(newDate) != 0) + addDateSeparator(newDate, lastItemPosition); + } + scroll_layout_->addWidget(item); - else + } else { + // The first item (position 0) is a stretch widget that pushes + // the widgets to the bottom of the page. + if (scroll_layout_->count() > 1) { + auto firstItem = + static_cast<TimelineItem *>(scroll_layout_->itemAt(1)->widget()); + + if (firstItem) { + auto oldDate = firstItem->descriptionMessage().datetime; + + if (newDate.daysTo(oldDate) != 0) + addDateSeparator(oldDate, 1); + } + } + scroll_layout_->insertWidget(1, item); + } } void @@ -563,6 +592,36 @@ TimelineView::event(QEvent *event) return QWidget::event(event); } +void +TimelineView::addDateSeparator(QDateTime datetime, int position) +{ + auto now = QDateTime::currentDateTime(); + auto days = now.daysTo(datetime); + + QString fmt; + QLabel *separator; + + if (now.date().year() != datetime.date().year()) + fmt = QString("ddd d MMMM yy"); + else + fmt = QString("ddd d MMMM"); + + if (days == 0) + separator = new QLabel(tr("Today")); + else if (std::abs(days) == 1) + separator = new QLabel(tr("Yesterday")); + else + separator = new QLabel(datetime.toString(fmt)); + + if (separator) { + separator->setStyleSheet( + QString("font-size: %1px").arg(conf::timeline::fonts::dateSeparator)); + separator->setAlignment(Qt::AlignCenter); + separator->setContentsMargins(0, 15, 0, 15); + scroll_layout_->insertWidget(position, separator); + } +} + QString TimelineView::getEventSender(const mtx::events::collections::TimelineEvents &event) const {