Chatterino
Split.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include "common/Aliases.hpp"
4 #include "common/Channel.hpp"
5 #include "common/NullablePtr.hpp"
6 #include "pajlada/signals/signalholder.hpp"
7 #include "widgets/BaseWidget.hpp"
8 
9 #include <QFont>
10 #include <QShortcut>
11 #include <QVBoxLayout>
12 #include <QWidget>
13 #include <boost/signals2.hpp>
14 
15 namespace chatterino {
16 
17 class ChannelView;
18 class MessageThread;
19 class SplitHeader;
20 class SplitInput;
21 class SplitContainer;
22 class SplitOverlay;
23 class SelectChannelDialog;
24 
25 // Each ChatWidget consists of three sub-elements that handle their own part of
26 // the chat widget: ChatWidgetHeader
27 // - Responsible for rendering which channel the ChatWidget is in, and the
28 // menu in the top-left of
29 // the chat widget
30 // ChatWidgetView
31 // - Responsible for rendering all chat messages, and the scrollbar
32 // ChatWidgetInput
33 // - Responsible for rendering and handling user text input
34 //
35 // Each sub-element has a reference to the parent Chat Widget
36 class Split : public BaseWidget
37 {
38  friend class SplitInput;
39 
40  Q_OBJECT
41 
42 public:
43  explicit Split(QWidget *parent);
44 
45  ~Split() override;
46 
47  pajlada::Signals::NoArgSignal channelChanged;
48  pajlada::Signals::NoArgSignal focused;
49  pajlada::Signals::NoArgSignal focusLost;
50 
53 
55  ChannelPtr getChannel() const;
56  void setChannel(IndirectChannel newChannel);
57 
58  void setFilters(const QList<QUuid> ids);
59  const QList<QUuid> getFilters() const;
60 
61  void setModerationMode(bool value);
62  bool getModerationMode() const;
63 
64  void insertTextToInput(const QString &text);
65 
66  void showChangeChannelPopup(const char *dialogTitle, bool empty,
67  std::function<void(bool)> callback);
68  void updateGifEmotes();
69  void updateLastReadMessage();
70  void setIsTopRightSplit(bool value);
71 
72  void drag();
73 
74  bool isInContainer() const;
75 
76  void setContainer(SplitContainer *container);
77 
78  void setInputReply(const std::shared_ptr<MessageThread> &reply);
79 
80  static pajlada::Signals::Signal<Qt::KeyboardModifiers>
82  static Qt::KeyboardModifiers modifierStatus;
83 
84  enum class Action {
85  RefreshTab,
88  Delete,
89 
94  };
95 
96  pajlada::Signals::Signal<Action> actionRequested;
97  pajlada::Signals::Signal<ChannelPtr> openSplitRequested;
98 
99  // args: (SplitContainer::Direction dir, Split* parent)
100  pajlada::Signals::Signal<int, Split *> insertSplitRequested;
101 
102 protected:
103  void paintEvent(QPaintEvent *event) override;
104  void mouseMoveEvent(QMouseEvent *event) override;
105  void keyPressEvent(QKeyEvent *event) override;
106  void keyReleaseEvent(QKeyEvent *event) override;
107  void resizeEvent(QResizeEvent *event) override;
108  void enterEvent(QEvent *event) override;
109  void leaveEvent(QEvent *event) override;
110 
111  void dragEnterEvent(QDragEnterEvent *event) override;
112  void dropEvent(QDropEvent *event) override;
113 
114 private:
115  void channelNameUpdated(const QString &newChannelName);
116  void handleModifiers(Qt::KeyboardModifiers modifiers);
117  void updateInputPlaceholder();
118  void addShortcuts() override;
119 
123  void openChannelInBrowserPlayer(ChannelPtr channel);
127  void openChannelInStreamlink(QString channelName);
131  void joinChannelInNewTab(ChannelPtr channel);
132 
133  IndirectChannel channel_;
134 
135  bool moderationMode_{};
136  bool isTopRightSplit_{};
137 
138  bool isMouseOver_{};
139  bool isDragging_{};
140 
141  QVBoxLayout *const vbox_;
142  SplitHeader *const header_;
143  ChannelView *const view_;
144  SplitInput *const input_;
145  SplitOverlay *const overlay_;
146 
147  NullablePtr<SelectChannelDialog> selectChannelDialog_;
148 
149  pajlada::Signals::Connection channelIDChangedConnection_;
150  pajlada::Signals::Connection usermodeChangedConnection_;
151  pajlada::Signals::Connection roomModeChangedConnection_;
152 
153  pajlada::Signals::Connection indirectChannelChangedConnection_;
154  pajlada::Signals::SignalHolder signalHolder_;
155  std::vector<boost::signals2::scoped_connection> bSignals_;
156 
157 public slots:
158  void addSibling();
159  void deleteFromContainer();
160  void changeChannel();
161  void explainMoving();
162  void explainSplitting();
163  void popup();
164  void clear();
165  void openInBrowser();
166  void openModViewInBrowser();
167  void openWhispersInBrowser();
168  void openBrowserPlayer();
169  void openInStreamlink();
170  void openWithCustomScheme();
171  void copyToClipboard();
172  void startWatching();
173  void setFiltersDialog();
174  void showSearch(bool singleChannel);
175  void showViewerList();
176  void openSubPage();
178  void reconnect();
179 };
180 
181 } // namespace chatterino
182 
183 QDebug operator<<(QDebug dbg, const chatterino::Split &split);
184 QDebug operator<<(QDebug dbg, const chatterino::Split *split);
ChannelPtr getChannel() const
Definition: Split.cpp:652
void setFilters(const QList< QUuid > ids)
Definition: Split.cpp:1156
void popup()
Definition: Split.cpp:880
pajlada::Signals::Signal< Action > actionRequested
Definition: Split.hpp:96
void resizeEvent(QResizeEvent *event) override
Definition: Split.cpp:794
Split(QWidget *parent)
Definition: Split.cpp:84
void mouseMoveEvent(QMouseEvent *event) override
Definition: Split.cpp:777
void setContainer(SplitContainer *container)
void copyToClipboard()
Definition: Split.cpp:1124
void openInStreamlink()
Definition: Split.cpp:935
void openSubPage()
Definition: Split.cpp:1114
void setModerationMode(bool value)
Definition: Split.cpp:712
ChannelView & getChannelView()
Definition: Split.cpp:580
Definition: SplitInput.hpp:38
void openInBrowser()
Definition: Split.cpp:901
pajlada::Signals::NoArgSignal focused
Definition: Split.hpp:48
Definition: SplitContainer.hpp:33
void paintEvent(QPaintEvent *event) override
Definition: Split.cpp:769
void changeChannel()
Definition: Split.cpp:856
void showSearch(bool singleChannel)
Definition: Split.cpp:1167
void openWhispersInBrowser()
Definition: Split.cpp:912
Definition: SplitHeader.hpp:23
Definition: Application.cpp:48
bool isInContainer() const
void dragEnterEvent(QDragEnterEvent *event) override
Definition: Split.cpp:1211
~Split() override
Definition: Split.cpp:572
void showChangeChannelPopup(const char *dialogTitle, bool empty, std::function< void(bool)> callback)
Definition: Split.cpp:729
void keyPressEvent(QKeyEvent *event) override
Definition: Split.cpp:782
void setInputReply(const std::shared_ptr< MessageThread > &reply)
Definition: Split.cpp:1275
SplitInput & getInput()
Definition: Split.cpp:585
void insertTextToInput(const QString &text)
Definition: Split.cpp:724
Definition: Split.hpp:36
void setFiltersDialog()
Definition: Split.cpp:1145
void deleteFromContainer()
Definition: Split.cpp:851
void openBrowserPlayer()
Definition: Split.cpp:919
const QList< QUuid > getFilters() const
Definition: Split.cpp:1162
pajlada::Signals::Signal< int, Split * > insertSplitRequested
Definition: Split.hpp:100
pajlada::Signals::Signal< ChannelPtr > openSplitRequested
Definition: Split.hpp:97
void drag()
Definition: Split.cpp:1252
static pajlada::Signals::Signal< Qt::KeyboardModifiers > modifierStatusChanged
Definition: Split.hpp:81
Definition: NullablePtr.hpp:8
static Qt::KeyboardModifiers modifierStatus
Definition: Split.hpp:82
void setChannel(IndirectChannel newChannel)
Definition: Split.cpp:657
void openWithCustomScheme()
Definition: Split.cpp:940
void leaveEvent(QEvent *event) override
Definition: Split.cpp:819
bool getModerationMode() const
Definition: Split.cpp:719
void startWatching()
Definition: Split.cpp:1129
IndirectChannel getIndirectChannel()
Definition: Split.cpp:647
void explainMoving()
Definition: Split.cpp:868
QDebug & operator<<(QDebug &dbg, const SeventvEventAPISubscription &subscription)
Definition: SeventvEventAPISubscription.cpp:70
void showViewerList()
Definition: Split.cpp:958
void addSibling()
Slots.
Definition: Split.cpp:846
void explainSplitting()
Definition: Split.cpp:874
Definition: SplitOverlay.hpp:13
Definition: ChannelView.hpp:61
void dropEvent(QDropEvent *event) override
Definition: Split.cpp:1224
pajlada::Signals::NoArgSignal channelChanged
Definition: Split.hpp:47
void clear()
Definition: Split.cpp:896
void updateGifEmotes()
Definition: Split.cpp:759
Action
Definition: Split.hpp:84
Definition: Channel.hpp:127
std::shared_ptr< Channel > ChannelPtr
Definition: Channel.hpp:125
void openModViewInBrowser()
Definition: Split.cpp:924
pajlada::Signals::NoArgSignal focusLost
Definition: Split.hpp:49
Definition: BaseWidget.hpp:14
void setIsTopRightSplit(bool value)
Definition: Split.cpp:839
void keyReleaseEvent(QKeyEvent *event) override
Definition: Split.cpp:788
void enterEvent(QEvent *event) override
Definition: Split.cpp:804
void reconnect()
Definition: Split.cpp:1206
void updateLastReadMessage()
Definition: Split.cpp:764
void reloadChannelAndSubscriberEmotes()
Definition: Split.cpp:1193