/* 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 #include "platform/platform_main_window.h" #include "base/unique_qptr.h" #include "ui/layers/layer_widget.h" #include "ui/effects/animation_value.h" class MainWidget; namespace Intro { class Widget; enum class EnterPoint : uchar; } // namespace Intro namespace Window { class MediaPreviewWidget; class SectionMemento; struct SectionShow; class PasscodeLockWidget; namespace Theme { struct BackgroundUpdate; class WarningWidget; } // namespace Theme } // namespace Window namespace Ui { class LinkButton; class BoxContent; class LayerStackWidget; } // namespace Ui class MediaPreviewWidget; extern const char kOptionAutoScrollInactiveChat[]; class MainWindow : public Platform::MainWindow { public: explicit MainWindow(not_null controller); ~MainWindow(); void finishFirstShow(); void preventOrInvoke(Fn callback); void setupPasscodeLock(); void clearPasscodeLock(); void setupIntro(Intro::EnterPoint point, QPixmap oldContentCache); void setupMain(MsgId singlePeerShowAtMsgId, QPixmap oldContentCache); void showSettings(); void setInnerFocus() override; MainWidget *sessionContent() const; void checkActivation(); [[nodiscard]] bool markingAsRead() const; bool takeThirdSectionFromLayer(); void sendPaths(); [[nodiscard]] bool contentOverlapped(const QRect &globalRect); [[nodiscard]] bool contentOverlapped(QWidget *w, QPaintEvent *e) { return contentOverlapped( QRect(w->mapToGlobal(e->rect().topLeft()), e->rect().size())); } [[nodiscard]] bool contentOverlapped(QWidget *w, const QRegion &r) { return contentOverlapped(QRect( w->mapToGlobal(r.boundingRect().topLeft()), r.boundingRect().size())); } void showMainMenu(); void fixOrder() override; [[nodiscard]] QPixmap grabForSlideAnimation(); void showLayer( std::unique_ptr &&layer, Ui::LayerOptions options, anim::type animated); void showSpecialLayer( object_ptr layer, anim::type animated); bool showSectionInExistingLayer( not_null memento, const Window::SectionShow ¶ms); void ui_showBox( object_ptr box, Ui::LayerOptions options, anim::type animated); void ui_hideSettingsAndLayer(anim::type animated); void ui_removeLayerBlackout(); [[nodiscard]] bool ui_isLayerShown() const; bool showMediaPreview( Data::FileOrigin origin, not_null document); bool showMediaPreview( Data::FileOrigin origin, not_null photo); void hideMediaPreview(); void updateControlsGeometry() override; protected: bool eventFilter(QObject *o, QEvent *e) override; void closeEvent(QCloseEvent *e) override; void initHook() override; void clearWidgetsHook() override; private: void applyInitialWorkMode(); void ensureLayerCreated(); void destroyLayer(); void showBoxOrLayer( std::variant< v::null_t, object_ptr, std::unique_ptr> &&layer, Ui::LayerOptions options, anim::type animated); void themeUpdated(const Window::Theme::BackgroundUpdate &data); QPoint _lastMousePosition; object_ptr _passcodeLock = { nullptr }; object_ptr _intro = { nullptr }; object_ptr _main = { nullptr }; base::unique_qptr _layer; object_ptr _mediaPreview = { nullptr }; object_ptr _testingThemeWarning = { nullptr }; };