From 6c64c22f835fab9d808c6584a6386b9383b3086c Mon Sep 17 00:00:00 2001
From: Ilya Fedin <fedin-ilja2010@ya.ru>
Date: Sun, 17 Nov 2024 07:38:48 +0400
Subject: [PATCH] Don't expand minimum window size for folders

Turn them into horizontal automatically instead
---
 Telegram/SourceFiles/dialogs/dialogs_widget.cpp    |  3 ++-
 Telegram/SourceFiles/settings/settings_folders.cpp | 13 +++++++++++--
 Telegram/SourceFiles/window/main_window.cpp        |  5 -----
 Telegram/SourceFiles/window/window_controller.cpp  |  1 +
 .../window/window_session_controller.cpp           | 14 +++++++++++++-
 .../SourceFiles/window/window_session_controller.h |  2 ++
 6 files changed, 29 insertions(+), 9 deletions(-)

diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp
index f2e809107..0cb207bc1 100644
--- a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp
+++ b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp
@@ -653,7 +653,8 @@ Widget::Widget(
 	}
 
 	if (session().settings().dialogsFiltersEnabled()
-		&& Core::App().settings().chatFiltersHorizontal()) {
+		&& (Core::App().settings().chatFiltersHorizontal()
+			|| !controller->enoughSpaceForFilters())) {
 		toggleFiltersMenu(true);
 	}
 }
diff --git a/Telegram/SourceFiles/settings/settings_folders.cpp b/Telegram/SourceFiles/settings/settings_folders.cpp
index f2ba21dd2..552215041 100644
--- a/Telegram/SourceFiles/settings/settings_folders.cpp
+++ b/Telegram/SourceFiles/settings/settings_folders.cpp
@@ -844,7 +844,16 @@ void SetupTopContent(
 
 }
 
-void SetupView(not_null<Ui::VerticalLayout*> content) {
+void SetupView(
+		not_null<Window::SessionController*> controller,
+		not_null<Ui::VerticalLayout*> content) {
+	const auto wrap = content->add(
+		object_ptr<Ui::SlideWrap<Ui::VerticalLayout>>(
+			content,
+			object_ptr<Ui::VerticalLayout>(content)));
+	wrap->toggleOn(controller->enoughSpaceForFiltersValue());
+	content = wrap->entity();
+
 	Ui::AddDivider(content);
 	Ui::AddSkip(content);
 	Ui::AddSubsectionTitle(content, tr::lng_filters_view_subtitle());
@@ -900,7 +909,7 @@ void Folders::setupContent(not_null<Window::SessionController*> controller) {
 
 	_save = SetupFoldersContent(controller, content);
 
-	SetupView(content);
+	SetupView(controller, content);
 
 	Ui::ResizeFitChild(this, content);
 }
diff --git a/Telegram/SourceFiles/window/main_window.cpp b/Telegram/SourceFiles/window/main_window.cpp
index 208ed561c..334af505e 100644
--- a/Telegram/SourceFiles/window/main_window.cpp
+++ b/Telegram/SourceFiles/window/main_window.cpp
@@ -566,11 +566,6 @@ void MainWindow::updatePalette() {
 
 int MainWindow::computeMinWidth() const {
 	auto result = st::windowMinWidth;
-	if (const auto session = _controller->sessionController()) {
-		if (const auto add = session->filtersWidth()) {
-			result += add;
-		}
-	}
 	if (_rightColumn) {
 		result += _rightColumn->width();
 	}
diff --git a/Telegram/SourceFiles/window/window_controller.cpp b/Telegram/SourceFiles/window/window_controller.cpp
index da6efc8d1..fb47a4050 100644
--- a/Telegram/SourceFiles/window/window_controller.cpp
+++ b/Telegram/SourceFiles/window/window_controller.cpp
@@ -230,6 +230,7 @@ void Controller::setupSideBar() {
 	}, _sessionController->lifetime());
 
 	if (_sessionController->session().settings().dialogsFiltersEnabled()
+		&& _sessionController->enoughSpaceForFilters()
 		&& !Core::App().settings().chatFiltersHorizontal()) {
 		_sessionController->toggleFiltersMenu(true);
 	} else {
diff --git a/Telegram/SourceFiles/window/window_session_controller.cpp b/Telegram/SourceFiles/window/window_session_controller.cpp
index 5c54a79d2..0ec6d195b 100644
--- a/Telegram/SourceFiles/window/window_session_controller.cpp
+++ b/Telegram/SourceFiles/window/window_session_controller.cpp
@@ -1315,6 +1315,7 @@ SessionController::SessionController(
 	}, lifetime());
 
 	rpl::merge(
+		enoughSpaceForFiltersValue() | rpl::skip(1) | rpl::to_empty,
 		Core::App().settings().chatFiltersHorizontalChanges() | rpl::to_empty,
 		session->data().chatsFilters().changed()
 	) | rpl::start_with_next([=] {
@@ -1322,7 +1323,8 @@ SessionController::SessionController(
 		crl::on_main(this, [this] {
 			if (SessionNavigation::session().data().chatsFilters().has()) {
 				const auto isHorizontal
-					= Core::App().settings().chatFiltersHorizontal();
+					= Core::App().settings().chatFiltersHorizontal()
+						|| !enoughSpaceForFilters();
 				content()->toggleFiltersMenu(isHorizontal);
 				toggleFiltersMenu(!isHorizontal);
 			} else {
@@ -2588,6 +2590,16 @@ int SessionController::filtersWidth() const {
 	return _filters ? st::windowFiltersWidth : 0;
 }
 
+bool SessionController::enoughSpaceForFilters() const {
+	return widget()->width() >= widget()->minimumWidth() + st::windowFiltersWidth;
+}
+
+rpl::producer<bool> SessionController::enoughSpaceForFiltersValue() const {
+	return widget()->widthValue() | rpl::map([=] {
+		return enoughSpaceForFilters();
+	}) | rpl::distinct_until_changed();
+}
+
 rpl::producer<FilterId> SessionController::activeChatsFilter() const {
 	return _activeChatsFilter.value();
 }
diff --git a/Telegram/SourceFiles/window/window_session_controller.h b/Telegram/SourceFiles/window/window_session_controller.h
index 8cb9a590f..f6880bdbe 100644
--- a/Telegram/SourceFiles/window/window_session_controller.h
+++ b/Telegram/SourceFiles/window/window_session_controller.h
@@ -546,6 +546,8 @@ public:
 	}
 
 	[[nodiscard]] int filtersWidth() const;
+	[[nodiscard]] bool enoughSpaceForFilters() const;
+	[[nodiscard]] rpl::producer<bool> enoughSpaceForFiltersValue() const;
 	[[nodiscard]] rpl::producer<FilterId> activeChatsFilter() const;
 	[[nodiscard]] FilterId activeChatsFilterCurrent() const;
 	void setActiveChatsFilter(