Chatterino
SplitInput.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include "util/QObjectRef.hpp"
4 #include "widgets/BaseWidget.hpp"
6 
7 #include <QHBoxLayout>
8 #include <QLabel>
9 #include <QLineEdit>
10 #include <QPaintEvent>
11 #include <QTextEdit>
12 #include <QVBoxLayout>
13 #include <QWidget>
14 #include <memory>
15 
16 namespace chatterino {
17 
18 class Split;
19 class EmotePopup;
20 class InputCompletionPopup;
21 class EffectLabel;
22 class MessageThread;
23 class ResizingTextEdit;
24 
25 // MessageOverflow is used for controlling how to guide the user into not
26 // sending a message that will be discarded by Twitch
28  // Allow overflowing characters to be inserted into the input box, but highlight them in red
30 
31  // Prevent more characters from being inserted into the input box
33 
34  // Do nothing
36 };
37 
38 class SplitInput : public BaseWidget
39 {
40  Q_OBJECT
41 
42 public:
43  SplitInput(Split *_chatWidget, bool enableInlineReplying = true);
44  SplitInput(QWidget *parent, Split *_chatWidget,
45  bool enableInlineReplying = true);
46 
47  void clearSelection();
48  bool isEditFirstWord() const;
49  QString getInputText() const;
50  void insertText(const QString &text);
51 
52  static const int TWITCH_MESSAGE_LIMIT = 500;
53 
54  void setReply(std::shared_ptr<MessageThread> reply,
55  bool showInlineReplying = true);
56  void setPlaceholderText(const QString &text);
57 
63  void hide();
64 
70  void show();
71 
79  bool isHidden() const;
80 
81  pajlada::Signals::Signal<const QString &> textChanged;
82 
83 protected:
84  void scaleChangedEvent(float scale_) override;
85  void themeChangedEvent() override;
86 
87  void paintEvent(QPaintEvent * /*event*/) override;
88  void resizeEvent(QResizeEvent * /*event*/) override;
89 
90  virtual void giveFocus(Qt::FocusReason reason);
91 
92  QString handleSendMessage(std::vector<QString> &arguments);
93  void postMessageSend(const QString &message,
94  const std::vector<QString> &arguments);
95 
97  void clearInput();
98 
99 protected:
100  void addShortcuts() override;
101  void initLayout();
102  bool eventFilter(QObject *obj, QEvent *event) override;
103  void installKeyPressedEvent();
105  void onTextChanged();
106  void updateEmoteButton();
107  void updateCompletionPopup();
108  void showCompletionPopup(const QString &text, bool emoteCompletion);
109  void hideCompletionPopup();
110  void insertCompletionText(const QString &text);
111  void openEmotePopup();
112 
114 
115  // scaledMaxHeight returns the height in pixels that this widget can grow to
116  // This does not take hidden into account, so callers must take hidden into account themselves
117  int scaledMaxHeight() const;
118 
119  // Returns true if the channel this input is connected to is a Twitch channel,
120  // the user's setting is set to Prevent, and the given text goes beyond the Twitch message length limit
121  bool shouldPreventInput(const QString &text) const;
122 
123  Split *const split_;
126 
127  struct {
129  QLabel *textEditLength;
131 
132  QHBoxLayout *hbox;
133  QVBoxLayout *vbox;
134 
135  QWidget *replyWrapper;
136  QHBoxLayout *replyHbox;
137  QLabel *replyLabel;
139  } ui_;
140 
141  std::shared_ptr<MessageThread> replyThread_ = nullptr;
143 
144  pajlada::Signals::SignalHolder managedConnections_;
145  QStringList prevMsg_;
146  QString currMsg_;
147  int prevIndex_ = 0;
148 
150 
151  // Hidden denotes whether this split input should be hidden or not
152  // This is used instead of the regular QWidget::hide/show because
153  // focus events don't work as expected, so instead we use this bool and
154  // set the height of the split input to 0 if we're supposed to be hidden instead
155  bool hidden{false};
156 
157 private slots:
158  void editTextChanged();
159 
160  friend class Split;
161  friend class ReplyThreadPopup;
162 };
163 
164 } // namespace chatterino
virtual void giveFocus(Qt::FocusReason reason)
Definition: SplitInput.cpp:997
static const int TWITCH_MESSAGE_LIMIT
Definition: SplitInput.hpp:52
bool hidden
Definition: SplitInput.hpp:155
int scaledMaxHeight() const
Definition: SplitInput.cpp:366
void showCompletionPopup(const QString &text, bool emoteCompletion)
Definition: SplitInput.cpp:716
void onCursorPositionChanged()
Definition: SplitInput.cpp:656
int prevIndex_
Definition: SplitInput.hpp:147
void initLayout()
Definition: SplitInput.cpp:71
EffectLabel * cancelReplyButton
Definition: SplitInput.hpp:138
bool shouldPreventInput(const QString &text) const
Definition: SplitInput.cpp:1043
struct chatterino::SplitInput::@50 ui_
void installKeyPressedEvent()
Definition: SplitInput.cpp:620
Definition: SplitInput.hpp:38
void updateCancelReplyButton()
Definition: SplitInput.cpp:242
Definition: EffectLabel.hpp:15
QVBoxLayout * vbox
Definition: SplitInput.hpp:133
bool isHidden() const
Returns the hidden or shown state of the SplitInput.
Definition: SplitInput.cpp:838
QHBoxLayout * replyHbox
Definition: SplitInput.hpp:136
Definition: Application.cpp:48
void paintEvent(QPaintEvent *) override
Definition: SplitInput.cpp:947
void hide()
Hide the widget.
Definition: SplitInput.cpp:814
void updateEmoteButton()
Definition: SplitInput.cpp:226
void setPlaceholderText(const QString &text)
Definition: SplitInput.cpp:1027
Definition: SplitInput.hpp:29
void openEmotePopup()
Definition: SplitInput.cpp:260
Split *const split_
Definition: SplitInput.hpp:123
MessageOverflow
Definition: SplitInput.hpp:27
bool enableInlineReplying_
Definition: SplitInput.hpp:142
void show()
Show the widget.
Definition: SplitInput.cpp:826
void setReply(std::shared_ptr< MessageThread > reply, bool showInlineReplying=true)
Definition: SplitInput.cpp:1002
Definition: ResizingTextEdit.hpp:10
void updateCompletionPopup()
Definition: SplitInput.cpp:661
void insertCompletionText(const QString &text)
Definition: SplitInput.cpp:752
Definition: Split.hpp:36
std::shared_ptr< MessageThread > replyThread_
Definition: SplitInput.hpp:141
void addShortcuts() override
Definition: SplitInput.cpp:371
void resizeEvent(QResizeEvent *) override
Definition: SplitInput.cpp:985
void onTextChanged()
Definition: SplitInput.cpp:651
QObjectRef< InputCompletionPopup > inputCompletionPopup_
Definition: SplitInput.hpp:125
Definition: ReplyThreadPopup.hpp:16
QString getInputText() const
Definition: SplitInput.cpp:804
void scaleChangedEvent(float scale_) override
Definition: SplitInput.cpp:172
Definition: QObjectRef.hpp:11
QHBoxLayout * hbox
Definition: SplitInput.hpp:132
QLabel * replyLabel
Definition: SplitInput.hpp:137
QString currMsg_
Definition: SplitInput.hpp:146
QObjectRef< EmotePopup > emotePopup_
Definition: SplitInput.hpp:124
int lastOverflowLength
Definition: SplitInput.hpp:149
QString handleSendMessage(std::vector< QString > &arguments)
Definition: SplitInput.cpp:293
void hideCompletionPopup()
Definition: SplitInput.cpp:746
pajlada::Signals::SignalHolder managedConnections_
Definition: SplitInput.hpp:144
void postMessageSend(const QString &message, const std::vector< QString > &arguments)
Definition: SplitInput.cpp:349
EffectLabel * emoteButton
Definition: SplitInput.hpp:130
void insertText(const QString &text)
Definition: SplitInput.cpp:809
Definition: SplitInput.hpp:32
bool eventFilter(QObject *obj, QEvent *event) override
Definition: SplitInput.cpp:599
SplitInput(Split *_chatWidget, bool enableInlineReplying=true)
Definition: SplitInput.cpp:33
bool isEditFirstWord() const
Definition: SplitInput.cpp:799
QStringList prevMsg_
Definition: SplitInput.hpp:145
void clearSelection()
Definition: SplitInput.cpp:789
pajlada::Signals::Signal< const QString & > textChanged
Definition: SplitInput.hpp:81
void clearInput()
Clears the input box, clears reply thread if inline replies are enabled.
Definition: SplitInput.cpp:1032
Definition: BaseWidget.hpp:14
QLabel * textEditLength
Definition: SplitInput.hpp:129
ResizingTextEdit * textEdit
Definition: SplitInput.hpp:128
Definition: SplitInput.hpp:35
QWidget * replyWrapper
Definition: SplitInput.hpp:135
void themeChangedEvent() override
Definition: SplitInput.cpp:192