/* This file is part of Telegram Desktop, the official desktop version of Telegram messaging app, see https://telegram.org Telegram Desktop is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. It is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. In addition, as a special exception, the copyright holders give permission to link the code of portions of this program with the OpenSSL library. Full license: https://github.com/telegramdesktop/tdesktop/blob/master/LICENSE Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org */ #pragma once #include #include "base/flags.h" class MainWidget; namespace Window { enum class GifPauseReason { Any = 0, InlineResults = (1 << 0), SavedGifs = (1 << 1), Layer = (1 << 2), RoundPlaying = (1 << 3), MediaPreview = (1 << 4), }; using GifPauseReasons = base::flags; inline constexpr bool is_flag_type(GifPauseReason) { return true; }; struct SectionShow { enum class Way { Forward, Backward, ClearStack, }; SectionShow( Way way = Way::Forward, anim::type animated = anim::type::normal, anim::activation activation = anim::activation::normal) : way(way) , animated(animated) , activation(activation) { } SectionShow( anim::type animated, anim::activation activation = anim::activation::normal) : animated(animated) , activation(activation) { } SectionShow withWay(Way newWay) const { return SectionShow(newWay, animated, activation); } Way way = Way::Forward; anim::type animated = anim::type::normal; anim::activation activation = anim::activation::normal; }; class MainWindow; class SectionMemento; class Controller { public: static constexpr auto kDefaultDialogsWidthRatio = 5. / 14; Controller(not_null window) : _window(window) { } not_null window() const { return _window; } // This is needed for History TopBar updating when searchInPeer // is changed in the DialogsWidget of the current window. rpl::variable searchInPeer; // This is needed while we have one HistoryWidget and one TopBarWidget // for all histories we show in a window. Once each history is shown // in its own HistoryWidget with its own TopBarWidget this can be removed. rpl::variable historyPeer; void enableGifPauseReason(GifPauseReason reason); void disableGifPauseReason(GifPauseReason reason); base::Observable &gifPauseLevelChanged() { return _gifPauseLevelChanged; } bool isGifPausedAtLeastFor(GifPauseReason reason) const; base::Observable &floatPlayerAreaUpdated() { return _floatPlayerAreaUpdated; } struct ColumnLayout { int bodyWidth; int dialogsWidth; int chatWidth; int thirdWidth; Adaptive::WindowLayout windowLayout; }; ColumnLayout computeColumnLayout() const; int dialogsSmallColumnWidth() const; bool forceWideDialogs() const; void updateColumnLayout(); bool canShowThirdSection() const; bool canShowThirdSectionWithoutResize() const; bool takeThirdSectionFromLayer(); void resizeForThirdSection(); void closeThirdSection(); void showSection( SectionMemento &&memento, const SectionShow ¶ms = SectionShow()); void showBackFromStack( const SectionShow ¶ms = SectionShow()); void showPeerHistory( PeerId peerId, const SectionShow ¶ms = SectionShow::Way::ClearStack, MsgId msgId = ShowAtUnreadMsgId); void showPeerHistory( not_null peer, const SectionShow ¶ms = SectionShow::Way::ClearStack, MsgId msgId = ShowAtUnreadMsgId); void showPeerHistory( not_null history, const SectionShow ¶ms = SectionShow::Way::ClearStack, MsgId msgId = ShowAtUnreadMsgId); void showPeerInfo( PeerId peerId, const SectionShow ¶ms = SectionShow()); void showPeerInfo( not_null peer, const SectionShow ¶ms = SectionShow()); void showPeerInfo( not_null history, const SectionShow ¶ms = SectionShow()); void clearSectionStack( const SectionShow ¶ms = SectionShow::Way::ClearStack) { showPeerHistory( PeerId(0), params, ShowAtUnreadMsgId); } void showSpecialLayer( object_ptr &&layer, anim::type animated = anim::type::normal); void hideSpecialLayer( anim::type animated = anim::type::normal) { showSpecialLayer(nullptr, animated); } void showJumpToDate( not_null peer, QDate requestedDate); base::Variable &dialogsWidthRatio() { return _dialogsWidthRatio; } const base::Variable &dialogsWidthRatio() const { return _dialogsWidthRatio; } base::Variable &dialogsListFocused() { return _dialogsListFocused; } const base::Variable &dialogsListFocused() const { return _dialogsListFocused; } base::Variable &dialogsListDisplayForced() { return _dialogsListDisplayForced; } const base::Variable &dialogsListDisplayForced() const { return _dialogsListDisplayForced; } private: int minimalThreeColumnWidth() const; not_null chats() const; not_null _window; GifPauseReasons _gifPauseReasons = 0; base::Observable _gifPauseLevelChanged; base::Observable _floatPlayerAreaUpdated; base::Variable _dialogsWidthRatio = { kDefaultDialogsWidthRatio }; base::Variable _dialogsListFocused = { false }; base::Variable _dialogsListDisplayForced = { false }; }; } // namespace Window