Chatterino
BaseWindow.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include "widgets/BaseWidget.hpp"
4 
5 #include <functional>
6 #include <pajlada/signals/signalholder.hpp>
7 #include "common/FlagsEnum.hpp"
8 
9 class QHBoxLayout;
10 struct tagMSG;
11 typedef struct tagMSG MSG;
12 
13 namespace chatterino {
14 
15 class Button;
16 class EffectLabel;
17 class TitleBarButton;
18 enum class TitleBarButtonStyle;
19 
20 class BaseWindow : public BaseWidget
21 {
22  Q_OBJECT
23 
24 public:
25  enum Flags {
26  None = 0,
28  Frameless = 2,
29  TopMost = 4,
32  DontFocus = 32,
33  Dialog = 64,
34  };
35 
37 
38  explicit BaseWindow(FlagsEnum<Flags> flags_ = None,
39  QWidget *parent = nullptr);
40  ~BaseWindow() override;
41 
42  void setInitialBounds(const QRect &bounds);
43  QRect getBounds();
44 
45  QWidget *getLayoutContainer();
46  bool hasCustomWindowFrame();
48  std::function<void()> onClicked);
49  EffectLabel *addTitleBarLabel(std::function<void()> onClicked);
50 
51  void setStayInScreenRect(bool value);
52  bool getStayInScreenRect() const;
53 
56 
57  void moveTo(QWidget *widget, QPoint point, bool offset = true);
58 
59  virtual float scale() const override;
60  float qtFontScale() const;
61 
62  pajlada::Signals::NoArgSignal closing;
63 
64  static bool supportsCustomWindowFrame();
65 
66 protected:
67  virtual bool nativeEvent(const QByteArray &eventType, void *message,
68  long *result) override;
69  virtual void scaleChangedEvent(float) override;
70 
71  virtual void paintEvent(QPaintEvent *) override;
72 
73  virtual void changeEvent(QEvent *) override;
74  virtual void leaveEvent(QEvent *) override;
75  virtual void resizeEvent(QResizeEvent *) override;
76  virtual void moveEvent(QMoveEvent *) override;
77  virtual void closeEvent(QCloseEvent *) override;
78  virtual void showEvent(QShowEvent *) override;
79 
80  virtual void themeChangedEvent() override;
81  virtual bool event(QEvent *event) override;
82  virtual void wheelEvent(QWheelEvent *event) override;
83 
84  void mousePressEvent(QMouseEvent *event) override;
85  void mouseReleaseEvent(QMouseEvent *event) override;
86  void mouseMoveEvent(QMouseEvent *event) override;
88  bool moving{};
89 
90  void updateScale();
91 
92  boost::optional<QColor> overrideBackgroundColor_;
93 
94 private:
95  void init();
96  void moveIntoDesktopRect(QWidget *parent, QPoint point);
97  void calcButtonsSizes();
98  void drawCustomWindowFrame(QPainter &painter);
99  void onFocusLost();
100 
101  bool handleDPICHANGED(MSG *msg);
102  bool handleSHOWWINDOW(MSG *msg);
103  bool handleNCCALCSIZE(MSG *msg, long *result);
104  bool handleSIZE(MSG *msg);
105  bool handleMOVE(MSG *msg);
106  bool handleNCHITTEST(MSG *msg, long *result);
107 
108  bool enableCustomFrame_;
109  ActionOnFocusLoss actionOnFocusLoss_ = Nothing;
110  bool frameless_;
111  bool stayInScreenRect_ = false;
112  bool shown_ = false;
113  FlagsEnum<Flags> flags_;
114  float nativeScale_ = 1;
115  bool isResizeFixing_ = false;
116 
117  struct {
118  QLayout *windowLayout = nullptr;
119  QHBoxLayout *titlebarBox = nullptr;
120  QWidget *titleLabel = nullptr;
124  QWidget *layoutBase = nullptr;
125  std::vector<Button *> buttons;
126  } ui_;
127 
128 #ifdef USEWINSDK
129  QRect initalBounds_;
130  QRect currentBounds_;
131  QRect nextBounds_;
132  QTimer useNextBounds_;
133  bool isNotMinimizedOrMaximized_{};
134 #endif
135 
136  pajlada::Signals::SignalHolder connections_;
137 
138  friend class BaseWidget;
139 };
140 
141 } // namespace chatterino
QLayout * windowLayout
Definition: BaseWindow.hpp:118
Definition: BaseWindow.hpp:36
void setInitialBounds(const QRect &bounds)
Definition: BaseWindow.cpp:103
Definition: BaseWindow.hpp:36
virtual void leaveEvent(QEvent *) override
Definition: BaseWindow.cpp:520
Definition: BaseWindow.hpp:33
Definition: BaseWindow.hpp:32
QRect getBounds()
Definition: BaseWindow.cpp:112
EffectLabel * addTitleBarLabel(std::function< void()> onClicked)
Definition: BaseWindow.cpp:473
TitleBarButton * exitButton
Definition: BaseWindow.hpp:123
Definition: EffectLabel.hpp:15
static bool supportsCustomWindowFrame()
Definition: BaseWindow.cpp:290
std::vector< Button * > buttons
Definition: BaseWindow.hpp:125
ActionOnFocusLoss getActionOnFocusLoss() const
Definition: BaseWindow.cpp:268
void mouseReleaseEvent(QMouseEvent *event) override
Definition: BaseWindow.cpp:425
Definition: BaseWindow.hpp:20
Definition: Application.cpp:48
virtual void resizeEvent(QResizeEvent *) override
Definition: BaseWindow.cpp:536
BaseWindow(FlagsEnum< Flags > flags_=None, QWidget *parent=nullptr)
Definition: BaseWindow.cpp:46
virtual void closeEvent(QCloseEvent *) override
Definition: BaseWindow.cpp:578
bool getStayInScreenRect() const
Definition: BaseWindow.cpp:258
void mouseMoveEvent(QMouseEvent *event) override
Definition: BaseWindow.cpp:440
struct tagMSG MSG
Definition: BaseWindow.hpp:11
virtual void scaleChangedEvent(float) override
Definition: BaseWindow.cpp:682
virtual float scale() const override
Definition: BaseWindow.cpp:121
Definition: BaseWindow.hpp:36
ActionOnFocusLoss
Definition: BaseWindow.hpp:36
void mousePressEvent(QMouseEvent *event) override
Definition: BaseWindow.cpp:390
QPointF movingRelativePos
Definition: BaseWindow.hpp:87
virtual void themeChangedEvent() override
Definition: BaseWindow.cpp:301
bool hasCustomWindowFrame()
Definition: BaseWindow.cpp:285
pajlada::Signals::NoArgSignal closing
Definition: BaseWindow.hpp:62
QHBoxLayout * titlebarBox
Definition: BaseWindow.hpp:119
virtual void changeEvent(QEvent *) override
Definition: BaseWindow.cpp:488
Definition: BaseWindow.hpp:31
Definition: BaseWindow.hpp:28
bool moving
Definition: BaseWindow.hpp:88
virtual void showEvent(QShowEvent *) override
Definition: BaseWindow.cpp:583
virtual void wheelEvent(QWheelEvent *event) override
Definition: BaseWindow.cpp:344
float qtFontScale() const
Definition: BaseWindow.cpp:126
void moveTo(QWidget *widget, QPoint point, bool offset=true)
Definition: BaseWindow.cpp:525
QWidget * layoutBase
Definition: BaseWindow.hpp:124
void updateScale()
Definition: BaseWindow.cpp:704
QWidget * titleLabel
Definition: BaseWindow.hpp:120
QWidget * getLayoutContainer()
Definition: BaseWindow.cpp:273
TitleBarButton * addTitleBarButton(const TitleBarButtonStyle &style, std::function< void()> onClicked)
Definition: BaseWindow.cpp:456
virtual void moveEvent(QMoveEvent *) override
Definition: BaseWindow.cpp:568
Definition: TitlebarButton.hpp:17
TitleBarButton * minButton
Definition: BaseWindow.hpp:121
Definition: BaseWindow.hpp:26
TitleBarButton * maxButton
Definition: BaseWindow.hpp:122
Definition: BaseWindow.hpp:36
void setActionOnFocusLoss(ActionOnFocusLoss value)
Definition: BaseWindow.cpp:263
void setStayInScreenRect(bool value)
Definition: BaseWindow.cpp:251
Flags
Definition: BaseWindow.hpp:25
Definition: BaseWidget.hpp:14
Definition: BaseWindow.hpp:27
virtual bool nativeEvent(const QByteArray &eventType, void *message, long *result) override
Definition: BaseWindow.cpp:635
TitleBarButtonStyle
Definition: TitlebarButton.hpp:7
virtual void paintEvent(QPaintEvent *) override
Definition: BaseWindow.cpp:691
boost::optional< QColor > overrideBackgroundColor_
Definition: BaseWindow.hpp:92
Definition: BaseWindow.hpp:29
~BaseWindow() override
Definition: BaseWindow.cpp:98
virtual bool event(QEvent *event) override
Definition: BaseWindow.cpp:333