From 39658ffe5269a652fbf1f650a2dd08b43d68e0c0 Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 8 Apr 2024 12:13:25 +0400 Subject: [PATCH] Allow narrow chats width without main section. --- .../dialogs/dialogs_inner_widget.cpp | 5 ---- .../SourceFiles/dialogs/dialogs_widget.cpp | 18 +++++++++-- Telegram/SourceFiles/dialogs/dialogs_widget.h | 1 + Telegram/SourceFiles/mainwidget.cpp | 30 ++++--------------- .../window/window_lock_widgets.cpp | 3 -- .../window/window_session_controller.cpp | 5 ---- .../window/window_session_controller.h | 25 +++++----------- 7 files changed, 30 insertions(+), 57 deletions(-) diff --git a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp index 0da825209..542d41118 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp @@ -2871,8 +2871,6 @@ void InnerWidget::refresh(bool toTop) { jumpToTop(); preloadRowsData(); } - _controller->setDialogsListDisplayForced( - _searchInChat || !_filter.isEmpty()); update(); } @@ -3060,9 +3058,6 @@ void InnerWidget::searchInChat( _searchInChatUserpic = {}; } moveCancelSearchButtons(); - - _controller->setDialogsListDisplayForced( - _searchInChat || !_filter.isEmpty()); } auto InnerWidget::searchTagsChanges() const diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp index b2b1a8fe1..340a29471 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp @@ -357,8 +357,14 @@ Widget::Widget( ) | rpl::start_with_next([=] { applySearchUpdate(); }, _search->lifetime()); + + _search->focusedChanges() | rpl::start_with_next([=](bool focused) { + updateForceDisplayWide(); + }, _search->lifetime()); + _search->submits( ) | rpl::start_with_next([=] { submit(); }, _search->lifetime()); + QObject::connect( _search->rawTextEdit().get(), &QTextEdit::cursorPositionChanged, @@ -2469,6 +2475,13 @@ void Widget::applySearchUpdate(bool force) { } } _lastSearchText = filterText; + updateForceDisplayWide(); +} + +void Widget::updateForceDisplayWide() { + controller()->setChatsForceDisplayWide(_search->hasFocus() + || !_search->getLastText().isEmpty() + || _searchInChat); } void Widget::showForum( @@ -2687,11 +2700,12 @@ bool Widget::setSearchInChat( && _lastSearchText == HistoryView::SwitchToChooseFromQuery()) { cancelSearch(); } - if (_searchInChat) { + if (_searchInChat || !_search->getLastText().isEmpty()) { _search->setFocus(); } else { setFocus(); } + updateForceDisplayWide(); return true; } @@ -3209,7 +3223,7 @@ void Widget::cancelSearchInChat() { setSearchInChat(Key()); } applySearchUpdate(true); - if (!isOneColumn) { + if (!isOneColumn && _search->getLastText().isEmpty()) { controller()->content()->dialogsCancelled(); } } diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.h b/Telegram/SourceFiles/dialogs/dialogs_widget.h index b3a53ee17..6686995f3 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.h +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.h @@ -233,6 +233,7 @@ private: mtpRequestId requestId); void peopleFailed(const MTP::Error &error, mtpRequestId requestId); + void updateForceDisplayWide(); void scrollToDefault(bool verytop = false); void scrollToDefaultChecked(bool verytop = false); void setupScrollUpButton(); diff --git a/Telegram/SourceFiles/mainwidget.cpp b/Telegram/SourceFiles/mainwidget.cpp index c1a6e1b2e..c60927950 100644 --- a/Telegram/SourceFiles/mainwidget.cpp +++ b/Telegram/SourceFiles/mainwidget.cpp @@ -296,11 +296,11 @@ MainWidget::MainWidget( _player->finishAnimating(); } - rpl::merge( - _controller->dialogsListFocusedChanges(), - _controller->dialogsListDisplayForcedChanges() + _controller->chatsForceDisplayWideChanges( ) | rpl::start_with_next([=] { - updateDialogsWidthAnimated(); + crl::on_main(this, [=] { + updateDialogsWidthAnimated(); + }); }, lifetime()); rpl::merge( @@ -1315,7 +1315,6 @@ void MainWidget::showHistory( } } - _controller->setDialogsListFocused(false); _a_dialogsWidth.stop(); using Way = SectionShow::Way; @@ -1708,7 +1707,6 @@ void MainWidget::showNewSection( _controller->window().hideSettingsAndLayer(); } - _controller->setDialogsListFocused(false); _a_dialogsWidth.stop(); auto mainSectionTop = getMainSectionTop(); @@ -2626,23 +2624,7 @@ bool MainWidget::eventFilter(QObject *o, QEvent *e) { const auto widget = o->isWidgetType() ? static_cast(o) : nullptr; - if (e->type() == QEvent::FocusIn) { - if (widget && (widget->window() == window())) { - if (_history == widget || _history->isAncestorOf(widget) - || (_mainSection - && (_mainSection == widget - || _mainSection->isAncestorOf(widget))) - || (_thirdSection - && (_thirdSection == widget - || _thirdSection->isAncestorOf(widget)))) { - _controller->setDialogsListFocused(false); - } else if (_dialogs - && (_dialogs == widget - || _dialogs->isAncestorOf(widget))) { - _controller->setDialogsListFocused(true); - } - } - } else if (e->type() == QEvent::MouseButtonPress) { + if (e->type() == QEvent::MouseButtonPress) { if (widget && (widget->window() == window())) { const auto event = static_cast(e); if (event->button() == Qt::BackButton) { @@ -2749,7 +2731,7 @@ void MainWidget::updateWindowAdaptiveLayout() { auto useSmallColumnWidth = !isOneColumn() && !dialogsWidthRatio - && !_controller->forceWideDialogs(); + && !_controller->chatsForceDisplayWide(); _dialogsWidth = !_dialogs ? 0 : useSmallColumnWidth diff --git a/Telegram/SourceFiles/window/window_lock_widgets.cpp b/Telegram/SourceFiles/window/window_lock_widgets.cpp index 813db805b..58f4881fa 100644 --- a/Telegram/SourceFiles/window/window_lock_widgets.cpp +++ b/Telegram/SourceFiles/window/window_lock_widgets.cpp @@ -41,9 +41,6 @@ not_null LockWidget::window() const { } void LockWidget::setInnerFocus() { - if (const auto controller = _window->sessionController()) { - controller->setDialogsListFocused(false); - } setFocus(); } diff --git a/Telegram/SourceFiles/window/window_session_controller.cpp b/Telegram/SourceFiles/window/window_session_controller.cpp index 581665aee..7b47da42d 100644 --- a/Telegram/SourceFiles/window/window_session_controller.cpp +++ b/Telegram/SourceFiles/window/window_session_controller.cpp @@ -1892,11 +1892,6 @@ int SessionController::minimalThreeColumnWidth() const { + st::columnMinimalWidthThird; } -bool SessionController::forceWideDialogs() const { - return _dialogsListDisplayForced.current() - || _dialogsListFocused.current(); -} - auto SessionController::computeColumnLayout() const -> ColumnLayout { auto layout = Adaptive::WindowLayout::OneColumn; diff --git a/Telegram/SourceFiles/window/window_session_controller.h b/Telegram/SourceFiles/window/window_session_controller.h index 293dda20c..241567b5e 100644 --- a/Telegram/SourceFiles/window/window_session_controller.h +++ b/Telegram/SourceFiles/window/window_session_controller.h @@ -423,7 +423,6 @@ public: }; [[nodiscard]] ColumnLayout computeColumnLayout() const; int dialogsSmallColumnWidth() const; - bool forceWideDialogs() const; void updateColumnLayout() const; bool canShowThirdSection() const; bool canShowThirdSectionWithoutResize() const; @@ -516,24 +515,15 @@ public: std::optional show = std::nullopt) const; void finishChatThemeEdit(not_null peer); - [[nodiscard]] bool dialogsListFocused() const { - return _dialogsListFocused.current(); + [[nodiscard]] bool chatsForceDisplayWide() const { + return _chatsForceDisplayWide.current(); } - [[nodiscard]] rpl::producer dialogsListFocusedChanges() const { - return _dialogsListFocused.changes(); - } - void setDialogsListFocused(bool value) { - _dialogsListFocused = value; - } - [[nodiscard]] bool dialogsListDisplayForced() const { - return _dialogsListDisplayForced.current(); - } - [[nodiscard]] auto dialogsListDisplayForcedChanges() const + [[nodiscard]] auto chatsForceDisplayWideChanges() const -> rpl::producer { - return _dialogsListDisplayForced.changes(); + return _chatsForceDisplayWide.changes(); } - void setDialogsListDisplayForced(bool value) { - _dialogsListDisplayForced = value; + void setChatsForceDisplayWide(bool value) { + _chatsForceDisplayWide = value; } not_null parentController() override { @@ -688,8 +678,7 @@ private: rpl::variable _searchInChat; rpl::variable _activeChatEntry; rpl::lifetime _activeHistoryLifetime; - rpl::variable _dialogsListFocused = false; - rpl::variable _dialogsListDisplayForced = false; + rpl::variable _chatsForceDisplayWide = false; std::deque _chatEntryHistory; int _chatEntryHistoryPosition = -1; bool _filtersActivated = false;