6 #include <QVariantAnimation> 9 #include <pajlada/signals/signal.hpp> 10 #include <unordered_map> 11 #include <unordered_set> 28 using MessagePtr = std::shared_ptr<const Message>;
42 class MessageLayoutElement;
75 size_t messagesLimit = 1000);
79 QString getSelectedText();
81 void clearSelection();
82 void setEnableScrollingToBottom(
bool);
83 bool getEnableScrollingToBottom()
const;
84 void setOverrideFlags(boost::optional<MessageElementFlags> value);
85 const boost::optional<MessageElementFlags> &getOverrideFlags()
const;
86 void updateLastReadMessage();
92 bool scrollToMessage(
const MessagePtr &message);
97 bool scrollToMessageId(
const QString &
id);
100 bool pausable()
const;
101 void setPausable(
bool value);
103 void pause(
PauseReason reason, boost::optional<uint> msecs = boost::none);
111 void setFilters(
const QList<QUuid> &ids);
112 const QList<QUuid> getFilterIds()
const;
116 void setSourceChannel(
ChannelPtr sourceChannel);
117 bool hasSourceChannel()
const;
122 void clearMessages();
132 void showUserInfoPopup(
const QString &userName,
133 QString alternativePopoutChannel = QString());
140 bool mayContainMessage(
const MessagePtr &message);
147 pajlada::Signals::Signal<QString, FromTwitchLinkOpenChannelIn>
151 void themeChangedEvent()
override;
152 void scaleChangedEvent(
float scale)
override;
154 void resizeEvent(QResizeEvent *)
override;
156 void paintEvent(QPaintEvent *)
override;
157 void wheelEvent(QWheelEvent *event)
override;
159 void enterEvent(QEvent *)
override;
160 void leaveEvent(QEvent *)
override;
162 void mouseMoveEvent(QMouseEvent *event)
override;
163 void mousePressEvent(QMouseEvent *event)
override;
164 void mouseReleaseEvent(QMouseEvent *event)
override;
165 void mouseDoubleClickEvent(QMouseEvent *event)
override;
167 void hideEvent(QHideEvent *)
override;
169 void handleLinkClick(QMouseEvent *event,
const Link &link,
172 bool tryGetMessageAt(QPoint p, std::shared_ptr<MessageLayout> &message,
173 QPoint &relativePos,
int &index);
176 void initializeLayout();
177 void initializeScrollbar();
178 void initializeSignals();
181 boost::optional<MessageFlags> overridingFlags);
182 void messageAddedAtStart(std::vector<MessagePtr> &messages);
183 void messageRemoveFromStart(
MessagePtr &message);
184 void messageReplaced(
size_t index,
MessagePtr &replacement);
185 void messagesUpdated();
187 void performLayout(
bool causedByScrollbar =
false);
188 void layoutVisibleMessages(
191 bool causedByScrollbar);
193 void drawMessages(QPainter &painter);
195 void selectWholeMessage(
MessageLayout *layout,
int &messageIndex);
198 const QPoint &relativePos,
int &wordStart,
int &wordEnd);
200 void handleMouseClick(QMouseEvent *event,
214 void addTwitchLinkContextMenuItems(
216 QMouseEvent *event, QMenu &menu);
220 void addCommandExecutionContextMenuItems(
222 QMouseEvent *event, QMenu &menu);
224 int getLayoutWidth()
const;
228 void enableScrolling(
const QPointF &scrollStart);
229 void disableScrolling();
237 void scrollToMessageLayout(
MessageLayout *layout,
size_t messageIdx);
239 void setInputReply(
const MessagePtr &message);
240 void showReplyThreadPopup(
const MessagePtr &message);
241 bool canReplyToMessages()
const;
243 QTimer *layoutCooldown_;
247 bool updateQueued_ =
false;
248 bool messageWasAdded_ =
false;
249 bool lastMessageHasAlternateBackground_ =
false;
250 bool lastMessageHasAlternateBackgroundReverse_ =
true;
252 bool pausable_ =
false;
254 std::unordered_map<PauseReason, boost::optional<SteadyClock::time_point>>
256 boost::optional<SteadyClock::time_point> pauseEnd_;
257 int pauseScrollOffset_ = 0;
259 uint32_t pauseSelectionOffset_ = 0;
261 boost::optional<MessageElementFlags> overrideFlags_;
269 Split *split_ =
nullptr;
273 bool showScrollBar_ =
false;
278 bool shouldIncludeMessage(
const MessagePtr &m)
const;
281 bool showScrollbarHighlights()
const;
285 bool showingLatestMessages_ =
true;
286 bool enableScrollingToBottom_ =
true;
288 bool onlyUpdateEmotes_ =
false;
291 bool isLeftMouseDown_ =
false;
292 bool isRightMouseDown_ =
false;
293 bool isDoubleClick_ =
false;
295 QPointF lastLeftPressPosition_;
296 QPointF lastRightPressPosition_;
297 QPointF lastDClickPosition_;
300 bool isScrolling_ =
false;
301 QPointF lastMiddlePressPosition_;
302 QPointF currentMousePosition_;
307 QVariantAnimation highlightAnimation_;
308 void setupHighlightAnimationColors();
317 bool selecting_ =
false;
323 pajlada::Signals::SignalHolder signalHolder_;
326 pajlada::Signals::SignalHolder channelConnections_;
328 std::unordered_set<std::shared_ptr<MessageLayout>> messagesOnScreen_;
330 static constexpr
int leftPadding = 8;
331 static constexpr
int scrollbarPadding = 8;
334 void wordFlagsChanged()
340 void scrollUpdateRequested();
Definition: Selection.hpp:9
int64_t FlagsEnum< MessageElementFlag > MessageElementFlags
Definition: MessageLayout.hpp:21
Definition: MessageLayoutElement.hpp:26
pajlada::Signals::NoArgSignal liveStatusChanged
Definition: ChannelView.hpp:145
Definition: MessageLayout.hpp:33
Definition: EffectLabel.hpp:15
Definition: Selection.hpp:44
Definition: Application.cpp:48
MessageElementFlag
Definition: MessageElement.hpp:29
HighlightState
Definition: Common.hpp:16
std::chrono::steady_clock SteadyClock
Definition: ChannelView.hpp:59
pajlada::Signals::Signal< const Link & > linkClicked
Definition: ChannelView.hpp:146
Definition: Selection.hpp:116
MessageFlag
Definition: Message.hpp:18
pajlada::Signals::NoArgSignal selectionChanged
Definition: ChannelView.hpp:143
int64_t FlagsEnum< MessageFlag > MessageFlags
Definition: Channel.hpp:20
PauseReason
Definition: ChannelView.hpp:45
QCursor down
Definition: ChannelView.hpp:313
pajlada::Signals::Signal< QMouseEvent * > mouseDown
Definition: ChannelView.hpp:142
Definition: ChannelView.hpp:61
FromTwitchLinkOpenChannelIn
Definition: ChannelView.hpp:52
std::shared_ptr< const Message > MessagePtr
Definition: Channel.hpp:18
QCursor neutral
Definition: ChannelView.hpp:311
pajlada::Signals::Signal< HighlightState > tabHighlightRequested
Definition: ChannelView.hpp:144
std::shared_ptr< Channel > ChannelPtr
Definition: Channel.hpp:125
std::shared_ptr< MessageLayout > MessageLayoutPtr
Definition: MessageLayout.hpp:94
std::shared_ptr< FilterSet > FilterSetPtr
Definition: FilterSet.hpp:86
Context
Definition: ChannelView.hpp:66
pajlada::Signals::Signal< QString, FromTwitchLinkOpenChannelIn > openChannelIn
Definition: ChannelView.hpp:148
QCursor up
Definition: ChannelView.hpp:312