| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246 |
- /*
- 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 "ui/widgets/rp_window.h"
- #include "base/timer.h"
- #include "base/object_ptr.h"
- #include "core/core_settings.h"
- namespace Main {
- class Session;
- class Account;
- } // namespace Main
- namespace Ui {
- class BoxContent;
- class PlainShadow;
- } // namespace Ui
- namespace Core {
- struct WindowPosition;
- enum class QuitReason;
- } // namespace Core
- namespace Window {
- class Controller;
- class SessionController;
- class TitleWidget;
- struct TermsLock;
- struct SeparateId;
- [[nodiscard]] const QImage &Logo();
- [[nodiscard]] const QImage &LogoNoMargin();
- void OverrideApplicationIcon(QImage image);
- [[nodiscard]] QIcon CreateIcon(
- Main::Session *session = nullptr,
- bool returnNullIfDefault = false);
- void ConvertIconToBlack(QImage &image);
- struct CounterLayerArgs {
- template <typename T>
- using required = base::required<T>;
- required<int> size = 16;
- double devicePixelRatio = 1.;
- required<int> count = 1;
- required<style::color> bg;
- required<style::color> fg;
- };
- extern const char kOptionNewWindowsSizeAsFirst[];
- extern const char kOptionDisableTouchbar[];
- [[nodiscard]] QImage GenerateCounterLayer(CounterLayerArgs &&args);
- [[nodiscard]] QImage WithSmallCounter(QImage image, CounterLayerArgs &&args);
- class MainWindow : public Ui::RpWindow {
- public:
- explicit MainWindow(not_null<Controller*> controller);
- virtual ~MainWindow();
- [[nodiscard]] Window::Controller &controller() const {
- return *_controller;
- }
- [[nodiscard]] Window::SeparateId id() const;
- [[nodiscard]] bool isPrimary() const;
- [[nodiscard]] Main::Account &account() const;
- [[nodiscard]] Window::SessionController *sessionController() const;
- bool hideNoQuit();
- void showFromTray();
- void quitFromTray();
- void activate();
- [[nodiscard]] QRect desktopRect() const;
- [[nodiscard]] Core::WindowPosition withScreenInPosition(
- Core::WindowPosition position) const;
- void init();
- void updateIsActive();
- [[nodiscard]] bool isActive() const {
- return !isHidden() && _isActive;
- }
- [[nodiscard]] virtual bool isActiveForTrayMenu() {
- updateIsActive();
- return isActive();
- }
- bool positionInited() const {
- return _positionInited;
- }
- void positionUpdated();
- void showRightColumn(object_ptr<TWidget> widget);
- int maximalExtendBy() const;
- bool canExtendNoMove(int extendBy) const;
- // Returns how much could the window get extended.
- int tryToExtendWidthBy(int addToWidth);
- virtual void fixOrder() {
- }
- virtual void setInnerFocus() {
- setFocus();
- }
- Ui::RpWidget *bodyWidget() {
- return _body.data();
- }
- void launchDrag(std::unique_ptr<QMimeData> data, Fn<void()> &&callback);
- [[nodiscard]] rpl::producer<> leaveEvents() const;
- [[nodiscard]] rpl::producer<> imeCompositionStarts() const;
- virtual void updateWindowIcon() = 0;
- void updateTitle();
- void clearWidgets();
- int computeMinWidth() const;
- int computeMinHeight() const;
- void recountGeometryConstraints();
- virtual void updateControlsGeometry();
- void firstShow();
- bool minimizeToTray();
- void updateGlobalMenu() {
- updateGlobalMenuHook();
- }
- [[nodiscard]] QRect countInitialGeometry(
- Core::WindowPosition position,
- Core::WindowPosition initial,
- QSize minSize) const;
- [[nodiscard]] virtual rpl::producer<QPoint> globalForceClicks() {
- return rpl::never<QPoint>();
- }
- protected:
- void leaveEventHook(QEvent *e) override;
- void savePosition(Qt::WindowState state = Qt::WindowActive);
- void handleStateChanged(Qt::WindowState state);
- void handleActiveChanged(bool active);
- void handleVisibleChanged(bool visible);
- virtual void checkActivation() {
- }
- virtual void initHook() {
- }
- virtual void handleVisibleChangedHook(bool visible) {
- }
- virtual void clearWidgetsHook() {
- }
- virtual void stateChangedHook(Qt::WindowState state) {
- }
- virtual void unreadCounterChangedHook() {
- }
- virtual void closeWithoutDestroy() {
- hide();
- }
- virtual void updateGlobalMenuHook() {
- }
- virtual void workmodeUpdated(Core::Settings::WorkMode mode) {
- }
- virtual void createGlobalMenu() {
- }
- virtual bool initGeometryFromSystem() {
- return false;
- }
- void imeCompositionStartReceived();
- void setPositionInited();
- virtual QRect computeDesktopRect() const;
- private:
- void refreshTitleWidget();
- void updateMinimumSize();
- void updatePalette();
- [[nodiscard]] Core::WindowPosition initialPosition() const;
- [[nodiscard]] Core::WindowPosition nextInitialChildPosition(
- SeparateId childId);
- [[nodiscard]] QRect countInitialGeometry(Core::WindowPosition position);
- bool computeIsActive() const;
- not_null<Window::Controller*> _controller;
- base::Timer _positionUpdatedTimer;
- bool _positionInited = false;
- object_ptr<Ui::PlainShadow> _titleShadow = { nullptr };
- object_ptr<Ui::RpWidget> _outdated;
- object_ptr<Ui::RpWidget> _body;
- object_ptr<TWidget> _rightColumn = { nullptr };
- bool _isActive = false;
- rpl::event_stream<> _leaveEvents;
- rpl::event_stream<> _imeCompositionStartReceived;
- bool _maximizedBeforeHide = false;
- QPoint _lastMyChildCreatePosition;
- int _lastChildIndex = 0;
- mutable QRect _monitorRect;
- mutable crl::time _monitorLastGot = 0;
- };
- [[nodiscard]] int32 DefaultScreenNameChecksum(const QString &name);
- [[nodiscard]] Core::WindowPosition PositionWithScreen(
- Core::WindowPosition position,
- const QScreen *chosen,
- QSize minimal);
- [[nodiscard]] Core::WindowPosition PositionWithScreen(
- Core::WindowPosition position,
- not_null<const QWidget*> widget,
- QSize minimal);
- } // namespace Window
|