1 /***************************************************************************
2 * Copyright (C) 2005-2020 by the Quassel Project *
3 * devel@quassel-irc.org *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) version 3. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
19 ***************************************************************************/
24 #include <QGraphicsView>
27 #include "abstractbuffercontainer.h"
29 class AbstractBufferContainer;
37 class ChatView : public QGraphicsView, public AbstractChatView
42 ChatView(MessageFilter*, QWidget* parent = nullptr);
43 ChatView(BufferId bufferId, QWidget* parent = nullptr);
45 MsgId lastMsgId() const override;
46 virtual MsgId lastVisibleMsgId() const;
47 inline AbstractBufferContainer* bufferContainer() const { return _bufferContainer; }
48 inline void setBufferContainer(AbstractBufferContainer* c) { _bufferContainer = c; }
50 inline ChatScene* scene() const { return _scene; }
52 //! Return a set of ChatLines currently visible in the view
53 /** \param mode How partially visible ChatLines are handled
54 * \return A set of visible ChatLines
56 QSet<ChatLine*> visibleChatLines(Qt::ItemSelectionMode mode = Qt::ContainsItemBoundingRect) const;
58 //! Return a sorted list of ChatLines currently visible in the view
59 /** \param mode How partially visible ChatLines are handled
60 * \return A list of visible ChatLines sorted by row
61 * \note If the order of ChatLines does not matter, use visibleChatLines() instead
63 QList<ChatLine*> visibleChatLinesSorted(Qt::ItemSelectionMode mode = Qt::ContainsItemBoundingRect) const;
65 //! Return the last fully visible ChatLine in this view
66 /** Using this method more efficient than calling visibleChatLinesSorted() and taking its last element.
67 * \return The last fully visible ChatLine in the view
69 ChatLine* lastVisibleChatLine(bool ignoreDayChange = false) const;
71 virtual void addActionsToMenu(QMenu*, const QPointF& pos);
73 //! Tell the view that this ChatLine has cached data
74 /** ChatLines cache some layout data that should be cleared as soon as it's no
75 * longer visible. A ChatLine caching data registers itself with this method to
76 * tell the view about it. The view will call ChatLine::clearCache() when
78 * \param line The ChatLine having cached data
80 void setHasCache(ChatLine* line, bool hasCache = true);
83 * Requests backlog if the scrollbar is not currently visible
85 * Use this whenever trying to scroll the backlog to try to ensure some text is visible. If the
86 * backlog does not have additional messages or those messages are filtered out, the scrollbar
87 * might remain invisible.
89 * @return True if the scrollbar isn't visible and a backlog request was made, otherwise false
91 bool requestBacklogForScroll();
94 inline virtual void clear() {}
99 void setMarkerLineVisible(bool visible = true);
100 void setMarkerLine(MsgId msgId);
101 void jumpToMarkerLine(bool requestBacklog);
104 bool event(QEvent* event) override;
105 bool eventFilter(QObject* watched, QEvent* event) override;
106 void resizeEvent(QResizeEvent* event) override;
107 void scrollContentsBy(int dx, int dy) override;
110 virtual void verticalScrollbarChanged(int);
113 void lastLineChanged(QGraphicsItem* chatLine, qreal offset);
114 void adjustSceneRect();
115 void checkChatLineCaches();
116 void mouseMoveWhileSelecting(const QPointF& scenePos);
117 void scrollTimerTimeout();
118 void invalidateFilter();
119 void markerLineSet(BufferId buffer, MsgId msg);
122 void init(MessageFilter* filter);
124 AbstractBufferContainer* _bufferContainer;
126 int _lastScrollbarPos;
127 qreal _currentScaleFactor;
130 bool _invalidateFilter;
131 QSet<ChatLine*> _linesWithCache;
132 bool _firstTouchUpdateHappened = false;
133 /// Workaround: If true, backlog has been requested before the vertical scrollbar became visible
134 bool _backlogRequestedBeforeScrollable{false};