From 8000dfac0143611a11913ebaa694ebba44881225 Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 2 Sep 2019 12:23:06 +0300 Subject: [PATCH] Fix crash on admin log exit by Escape. --- .../admin_log/history_admin_log_inner.cpp | 18 ++++++++++++--- .../admin_log/history_admin_log_inner.h | 14 +++++++----- .../admin_log/history_admin_log_section.cpp | 22 +++++++++++++++---- 3 files changed, 42 insertions(+), 12 deletions(-) diff --git a/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp b/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp index 3a2a197a6..dfb077f7e 100644 --- a/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp +++ b/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp @@ -283,6 +283,18 @@ Main::Session &InnerWidget::session() const { return _controller->session(); } +rpl::producer<> InnerWidget::showSearchSignal() const { + return _showSearchSignal.events(); +} + +rpl::producer InnerWidget::scrollToSignal() const { + return _scrollToSignal.events(); +} + +rpl::producer<> InnerWidget::cancelSignal() const { + return _cancelSignal.events(); +} + void InnerWidget::visibleTopBottomUpdated( int visibleTop, int visibleBottom) { @@ -765,10 +777,10 @@ int InnerWidget::resizeGetHeight(int newWidth) { } void InnerWidget::restoreScrollPosition() { - auto newVisibleTop = _visibleTopItem + const auto newVisibleTop = _visibleTopItem ? (itemTop(_visibleTopItem) + _visibleTopFromItem) : ScrollMax; - scrollToSignal.notify(newVisibleTop, true); + _scrollToSignal.fire_copy(newVisibleTop); } void InnerWidget::paintEvent(QPaintEvent *e) { @@ -919,7 +931,7 @@ TextForMimeData InnerWidget::getSelectedText() const { void InnerWidget::keyPressEvent(QKeyEvent *e) { if (e->key() == Qt::Key_Escape || e->key() == Qt::Key_Back) { - cancelledSignal.notify(true); + _cancelSignal.fire({}); } else if (e == QKeySequence::Copy && _selectedItem != nullptr) { copySelectedText(); #ifdef Q_OS_MAC diff --git a/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.h b/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.h index 709b033cf..beb9b1672 100644 --- a/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.h +++ b/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.h @@ -52,13 +52,13 @@ public: not_null controller, not_null channel); - Main::Session &session() const; + [[nodiscard]] Main::Session &session() const; - base::Observable showSearchSignal; - base::Observable scrollToSignal; - base::Observable cancelledSignal; + [[nodiscard]] rpl::producer<> showSearchSignal() const; + [[nodiscard]] rpl::producer scrollToSignal() const; + [[nodiscard]] rpl::producer<> cancelSignal() const; - not_null channel() const { + [[nodiscard]] not_null channel() const { return _channel; } @@ -276,6 +276,10 @@ private: std::vector> _adminsCanEdit; Fn _showFilterCallback; + rpl::event_stream<> _showSearchSignal; + rpl::event_stream _scrollToSignal; + rpl::event_stream<> _cancelSignal; + }; } // namespace AdminLog diff --git a/Telegram/SourceFiles/history/admin_log/history_admin_log_section.cpp b/Telegram/SourceFiles/history/admin_log/history_admin_log_section.cpp index 6f9dacb1e..81483e12e 100644 --- a/Telegram/SourceFiles/history/admin_log/history_admin_log_section.cpp +++ b/Telegram/SourceFiles/history/admin_log/history_admin_log_section.cpp @@ -250,7 +250,11 @@ void FixedBar::mousePressEvent(QMouseEvent *e) { } } -Widget::Widget(QWidget *parent, not_null controller, not_null channel) : Window::SectionWidget(parent, controller) +Widget::Widget( + QWidget *parent, + not_null controller, + not_null channel) +: Window::SectionWidget(parent, controller) , _scroll(this, st::historyScroll, false) , _fixedBar(this, controller, channel) , _fixedBarShadow(this) @@ -267,9 +271,19 @@ Widget::Widget(QWidget *parent, not_null controller, subscribe(Adaptive::Changed(), [this] { updateAdaptiveLayout(); }); _inner = _scroll->setOwnedWidget(object_ptr(this, controller, channel)); - subscribe(_inner->showSearchSignal, [this] { _fixedBar->showSearch(); }); - subscribe(_inner->cancelledSignal, [this] { _fixedBar->goBack(); }); - subscribe(_inner->scrollToSignal, [this](int top) { _scroll->scrollToY(top); }); + _inner->showSearchSignal( + ) | rpl::start_with_next([=] { + _fixedBar->showSearch(); + }, lifetime()); + _inner->cancelSignal( + ) | rpl::start_with_next([=] { + _fixedBar->goBack(); + }, lifetime()); + _inner->scrollToSignal( + ) | rpl::start_with_next([=](int top) { + _scroll->scrollToY(top); + }, lifetime()); + _scroll->move(0, _fixedBar->height()); _scroll->show();