From 8ebbeb5274f41e75dedb2da4ed585a7062059ba6 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Wed, 15 Jan 2020 01:23:16 +0300 Subject: [PATCH] Fixed display of scheduled until online message dates. --- Telegram/Resources/langs/lang.strings | 2 ++ .../SourceFiles/data/data_scheduled_messages.h | 2 ++ Telegram/SourceFiles/history/history.style | 2 ++ Telegram/SourceFiles/history/history_item.cpp | 16 ++++++++++++++++ Telegram/SourceFiles/history/history_item.h | 2 ++ .../history/view/history_view_element.cpp | 9 +++++---- .../history/view/history_view_element.h | 3 ++- .../history/view/history_view_list_widget.cpp | 2 +- .../history/view/history_view_message.cpp | 7 ++++++- .../view/history_view_service_message.cpp | 4 ++++ .../history/view/history_view_service_message.h | 1 + 11 files changed, 43 insertions(+), 7 deletions(-) diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 6530b5589..3a40020ab 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -1294,6 +1294,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_scheduled_messages" = "Scheduled Messages"; "lng_reminder_messages" = "Reminders"; +"lng_scheduled_date" = "Scheduled for {date}"; +"lng_scheduled_date_until_online" = "Scheduled until online"; "lng_scheduled_send_now" = "Send message now?"; "lng_scheduled_send_now_many#one" = "Send {count} message now?"; "lng_scheduled_send_now_many#other" = "Send {count} messages now?"; diff --git a/Telegram/SourceFiles/data/data_scheduled_messages.h b/Telegram/SourceFiles/data/data_scheduled_messages.h index 3deff1f08..68c586f42 100644 --- a/Telegram/SourceFiles/data/data_scheduled_messages.h +++ b/Telegram/SourceFiles/data/data_scheduled_messages.h @@ -43,6 +43,8 @@ public: [[nodiscard]] rpl::producer<> updates(not_null history); [[nodiscard]] Data::MessagesSlice list(not_null history); + static constexpr auto kScheduledUntilOnlineTimestamp = TimeId(0x7FFFFFFE); + private: using OwnedItem = std::unique_ptr; struct List { diff --git a/Telegram/SourceFiles/history/history.style b/Telegram/SourceFiles/history/history.style index 0b9451c66..ab24059f3 100644 --- a/Telegram/SourceFiles/history/history.style +++ b/Telegram/SourceFiles/history/history.style @@ -149,6 +149,8 @@ historyReceivedIcon: icon {{ "history_received", historyOutIconFg, point(2px, 4p historyReceivedSelectedIcon: icon {{ "history_received", historyOutIconFgSelected, point(2px, 4px) }}; historyReceivedInvertedIcon: icon {{ "history_received", historyIconFgInverted, point(2px, 4px) }}; +historyScheduledUntilOnlineStateSpace: 17px; + historyViewsSpace: 11px; historyViewsWidth: 20px; historyViewsTop: -15px; diff --git a/Telegram/SourceFiles/history/history_item.cpp b/Telegram/SourceFiles/history/history_item.cpp index 23dfc8c74..821e53b9c 100644 --- a/Telegram/SourceFiles/history/history_item.cpp +++ b/Telegram/SourceFiles/history/history_item.cpp @@ -33,6 +33,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "window/window_session_controller.h" #include "core/crash_reports.h" #include "base/unixtime.h" +#include "data/data_scheduled_messages.h" // kScheduledUntilOnlineTimestamp #include "data/data_session.h" #include "data/data_messages.h" #include "data/data_media_types.h" @@ -862,6 +863,21 @@ QDateTime ItemDateTime(not_null item) { return base::unixtime::parse(item->date()); } +QString ItemDateText(not_null item, bool isUntilOnline) { + const auto dateText = langDayOfMonthFull(ItemDateTime(item).date()); + return !item->isScheduled() + ? dateText + : isUntilOnline + ? tr::lng_scheduled_date_until_online(tr::now) + : tr::lng_scheduled_date(tr::now, lt_date, dateText); +} + +bool IsItemScheduledUntilOnline(not_null item) { + return item->isScheduled() + && (item->date() == + Data::ScheduledMessages::kScheduledUntilOnlineTimestamp); +} + ClickHandlerPtr goToMessageClickHandler( not_null item, FullMsgId returnToId) { diff --git a/Telegram/SourceFiles/history/history_item.h b/Telegram/SourceFiles/history/history_item.h index 87b4d8ac6..92f149492 100644 --- a/Telegram/SourceFiles/history/history_item.h +++ b/Telegram/SourceFiles/history/history_item.h @@ -374,6 +374,8 @@ private: }; QDateTime ItemDateTime(not_null item); +QString ItemDateText(not_null item, bool isUntilOnline); +bool IsItemScheduledUntilOnline(not_null item); ClickHandlerPtr goToMessageClickHandler( not_null peer, diff --git a/Telegram/SourceFiles/history/view/history_view_element.cpp b/Telegram/SourceFiles/history/view/history_view_element.cpp index f1e5fda69..0e20f1716 100644 --- a/Telegram/SourceFiles/history/view/history_view_element.cpp +++ b/Telegram/SourceFiles/history/view/history_view_element.cpp @@ -185,8 +185,8 @@ void UnreadBar::paint(Painter &p, int y, int w) const { } -void DateBadge::init(const QDateTime &date) { - text = langDayOfMonthFull(date.date()); +void DateBadge::init(const QString &date) { + text = date; width = st::msgServiceFont->width(text); } @@ -207,7 +207,8 @@ Element::Element( not_null data) : _delegate(delegate) , _data(data) -, _dateTime(ItemDateTime(data)) +, _isScheduledUntilOnline(IsItemScheduledUntilOnline(data)) +, _dateTime(_isScheduledUntilOnline ? QDateTime() : ItemDateTime(data)) , _context(delegate->elementContext()) { history()->owner().registerItemView(this); refreshMedia(); @@ -505,7 +506,7 @@ void Element::setDisplayDate(bool displayDate) { const auto item = data(); if (displayDate && !Has()) { AddComponents(DateBadge::Bit()); - Get()->init(dateTime()); + Get()->init(ItemDateText(item, _isScheduledUntilOnline)); setPendingResize(); } else if (!displayDate && Has()) { RemoveComponents(DateBadge::Bit()); diff --git a/Telegram/SourceFiles/history/view/history_view_element.h b/Telegram/SourceFiles/history/view/history_view_element.h index c53813710..9575879e9 100644 --- a/Telegram/SourceFiles/history/view/history_view_element.h +++ b/Telegram/SourceFiles/history/view/history_view_element.h @@ -122,7 +122,7 @@ struct UnreadBar : public RuntimeComponent { // Any HistoryView::Element can have this Component for // displaying the day mark above the message. struct DateBadge : public RuntimeComponent { - void init(const QDateTime &date); + void init(const QString &date); int height() const; void paint(Painter &p, int y, int w) const; @@ -310,6 +310,7 @@ private: const not_null _delegate; const not_null _data; std::unique_ptr _media; + bool _isScheduledUntilOnline = false; const QDateTime _dateTime; int _y = 0; diff --git a/Telegram/SourceFiles/history/view/history_view_list_widget.cpp b/Telegram/SourceFiles/history/view/history_view_list_widget.cpp index dec0bf124..5b60bab43 100644 --- a/Telegram/SourceFiles/history/view/history_view_list_widget.cpp +++ b/Telegram/SourceFiles/history/view/history_view_list_widget.cpp @@ -1391,7 +1391,7 @@ void ListWidget::paintEvent(QPaintEvent *e) { } else { ServiceMessagePainter::paintDate( p, - view->dateTime(), + ItemDateText(view->data(), IsItemScheduledUntilOnline(view->data())), dateY, width); } diff --git a/Telegram/SourceFiles/history/view/history_view_message.cpp b/Telegram/SourceFiles/history/view/history_view_message.cpp index 8365366d9..af27346f9 100644 --- a/Telegram/SourceFiles/history/view/history_view_message.cpp +++ b/Telegram/SourceFiles/history/view/history_view_message.cpp @@ -1269,7 +1269,12 @@ int Message::infoWidth() const { result += st::historySendStateSpace; } } - if (hasOutLayout()) { + + // When message is scheduled until online, time is not displayed, + // so message should have less space. + if (!item->_timeWidth) { + result += st::historyScheduledUntilOnlineStateSpace; + } else if (hasOutLayout()) { result += st::historySendStateSpace; } return result; diff --git a/Telegram/SourceFiles/history/view/history_view_service_message.cpp b/Telegram/SourceFiles/history/view/history_view_service_message.cpp index 3264fe1b9..3e2328bd3 100644 --- a/Telegram/SourceFiles/history/view/history_view_service_message.cpp +++ b/Telegram/SourceFiles/history/view/history_view_service_message.cpp @@ -199,6 +199,10 @@ void ServiceMessagePainter::paintDate(Painter &p, const QDateTime &date, int y, paintPreparedDate(p, dateText, dateTextWidth, y, w); } +void ServiceMessagePainter::paintDate(Painter &p, const QString &dateText, int y, int w) { + paintPreparedDate(p, dateText, st::msgServiceFont->width(dateText), y, w); +} + void ServiceMessagePainter::paintDate(Painter &p, const QString &dateText, int dateTextWidth, int y, int w) { paintPreparedDate(p, dateText, dateTextWidth, y, w); } diff --git a/Telegram/SourceFiles/history/view/history_view_service_message.h b/Telegram/SourceFiles/history/view/history_view_service_message.h index acb2b2f2c..41d552772 100644 --- a/Telegram/SourceFiles/history/view/history_view_service_message.h +++ b/Telegram/SourceFiles/history/view/history_view_service_message.h @@ -63,6 +63,7 @@ struct PaintContext { class ServiceMessagePainter { public: static void paintDate(Painter &p, const QDateTime &date, int y, int w); + static void paintDate(Painter &p, const QString &dateText, int y, int w); static void paintDate(Painter &p, const QString &dateText, int dateTextWidth, int y, int w); static void paintBubble(Painter &p, int x, int y, int w, int h);