From 7d0eb3ba8ea8017fa697664306af5745efeff30b Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 30 Jun 2020 19:05:12 +0400 Subject: [PATCH] Fix crash in MainWidget setup with audio player. --- .../SourceFiles/dialogs/dialogs_inner_widget.cpp | 2 +- Telegram/SourceFiles/dialogs/dialogs_widget.cpp | 12 ++++++------ Telegram/SourceFiles/mainwidget.cpp | 5 +++++ .../SourceFiles/window/window_session_controller.h | 10 ++++++++++ 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp index 47159854e7..a64d7f9bb7 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp @@ -3016,7 +3016,7 @@ void InnerWidget::setupShortcuts() { }) | rpl::start_with_next([=](not_null request) { using Command = Shortcuts::Command; - if (_controller->content()->selectingPeer()) { + if (_controller->selectingPeer()) { return; } const auto row = _controller->activeChatEntryCurrent(); diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp index 46ee3f826b..4086eeafb0 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp @@ -212,7 +212,7 @@ Widget::Widget( }); _inner->chosenRow( ) | rpl::start_with_next([=](const ChosenRow &row) { - const auto openSearchResult = !controller->content()->selectingPeer() + const auto openSearchResult = !controller->selectingPeer() && row.filteredRow; if (const auto history = row.key.history()) { controller->content()->choosePeer( @@ -701,7 +701,7 @@ void Widget::escape() { } else if (controller()->activeChatsFilterCurrent()) { controller()->setActiveChatsFilter(FilterId(0)); } - } else if (!_searchInChat && !controller()->content()->selectingPeer()) { + } else if (!_searchInChat && !controller()->selectingPeer()) { if (controller()->activeChatEntryCurrent().key) { emit cancelled(); } @@ -1260,7 +1260,7 @@ void Widget::peopleFailed(const RPCError &error, mtpRequestId requestId) { void Widget::dragEnterEvent(QDragEnterEvent *e) { using namespace Storage; - if (controller()->content()->selectingPeer()) { + if (controller()->selectingPeer()) { return; } @@ -1609,7 +1609,7 @@ void Widget::updateControlsGeometry() { } void Widget::updateForwardBar() { - auto selecting = controller()->content()->selectingPeer(); + auto selecting = controller()->selectingPeer(); auto oneColumnSelecting = (Adaptive::OneColumn() && selecting); if (!oneColumnSelecting == !_forwardCancel) { return; @@ -1752,7 +1752,7 @@ bool Widget::onCancelSearch() { void Widget::onCancelSearchInChat() { cancelSearchRequest(); if (_searchInChat) { - if (Adaptive::OneColumn() && !controller()->content()->selectingPeer()) { + if (Adaptive::OneColumn() && !controller()->selectingPeer()) { if (const auto peer = _searchInChat.peer()) { Ui::showPeerHistory(peer, ShowAtUnreadMsgId); //} else if (const auto feed = _searchInChat.feed()) { // #feed @@ -1767,7 +1767,7 @@ void Widget::onCancelSearchInChat() { _filter->clear(); _filter->updatePlaceholder(); applyFilterUpdate(); - if (!Adaptive::OneColumn() && !controller()->content()->selectingPeer()) { + if (!Adaptive::OneColumn() && !controller()->selectingPeer()) { emit cancelled(); } } diff --git a/Telegram/SourceFiles/mainwidget.cpp b/Telegram/SourceFiles/mainwidget.cpp index 2d3214403e..a6f20da2f4 100644 --- a/Telegram/SourceFiles/mainwidget.cpp +++ b/Telegram/SourceFiles/mainwidget.cpp @@ -612,6 +612,8 @@ void MainWidget::clearHider(not_null instance) { return; } _hider.release(); + controller()->setSelectingPeer(false); + if (Adaptive::OneColumn()) { if (_mainSection || (_history->peer() && _history->peer()->id)) { auto animationParams = ([=] { @@ -637,6 +639,8 @@ void MainWidget::hiderLayer(base::unique_qptr hider) { } _hider = std::move(hider); + controller()->setSelectingPeer(true); + _hider->setParent(this); _hider->hidden( @@ -1407,6 +1411,7 @@ void MainWidget::ui_showPeerHistory( if (_hider) { _hider->startHide(); _hider.release(); + controller()->setSelectingPeer(false); } auto animatedShow = [&] { diff --git a/Telegram/SourceFiles/window/window_session_controller.h b/Telegram/SourceFiles/window/window_session_controller.h index e0520ebee5..16ea70d448 100644 --- a/Telegram/SourceFiles/window/window_session_controller.h +++ b/Telegram/SourceFiles/window/window_session_controller.h @@ -168,6 +168,15 @@ public: [[nodiscard]] not_null<::MainWindow*> widget() const; [[nodiscard]] not_null content() const; + // We need access to this from MainWidget::MainWidget, where + // we can't call content() yet. + void setSelectingPeer(bool selecting) { + _selectingPeer = selecting; + } + [[nodiscard]] bool selectingPeer() const { + return _selectingPeer; + } + [[nodiscard]] auto tabbedSelector() const -> not_null; void takeTabbedSelectorOwnershipFrom(not_null parent); @@ -331,6 +340,7 @@ private: base::Variable _dialogsListDisplayForced = { false }; std::deque _chatEntryHistory; int _chatEntryHistoryPosition = -1; + bool _selectingPeer = false; rpl::variable _activeChatsFilter;