From 8d02d81a9a9a4b2c7d26135adfb54823a58029a4 Mon Sep 17 00:00:00 2001 From: John Preston Date: Sat, 13 May 2017 15:02:07 +0300 Subject: [PATCH] Switch layout to Normal in a wide enough window. A lot of people didn't know how to bring the dialogs column back after it was gone in a wide single column MainWindow. Now we switch to a two column layout if the window allows it, preserving the emoji / stickers / GIFs section in case it is shown. --- Telegram/SourceFiles/historywidget.cpp | 6 +++++- Telegram/SourceFiles/historywidget.h | 3 ++- Telegram/SourceFiles/mainwidget.cpp | 14 ++++++++++++++ Telegram/SourceFiles/window/window_controller.cpp | 6 +++++- Telegram/SourceFiles/window/window_controller.h | 1 + 5 files changed, 27 insertions(+), 3 deletions(-) diff --git a/Telegram/SourceFiles/historywidget.cpp b/Telegram/SourceFiles/historywidget.cpp index cfd318200e..eb265b934c 100644 --- a/Telegram/SourceFiles/historywidget.cpp +++ b/Telegram/SourceFiles/historywidget.cpp @@ -3735,8 +3735,12 @@ void HistoryWidget::updateTabbedSelectorSectionShown() { orderWidgets(); } +int HistoryWidget::tabbedSelectorSectionWidth() const { + return st::emojiPanWidth; +} + int HistoryWidget::minimalWidthForTabbedSelectorSection() const { - return st::windowMinWidth + st::emojiPanWidth; + return st::windowMinWidth + tabbedSelectorSectionWidth(); } void HistoryWidget::toggleTabbedSelectorMode() { diff --git a/Telegram/SourceFiles/historywidget.h b/Telegram/SourceFiles/historywidget.h index 0f56f9db3a..0eded83c66 100644 --- a/Telegram/SourceFiles/historywidget.h +++ b/Telegram/SourceFiles/historywidget.h @@ -200,6 +200,8 @@ public: void unreadCountChanged(History *history); QRect historyRect() const; + int tabbedSelectorSectionWidth() const; + int minimalWidthForTabbedSelectorSection() const; void updateSendAction(History *history, SendAction::Type type, int32 progress = 0); void cancelSendAction(History *history, SendAction::Type type); @@ -480,7 +482,6 @@ private: void toggleTabbedSelectorMode(); void updateTabbedSelectorSectionShown(); void recountChatWidth(); - int minimalWidthForTabbedSelectorSection() const; void setReportSpamStatus(DBIPeerReportSpamStatus status); void animationCallback(); diff --git a/Telegram/SourceFiles/mainwidget.cpp b/Telegram/SourceFiles/mainwidget.cpp index 069f11b659..26e3194d87 100644 --- a/Telegram/SourceFiles/mainwidget.cpp +++ b/Telegram/SourceFiles/mainwidget.cpp @@ -3160,6 +3160,7 @@ bool MainWidget::eventFilter(QObject *o, QEvent *e) { Local::writeUserSettings(); } else if (e->type() == QEvent::MouseMove && _resizingSide) { auto newWidth = mouseLeft() - _resizingSideShift; + accumulate_max(newWidth, _controller->dialogsSmallColumnWidth()); _controller->dialogsWidthRatio().set(float64(newWidth) / width(), true); } } else if (e->type() == QEvent::FocusIn) { @@ -3191,6 +3192,19 @@ void MainWidget::handleAdaptiveLayoutUpdate() { void MainWidget::updateWindowAdaptiveLayout() { auto layout = _controller->computeColumnLayout(); + if (layout.windowLayout == Adaptive::WindowLayout::OneColumn) { + auto chatWidth = layout.dialogsWidth; + if (AuthSession::Current().data().tabbedSelectorSectionEnabled() + && chatWidth >= _history->minimalWidthForTabbedSelectorSection()) { + chatWidth -= _history->tabbedSelectorSectionWidth(); + } + if (chatWidth >= st::dialogsWidthMin + st::windowMinWidth) { + // Switch layout back to normal in a wide enough window. + layout.windowLayout = Adaptive::WindowLayout::Normal; + layout.dialogsWidth = st::dialogsWidthMin; + _controller->dialogsWidthRatio().set(float64(layout.dialogsWidth) / layout.bodyWidth, true); + } + } _dialogsWidth = layout.dialogsWidth; if (layout.windowLayout != Global::AdaptiveWindowLayout()) { Global::SetAdaptiveWindowLayout(layout.windowLayout); diff --git a/Telegram/SourceFiles/window/window_controller.cpp b/Telegram/SourceFiles/window/window_controller.cpp index e5cf852122..93016b0211 100644 --- a/Telegram/SourceFiles/window/window_controller.cpp +++ b/Telegram/SourceFiles/window/window_controller.cpp @@ -53,6 +53,10 @@ bool Controller::isGifPausedAtLeastFor(GifPauseReason reason) const { return (static_cast(_gifPauseReasons) >= 2 * static_cast(reason)) || !window()->isActive(); } +int Controller::dialogsSmallColumnWidth() const { + return st::dialogsPadding.x() + st::dialogsPhotoSize + st::dialogsPadding.x(); +} + Controller::ColumnLayout Controller::computeColumnLayout() { auto layout = Adaptive::WindowLayout::OneColumn; @@ -94,7 +98,7 @@ Controller::ColumnLayout Controller::computeColumnLayout() { if (forceWideDialogs()) { dialogsWidth = st::dialogsWidthMin; } else { - dialogsWidth = st::dialogsPadding.x() + st::dialogsPhotoSize + st::dialogsPadding.x(); + dialogsWidth = dialogsSmallColumnWidth(); } } else { layout = Adaptive::WindowLayout::Normal; diff --git a/Telegram/SourceFiles/window/window_controller.h b/Telegram/SourceFiles/window/window_controller.h index 40465ecc9b..112cf70290 100644 --- a/Telegram/SourceFiles/window/window_controller.h +++ b/Telegram/SourceFiles/window/window_controller.h @@ -72,6 +72,7 @@ public: Adaptive::WindowLayout windowLayout; }; ColumnLayout computeColumnLayout(); + int dialogsSmallColumnWidth() const; bool provideChatWidth(int requestedWidth); base::Variable &dialogsWidthRatio() {