From 2d90a06078e2bab6b62f8570941ccc4ca33cee40 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Thu, 27 May 2021 02:16:12 +0300 Subject: [PATCH] Added new Adaptive class to replace legacy Adaptive namespace. Temporarily named class as AdaptiveModern. --- Telegram/CMakeLists.txt | 2 + .../SourceFiles/window/window_adaptive.cpp | 51 +++++++++++++++++++ Telegram/SourceFiles/window/window_adaptive.h | 43 ++++++++++++++++ .../SourceFiles/window/window_controller.cpp | 5 ++ .../SourceFiles/window/window_controller.h | 4 ++ .../window/window_session_controller.cpp | 4 ++ .../window/window_session_controller.h | 2 + 7 files changed, 111 insertions(+) create mode 100644 Telegram/SourceFiles/window/window_adaptive.cpp create mode 100644 Telegram/SourceFiles/window/window_adaptive.h diff --git a/Telegram/CMakeLists.txt b/Telegram/CMakeLists.txt index 93e09681fa..bd081899dd 100644 --- a/Telegram/CMakeLists.txt +++ b/Telegram/CMakeLists.txt @@ -1086,6 +1086,8 @@ PRIVATE window/section_memento.h window/section_widget.cpp window/section_widget.h + window/window_adaptive.cpp + window/window_adaptive.h window/window_connecting_widget.cpp window/window_connecting_widget.h window/window_controller.cpp diff --git a/Telegram/SourceFiles/window/window_adaptive.cpp b/Telegram/SourceFiles/window/window_adaptive.cpp new file mode 100644 index 0000000000..cc0f9b659b --- /dev/null +++ b/Telegram/SourceFiles/window/window_adaptive.cpp @@ -0,0 +1,51 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#include "window/window_adaptive.h" + +#include "history/history_item.h" +#include "data/data_media_types.h" +#include "data/data_session.h" + +namespace Window { + +AdaptiveModern::AdaptiveModern() = default; + +void AdaptiveModern::setWindowLayout(WindowLayout value) { + _layout = value; +} + +void AdaptiveModern::setChatLayout(ChatLayout value) { + _chatLayout = value; +} + +rpl::producer<> AdaptiveModern::changed() const { + return rpl::merge( + _chatLayout.changes() | rpl::to_empty, + _layout.changes() | rpl::to_empty); +} + +rpl::producer AdaptiveModern::oneColumnValue() const { + return _layout.value( + ) | rpl::map([=] { + return isOneColumn(); + }); +} + +bool AdaptiveModern::isOneColumn() const { + return _layout.current() == WindowLayout::OneColumn; +} + +bool AdaptiveModern::isNormal() const { + return _layout.current() == WindowLayout::Normal; +} + +bool AdaptiveModern::isThreeColumn() const { + return _layout.current() == WindowLayout::ThreeColumn; +} + +} // namespace Window diff --git a/Telegram/SourceFiles/window/window_adaptive.h b/Telegram/SourceFiles/window/window_adaptive.h new file mode 100644 index 0000000000..163eb80c20 --- /dev/null +++ b/Telegram/SourceFiles/window/window_adaptive.h @@ -0,0 +1,43 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#pragma once + +namespace Window { + +class AdaptiveModern { +public: + enum class WindowLayout { + OneColumn, + Normal, + ThreeColumn, + }; + + enum class ChatLayout { + Normal, + Wide, + }; + + AdaptiveModern(); + + void setWindowLayout(WindowLayout value); + void setChatLayout(ChatLayout value); + + [[nodiscard]] rpl::producer<> changed() const; + [[nodiscard]] rpl::producer oneColumnValue() const; + + [[nodiscard]] bool isOneColumn() const; + [[nodiscard]] bool isNormal() const; + [[nodiscard]] bool isThreeColumn() const; + +private: + rpl::variable _chatLayout; + rpl::variable _layout; + +}; + +} // namespace Window diff --git a/Telegram/SourceFiles/window/window_controller.cpp b/Telegram/SourceFiles/window/window_controller.cpp index 0bbddee13b..0aeefca1bb 100644 --- a/Telegram/SourceFiles/window/window_controller.cpp +++ b/Telegram/SourceFiles/window/window_controller.cpp @@ -41,6 +41,7 @@ namespace Window { Controller::Controller() : _widget(this) +, _adaptive(std::make_unique()) , _isActiveTimer([=] { updateIsActive(); }) { _widget.init(); } @@ -367,4 +368,8 @@ void Controller::showLogoutConfirmation() { callback)); } +Window::AdaptiveModern &Controller::adaptive() const { + return *_adaptive; +} + } // namespace Window diff --git a/Telegram/SourceFiles/window/window_controller.h b/Telegram/SourceFiles/window/window_controller.h index b5cb6710ee..00d4667fad 100644 --- a/Telegram/SourceFiles/window/window_controller.h +++ b/Telegram/SourceFiles/window/window_controller.h @@ -8,6 +8,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #pragma once #include "mainwindow.h" +#include "window/window_adaptive.h" #include "ui/layers/layer_widget.h" namespace Main { @@ -39,6 +40,8 @@ public: } [[nodiscard]] bool locked() const; + [[nodiscard]] AdaptiveModern &adaptive() const; + void finishFirstShow(); void setupPasscodeLock(); @@ -90,6 +93,7 @@ private: Main::Account *_account = nullptr; ::MainWindow _widget; + const std::unique_ptr _adaptive; std::unique_ptr _sessionController; base::Timer _isActiveTimer; QPointer _termsBox; diff --git a/Telegram/SourceFiles/window/window_session_controller.cpp b/Telegram/SourceFiles/window/window_session_controller.cpp index 310e1d3720..27e0c2700a 100644 --- a/Telegram/SourceFiles/window/window_session_controller.cpp +++ b/Telegram/SourceFiles/window/window_session_controller.cpp @@ -1205,6 +1205,10 @@ void SessionController::showNewChannel() { Ui::LayerOption::KeepOther); } +Window::AdaptiveModern &SessionController::adaptive() const { + return _window->adaptive(); +} + SessionController::~SessionController() = default; } // namespace Window diff --git a/Telegram/SourceFiles/window/window_session_controller.h b/Telegram/SourceFiles/window/window_session_controller.h index 5399ae8b0d..93e0a98a5e 100644 --- a/Telegram/SourceFiles/window/window_session_controller.h +++ b/Telegram/SourceFiles/window/window_session_controller.h @@ -53,6 +53,7 @@ class MainWindow; class SectionMemento; class Controller; class FiltersMenu; +class AdaptiveModern; enum class GifPauseReason { Any = 0, @@ -238,6 +239,7 @@ public: } [[nodiscard]] not_null<::MainWindow*> widget() const; [[nodiscard]] not_null content() const; + [[nodiscard]] AdaptiveModern &adaptive() const; // We need access to this from MainWidget::MainWidget, where // we can't call content() yet.