diff --git a/Telegram/SourceFiles/dialogs/dialogs_top_bar_suggestion.cpp b/Telegram/SourceFiles/dialogs/dialogs_top_bar_suggestion.cpp index 50b6c5ca65..b69d6df009 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_top_bar_suggestion.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_top_bar_suggestion.cpp @@ -11,17 +11,20 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "apiwrap.h" #include "base/call_delayed.h" #include "core/application.h" +#include "core/core_settings.h" #include "data/components/gift_auctions.h" #include "data/components/promo_suggestions.h" #include "data/data_peer_values.h" // Data::AmPremiumValue. #include "dialogs/suggestions/suggestion.h" #include "dialogs/ui/dialogs_top_bar_suggestion_content.h" #include "main/main_session.h" +#include "mainwindow.h" #include "ui/ui_utility.h" #include "ui/wrap/slide_wrap.h" #include "window/window_controller.h" #include "window/window_session_controller.h" #include "styles/style_dialogs.h" +#include "styles/style_window.h" namespace Dialogs { namespace { @@ -35,6 +38,19 @@ namespace { } // namespace +Fn ExpandChatsListCallback(not_null widget) { + return [=] { + const auto controller = FindSessionController(widget); + const auto nochat = !controller->mainSectionShown(); + const auto body = controller->widget()->bodyWidget()->width() + - controller->filtersWidth(); + Core::App().settings().updateDialogsWidthRatio( + st::columnMinimalWidthLeft / float64(std::max(body, 1)), + nochat); + Core::App().saveSettingsDelayed(); + }; +} + rpl::producer*> TopBarSuggestionValue( not_null parent, not_null session, @@ -79,6 +95,8 @@ rpl::producer*> TopBarSuggestionValue( Window::GifPauseReason::Layer); }); state->content->setCollapseProgress( rpl::duplicate(childListShown)); + state->content->setNarrowExpandCallback( + ExpandChatsListCallback(parent)); } return state->content; }; diff --git a/Telegram/SourceFiles/dialogs/dialogs_top_bar_suggestion.h b/Telegram/SourceFiles/dialogs/dialogs_top_bar_suggestion.h index 9ad295c3c5..8793567f0d 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_top_bar_suggestion.h +++ b/Telegram/SourceFiles/dialogs/dialogs_top_bar_suggestion.h @@ -30,5 +30,8 @@ namespace Dialogs { rpl::producer<> prepareCollapseSnapshot) -> rpl::producer*>; +[[nodiscard]] Fn ExpandChatsListCallback( + not_null widget); + } // namespace Dialogs diff --git a/Telegram/SourceFiles/dialogs/dialogs_top_bar_suggestion_test.cpp b/Telegram/SourceFiles/dialogs/dialogs_top_bar_suggestion_test.cpp index 8223361fb8..4047c2c4e0 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_top_bar_suggestion_test.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_top_bar_suggestion_test.cpp @@ -17,6 +17,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_session.h" #include "data/data_user.h" #include "dialogs/dialogs_inner_widget.h" +#include "dialogs/dialogs_top_bar_suggestion.h" #include "dialogs/ui/dialogs_top_bar_suggestion_content.h" #include "lang/lang_keys.h" #include "main/main_session.h" @@ -81,6 +82,39 @@ void Widget::setupTopBarSuggestionTestHotkeys() { MTP_string("Test Location"))); }; + const auto installBirthdayTest = [=, this] { + using RightIcon = TopBarSuggestionContent::RightIcon; + const auto content = Ui::CreateChild( + this); + content->setRightIcon(RightIcon::Close); + const auto user = session().user(); + content->setContent( + tr::lng_dialogs_suggestions_birthday_contact_title( + tr::now, + lt_text, + { user->shortName() }, + tr::rich), + tr::lng_dialogs_suggestions_birthday_contact_about( + tr::now, + TextWithEntities::Simple)); + content->setLeadingWidget(Ui::CreateChild( + content, + user, + st::uploadUserpicButton)); + content->setHideCallback(hideAndCleanup); + content->setNarrowExpandCallback(ExpandChatsListCallback(this)); + content->setCollapseProgress(_childListShown.value()); + _prepareTopBarSnapshot.events( + ) | rpl::on_next([content] { + content->prepareCollapseSnapshot(); + }, content->lifetime()); + const auto wrap = Ui::CreateChild< + Ui::SlideWrap>( + this, + object_ptr::fromRaw(content)); + install(wrap); + }; + const auto regularShortcut = new QShortcut( QKeySequence(u"Ctrl+Shift+T"_q), this); @@ -88,37 +122,7 @@ void Widget::setupTopBarSuggestionTestHotkeys() { regularShortcut, &QShortcut::activated, this, - [=, this] { - using RightIcon = TopBarSuggestionContent::RightIcon; - const auto content = Ui::CreateChild( - this); - content->setRightIcon(RightIcon::Close); - const auto user = session().user(); - content->setContent( - tr::lng_dialogs_suggestions_birthday_contact_title( - tr::now, - lt_text, - { user->shortName() }, - tr::rich), - tr::lng_dialogs_suggestions_birthday_contact_about( - tr::now, - TextWithEntities::Simple)); - content->setLeadingWidget(Ui::CreateChild( - content, - user, - st::uploadUserpicButton)); - content->setHideCallback(hideAndCleanup); - content->setCollapseProgress(_childListShown.value()); - _prepareTopBarSnapshot.events( - ) | rpl::on_next([content] { - content->prepareCollapseSnapshot(); - }, content->lifetime()); - const auto wrap = Ui::CreateChild< - Ui::SlideWrap>( - this, - object_ptr::fromRaw(content)); - install(wrap); - }); + installBirthdayTest); const auto authShortcut = new QShortcut( QKeySequence(u"Ctrl+Shift+A"_q), diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp index 338b864c56..bc168fa4bd 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp @@ -1234,20 +1234,15 @@ void Widget::setupTopBarSuggestions() { auto on = rpl::combine( controller()->activeChatsFilter(), _openedFolderOrForumChanges.events_starting_with(false), - widthValue() | rpl::map( - _1 >= st::columnMinimalWidthLeft - ) | rpl::distinct_until_changed(), _searchStateForTopBarSuggestion.events_starting_with( !_searchState.query.isEmpty()), _jumpToDate->toggledValue() ) | rpl::map([=]( FilterId id, bool folderOrForum, - bool wide, bool search, bool searchInPeer) { return !folderOrForum - && wide && !search && !searchInPeer && (id == owner->chatsFilters().defaultId()); 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 7f68567220..ae7e21fac9 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_top_bar_suggestion_content.cpp +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_top_bar_suggestion_content.cpp @@ -84,31 +84,6 @@ namespace { return (width < st::columnMinimalWidthLeft / 2); } -void PaintNarrowSuggestionBubble( - QPainter &p, - QRect outer, - const Ui::BoxShadow &shadow, - int cornerRadius) { - const auto &margins = st::dialogsTopBarSuggestionMargins; - const auto pill = outer - margins; - PaintSuggestionBubbleBackground(p, outer, shadow, cornerRadius); - if (pill.isEmpty()) { - return; - } - const auto accentSide = st::dialogsRequestsBubbleIconSize; - const auto accent = QRect( - pill.x() + (pill.width() - accentSide) / 2, - pill.y() + (pill.height() - accentSide) / 2, - accentSide, - accentSide); - auto hq = PainterHighQualityEnabler(p); - auto background = Ui::RoundRect( - st::dialogsRequestsBubbleIconRadius, - st::dialogsRequestsBubbleIconBg); - background.paint(p, accent); - st::dialogsRequestsBubbleIcon.paintInCenter(p, accent); -} - } // namespace void PaintBottomFade( @@ -330,6 +305,23 @@ TopBarSuggestionContent::TopBarSuggestionContent( , _emojiPaused(std::move(emojiPaused)) { _leftPadding = st::dialogsTopBarLeftPadding; setRightIcon(RightIcon::Close); + Ui::AbstractButton::setClickedCallback([=] { + if (TopBarSuggestionNarrow(width())) { + if (_narrowExpandCallback) { + _narrowExpandCallback(); + } + } else if (_suggestionClickCallback) { + _suggestionClickCallback(); + } + }); +} + +void TopBarSuggestionContent::setClickedCallback(Fn callback) { + _suggestionClickCallback = std::move(callback); +} + +void TopBarSuggestionContent::setNarrowExpandCallback(Fn callback) { + _narrowExpandCallback = std::move(callback); } void TopBarSuggestionContent::setRightIcon(RightIcon icon) { @@ -458,11 +450,33 @@ void TopBarSuggestionContent::draw(QPainter &p) { }; if (TopBarSuggestionNarrow(width())) { setControlsVisible(false); - PaintNarrowSuggestionBubble( + const auto &margins = st::dialogsTopBarSuggestionMargins; + const auto pill = outer - margins; + const auto radius = PaintSuggestionBubbleBackground( p, outer, _shadow, _geometry.cornerRadius); + if (pill.isEmpty()) { + return; + } + auto clipPath = QPainterPath(); + clipPath.addRoundedRect(pill, radius, radius); + p.setClipPath(clipPath); + Ui::RippleButton::paintRipple(p, 0, 0); + p.setClipping(false); + const auto accentSide = st::dialogsRequestsBubbleIconSize; + const auto accent = QRect( + pill.x() + (pill.width() - accentSide) / 2, + pill.y() + (pill.height() - accentSide) / 2, + accentSide, + accentSide); + auto hq = PainterHighQualityEnabler(p); + auto background = Ui::RoundRect( + st::dialogsRequestsBubbleIconRadius, + st::dialogsRequestsBubbleIconBg); + background.paint(p, accent); + st::dialogsRequestsBubbleIcon.paintInCenter(p, accent); return; } setControlsVisible(true); diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_top_bar_suggestion_content.h b/Telegram/SourceFiles/dialogs/ui/dialogs_top_bar_suggestion_content.h index 5185fef2af..f9be65bf8f 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_top_bar_suggestion_content.h +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_top_bar_suggestion_content.h @@ -96,6 +96,8 @@ public: not_null parent, Fn emojiPaused = nullptr); + void setClickedCallback(Fn callback); + void setNarrowExpandCallback(Fn callback); void setContent( TextWithEntities title, TextWithEntities description, @@ -145,6 +147,8 @@ private: rpl::lifetime _leadingWidgetLifetime; Fn _hideCallback; Fn _emojiPaused; + Fn _suggestionClickCallback; + Fn _narrowExpandCallback; int _leftPadding = 0; TopBarSuggestionGeometry _geometry;