diff --git a/Telegram/SourceFiles/api/api_bot.cpp b/Telegram/SourceFiles/api/api_bot.cpp index d961063ed..9921355de 100644 --- a/Telegram/SourceFiles/api/api_bot.cpp +++ b/Telegram/SourceFiles/api/api_bot.cpp @@ -57,11 +57,7 @@ void SendBotCallbackData( const auto bot = item->getMessageBot(); const auto fullId = item->fullId(); const auto getButton = [=] { - return HistoryMessageMarkupButton::Get( - owner, - fullId, - row, - column); + return HistoryMessageMarkupButton::Get(owner, fullId, row, column); }; const auto button = getButton(); if (!button || button->requestId) { diff --git a/Telegram/SourceFiles/calls/group/calls_group_settings.cpp b/Telegram/SourceFiles/calls/group/calls_group_settings.cpp index e1edaf75f..5fa269328 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_settings.cpp +++ b/Telegram/SourceFiles/calls/group/calls_group_settings.cpp @@ -194,7 +194,7 @@ object_ptr ShareInviteLinkBox( showToast(tr::lng_share_done(tr::now)); }; auto filterCallback = [](not_null thread) { - return thread->canWrite(); // #TODO forum share + return thread->canWrite(); }; const auto scheduleStyle = [&] { diff --git a/Telegram/SourceFiles/data/data_forum.cpp b/Telegram/SourceFiles/data/data_forum.cpp index cc9e6272b..bcf598887 100644 --- a/Telegram/SourceFiles/data/data_forum.cpp +++ b/Telegram/SourceFiles/data/data_forum.cpp @@ -255,9 +255,6 @@ void Forum::requestSomeStale() { const auto rootId = *i; i = _staleRootIds.erase(i); - if (_topicRequests.contains(rootId)) { - continue; - } rootIds.push_back(MTP_int(rootId)); if (rootIds.size() == kStalePerRequest) { break; @@ -279,10 +276,12 @@ void Forum::requestSomeStale() { channel()->inputChannel, MTP_vector(rootIds)) ).done([=](const MTPmessages_ForumTopics &result) { + _staleRequestId = 0; applyReceivedTopics(result); call(); finish(); }).fail([=] { + _staleRequestId = 0; call(); finish(); }).send(); @@ -301,35 +300,19 @@ void Forum::finishTopicRequest(MsgId rootId) { } void Forum::requestTopic(MsgId rootId, Fn done) { - _staleRootIds.remove(rootId); - auto &request = _topicRequests[rootId]; if (done) { request.callbacks.push_back(std::move(done)); } - if (request.id) { - return; + if (!request.id + && _staleRootIds.emplace(rootId).second + && (_staleRootIds.size() == 1)) { + crl::on_main(&session(), [peer = channel()] { + if (const auto forum = peer->forum()) { + forum->requestSomeStale(); + } + }); } - const auto call = [=] { - finishTopicRequest(rootId); - }; - const auto type = Histories::RequestType::History; - auto &histories = owner().histories(); - request.id = histories.sendRequest(_history, type, [=]( - Fn finish) { - return session().api().request( - MTPchannels_GetForumTopicsByID( - channel()->inputChannel, - MTP_vector(1, MTP_int(rootId.bare))) - ).done([=](const MTPmessages_ForumTopics &result) { - applyReceivedTopics(result); - call(); - finish(); - }).fail([=] { - call(); - finish(); - }).send(); - }); } ForumTopic *Forum::applyTopicAdded( diff --git a/Telegram/SourceFiles/data/data_replies_list.cpp b/Telegram/SourceFiles/data/data_replies_list.cpp index ed9cbe324..d59491250 100644 --- a/Telegram/SourceFiles/data/data_replies_list.cpp +++ b/Telegram/SourceFiles/data/data_replies_list.cpp @@ -86,7 +86,7 @@ RepliesList::RepliesList(not_null history, MsgId rootId) | MessageUpdate::Flag::Destroyed ) | rpl::filter([=](const MessageUpdate &update) { return applyUpdate(update); - }) | rpl::to_empty | rpl::start_to_stream(_listChanges, _lifetime); + }) | rpl::to_empty | rpl::start_to_stream(_instantChanges, _lifetime); _history->owner().channelDifferenceTooLong( ) | rpl::filter([=](not_null channel) { @@ -114,12 +114,18 @@ rpl::producer RepliesList::source( auto lifetime = rpl::lifetime(); const auto viewer = lifetime.make_state(); const auto push = [=] { - viewer->scheduled = false; - if (buildFromData(viewer)) { - appendClientSideMessages(viewer->slice); - consumer.put_next_copy(viewer->slice); + if (viewer->scheduled) { + viewer->scheduled = false; + if (buildFromData(viewer)) { + appendClientSideMessages(viewer->slice); + consumer.put_next_copy(viewer->slice); + } } }; + const auto pushInstant = [=] { + viewer->scheduled = true; + push(); + }; const auto pushDelayed = [=] { if (!viewer->scheduled) { viewer->scheduled = true; @@ -144,7 +150,10 @@ rpl::producer RepliesList::source( _listChanges.events( ) | rpl::start_with_next(pushDelayed, lifetime); - push(); + _instantChanges.events( + ) | rpl::start_with_next(pushInstant, lifetime); + + pushInstant(); return lifetime; }; } diff --git a/Telegram/SourceFiles/data/data_replies_list.h b/Telegram/SourceFiles/data/data_replies_list.h index 8df3ce3bf..d83f85b68 100644 --- a/Telegram/SourceFiles/data/data_replies_list.h +++ b/Telegram/SourceFiles/data/data_replies_list.h @@ -105,6 +105,7 @@ private: std::optional _skippedAfter; rpl::variable> _fullCount; rpl::event_stream<> _listChanges; + rpl::event_stream<> _instantChanges; std::optional _loadingAround; rpl::variable> _unreadCount; MsgId _inboxReadTillId = 0; diff --git a/Telegram/SourceFiles/history/history_inner_widget.cpp b/Telegram/SourceFiles/history/history_inner_widget.cpp index 030268347..c719a3ad3 100644 --- a/Telegram/SourceFiles/history/history_inner_widget.cpp +++ b/Telegram/SourceFiles/history/history_inner_widget.cpp @@ -975,10 +975,10 @@ void HistoryInner::paintEvent(QPaintEvent *e) { auto readTill = (HistoryItem*)nullptr; auto readContents = base::flat_set>(); const auto guard = gsl::finally([&] { - if (readTill && _widget->doWeReadServerHistory()) { + if (readTill && _widget->markingMessagesRead()) { session().data().histories().readInboxTill(readTill); } - if (!readContents.empty() && _widget->doWeReadMentions()) { + if (!readContents.empty() && _widget->markingContentsRead()) { session().api().markContentsRead(readContents); } _userpicsCache.clear(); @@ -2796,8 +2796,8 @@ void HistoryInner::keyPressEvent(QKeyEvent *e) { } } -void HistoryInner::checkHistoryActivation() { - if (!_widget->doWeReadServerHistory()) { +void HistoryInner::checkActivation() { + if (!_widget->markingMessagesRead()) { return; } adjustCurrent(_visibleAreaBottom); @@ -3020,7 +3020,7 @@ void HistoryInner::visibleAreaUpdated(int top, int bottom) { from, till); } - checkHistoryActivation(); + checkActivation(); _emojiInteractions->visibleAreaUpdated( _visibleAreaTop, diff --git a/Telegram/SourceFiles/history/history_inner_widget.h b/Telegram/SourceFiles/history/history_inner_widget.h index 5a4962f14..a84bb95b9 100644 --- a/Telegram/SourceFiles/history/history_inner_widget.h +++ b/Telegram/SourceFiles/history/history_inner_widget.h @@ -108,7 +108,7 @@ public: void setItemsRevealHeight(int revealHeight); void changeItemsRevealHeight(int revealHeight); - void checkHistoryActivation(); + void checkActivation(); void recountHistoryGeometry(); void updateSize(); diff --git a/Telegram/SourceFiles/history/history_widget.cpp b/Telegram/SourceFiles/history/history_widget.cpp index 198edfa10..cded5d729 100644 --- a/Telegram/SourceFiles/history/history_widget.cpp +++ b/Telegram/SourceFiles/history/history_widget.cpp @@ -2879,10 +2879,10 @@ void HistoryWidget::newItemAdded(not_null item) { } // If we get here in non-resized state we can't rely on results of - // doWeReadServerHistory() and mark chat as read. + // markingMessagesRead() and mark chat as read. // If we receive N messages being not at bottom: // - on first message we set unreadcount += 1, firstUnreadMessage. - // - on second we get wrong doWeReadServerHistory() and read both. + // - on second we get wrong markingMessagesRead() and read both. session().data().sendHistoryChangeNotifications(); if (item->isSending()) { @@ -2892,7 +2892,7 @@ void HistoryWidget::newItemAdded(not_null item) { } if (item->showNotification()) { destroyUnreadBar(); - if (doWeReadServerHistory()) { + if (markingMessagesRead()) { if (item->isUnreadMention() && !item->isUnreadMedia()) { session().api().markContentsRead(item); } @@ -2916,7 +2916,7 @@ void HistoryWidget::maybeMarkReactionsRead(not_null item) { } const auto view = item->mainView(); const auto itemTop = _list->itemTop(view); - if (itemTop <= 0 || !doWeReadMentions()) { + if (itemTop <= 0 || !markingContentsRead()) { return; } const auto reactionCenter @@ -3050,7 +3050,7 @@ void HistoryWidget::messagesReceived(PeerData *peer, const MTPmessages_Messages _preloadDownRequest = 0; preloadHistoryIfNeeded(); if (_history->loadedAtBottom()) { - checkHistoryActivation(); + checkActivation(); } } else if (_firstLoadRequest == requestId) { if (toMigrated) { @@ -3114,23 +3114,23 @@ void HistoryWidget::windowShown() { updateControlsGeometry(); } -bool HistoryWidget::doWeReadServerHistory() const { - return doWeReadMentions() && !session().supportMode(); +bool HistoryWidget::markingMessagesRead() const { + return markingContentsRead() && !session().supportMode(); } -bool HistoryWidget::doWeReadMentions() const { +bool HistoryWidget::markingContentsRead() const { return _history && _list && _historyInited && !_firstLoadRequest && !_delayedShowAtRequest && !_a_show.animating() - && controller()->widget()->doWeMarkAsRead(); + && controller()->widget()->markingAsRead(); } -void HistoryWidget::checkHistoryActivation() { +void HistoryWidget::checkActivation() { if (_list) { - _list->checkHistoryActivation(); + _list->checkActivation(); } } @@ -3980,7 +3980,7 @@ void HistoryWidget::doneShow() { if (_requestsBar) { _requestsBar->finishAnimating(); } - checkHistoryActivation(); + checkActivation(); controller()->widget()->setInnerFocus(); _preserveScrollTop = false; checkSuggestToGigagroup(); diff --git a/Telegram/SourceFiles/history/history_widget.h b/Telegram/SourceFiles/history/history_widget.h index 12f66f4b4..4bae19f30 100644 --- a/Telegram/SourceFiles/history/history_widget.h +++ b/Telegram/SourceFiles/history/history_widget.h @@ -129,10 +129,10 @@ public: void setGeometryWithTopMoved(const QRect &newGeometry, int topDelta); void windowShown(); - [[nodiscard]] bool doWeReadServerHistory() const; - [[nodiscard]] bool doWeReadMentions() const; + [[nodiscard]] bool markingMessagesRead() const; + [[nodiscard]] bool markingContentsRead() const; bool skipItemRepaint(); - void checkHistoryActivation(); + void checkActivation(); void leaveToChildEvent(QEvent *e, QWidget *child) override; diff --git a/Telegram/SourceFiles/history/view/history_view_list_widget.cpp b/Telegram/SourceFiles/history/view/history_view_list_widget.cpp index a727f48b2..ac3eb3345 100644 --- a/Telegram/SourceFiles/history/view/history_view_list_widget.cpp +++ b/Telegram/SourceFiles/history/view/history_view_list_widget.cpp @@ -429,11 +429,13 @@ not_null ListWidget::delegate() const { void ListWidget::refreshViewer() { _viewerLifetime.destroy(); + _refreshingViewer = true; _delegate->listSource( _aroundPosition, _idsLimit, _idsLimit ) | rpl::start_with_next([=](Data::MessagesSlice &&slice) { + _refreshingViewer = false; std::swap(_slice, slice); refreshRows(slice); }, _viewerLifetime); @@ -453,6 +455,7 @@ void ListWidget::refreshRows(const Data::MessagesSlice &old) { ) - 1; auto destroyingBarElement = _bar.element; + _resizePending = true; _items.clear(); _items.reserve(_slice.ids.size()); auto nearestIndex = -1; @@ -486,7 +489,7 @@ void ListWidget::refreshRows(const Data::MessagesSlice &old) { if (_emptyInfo) { _emptyInfo->setVisible(isEmpty()); } - _delegate->listContentRefreshed(); + checkActivation(); } std::optional ListWidget::scrollTopForPosition( @@ -1728,6 +1731,7 @@ void ListWidget::updateItemsGeometry() { void ListWidget::updateSize() { resizeToWidth(width(), _minHeight); updateVisibleTopItem(); + _resizePending = false; } void ListWidget::resizeToWidth(int newWidth, int minHeight) { @@ -1936,6 +1940,43 @@ Ui::ChatPaintContext ListWidget::preparePaintContext( }); } +bool ListWidget::markingContentsRead() const { + return _showFinished + && !_refreshingViewer + && controller()->widget()->markingAsRead(); +} + +bool ListWidget::markingMessagesRead() const { + return markingContentsRead() && !session().supportMode(); +} + +void ListWidget::showFinished() { + _showFinished = true; + checkActivation(); +} + +void ListWidget::checkActivation() { + if (_resizePending + || _visibleTop >= _visibleBottom + || !markingMessagesRead()) { + return; + } + const auto h = height(); + const auto t = _visibleTop; + const auto b = _visibleBottom; + const auto r = _itemsRevealHeight; + auto a = 0; + for (const auto &view : _itemRevealPending) { + a += view->height(); + } + for (const auto &view : ranges::views::reverse(_items)) { + const auto bottom = itemTop(view) + view->height(); + if (_visibleBottom + _itemsRevealHeight >= bottom) { + delegate()->listMarkReadTill(view->data()); + } + } +} + void ListWidget::paintEvent(QPaintEvent *e) { if (Ui::skipPaintEvent(this, e)) { return; @@ -1944,10 +1985,10 @@ void ListWidget::paintEvent(QPaintEvent *e) { auto readTill = (HistoryItem*)nullptr; auto readContents = base::flat_set>(); const auto guard = gsl::finally([&] { - if (readTill) { + if (readTill && markingMessagesRead()) { _delegate->listMarkReadTill(readTill); } - if (!readContents.empty()) { + if (!readContents.empty() && markingContentsRead()) { _delegate->listMarkContentsRead(readContents); } _userpicsCache.clear(); @@ -2137,7 +2178,7 @@ void ListWidget::paintEvent(QPaintEvent *e) { void ListWidget::maybeMarkReactionsRead(not_null item) { const auto view = viewForItem(item); - if (!view) { + if (!view || !markingContentsRead()) { return; } const auto top = itemTop(view); @@ -3592,8 +3633,10 @@ void ListWidget::refreshAttachmentsAtIndex(int index) { void ListWidget::refreshAttachmentsFromTill(int from, int till) { Expects(from >= 0 && from <= till && till <= int(_items.size())); - if (from == till) { + const auto guard = gsl::finally([&] { updateSize(); + }); + if (from == till) { return; } auto view = _items[from].get(); diff --git a/Telegram/SourceFiles/history/view/history_view_list_widget.h b/Telegram/SourceFiles/history/view/history_view_list_widget.h index eb33b0a19..210f28eff 100644 --- a/Telegram/SourceFiles/history/view/history_view_list_widget.h +++ b/Telegram/SourceFiles/history/view/history_view_list_widget.h @@ -245,6 +245,11 @@ public: [[nodiscard]] bool loadedAtBottom() const; [[nodiscard]] bool isEmpty() const; + [[nodiscard]] bool markingContentsRead() const; + [[nodiscard]] bool markingMessagesRead() const; + void showFinished(); + void checkActivation(); + [[nodiscard]] bool hasCopyRestriction(HistoryItem *item = nullptr) const; [[nodiscard]] bool hasCopyMediaRestriction( not_null item) const; @@ -692,6 +697,9 @@ private: Qt::CursorShape _cursor = style::cur_default; bool _isChatWide = false; + bool _refreshingViewer = false; + bool _showFinished = false; + bool _resizePending = false; // _menu must be destroyed before _whoReactedMenuLifetime. rpl::lifetime _whoReactedMenuLifetime; diff --git a/Telegram/SourceFiles/history/view/history_view_pinned_section.cpp b/Telegram/SourceFiles/history/view/history_view_pinned_section.cpp index 1947696c4..cd67b19a6 100644 --- a/Telegram/SourceFiles/history/view/history_view_pinned_section.cpp +++ b/Telegram/SourceFiles/history/view/history_view_pinned_section.cpp @@ -261,6 +261,10 @@ QPixmap PinnedWidget::grabForShowAnimation(const Window::SectionSlideParams &par return result; } +void PinnedWidget::checkActivation() { + _inner->checkActivation(); +} + void PinnedWidget::doSetInnerFocus() { _inner->setFocus(); } @@ -421,6 +425,7 @@ void PinnedWidget::showAnimatedHook( void PinnedWidget::showFinishedHook() { _topBar->setAnimatingMode(false); + _inner->showFinished(); } bool PinnedWidget::floatPlayerHandleWheelEvent(QEvent *e) { diff --git a/Telegram/SourceFiles/history/view/history_view_pinned_section.h b/Telegram/SourceFiles/history/view/history_view_pinned_section.h index 05c9d103d..0c314b81d 100644 --- a/Telegram/SourceFiles/history/view/history_view_pinned_section.h +++ b/Telegram/SourceFiles/history/view/history_view_pinned_section.h @@ -138,7 +138,7 @@ public: bool cornerButtonsUnreadMayBeShown() override; bool cornerButtonsHas(CornerButtonType type) override; -protected: +private: void resizeEvent(QResizeEvent *e) override; void paintEvent(QPaintEvent *e) override; @@ -146,8 +146,8 @@ protected: const Window::SectionSlideParams ¶ms) override; void showFinishedHook() override; void doSetInnerFocus() override; + void checkActivation() override; -private: void onScroll(); void updateInnerVisibleArea(); void updateControlsGeometry(); diff --git a/Telegram/SourceFiles/history/view/history_view_replies_section.cpp b/Telegram/SourceFiles/history/view/history_view_replies_section.cpp index 2df571eca..955a83000 100644 --- a/Telegram/SourceFiles/history/view/history_view_replies_section.cpp +++ b/Telegram/SourceFiles/history/view/history_view_replies_section.cpp @@ -1872,6 +1872,10 @@ QPixmap RepliesWidget::grabForShowAnimation(const Window::SectionSlideParams &pa return result; } +void RepliesWidget::checkActivation() { + _inner->checkActivation(); +} + void RepliesWidget::doSetInnerFocus() { if (!_inner->getSelectedText().rich.text.isEmpty() || !_inner->getSelectedItems().empty() @@ -2236,6 +2240,7 @@ void RepliesWidget::showFinishedHook() { } else { _composeControls->showFinished(); } + _inner->showFinished(); if (_rootView) { _rootView->show(); } @@ -2338,16 +2343,12 @@ void RepliesWidget::listSelectionChanged(SelectedItems &&items) { } void RepliesWidget::listMarkReadTill(not_null item) { - if (true/*doWeReadServerHistory()*/) { // #TODO forum active - _replies->readTill(item); - } + _replies->readTill(item); } void RepliesWidget::listMarkContentsRead( const base::flat_set> &items) { - if (true/*doWeReadMentions()*/) { // #TODO forum active - session().api().markContentsRead(items); - } + session().api().markContentsRead(items); } MessagesBarData RepliesWidget::listMessagesBar( diff --git a/Telegram/SourceFiles/history/view/history_view_replies_section.h b/Telegram/SourceFiles/history/view/history_view_replies_section.h index 3f7b7e4d0..4d7320544 100644 --- a/Telegram/SourceFiles/history/view/history_view_replies_section.h +++ b/Telegram/SourceFiles/history/view/history_view_replies_section.h @@ -182,16 +182,16 @@ public: bool cornerButtonsUnreadMayBeShown() override; bool cornerButtonsHas(CornerButtonType type) override; -protected: +private: void resizeEvent(QResizeEvent *e) override; void paintEvent(QPaintEvent *e) override; void showAnimatedHook( const Window::SectionSlideParams ¶ms) override; void showFinishedHook() override; + void checkActivation() override; void doSetInnerFocus() override; -private: void onScroll(); void updateInnerVisibleArea(); void updateControlsGeometry(); diff --git a/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp b/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp index 7df6c18bc..da68f31fb 100644 --- a/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp +++ b/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp @@ -895,6 +895,10 @@ QPixmap ScheduledWidget::grabForShowAnimation(const Window::SectionSlideParams & return result; } +void ScheduledWidget::checkActivation() { + _inner->checkActivation(); +} + void ScheduledWidget::doSetInnerFocus() { _composeControls->focus(); } @@ -1031,6 +1035,7 @@ void ScheduledWidget::showAnimatedHook( void ScheduledWidget::showFinishedHook() { _topBar->setAnimatingMode(false); _composeControls->showFinished(); + _inner->showFinished(); // We should setup the drag area only after // the section animation is finished, diff --git a/Telegram/SourceFiles/history/view/history_view_scheduled_section.h b/Telegram/SourceFiles/history/view/history_view_scheduled_section.h index c45d1ee37..d63c1c468 100644 --- a/Telegram/SourceFiles/history/view/history_view_scheduled_section.h +++ b/Telegram/SourceFiles/history/view/history_view_scheduled_section.h @@ -162,7 +162,7 @@ public: bool cornerButtonsUnreadMayBeShown() override; bool cornerButtonsHas(CornerButtonType type) override; -protected: +private: void resizeEvent(QResizeEvent *e) override; void paintEvent(QPaintEvent *e) override; @@ -170,8 +170,8 @@ protected: const Window::SectionSlideParams ¶ms) override; void showFinishedHook() override; void doSetInnerFocus() override; + void checkActivation() override; -private: void onScroll(); void updateInnerVisibleArea(); void updateControlsGeometry(); diff --git a/Telegram/SourceFiles/mainwidget.cpp b/Telegram/SourceFiles/mainwidget.cpp index 4ce65d6c1..c8ac4647d 100644 --- a/Telegram/SourceFiles/mainwidget.cpp +++ b/Telegram/SourceFiles/mainwidget.cpp @@ -2060,8 +2060,11 @@ void MainWidget::dialogsToUp() { } } -void MainWidget::checkHistoryActivation() { - _history->checkHistoryActivation(); +void MainWidget::checkActivation() { + _history->checkActivation(); + if (_mainSection) { + _mainSection->checkActivation(); + } } void MainWidget::showAnimated(const QPixmap &bgAnimCache, bool back) { @@ -2223,7 +2226,7 @@ void MainWidget::showAll() { updateControlsGeometry(); floatPlayerCheckVisibility(); - _controller->widget()->checkHistoryActivation(); + _controller->widget()->checkActivation(); } void MainWidget::resizeEvent(QResizeEvent *e) { @@ -2778,14 +2781,8 @@ void MainWidget::activate() { _controller->widget()->fixOrder(); } -bool MainWidget::isActive() const { - return isVisible() - && !_a_show.animating() - && !session().updates().isIdle(); -} - -bool MainWidget::doWeMarkAsRead() const { - return isActive() && !_mainSection; +bool MainWidget::animatingShow() const { + return _a_show.animating(); } bool MainWidget::isOneColumn() const { diff --git a/Telegram/SourceFiles/mainwidget.h b/Telegram/SourceFiles/mainwidget.h index dc3b2c0a0..d5a26ae89 100644 --- a/Telegram/SourceFiles/mainwidget.h +++ b/Telegram/SourceFiles/mainwidget.h @@ -144,7 +144,7 @@ public: void windowShown(); void dialogsToUp(); - void checkHistoryActivation(); + void checkActivation(); [[nodiscard]] PeerData *peer() const; [[nodiscard]] Ui::ChatTheme *customChatTheme() const; @@ -167,8 +167,7 @@ public: not_null document, Api::SendOptions options); - bool isActive() const; - [[nodiscard]] bool doWeMarkAsRead() const; + [[nodiscard]] bool animatingShow() const; void showForwardLayer(Data::ForwardDraft &&draft); void showSendPathsLayer(); diff --git a/Telegram/SourceFiles/mainwindow.cpp b/Telegram/SourceFiles/mainwindow.cpp index 1d12884a9..ff34347e1 100644 --- a/Telegram/SourceFiles/mainwindow.cpp +++ b/Telegram/SourceFiles/mainwindow.cpp @@ -114,7 +114,7 @@ void MainWindow::initHook() { windowHandle(), &QWindow::activeChanged, this, - [=] { checkHistoryActivation(); }, + [=] { checkActivation(); }, Qt::QueuedConnection); if (Media::SystemMediaControlsManager::Supported()) { @@ -395,7 +395,7 @@ void MainWindow::destroyLayer() { setInnerFocus(); } InvokeQueued(this, [=] { - checkHistoryActivation(); + checkActivation(); }); } @@ -459,7 +459,7 @@ void MainWindow::showLayer( showBoxOrLayer(std::move(layer), options, animated); } -bool MainWindow::ui_isLayerShown() { +bool MainWindow::ui_isLayerShown() const { return _layer != nullptr; } @@ -539,17 +539,19 @@ void MainWindow::themeUpdated(const Window::Theme::BackgroundUpdate &data) { } } -bool MainWindow::doWeMarkAsRead() { - if (!_main || Ui::isLayerShown()) { - return false; - } - return isActive() && _main->doWeMarkAsRead(); +bool MainWindow::markingAsRead() const { + return _main + && !_main->isHidden() + && !_main->animatingShow() + && !_layer + && isActive() + && !_main->session().updates().isIdle(); } -void MainWindow::checkHistoryActivation() { +void MainWindow::checkActivation() { updateIsActive(); if (_main) { - _main->checkHistoryActivation(); + _main->checkActivation(); } } diff --git a/Telegram/SourceFiles/mainwindow.h b/Telegram/SourceFiles/mainwindow.h index 142893ac1..4535cfbb0 100644 --- a/Telegram/SourceFiles/mainwindow.h +++ b/Telegram/SourceFiles/mainwindow.h @@ -62,13 +62,11 @@ public: MainWidget *sessionContent() const; - [[nodiscard]] bool doWeMarkAsRead(); - + void checkActivation(); + [[nodiscard]] bool markingAsRead() const; bool takeThirdSectionFromLayer(); - void checkHistoryActivation(); - void sendPaths(); bool contentOverlapped(const QRect &globalRect); @@ -98,7 +96,7 @@ public: anim::type animated); void ui_hideSettingsAndLayer(anim::type animated); void ui_removeLayerBlackout(); - bool ui_isLayerShown(); + [[nodiscard]] bool ui_isLayerShown() const; bool showMediaPreview( Data::FileOrigin origin, not_null document); diff --git a/Telegram/SourceFiles/window/section_widget.h b/Telegram/SourceFiles/window/section_widget.h index c9bff162f..f42b78432 100644 --- a/Telegram/SourceFiles/window/section_widget.h +++ b/Telegram/SourceFiles/window/section_widget.h @@ -165,6 +165,8 @@ public: void setInnerFocus() { doSetInnerFocus(); } + virtual void checkActivation() { + } [[nodiscard]] virtual rpl::producer desiredHeight() const; [[nodiscard]] virtual rpl::producer<> removeRequests() const { diff --git a/Telegram/SourceFiles/window/window_controller.cpp b/Telegram/SourceFiles/window/window_controller.cpp index 124ce16bc..d746dcd9b 100644 --- a/Telegram/SourceFiles/window/window_controller.cpp +++ b/Telegram/SourceFiles/window/window_controller.cpp @@ -113,7 +113,7 @@ void Controller::showAccount( ) | rpl::filter([=](bool idle) { return !idle; }) | rpl::start_with_next([=] { - widget()->checkHistoryActivation(); + widget()->checkActivation(); }, _sessionController->lifetime()); session->termsLockValue(