diff --git a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp index 1ab020d36f..7587706a8f 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp @@ -473,8 +473,10 @@ int InnerWidget::dialogsOffset() const { - skipTopHeight(); } -rpl::producer<> InnerWidget::scrollToVeryTopRequests() const { - return _stories->expandRequests(); +rpl::producer InnerWidget::storiesExpandedRequests() const { + return rpl::merge( + _stories->toggleExpandedRequests(), + _storiesExpandedRequests.events()); } int InnerWidget::defaultScrollTop() const { @@ -623,11 +625,6 @@ void InnerWidget::paintEvent(QPaintEvent *e) { if (_controller->contentOverlapped(this, e)) { return; } - const auto fillGuard = gsl::finally([&] { - // We translate painter down, but it'll be cropped below rect. - p.fillRect(rect(), st::dialogsBg); - }); - const auto activeEntry = _controller->activeChatEntryCurrent(); const auto videoPaused = _controller->isGifPausedAtLeastFor( Window::GifPauseReason::Any); @@ -648,6 +645,11 @@ void InnerWidget::paintEvent(QPaintEvent *e) { .paused = videoPaused, .narrow = (fullWidth < st::columnMinimalWidthLeft / 2), }; + _stories->setBgOverride(context.currentBg); + const auto fillGuard = gsl::finally([&] { + // We translate painter down, but it'll be cropped below rect. + p.fillRect(rect(), context.currentBg); + }); const auto paintRow = [&]( not_null row, bool selected, @@ -3408,6 +3410,7 @@ ChosenRow InnerWidget::computeChosenRow() const { bool InnerWidget::chooseRow( Qt::KeyboardModifiers modifiers, MsgId pressedTopicRootId) { + _storiesExpandedRequests.fire(false); if (chooseCollapsedRow()) { return true; } else if (chooseHashtag()) { diff --git a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.h b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.h index 1dcaf68fee..ce70f3bb39 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.h +++ b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.h @@ -104,7 +104,7 @@ public: const QVector &my, const QVector &result); - [[nodiscard]] rpl::producer<> scrollToVeryTopRequests() const; + [[nodiscard]] rpl::producer storiesExpandedRequests() const; [[nodiscard]] int defaultScrollTop() const; void setViewportHeight(int viewportHeight); @@ -408,6 +408,7 @@ private: const not_null _controller; const std::unique_ptr _stories; + rpl::event_stream _storiesExpandedRequests; int _viewportHeight = 0; not_null _shownList; diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp index 008102df0f..de20a5fac2 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp @@ -261,9 +261,11 @@ Widget::Widget( } }, lifetime()); - _inner->scrollToVeryTopRequests( - ) | rpl::start_with_next([=] { - scrollToDefaultChecked(true); + _inner->storiesExpandedRequests( + ) | rpl::start_with_next([=](bool expanded) { + if (expanded || _scroll->scrollTop() < _inner->defaultScrollTop()) { + scrollToDefaultChecked(expanded); + } }, lifetime()); _inner->mustScrollTo( @@ -1123,7 +1125,7 @@ void Widget::scrollToDefault(bool verytop) { _scrollToAnimation.stop(); auto scrollTop = _scroll->scrollTop(); const auto scrollTo = verytop ? 0 : _inner->defaultScrollTop(); - if (scrollTop <= scrollTo) { + if (scrollTop == scrollTo) { return; } const auto maxAnimatedDelta = _scroll->height(); @@ -2017,6 +2019,7 @@ void Widget::dropEvent(QDropEvent *e) { void Widget::listScrollUpdated() { const auto scrollTop = _scroll->scrollTop(); + PROFILE_LOG(("SCROLLED: %1").arg(scrollTop)); _inner->setVisibleTopBottom(scrollTop, scrollTop + _scroll->height()); updateScrollUpVisibility(); diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.cpp b/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.cpp index c54803ef63..b8d9c5a5b3 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.cpp +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.cpp @@ -239,8 +239,8 @@ rpl::producer List::toggleShown() const { return _toggleShown.events(); } -rpl::producer<> List::expandRequests() const { - return _expandRequests.events(); +rpl::producer List::toggleExpandedRequests() const { + return _toggleExpandedRequests.events(); } rpl::producer<> List::entered() const { @@ -347,7 +347,7 @@ void List::paintEvent(QPaintEvent *e) { const auto readUserpicAppearingOpacity = lerp(_st.readOpacity, 0.); auto p = QPainter(this); - p.fillRect(e->rect(), _st.bg); + p.fillRect(e->rect(), _bgOverride.value_or(_st.bg)); p.translate(0, height() - layout.shownHeight); const auto drawSmall = (ratio < 1.); @@ -670,7 +670,7 @@ void List::wheelEvent(QWheelEvent *e) { const auto used = now - delta; const auto next = std::clamp(used, 0, _scrollLeftMax); if (next != now) { - _expandRequests.fire({}); + _toggleExpandedRequests.fire(true); _scrollLeft = next; updateSelected(); checkLoadMore(); @@ -698,7 +698,7 @@ void List::mouseMoveEvent(QMouseEvent *e) { if ((_lastMousePosition - *_mouseDownPosition).manhattanLength() >= QApplication::startDragDistance()) { if (_shownHeight() < _st.full.height) { - _expandRequests.fire({}); + _toggleExpandedRequests.fire(true); } _dragging = true; _startDraggingLeft = _scrollLeft; @@ -742,13 +742,17 @@ void List::mouseReleaseEvent(QMouseEvent *e) { updateSelected(); if (_selected == pressed) { if (_selected < 0) { - _expandRequests.fire({}); + _toggleExpandedRequests.fire(true); } else if (_selected < _data.items.size()) { _clicks.fire_copy(_data.items[_selected].element.id); } } } +void List::setBgOverride(QBrush brush) { + _bgOverride = std::move(brush); +} + void List::contextMenuEvent(QContextMenuEvent *e) { _menu = nullptr; diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.h b/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.h index 8381a42892..1f1cabb45e 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.h +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.h @@ -67,10 +67,12 @@ public: rpl::producer content, Fn shownHeight); + void setBgOverride(QBrush brush); + [[nodiscard]] rpl::producer clicks() const; [[nodiscard]] rpl::producer showProfileRequests() const; [[nodiscard]] rpl::producer toggleShown() const; - [[nodiscard]] rpl::producer<> expandRequests() const; + [[nodiscard]] rpl::producer toggleExpandedRequests() const; [[nodiscard]] rpl::producer<> entered() const; [[nodiscard]] rpl::producer<> loadMoreRequests() const; @@ -165,10 +167,11 @@ private: rpl::event_stream _clicks; rpl::event_stream _showProfileRequests; rpl::event_stream _toggleShown; - rpl::event_stream<> _expandRequests; + rpl::event_stream _toggleExpandedRequests; rpl::event_stream<> _entered; rpl::event_stream<> _loadMoreRequests; + std::optional _bgOverride; Ui::Animations::Simple _shownAnimation; QPoint _lastMousePosition;