From d3af60ff0bc68a0d8199d244b93920a0118954bc Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 7 Mar 2017 18:01:08 +0300 Subject: [PATCH] Add a simple jump to date in a chat. --- Telegram/SourceFiles/boxes/calendarbox.cpp | 2 +- Telegram/SourceFiles/mainwidget.cpp | 48 +++++++++++++++++++--- Telegram/SourceFiles/mainwidget.h | 1 + 3 files changed, 45 insertions(+), 6 deletions(-) diff --git a/Telegram/SourceFiles/boxes/calendarbox.cpp b/Telegram/SourceFiles/boxes/calendarbox.cpp index 3841e8610..489ebc58b 100644 --- a/Telegram/SourceFiles/boxes/calendarbox.cpp +++ b/Telegram/SourceFiles/boxes/calendarbox.cpp @@ -352,7 +352,7 @@ void CalendarBox::Title::paintEvent(QPaintEvent *e) { } CalendarBox::CalendarBox(QWidget*, QDate month, QDate highlighted, base::lambda callback) -: _context(std::make_unique(month, highlighted.addDays(-5))) +: _context(std::make_unique(month, highlighted)) , _inner(this, _context.get()) , _title(this, _context.get()) , _left(this, st::calendarLeft) diff --git a/Telegram/SourceFiles/mainwidget.cpp b/Telegram/SourceFiles/mainwidget.cpp index fdf8946b0..5205ce068 100644 --- a/Telegram/SourceFiles/mainwidget.cpp +++ b/Telegram/SourceFiles/mainwidget.cpp @@ -2761,7 +2761,7 @@ void MainWidget::dlgUpdated(PeerData *peer, MsgId msgId) { void MainWidget::showJumpToDate(PeerData *peer) { t_assert(peer != nullptr); - auto shown = ([peer] { + auto currentPeerDate = [peer] { if (auto history = App::historyLoaded(peer)) { if (history->scrollTopItem) { return history->scrollTopItem->date.date(); @@ -2770,10 +2770,48 @@ void MainWidget::showJumpToDate(PeerData *peer) { } } return QDate::currentDate(); - })(); - auto highlighted = shown; - Ui::show(Box(shown, highlighted, [peer](QDate date) { - Ui::show(Box("not implemented " + langDayOfMonthFull(date))); + }; + auto highlighted = currentPeerDate(), month = highlighted; + Ui::show(Box(month, highlighted, [this, peer](const QDate &date) { jumpToDate(peer, date); })); +} + +void MainWidget::jumpToDate(PeerData *peer, const QDate &date) { + auto time = static_cast(QDateTime(date).toTime_t()); + auto flags = MTPmessages_Search::Flags(0); + auto request = MTPmessages_GetHistory(peer->input, MTP_int(0), MTP_int(time), MTP_int(-1), MTP_int(1), MTP_int(0), MTP_int(0)); + MTP::send(request, ::rpcDone([peer](const MTPmessages_Messages &result) { + auto getMessagesList = [&result, peer]() -> const QVector* { + auto handleMessages = [](auto &messages) { + App::feedUsers(messages.vusers); + App::feedChats(messages.vchats); + return &messages.vmessages.c_vector().v; + }; + switch (result.type()) { + case mtpc_messages_messages: return handleMessages(result.c_messages_messages()); + case mtpc_messages_messagesSlice: return handleMessages(result.c_messages_messagesSlice()); + case mtpc_messages_channelMessages: { + auto &messages = result.c_messages_channelMessages(); + if (peer && peer->isChannel()) { + peer->asChannel()->ptsReceived(messages.vpts.v); + } else { + LOG(("API Error: received messages.channelMessages when no channel was passed! (MainWidget::showJumpToDate)")); + } + return handleMessages(messages); + } break; + } + return nullptr; + }; + + if (auto list = getMessagesList()) { + App::feedMsgs(*list, NewMessageExisting); + for (auto &message : *list) { + if (auto id = idFromMessage(message)) { + Ui::showPeerHistory(peer, id); + return; + } + } + } + Ui::showPeerHistory(peer, ShowAtUnreadMsgId); })); } diff --git a/Telegram/SourceFiles/mainwidget.h b/Telegram/SourceFiles/mainwidget.h index 099573c4a..f1b88946c 100644 --- a/Telegram/SourceFiles/mainwidget.h +++ b/Telegram/SourceFiles/mainwidget.h @@ -307,6 +307,7 @@ public: void hideSingleUseKeyboard(PeerData *peer, MsgId replyTo); bool insertBotCommand(const QString &cmd, bool specialGif); + void jumpToDate(PeerData *peer, const QDate &date); void searchMessages(const QString &query, PeerData *inPeer); bool preloadOverview(PeerData *peer, MediaOverviewType type); void preloadOverviews(PeerData *peer);