diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp index 04e8afcbe8..941eeb39af 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp @@ -1120,7 +1120,7 @@ void Widget::setupTopBarSuggestions() { && (id == owner->chatsFilters().defaultId()); }); return TopBarSuggestionValue( - _innerList, + this, &session(), std::move(on), _childListShown.value(), @@ -1128,18 +1128,41 @@ void Widget::setupTopBarSuggestions() { }) | rpl::flatten_latest() | rpl::on_next([=]( Ui::SlideWrap *raw) { if (raw) { - _topBarSuggestion = _innerList->insert( + _topBarSuggestionPlaceholder.reset(_innerList->insert( 0, - object_ptr>::fromRaw(raw)); + object_ptr(_innerList))); + _topBarSuggestionPlaceholder->paintOn([ + ph = _topBarSuggestionPlaceholder.get() + ](QPainter &p) { + p.fillRect(ph->rect(), st::dialogsBg); + }); + _topBarSuggestion.reset(raw); + _topBarSuggestion->setParent(_scroll); + _topBarSuggestion->raise(); _topBarSuggestion->heightValue( - ) | rpl::start_to_stream( - _topBarSuggestionHeightChanged, + ) | rpl::on_next([=](int h) { + if (_topBarSuggestionPlaceholder) { + _topBarSuggestionPlaceholder->resize( + _topBarSuggestionPlaceholder->width(), + h); + } + _topBarSuggestionHeightChanged.fire_copy(h); + }, _topBarSuggestion->entity()->lifetime()); + const auto pinToScroll = [=] { + if (_topBarSuggestion) { + _topBarSuggestion->resizeToWidth(_scroll->width()); + _topBarSuggestion->moveToLeft(0, 0); + } + }; + _scroll->sizeValue( + ) | rpl::to_empty | rpl::on_next( + pinToScroll, _topBarSuggestion->entity()->lifetime()); + pinToScroll(); } else { - if (_topBarSuggestion) { - delete _topBarSuggestion; - } + _topBarSuggestionPlaceholder = nullptr; _topBarSuggestion = nullptr; + _topBarSuggestionHeightChanged.fire(0); } }, lifetime()); }); diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.h b/Telegram/SourceFiles/dialogs/dialogs_widget.h index fde36c875e..fbc97dfbed 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.h +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.h @@ -332,7 +332,8 @@ private: base::unique_qptr _chatFilters; - QPointer> _topBarSuggestion; + base::unique_qptr> _topBarSuggestion; + base::unique_qptr _topBarSuggestionPlaceholder; rpl::event_stream _topBarSuggestionHeightChanged; rpl::event_stream _searchStateForTopBarSuggestion; rpl::event_stream<> _prepareTopBarSnapshot; diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_top_bar_suggestion_content.cpp b/Telegram/SourceFiles/dialogs/ui/dialogs_top_bar_suggestion_content.cpp index fde47a5813..d3489e3a9a 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_top_bar_suggestion_content.cpp +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_top_bar_suggestion_content.cpp @@ -120,10 +120,8 @@ not_null CreateUnconfirmedAuthContent( const auto content = wrap->entity(); const auto &margins = st::dialogsTopBarSuggestionMargins; content->paintOn([=](QPainter &p) { - const auto outer = content->rect(); - const auto pill = outer - margins; + const auto pill = content->rect() - margins; const auto radius = st::dialogsTopBarSuggestionRadius; - p.fillRect(outer, st::dialogsBg); wrap->shadow().paint(p, pill, radius); auto hq = PainterHighQualityEnabler(p); p.setBrush(st::dialogsBg); @@ -330,8 +328,6 @@ void TopBarSuggestionContent::draw(QPainter &p) { const auto pill = outer - margins; const auto radius = st::dialogsTopBarSuggestionRadius; - p.fillRect(outer, st::dialogsBg); - _shadow.paint(p, pill, radius); auto hq = PainterHighQualityEnabler(p);