Chatterino
WindowManager.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include <memory>
4 #include "common/Channel.hpp"
5 #include "common/FlagsEnum.hpp"
6 #include "common/Singleton.hpp"
8 
9 #include "pajlada/settings/settinglistener.hpp"
11 
12 namespace chatterino {
13 
14 class Settings;
15 class Paths;
16 class Window;
17 class SplitContainer;
18 class ChannelView;
19 
20 enum class MessageElementFlag : int64_t;
21 using MessageElementFlags = FlagsEnum<MessageElementFlag>;
22 enum class WindowType;
23 
24 enum class SettingsDialogPreference;
25 class FramelessEmbedWindow;
26 
27 class WindowManager final : public Singleton
28 {
29 public:
30  static const QString WINDOW_LAYOUT_FILENAME;
31 
32  WindowManager();
33  ~WindowManager() override;
34 
35  static void encodeTab(SplitContainer *tab, bool isSelected,
36  QJsonObject &obj);
37  static void encodeChannel(IndirectChannel channel, QJsonObject &obj);
38  static void encodeFilters(Split *split, QJsonArray &arr);
39  static IndirectChannel decodeChannel(const SplitDescriptor &descriptor);
40 
41  void showSettingsDialog(
42  QWidget *parent,
44 
45  // Show the account selector widget at point
46  void showAccountSelectPopup(QPoint point);
47 
48  // Tell a channel (or all channels if channel is nullptr) to redo their
49  // layout
50  void layoutChannelViews(Channel *channel = nullptr);
51 
52  // Force all channel views to redo their layout
53  // This is called, for example, when the emote scale or timestamp format has
54  // changed
55  void forceLayoutChannelViews();
56  void repaintVisibleChatWidgets(Channel *channel = nullptr);
57  void repaintGifEmotes();
58 
59  Window &getMainWindow();
60  Window &getSelectedWindow();
61  Window &createWindow(WindowType type, bool show = true,
62  QWidget *parent = nullptr);
63 
64  // Use this method if you want to open a "new" channel in a popup. If you want to popup an
65  // existing Split or SplitContainer, consider using Split::popup() or SplitContainer::popup().
66  Window &openInPopup(ChannelPtr channel);
67 
68  void select(Split *split);
69  void select(SplitContainer *container);
76  void scrollToMessage(const MessagePtr &message);
77 
78  QPoint emotePopupPos();
79  void setEmotePopupPos(QPoint pos);
80 
81  virtual void initialize(Settings &settings, Paths &paths) override;
82  virtual void save() override;
83  void closeAll();
84 
85  int getGeneration() const;
86  void incGeneration();
87 
88  MessageElementFlags getWordFlags();
89  void updateWordTypeMask();
90 
91  // Sends an alert to the main window
92  // It reads the `longAlert` setting to decide whether the alert will expire
93  // or not
94  void sendAlert();
95 
96  // Queue up a save in the next 10 seconds
97  // If a save was already queued up, we reset the to happen in 10 seconds
98  // again
99  void queueSave();
100 
102  pajlada::Signals::NoArgSignal gifRepaintRequested;
103 
104  // This signal fires whenever views rendering a channel, or all views if the
105  // channel is a nullptr, need to redo their layout
106  pajlada::Signals::Signal<Channel *> layoutRequested;
107 
108  pajlada::Signals::NoArgSignal wordFlagsChanged;
109 
110  // This signal fires every 100ms and can be used to trigger random things that require a recheck.
111  // It is currently being used by the "Tooltip Preview Image" system to recheck if an image is ready to be rendered.
112  pajlada::Signals::NoArgSignal miscUpdate;
113 
114  pajlada::Signals::Signal<Split *> selectSplit;
115  pajlada::Signals::Signal<SplitContainer *> selectSplitContainer;
116  pajlada::Signals::Signal<const MessagePtr &> scrollToMessageSignal;
117 
118 private:
119  static void encodeNodeRecursively(SplitContainer::Node *node,
120  QJsonObject &obj);
121 
122  // Load window layout from the window-layout.json file
123  WindowLayout loadWindowLayoutFromFile() const;
124 
125  // Apply a window layout for this window manager.
126  void applyWindowLayout(const WindowLayout &layout);
127 
128  // Contains the full path to the window layout file, e.g. /home/pajlada/.local/share/Chatterino/Settings/window-layout.json
129  const QString windowLayoutFilePath;
130 
131  bool initialized_ = false;
132 
133  QPoint emotePopupPos_;
134 
135  std::atomic<int> generation_{0};
136 
137  std::vector<Window *> windows_;
138 
139  std::unique_ptr<FramelessEmbedWindow> framelessEmbedWindow_;
140  Window *mainWindow_{};
141  Window *selectedWindow_{};
142 
143  MessageElementFlags wordFlags_{};
144  pajlada::SettingListener wordFlagsListener_;
145 
146  QTimer *saveTimer;
147  QTimer miscUpdateTimer_;
148 };
149 
150 } // namespace chatterino
pajlada::Signals::NoArgSignal wordFlagsChanged
Definition: WindowManager.hpp:108
int64_t FlagsEnum< MessageElementFlag > MessageElementFlags
Definition: MessageLayout.hpp:21
pajlada::Signals::Signal< Split * > selectSplit
Definition: WindowManager.hpp:114
Definition: Singleton.hpp:10
WindowType
Definition: Window.hpp:17
Definition: SplitContainer.hpp:33
Definition: Application.cpp:48
static const QString WINDOW_LAYOUT_FILENAME
Definition: WindowManager.hpp:30
Definition: WindowManager.hpp:27
Definition: SplitContainer.hpp:85
Definition: Split.hpp:36
MessageElementFlag
Definition: MessageElement.hpp:29
Definition: Window.hpp:19
Definition: Channel.hpp:30
pajlada::Signals::NoArgSignal miscUpdate
Definition: WindowManager.hpp:112
Settings which are availlable for reading and writing on the gui thread.
Definition: Settings.hpp:78
Definition: WindowDescriptors.hpp:31
pajlada::Signals::Signal< const MessagePtr & > scrollToMessageSignal
Definition: WindowManager.hpp:116
Definition: Paths.hpp:8
pajlada::Signals::NoArgSignal gifRepaintRequested
Signals.
Definition: WindowManager.hpp:102
SettingsDialogPreference
Definition: SettingsDialog.hpp:28
std::shared_ptr< const Message > MessagePtr
Definition: Channel.hpp:18
Definition: WindowDescriptors.hpp:94
Definition: Channel.hpp:127
std::shared_ptr< Channel > ChannelPtr
Definition: Channel.hpp:125
pajlada::Signals::Signal< Channel * > layoutRequested
Definition: WindowManager.hpp:106
pajlada::Signals::Signal< SplitContainer * > selectSplitContainer
Definition: WindowManager.hpp:115