From 15d7dfef921959ce1260476550bb08aabc919c21 Mon Sep 17 00:00:00 2001 From: RadRussianRus Date: Sun, 11 Sep 2022 03:07:21 +0300 Subject: [PATCH] [Improvement] Jump to date and time --- .../Resources/icons/menu/to_beginning.png | Bin 0 -> 195 bytes .../Resources/icons/menu/to_beginning@2x.png | Bin 0 -> 313 bytes .../Resources/icons/menu/to_beginning@3x.png | Bin 0 -> 418 bytes Telegram/Resources/langs/rewrites/en.json | 4 + Telegram/SourceFiles/apiwrap.cpp | 8 +- Telegram/SourceFiles/apiwrap.h | 6 +- .../SourceFiles/dialogs/dialogs_widget.cpp | 2 +- .../history/history_inner_widget.cpp | 4 +- .../controls/history_view_compose_search.cpp | 2 +- .../view/history_view_replies_section.cpp | 2 +- .../SourceFiles/ui/boxes/calendar_box.cpp | 74 +++++++++- .../SourceFiles/ui/boxes/choose_date_time.cpp | 7 +- Telegram/SourceFiles/ui/menu_icons.style | 1 + .../window/window_session_controller.cpp | 129 ++++++++++++++---- .../window/window_session_controller.h | 8 +- 15 files changed, 190 insertions(+), 57 deletions(-) create mode 100644 Telegram/Resources/icons/menu/to_beginning.png create mode 100644 Telegram/Resources/icons/menu/to_beginning@2x.png create mode 100644 Telegram/Resources/icons/menu/to_beginning@3x.png diff --git a/Telegram/Resources/icons/menu/to_beginning.png b/Telegram/Resources/icons/menu/to_beginning.png new file mode 100644 index 0000000000000000000000000000000000000000..dc573c5356808ccb113be6f9e654959435f932d1 GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^5+KY0Bp8m$B&h%?&H|6fVg?3oVGw3ym^BBag1yAk z*OmPl6E6#+p4)QY3qYYHPZ!4!jq}L~3$#6|ziRQ$t~hr4|Nr}G30=?kRF}TLx4PUi z<4{lK`*^o`*5W@u)ygS%v0VQxzL4knIm4EH73W)5CGWLoKD@J-hv(mGNyD|4<$Rro nTTXv;_Gx16texL@j)CEyzrw7ovaxAE+Za4u{an^LB{Ts5M#4k^ literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/to_beginning@2x.png b/Telegram/Resources/icons/menu/to_beginning@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a1dc66a984b08e8c86acf4dc585789ee75ea6176 GIT binary patch literal 313 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZAFdh=jER?pk@v{~n?*pO8=fwXAs)xyPEq7L!`>fq{Ag-()P}IO4}5Z(~}ege&2ob&%8eEsF!2?nweXT>$hK&O3;1my@X-H zuW$E1Tsfw%%-mPNVl@9>bb?{iMW!2d=T02dGi}>AO{{49?xnIfR(d%Eb6anXIl|TD zBD!En!_?FAj)oIgGA#CF3_N>jW$5x^bJ?y{E{E?uC@Xp=F#Y@|8Be#5xB0%F%KHB* zKJ87aY(qPfKm$V!%ezZ^e=fUQQ}b5-+4TIT-ar3;Es%e~sQ<3`{H3YwOM!l5@O1Ta JS?83{1OR79eYgMs literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/to_beginning@3x.png b/Telegram/Resources/icons/menu/to_beginning@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..62c8babeb24d0a4130ed7fa5fd16e72a8294f58a GIT binary patch literal 418 zcmV;T0bTxyP)?BOU0003&NklR5kz;6TqARY${$Ha|is_^kZ@gNvsdxG;ViNHb5^b=a58u0Cwu) zh`4xBgCf!`&VIh16}uu5y!`?{SyZar@cQt!7v*K@x7Z(jG6$IrRG& zz1uuiNFjw3Qb-|%{uHv0i_bz+n1-%yd$_v8d3k(&e%HTNP5UQ(0Ji$$NHrx&9{>OV M07*qoM6N<$g8yr#eE, MsgId)> callback) { if (const auto peer = chat.peer()) { const auto topic = chat.topic(); @@ -2971,13 +2971,13 @@ template void ApiWrap::requestMessageAfterDate( not_null peer, MsgId topicRootId, - const QDate &date, + const QDateTime &date, Callback &&callback) { // API returns a message with date <= offset_date. // So we request a message with offset_date = desired_date - 1 and add_offset = -1. // This should give us the first message with date >= desired_date. const auto offsetId = 0; - const auto offsetDate = static_cast(date.startOfDay().toSecsSinceEpoch()) - 1; + const auto offsetDate = static_cast(date.toSecsSinceEpoch()) - 1; const auto addOffset = -1; const auto limit = 1; const auto maxId = 0; @@ -3054,7 +3054,7 @@ void ApiWrap::requestMessageAfterDate( void ApiWrap::resolveJumpToHistoryDate( not_null peer, MsgId topicRootId, - const QDate &date, + const QDateTime &date, Fn, MsgId)> callback) { if (const auto channel = peer->migrateTo()) { return resolveJumpToHistoryDate( diff --git a/Telegram/SourceFiles/apiwrap.h b/Telegram/SourceFiles/apiwrap.h index 0cc928678..76d207fa7 100644 --- a/Telegram/SourceFiles/apiwrap.h +++ b/Telegram/SourceFiles/apiwrap.h @@ -270,7 +270,7 @@ public: void resolveJumpToDate( Dialogs::Key chat, - const QDate &date, + const QDateTime &date, Fn, MsgId)> callback); using SliceType = Data::LoadDirection; @@ -495,13 +495,13 @@ private: void resolveJumpToHistoryDate( not_null peer, MsgId topicRootId, - const QDate &date, + const QDateTime &date, Fn, MsgId)> callback); template void requestMessageAfterDate( not_null peer, MsgId topicRootId, - const QDate &date, + const QDateTime &date, Callback &&callback); void sharedMediaDone( diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp index cd0846670..bb684e470 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp @@ -2937,7 +2937,7 @@ void Widget::clearSearchCache() { void Widget::showCalendar() { if (_searchInChat) { - controller()->showCalendar(_searchInChat, QDate()); + controller()->showCalendar(_searchInChat, QDateTime()); } } diff --git a/Telegram/SourceFiles/history/history_inner_widget.cpp b/Telegram/SourceFiles/history/history_inner_widget.cpp index 55ea6de2a..8bc7a36c9 100644 --- a/Telegram/SourceFiles/history/history_inner_widget.cpp +++ b/Telegram/SourceFiles/history/history_inner_widget.cpp @@ -3788,9 +3788,9 @@ void HistoryInner::mouseActionUpdate() { if (point.x() >= dateLeft && point.x() < dateLeft + dateWidth) { if (!_scrollDateLink) { - _scrollDateLink = std::make_shared(item->history(), view->dateTime().date()); + _scrollDateLink = std::make_shared(item->history(), view->dateTime()); } else { - static_cast(_scrollDateLink.get())->setDate(view->dateTime().date()); + static_cast(_scrollDateLink.get())->setDate(view->dateTime()); } dragState = TextState( nullptr, diff --git a/Telegram/SourceFiles/history/view/controls/history_view_compose_search.cpp b/Telegram/SourceFiles/history/view/controls/history_view_compose_search.cpp index cc4463594..b7c25f8f7 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_compose_search.cpp +++ b/Telegram/SourceFiles/history/view/controls/history_view_compose_search.cpp @@ -990,7 +990,7 @@ ComposeSearch::Inner::Inner( _bottomBar->showCalendarRequests( ) | rpl::start_with_next([=] { hideList(); - _window->showCalendar({ _history }, QDate()); + _window->showCalendar({ _history }, QDateTime()); }, _bottomBar->lifetime()); _bottomBar->showBoxFromRequests( diff --git a/Telegram/SourceFiles/history/view/history_view_replies_section.cpp b/Telegram/SourceFiles/history/view/history_view_replies_section.cpp index 86c67534f..6810a0aa5 100644 --- a/Telegram/SourceFiles/history/view/history_view_replies_section.cpp +++ b/Telegram/SourceFiles/history/view/history_view_replies_section.cpp @@ -2541,7 +2541,7 @@ void RepliesWidget::listUpdateDateLink( link = nullptr; return; } - const auto date = view->dateTime().date(); + const auto date = view->dateTime(); if (!link) { link = std::make_shared(_topic, date); } else { diff --git a/Telegram/SourceFiles/ui/boxes/calendar_box.cpp b/Telegram/SourceFiles/ui/boxes/calendar_box.cpp index 5c46fbff4..d8d0d66a8 100644 --- a/Telegram/SourceFiles/ui/boxes/calendar_box.cpp +++ b/Telegram/SourceFiles/ui/boxes/calendar_box.cpp @@ -48,6 +48,7 @@ public: void skipMonth(int skip); void showMonth(QDate month); + void skipDays(int skip); [[nodiscard]] bool showsMonthOf(QDate date) const; [[nodiscard]] int highlightedIndex() const { @@ -68,6 +69,9 @@ public: [[nodiscard]] bool isEnabled(int index) const { return (index >= _minDayIndex) && (index <= _maxDayIndex); } + QDate highlighted() const { + return _highlighted; + } [[nodiscard]] QDate month() const { return _month.current(); @@ -99,6 +103,7 @@ private: static int DaysShiftForMonth(QDate month, QDate min); static int RowsCountForMonth(QDate month, QDate min, QDate max); + void setHighlightedDate(QDate highlighted); bool _allowsSelection = false; @@ -197,6 +202,36 @@ void CalendarBox::Context::skipMonth(int skip) { showMonth(QDate(year, month, 1)); } +void CalendarBox::Context::skipDays(int skip) { + auto date = _highlighted; + + if (_month.current().month() == _highlighted.month() + && _month.current().year() == _highlighted.year()) { + date = date.addDays(skip); + } else if (skip < 0) { + date = QDate( + _month.current().year(), + _month.current().month(), + _month.current().daysInMonth()); + } else { + date = QDate( + _month.current().year(), + _month.current().month(), + 1); + } + + if (date.isValid() && date >= _min && date <= _max) { + auto needMonthChange = (date.month() != _highlighted.month() + || date.year() != _highlighted.year()); + + setHighlightedDate(date); + + if (needMonthChange) { + showMonth(date); + } + } +} + int CalendarBox::Context::DaysShiftForMonth(QDate month, QDate min) { Expects(!month.isNull()); @@ -245,6 +280,12 @@ int CalendarBox::Context::RowsCountForMonth( return cellsFull / kDaysInWeek; } +void CalendarBox::Context::setHighlightedDate(QDate highlighted) { + _highlighted = highlighted; + _highlightedIndex = _month.current().daysTo(_highlighted); + applyMonth(_month.current(), true); +} + QDate CalendarBox::Context::dateFromIndex(int index) const { constexpr auto kMonthsCount = 12; auto month = _month.current().month(); @@ -350,6 +391,9 @@ public: [[nodiscard]] int countMaxHeight() const; void setDateChosenCallback(Fn callback); + void selectBeginning(); + void selectEnd(); + void selectHighlighted(); ~Inner(); @@ -728,6 +772,18 @@ void CalendarBox::Inner::setDateChosenCallback(Fn callback) { _dateChosenCallback = std::move(callback); } +void CalendarBox::Inner::selectBeginning() { + _dateChosenCallback(_context->dateFromIndex(_context->minDayIndex())); +} + +void CalendarBox::Inner::selectEnd() { + _dateChosenCallback(_context->dateFromIndex(_context->maxDayIndex())); +} + +void CalendarBox::Inner::selectHighlighted() { + _dateChosenCallback(_context->highlighted()); +} + CalendarBox::Inner::~Inner() = default; class CalendarBox::Title final : public RpWidget { @@ -1135,14 +1191,20 @@ void CalendarBox::keyPressEvent(QKeyEvent *e) { jump(_previous.data()); } else if (e->key() == Qt::Key_End) { jump(_next.data()); - } else if (e->key() == Qt::Key_Left - || e->key() == Qt::Key_Up - || e->key() == Qt::Key_PageUp) { + } else if (e->key() == Qt::Key_PageUp) { goPreviousMonth(); - } else if (e->key() == Qt::Key_Right - || e->key() == Qt::Key_Down - || e->key() == Qt::Key_PageDown) { + } else if (e->key() == Qt::Key_PageDown) { goNextMonth(); + } else if (e->key() == Qt::Key_Left) { + _context->skipDays(-1); + } else if (e->key() == Qt::Key_Right) { + _context->skipDays(1); + } else if (e->key() == Qt::Key_Up) { + _context->skipDays(-7); + } else if (e->key() == Qt::Key_Down) { + _context->skipDays(7); + } else if (e->key() == Qt::Key_Return || e->key() == Qt::Key_Enter) { + _inner->selectHighlighted(); } } diff --git a/Telegram/SourceFiles/ui/boxes/choose_date_time.cpp b/Telegram/SourceFiles/ui/boxes/choose_date_time.cpp index 8651b5b01..9f8156bb7 100644 --- a/Telegram/SourceFiles/ui/boxes/choose_date_time.cpp +++ b/Telegram/SourceFiles/ui/boxes/choose_date_time.cpp @@ -26,12 +26,7 @@ namespace { constexpr auto kMinimalSchedule = TimeId(10); QString DayString(const QDate &date) { - return tr::lng_month_day( - tr::now, - lt_month, - Lang::MonthDay(date.month())(tr::now), - lt_day, - QString::number(date.day())); + return langDayOfMonthFull(date); } QString TimeString(QTime time) { diff --git a/Telegram/SourceFiles/ui/menu_icons.style b/Telegram/SourceFiles/ui/menu_icons.style index a16e42b92..9be064046 100644 --- a/Telegram/SourceFiles/ui/menu_icons.style +++ b/Telegram/SourceFiles/ui/menu_icons.style @@ -81,6 +81,7 @@ menuIconPorn: icon {{ "menu/porn", menuIconColor }}; menuIconViolence: icon {{ "menu/violence", menuIconColor }}; menuIconHide: icon {{ "menu/hide", menuIconColor }}; menuIconMention: icon {{ "menu/mention", menuSubmenuArrowFg }}; +menuIconToBeginning: icon {{ "menu/to_beginning", menuSubmenuArrowFg }}; menuIconMuteFor: icon {{ "menu/mute_for", menuIconColor }}; menuIconSilent: icon {{ "menu/silent", menuIconColor }}; menuIconCustomize: icon {{ "menu/customize", menuIconColor }}; diff --git a/Telegram/SourceFiles/window/window_session_controller.cpp b/Telegram/SourceFiles/window/window_session_controller.cpp index 0bb809f5c..96277655f 100644 --- a/Telegram/SourceFiles/window/window_session_controller.cpp +++ b/Telegram/SourceFiles/window/window_session_controller.cpp @@ -7,6 +7,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "window/window_session_controller.h" +#include "kotato/kotato_settings.h" +#include "kotato/kotato_lang.h" #include "api/api_text_entities.h" #include "boxes/add_contact_box.h" #include "boxes/peers/add_bot_to_chat_box.h" @@ -64,9 +66,11 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/toast/toast.h" #include "calls/calls_instance.h" // Core::App().calls().inCall(). #include "calls/group/calls_group_call.h" +#include "ui/boxes/choose_date_time.h" #include "ui/boxes/calendar_box.h" #include "ui/boxes/collectible_info_box.h" #include "ui/boxes/confirm_box.h" +#include "ui/widgets/popup_menu.h" #include "ui/dynamic_thumbnails.h" #include "mainwidget.h" #include "main/main_app_config.h" @@ -92,6 +96,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "styles/style_boxes.h" #include "styles/style_dialogs.h" #include "styles/style_layers.h" // st::boxLabel +#include "styles/style_info.h" +#include "styles/style_menu_icons.h" namespace Window { namespace { @@ -303,6 +309,53 @@ void MainWindowShow::processChosenSticker( } } +void ChooseJumpDateTimeBox( + not_null box, + QDateTime minDate, + QDateTime maxDate, + QDateTime highlighted, + Fn onDone, + Fn onBegnning, + Fn onCalendar, + bool hasCalendar) { + + auto descriptor = Ui::ChooseDateTimeBox(box, + Ui::ChooseDateTimeBoxArgs{ + .title = rktr("ktg_jump_to_date_title"), + .submit = rktr("ktg_jump_to_date_button"), + .done = std::move(onDone), + .min = [=] { return base::unixtime::serialize(minDate); }, + .time = base::unixtime::serialize(highlighted), + .max = [=] { return base::unixtime::serialize(maxDate); }, + }); + const auto topMenuButton = box->addTopButton(st::infoTopBarMenu); + const auto menu = std::make_shared>(); + topMenuButton.data()->setClickedCallback([=] { + *menu = base::make_unique_q( + topMenuButton.data(), + st::popupMenuWithIcons); + (*menu)->addAction( + ktr("ktg_jump_to_beginning"), + std::move(onBegnning), + &st::menuIconToBeginning); + if (hasCalendar) { + (*menu)->addAction( + ktr("ktg_show_calendar"), + std::move(onCalendar), + &st::menuIconSchedule); + } + + (*menu)->setForcedOrigin(Ui::PanelAnimation::Origin::TopRight); + const auto buttonTopLeft = topMenuButton.data()->mapToGlobal(QPoint()); + const auto buttonRect = QRect(buttonTopLeft, topMenuButton.data()->size()); + const auto pos = QPoint( + buttonRect.x() + buttonRect.width(), + buttonRect.y() + buttonRect.height()); + (*menu)->popup(pos); + return true; + }); +} + } // namespace void ActivateWindow(not_null controller) { @@ -329,13 +382,13 @@ bool operator!=(const PeerThemeOverride &a, const PeerThemeOverride &b) { return !(a == b); } -DateClickHandler::DateClickHandler(Dialogs::Key chat, QDate date) +DateClickHandler::DateClickHandler(Dialogs::Key chat, QDateTime date) : _chat(chat) , _weak(chat.topic()) , _date(date) { } -void DateClickHandler::setDate(QDate date) { +void DateClickHandler::setDate(QDateTime date) { _date = date; } @@ -2158,7 +2211,7 @@ void SessionController::startOrJoinGroupCall( Core::App().calls().startOrJoinGroupCall(uiShow(), peer, args); } -void SessionController::showCalendar(Dialogs::Key chat, QDate requestedDate) { +void SessionController::showCalendar(Dialogs::Key chat, QDateTime requestedDate) { const auto topic = chat.topic(); const auto history = chat.owningHistory(); if (!history) { @@ -2167,11 +2220,11 @@ void SessionController::showCalendar(Dialogs::Key chat, QDate requestedDate) { const auto currentPeerDate = [&] { if (topic) { if (const auto item = topic->lastMessage()) { - return base::unixtime::parse(item->date()).date(); + return base::unixtime::parse(item->date()); } - return QDate(); + return QDateTime(); } else if (history->scrollTopItem) { - return history->scrollTopItem->dateTime().date(); + return history->scrollTopItem->dateTime(); } else if (history->loadedAtTop() && !history->isEmpty() && history->peer->migrateFrom()) { @@ -2179,41 +2232,41 @@ void SessionController::showCalendar(Dialogs::Key chat, QDate requestedDate) { if (migrated->scrollTopItem) { // We're up in the migrated history. // So current date is the date of first message here. - return history->blocks.front()->messages.front()->dateTime().date(); + return history->blocks.front()->messages.front()->dateTime(); } } } else if (const auto item = history->lastMessage()) { - return base::unixtime::parse(item->date()).date(); + return base::unixtime::parse(item->date()); } - return QDate(); + return QDateTime(); }(); const auto maxPeerDate = [&] { if (topic) { if (const auto item = topic->lastMessage()) { - return base::unixtime::parse(item->date()).date(); + return base::unixtime::parse(item->date()); } - return QDate(); + return QDateTime(); } const auto check = history->peer->migrateTo() ? history->owner().historyLoaded(history->peer->migrateTo()) : history; if (const auto item = check ? check->lastMessage() : nullptr) { - return base::unixtime::parse(item->date()).date(); + return base::unixtime::parse(item->date()); } - return QDate(); + return QDateTime(); }(); const auto minPeerDate = [&] { const auto startDate = [&] { // Telegram was launched in August 2013 :) - return QDate(2013, 8, 1); + return QDate(2013, 8, 1).startOfDay(); }; if (topic) { - return base::unixtime::parse(topic->creationDate()).date(); + return base::unixtime::parse(topic->creationDate()); } else if (const auto chat = history->peer->migrateFrom()) { if (const auto history = chat->owner().historyLoaded(chat)) { if (history->loadedAtTop()) { if (!history->isEmpty()) { - return history->blocks.front()->messages.front()->dateTime().date(); + return history->blocks.front()->messages.front()->dateTime(); } } else { return startDate(); @@ -2222,9 +2275,9 @@ void SessionController::showCalendar(Dialogs::Key chat, QDate requestedDate) { } if (history->loadedAtTop()) { if (!history->isEmpty()) { - return history->blocks.front()->messages.front()->dateTime().date(); + return history->blocks.front()->messages.front()->dateTime(); } - return QDate::currentDate(); + return QDateTime::currentDateTime(); } return startDate(); }(); @@ -2232,7 +2285,8 @@ void SessionController::showCalendar(Dialogs::Key chat, QDate requestedDate) { ? requestedDate : !currentPeerDate.isNull() ? currentPeerDate - : QDate::currentDate(); + : QDateTime::currentDateTime(); + struct ButtonState { enum class Type { None, @@ -2291,9 +2345,10 @@ void SessionController::showCalendar(Dialogs::Key chat, QDate requestedDate) { button->setPointerCursor(false); } }; + const auto weak = base::make_weak(this); const auto weakTopic = base::make_weak(topic); - const auto jump = [=](const QDate &date) { + const auto jump = [=](const QDateTime &date) { const auto open = [=](not_null peer, MsgId id) { if (const auto strong = weak.get()) { if (!topic) { @@ -2314,15 +2369,31 @@ void SessionController::showCalendar(Dialogs::Key chat, QDate requestedDate) { session().api().resolveJumpToDate(chat, date, open); } }; - show(Box(Ui::CalendarBoxArgs{ - .month = highlighted, - .highlighted = highlighted, - .callback = [=](const QDate &date) { jump(date); }, - .minDate = minPeerDate, - .maxDate = maxPeerDate, - .allowsSelection = history->peer->isUser(), - .selectionChanged = selectionChanged, - })); + const auto showCalendarCallback = [=] { + show(Box(Ui::CalendarBoxArgs{ + .month = highlighted.date(), + .highlighted = highlighted.date(), + .callback = [=](const QDate &date) { jump(date.startOfDay()); }, + .minDate = minPeerDate.date(), + .maxDate = maxPeerDate.date(), + .allowsSelection = history->peer->isUser(), + .selectionChanged = selectionChanged, + }), Ui::LayerOption::CloseOther); + }; + + show(Box(ChooseJumpDateTimeBox, + minPeerDate, + maxPeerDate, + highlighted, + [=](TimeId result) { + jump(base::unixtime::parse(result)); + }, + [=] { + jump(minPeerDate); + }, + std::move(showCalendarCallback), + history->peer->isUser()), + Ui::LayerOption::KeepOther); } void SessionController::showPassportForm(const Passport::FormRequest &request) { diff --git a/Telegram/SourceFiles/window/window_session_controller.h b/Telegram/SourceFiles/window/window_session_controller.h index 5c3c5a388..8217eca61 100644 --- a/Telegram/SourceFiles/window/window_session_controller.h +++ b/Telegram/SourceFiles/window/window_session_controller.h @@ -101,15 +101,15 @@ bool operator!=(const PeerThemeOverride &a, const PeerThemeOverride &b); class DateClickHandler : public ClickHandler { public: - DateClickHandler(Dialogs::Key chat, QDate date); + DateClickHandler(Dialogs::Key chat, QDateTime date); - void setDate(QDate date); + void setDate(QDateTime date); void onClick(ClickContext context) const override; private: Dialogs::Key _chat; base::weak_ptr _weak; - QDate _date; + QDateTime _date; }; @@ -473,7 +473,7 @@ public: void showCalendar( Dialogs::Key chat, - QDate requestedDate); + QDateTime requestedDateTime); void showAddContact(); void showNewGroup();