From e72ca712ec60ceb201839084d97158d79fcc0867 Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 23 May 2022 12:04:31 +0400 Subject: [PATCH] Fix glitch in Settings > Premium layer scroll-to-bottom. --- .../SourceFiles/info/info_content_widget.h | 2 +- .../SourceFiles/info/info_layer_widget.cpp | 8 +++- Telegram/SourceFiles/info/info_layer_widget.h | 1 + .../SourceFiles/info/info_section_widget.cpp | 20 +++++++-- .../SourceFiles/info/info_section_widget.h | 1 + .../SourceFiles/info/info_wrap_widget.cpp | 6 ++- Telegram/SourceFiles/info/info_wrap_widget.h | 1 + Telegram/SourceFiles/settings/settings.style | 2 +- .../SourceFiles/settings/settings_premium.cpp | 42 +++++++++++++++---- .../SourceFiles/settings/settings_premium.h | 7 ++++ 10 files changed, 73 insertions(+), 17 deletions(-) diff --git a/Telegram/SourceFiles/info/info_content_widget.h b/Telegram/SourceFiles/info/info_content_widget.h index c79c703d5..cddaef841 100644 --- a/Telegram/SourceFiles/info/info_content_widget.h +++ b/Telegram/SourceFiles/info/info_content_widget.h @@ -113,7 +113,7 @@ private: style::color _bg; rpl::variable _scrollTopSkip = -1; - rpl::variable _scrollBottomSkip = -1; + rpl::variable _scrollBottomSkip = 0; rpl::event_stream _scrollTillBottomChanges; object_ptr _scroll; Ui::PaddingWrap *_innerWrap = nullptr; diff --git a/Telegram/SourceFiles/info/info_layer_widget.cpp b/Telegram/SourceFiles/info/info_layer_widget.cpp index 94c01c531..f170c690f 100644 --- a/Telegram/SourceFiles/info/info_layer_widget.cpp +++ b/Telegram/SourceFiles/info/info_layer_widget.cpp @@ -299,9 +299,13 @@ QRect LayerWidget::countGeometry(int newWidth) { contentHeight += additionalScroll; _tillBottom = (newTop + desiredHeight >= windowHeight); if (_tillBottom) { - contentHeight += contentBottom; additionalScroll += contentBottom; } + _contentTillBottom = _tillBottom && !_content->scrollBottomSkip(); + if (_contentTillBottom) { + contentHeight += contentBottom; + } + const auto bottomPadding = _tillBottom ? 0 : contentBottom; _content->updateGeometry({ contentLeft, contentTop, @@ -328,6 +332,8 @@ void LayerWidget::paintEvent(QPaintEvent *e) { if (clip.intersects({ 0, height() - radius, width(), radius })) { parts |= RectPart::FullBottom; } + } else if (!_contentTillBottom) { + p.fillRect(0, height() - radius, width(), radius, st::boxBg); } if (_content->animatingShow()) { if (clip.intersects({ 0, 0, width(), radius })) { diff --git a/Telegram/SourceFiles/info/info_layer_widget.h b/Telegram/SourceFiles/info/info_layer_widget.h index 0f4af7e08..dc7665d3a 100644 --- a/Telegram/SourceFiles/info/info_layer_widget.h +++ b/Telegram/SourceFiles/info/info_layer_widget.h @@ -83,6 +83,7 @@ private: bool _inResize = false; bool _pendingResize = false; bool _tillBottom = false; + bool _contentTillBottom = false; bool _floatPlayerDelegateRestored = false; diff --git a/Telegram/SourceFiles/info/info_section_widget.cpp b/Telegram/SourceFiles/info/info_section_widget.cpp index 1b6f522f4..75d0b2dd8 100644 --- a/Telegram/SourceFiles/info/info_section_widget.cpp +++ b/Telegram/SourceFiles/info/info_section_widget.cpp @@ -16,6 +16,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "info/info_layer_widget.h" #include "info/info_memento.h" #include "info/info_controller.h" +#include "styles/style_layers.h" namespace Info { @@ -42,11 +43,15 @@ SectionWidget::SectionWidget( void SectionWidget::init() { Expects(_connecting == nullptr); - sizeValue( - ) | rpl::start_with_next([wrap = _content.data()](QSize size) { + rpl::combine( + sizeValue(), + _content->desiredHeightValue() + ) | rpl::start_with_next([wrap = _content.data()](QSize size, int) { const auto expanding = false; - auto wrapGeometry = QRect{ { 0, 0 }, size }; - auto additionalScroll = 0; + const auto additionalScroll = st::boxRadius; + const auto full = !wrap->scrollBottomSkip(); + const auto height = size.height() - (full ? 0 : st::boxRadius); + const auto wrapGeometry = QRect{ 0, 0, size.width(), height }; wrap->updateGeometry(wrapGeometry, expanding, additionalScroll); }, _content->lifetime()); @@ -88,6 +93,13 @@ void SectionWidget::showAnimatedHook( _topBarSurrogate = _content->createTopBarSurrogate(this); } +void SectionWidget::paintEvent(QPaintEvent *e) { + Window::SectionWidget::paintEvent(e); + if (!animatingShow()) { + QPainter(this).fillRect(e->rect(), st::windowBg); + } +} + bool SectionWidget::showInternal( not_null memento, const Window::SectionShow ¶ms) { diff --git a/Telegram/SourceFiles/info/info_section_widget.h b/Telegram/SourceFiles/info/info_section_widget.h index 7a4e470c2..f93281e3e 100644 --- a/Telegram/SourceFiles/info/info_section_widget.h +++ b/Telegram/SourceFiles/info/info_section_widget.h @@ -63,6 +63,7 @@ protected: void showAnimatedHook( const Window::SectionSlideParams ¶ms) override; + void paintEvent(QPaintEvent *e) override; private: void init(); diff --git a/Telegram/SourceFiles/info/info_wrap_widget.cpp b/Telegram/SourceFiles/info/info_wrap_widget.cpp index bd992ee35..5c0b82bcf 100644 --- a/Telegram/SourceFiles/info/info_wrap_widget.cpp +++ b/Telegram/SourceFiles/info/info_wrap_widget.cpp @@ -645,8 +645,8 @@ void WrapWidget::showContent(object_ptr content) { old->setParent(nullptr); old.destroy(); } - _content->show(); _additionalScroll = 0; + _content->show(); //_anotherTabMemento = nullptr; finishShowContent(); } @@ -1098,6 +1098,10 @@ int WrapWidget::scrollTillBottom(int forHeight) const { return _content->scrollTillBottom(forHeight - topWidget()->height()); } +int WrapWidget::scrollBottomSkip() const { + return _content->scrollBottomSkip(); +} + rpl::producer WrapWidget::scrollTillBottomChanges() const { return _scrollTillBottomChanges.events_starting_with( _content->scrollTillBottomChanges() diff --git a/Telegram/SourceFiles/info/info_wrap_widget.h b/Telegram/SourceFiles/info/info_wrap_widget.h index a1100f6fd..a22568e7a 100644 --- a/Telegram/SourceFiles/info/info_wrap_widget.h +++ b/Telegram/SourceFiles/info/info_wrap_widget.h @@ -125,6 +125,7 @@ public: QRect newGeometry, bool expanding, int additionalScroll); + [[nodiscard]] int scrollBottomSkip() const; [[nodiscard]] int scrollTillBottom(int forHeight) const; [[nodiscard]] rpl::producer scrollTillBottomChanges() const; [[nodiscard]] rpl::producer grabbingForExpanding() const; diff --git a/Telegram/SourceFiles/settings/settings.style b/Telegram/SourceFiles/settings/settings.style index 90f619969..7f8feeacc 100644 --- a/Telegram/SourceFiles/settings/settings.style +++ b/Telegram/SourceFiles/settings/settings.style @@ -422,5 +422,5 @@ notifyPreviewChecksSkip: 12px; notifyPreviewBottomSkip: 9px; settingsPremiumDescriptionSkip: 3px; -settingsPremiumButtonPadding: margins(11px, 11px, 11px, 11px); +settingsPremiumButtonPadding: margins(11px, 11px, 11px, 3px); diff --git a/Telegram/SourceFiles/settings/settings_premium.cpp b/Telegram/SourceFiles/settings/settings_premium.cpp index 4dcd10c52..3b83f015d 100644 --- a/Telegram/SourceFiles/settings/settings_premium.cpp +++ b/Telegram/SourceFiles/settings/settings_premium.cpp @@ -12,7 +12,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "settings/settings_premium.h" #include "core/application.h" #include "ui/abstract_button.h" +#include "ui/basic_click_handlers.h" #include "ui/effects/gradient.h" +#include "ui/effects/premium_graphics.h" #include "ui/text/text_utilities.h" #include "ui/widgets/gradient_round_button.h" #include "ui/widgets/labels.h" @@ -21,6 +23,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "window/window_session_controller.h" #include "window/window_controller.h" #include "main/main_session.h" +#include "main/main_account.h" +#include "main/main_app_config.h" #include "styles/style_boxes.h" #include "styles/style_chat_helpers.h" #include "styles/style_layers.h" @@ -41,22 +45,25 @@ public: not_null parent) override; private: - void setupContent(not_null controller); + void setupContent(); + + const not_null _controller; }; Premium::Premium( QWidget *parent, not_null controller) -: Section(parent) { - setupContent(controller); +: Section(parent) +, _controller(controller) { + setupContent(); } rpl::producer Premium::title() { return tr::lng_premium_summary_title(); } -void Premium::setupContent(not_null controller) { +void Premium::setupContent() { const auto content = Ui::CreateChild(this); content->add( @@ -221,11 +228,11 @@ QPointer Premium::createPinnedToBottom( auto result = object_ptr( content, - QGradientStops{ - { 0., st::premiumButtonBg1->c }, - { .6, st::premiumButtonBg2->c }, - { 1., st::premiumButtonBg3->c }, - }); + Ui::Premium::ButtonGradientStops()); + + result->setClickedCallback([=] { + StartPremiumPayment(_controller, "settings"); + }); const auto &st = st::premiumPreviewBox.button; result->resize(content->width(), st.height); @@ -271,4 +278,21 @@ void ShowPremium(not_null session) { } } +void StartPremiumPayment( + not_null controller, + const QString &ref) { + const auto account = &controller->session().account(); + const auto username = account->appConfig().get( + "premium_bot_username", + QString()); + const auto slug = account->appConfig().get( + "premium_invoice_slug", + QString()); + if (!username.isEmpty()) { + UrlClickHandler::Open("https://t.me/" + username + "?start=" + ref); + } else if (!slug.isEmpty()) { + UrlClickHandler::Open("https://t.me/$" + slug); + } +} + } // namespace Settings diff --git a/Telegram/SourceFiles/settings/settings_premium.h b/Telegram/SourceFiles/settings/settings_premium.h index 3a8111917..8973871d5 100644 --- a/Telegram/SourceFiles/settings/settings_premium.h +++ b/Telegram/SourceFiles/settings/settings_premium.h @@ -13,11 +13,18 @@ namespace Main { class Session; } // namespace Main +namespace Window { +class SessionController; +} // namespace Window + namespace Settings { [[nodiscard]] Type PremiumId(); void ShowPremium(not_null<::Main::Session*> session); +void StartPremiumPayment( + not_null controller, + const QString &ref); } // namespace Settings