Open jump-to-date by date click in topics.

This commit is contained in:
John Preston 2022-10-27 11:52:18 +04:00
parent 850746b0ba
commit 46ebbdb547
10 changed files with 42 additions and 14 deletions

View file

@ -3248,7 +3248,7 @@ void ListWidget::mouseActionUpdate() {
dateLeft += (widthForDate - dateWidth) / 2; dateLeft += (widthForDate - dateWidth) / 2;
if (point.x() >= dateLeft && point.x() < dateLeft + dateWidth) { if (point.x() >= dateLeft && point.x() < dateLeft + dateWidth) {
_scrollDateLink = _delegate->listDateLink(view); _delegate->listUpdateDateLink(_scrollDateLink, view);
dragState = TextState( dragState = TextState(
nullptr, nullptr,
_scrollDateLink); _scrollDateLink);

View file

@ -106,7 +106,9 @@ public:
virtual MessagesBarData listMessagesBar( virtual MessagesBarData listMessagesBar(
const std::vector<not_null<Element*>> &elements) = 0; const std::vector<not_null<Element*>> &elements) = 0;
virtual void listContentRefreshed() = 0; virtual void listContentRefreshed() = 0;
virtual ClickHandlerPtr listDateLink(not_null<Element*> view) = 0; virtual void listUpdateDateLink(
ClickHandlerPtr &link,
not_null<Element*> view) = 0;
virtual bool listElementHideReply(not_null<const Element*> view) = 0; virtual bool listElementHideReply(not_null<const Element*> view) = 0;
virtual bool listElementShownUnread(not_null<const Element*> view) = 0; virtual bool listElementShownUnread(not_null<const Element*> view) = 0;
virtual bool listIsGoodForAroundPosition( virtual bool listIsGoodForAroundPosition(

View file

@ -544,8 +544,9 @@ MessagesBarData PinnedWidget::listMessagesBar(
void PinnedWidget::listContentRefreshed() { void PinnedWidget::listContentRefreshed() {
} }
ClickHandlerPtr PinnedWidget::listDateLink(not_null<Element*> view) { void PinnedWidget::listUpdateDateLink(
return nullptr; ClickHandlerPtr &link,
not_null<Element*> view) {
} }
bool PinnedWidget::listElementHideReply(not_null<const Element*> view) { bool PinnedWidget::listElementHideReply(not_null<const Element*> view) {

View file

@ -98,7 +98,9 @@ public:
MessagesBarData listMessagesBar( MessagesBarData listMessagesBar(
const std::vector<not_null<Element*>> &elements) override; const std::vector<not_null<Element*>> &elements) override;
void listContentRefreshed() override; void listContentRefreshed() override;
ClickHandlerPtr listDateLink(not_null<Element*> view) override; void listUpdateDateLink(
ClickHandlerPtr &link,
not_null<Element*> view) override;
bool listElementHideReply(not_null<const Element*> view) override; bool listElementHideReply(not_null<const Element*> view) override;
bool listElementShownUnread(not_null<const Element*> view) override; bool listElementShownUnread(not_null<const Element*> view) override;
bool listIsGoodForAroundPosition(not_null<const Element*> view) override; bool listIsGoodForAroundPosition(not_null<const Element*> view) override;

View file

@ -2010,8 +2010,19 @@ MessagesBarData RepliesWidget::listMessagesBar(
void RepliesWidget::listContentRefreshed() { void RepliesWidget::listContentRefreshed() {
} }
ClickHandlerPtr RepliesWidget::listDateLink(not_null<Element*> view) { void RepliesWidget::listUpdateDateLink(
return nullptr; ClickHandlerPtr &link,
not_null<Element*> view) {
if (!_topic) {
link = nullptr;
return;
}
const auto date = view->dateTime().date();
if (!link) {
link = std::make_shared<Window::DateClickHandler>(_topic, date);
} else {
static_cast<Window::DateClickHandler*>(link.get())->setDate(date);
}
} }
bool RepliesWidget::listElementHideReply(not_null<const Element*> view) { bool RepliesWidget::listElementHideReply(not_null<const Element*> view) {

View file

@ -138,7 +138,9 @@ public:
MessagesBarData listMessagesBar( MessagesBarData listMessagesBar(
const std::vector<not_null<Element*>> &elements) override; const std::vector<not_null<Element*>> &elements) override;
void listContentRefreshed() override; void listContentRefreshed() override;
ClickHandlerPtr listDateLink(not_null<Element*> view) override; void listUpdateDateLink(
ClickHandlerPtr &link,
not_null<Element*> view) override;
bool listElementHideReply(not_null<const Element*> view) override; bool listElementHideReply(not_null<const Element*> view) override;
bool listElementShownUnread(not_null<const Element*> view) override; bool listElementShownUnread(not_null<const Element*> view) override;
bool listIsGoodForAroundPosition(not_null<const Element*> view) override; bool listIsGoodForAroundPosition(not_null<const Element*> view) override;

View file

@ -1162,8 +1162,9 @@ MessagesBarData ScheduledWidget::listMessagesBar(
void ScheduledWidget::listContentRefreshed() { void ScheduledWidget::listContentRefreshed() {
} }
ClickHandlerPtr ScheduledWidget::listDateLink(not_null<Element*> view) { void ScheduledWidget::listUpdateDateLink(
return nullptr; ClickHandlerPtr &link,
not_null<Element*> view) {
} }
bool ScheduledWidget::listElementHideReply(not_null<const Element*> view) { bool ScheduledWidget::listElementHideReply(not_null<const Element*> view) {

View file

@ -120,7 +120,9 @@ public:
MessagesBarData listMessagesBar( MessagesBarData listMessagesBar(
const std::vector<not_null<Element*>> &elements) override; const std::vector<not_null<Element*>> &elements) override;
void listContentRefreshed() override; void listContentRefreshed() override;
ClickHandlerPtr listDateLink(not_null<Element*> view) override; void listUpdateDateLink(
ClickHandlerPtr &link,
not_null<Element*> view) override;
bool listElementHideReply(not_null<const Element*> view) override; bool listElementHideReply(not_null<const Element*> view) override;
bool listElementShownUnread(not_null<const Element*> view) override; bool listElementShownUnread(not_null<const Element*> view) override;
bool listIsGoodForAroundPosition( bool listIsGoodForAroundPosition(

View file

@ -167,8 +167,9 @@ bool operator!=(const PeerThemeOverride &a, const PeerThemeOverride &b) {
} }
DateClickHandler::DateClickHandler(Dialogs::Key chat, QDate date) DateClickHandler::DateClickHandler(Dialogs::Key chat, QDate date)
: _chat(chat) : _chat(chat)
, _date(date) { , _weak(chat.topic())
, _date(date) {
} }
void DateClickHandler::setDate(QDate date) { void DateClickHandler::setDate(QDate date) {
@ -178,7 +179,11 @@ void DateClickHandler::setDate(QDate date) {
void DateClickHandler::onClick(ClickContext context) const { void DateClickHandler::onClick(ClickContext context) const {
const auto my = context.other.value<ClickHandlerContext>(); const auto my = context.other.value<ClickHandlerContext>();
if (const auto window = my.sessionWindow.get()) { if (const auto window = my.sessionWindow.get()) {
window->showCalendar(_chat, _date); if (!_chat.topic()) {
window->showCalendar(_chat, _date);
} else if (const auto strong = _weak.get()) {
window->showCalendar(strong, _date);
}
} }
} }

View file

@ -70,6 +70,7 @@ namespace Data {
struct CloudTheme; struct CloudTheme;
enum class CloudThemeType; enum class CloudThemeType;
class Thread; class Thread;
class ForumTopic;
} // namespace Data } // namespace Data
namespace HistoryView::Reactions { namespace HistoryView::Reactions {
@ -119,6 +120,7 @@ public:
private: private:
Dialogs::Key _chat; Dialogs::Key _chat;
base::weak_ptr<Data::ForumTopic> _weak;
QDate _date; QDate _date;
}; };