qTox  Version: nightly | Commit: bc751c8e1cac455f9690654fcfe0f560d2d7dfdd
chatwidget.h
Go to the documentation of this file.
1 /*
2  Copyright © 2014-2019 by The qTox Project Contributors
3 
4  This file is part of qTox, a Qt-based graphical interface for Tox.
5 
6  qTox is libre software: you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation, either version 3 of the License, or
9  (at your option) any later version.
10 
11  qTox is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with qTox. If not, see <http://www.gnu.org/licenses/>.
18 */
19 
20 #pragma once
21 
22 #include <QDateTime>
23 #include <QGraphicsView>
24 #include <QMargins>
25 
26 #include "chatline.h"
27 #include "chatmessage.h"
28 #include "src/widget/style.h"
29 #include "src/model/ichatlog.h"
30 
31 class QGraphicsScene;
32 class QGraphicsRectItem;
33 class QMouseEvent;
34 class QTimer;
35 class ChatLineContent;
36 struct ToxFile;
37 
38 class ChatLineStorage;
39 
40 static const size_t DEF_NUM_MSG_TO_LOAD = 100;
41 class ChatWidget : public QGraphicsView
42 {
43  Q_OBJECT
44 public:
45  explicit ChatWidget(IChatLog& chatLog, const Core& core, QWidget* parent = nullptr);
46  virtual ~ChatWidget();
47 
48  void insertChatlines(std::map<ChatLogIdx, ChatLine::Ptr> chatLines);
49  void clearSelection();
50  void clear();
51  void copySelectedText(bool toSelectionBuffer = false) const;
52  void setTypingNotificationVisible(bool visible);
53  void setTypingNotificationName(const QString& displayName);
54  void scrollToLine(ChatLine::Ptr line);
55  void selectAll();
56  void fontChanged(const QFont& font);
57 
58  QString getSelectedText() const;
59 
60  bool isEmpty() const;
61  bool hasTextToBeCopied() const;
62  ChatLineContent* getContentFromGlobalPos(QPoint pos) const;
63  const uint repNameAfter = 5 * 60;
64 
65  void setColorizedNames(bool enable) { colorizeNames = enable; };
66  void jumpToDate(QDate date);
67  void jumpToIdx(ChatLogIdx idx);
68 
69 signals:
70  void selectionChanged();
71  void firstVisibleLineChanged(const ChatLine::Ptr& prevLine, const ChatLine::Ptr& firstLine);
72 
73  void messageNotFoundShow(SearchDirection direction);
74  void renderFinished();
75 public slots:
76  void forceRelayout();
77  void reloadTheme();
78 
79  void startSearch(const QString& phrase, const ParameterSearch& parameter);
80  void onSearchUp(const QString& phrase, const ParameterSearch& parameter);
81  void onSearchDown(const QString& phrase, const ParameterSearch& parameter);
82  void handleSearchResult(SearchResult result, SearchDirection direction);
83  void removeSearchPhrase();
84 
85 private slots:
87  void onWorkerTimeout();
88  void onMultiClickTimeout();
89 
90  void onMessageUpdated(ChatLogIdx idx);
91  void renderMessage(ChatLogIdx idx);
92  void renderMessages(ChatLogIdx begin, ChatLogIdx end);
93 
96 
97  void onRenderFinished();
98  void onScrollValueChanged(int value);
99 protected:
100  QRectF calculateSceneRect() const;
101  QRect getVisibleRect() const;
102  ChatLineContent* getContentFromPos(QPointF scenePos) const;
103 
104  void layout(int start, int end, qreal width);
105  bool isOverSelection(QPointF scenePos) const;
106  bool stickToBottom() const;
107 
108  qreal useableWidth() const;
109 
110  void updateSceneRect();
111  void checkVisibility();
112  void scrollToBottom();
113  void startResizeWorker();
114 
115  void mouseDoubleClickEvent(QMouseEvent* ev) final;
116  void mousePressEvent(QMouseEvent* ev) final;
117  void mouseReleaseEvent(QMouseEvent* ev) final;
118  void mouseMoveEvent(QMouseEvent* ev) final;
119  void scrollContentsBy(int dx, int dy) final;
120  void resizeEvent(QResizeEvent* ev) final;
121  void showEvent(QShowEvent*) final;
122  void hideEvent(QHideEvent* event) final;
123  void focusInEvent(QFocusEvent* ev) final;
124  void focusOutEvent(QFocusEvent* ev) final;
125  void wheelEvent(QWheelEvent *event) final;
126 
129  void updateBusyNotification();
130 
131  ChatLine::Ptr findLineByPosY(qreal yPos) const;
132 
133  void removeLines(ChatLogIdx being, ChatLogIdx end);
134 
135 private:
136  void retranslateUi();
138  void handleMultiClickEvent();
139  void moveSelectionRectUpIfSelected(int offset);
140  void moveSelectionRectDownIfSelected(int offset);
141  void movePreciseSelectionDown(int offset);
142  void movePreciseSelectionUp(int offset);
143  void moveMultiSelectionUp(int offset);
144  void moveMultiSelectionDown(int offset);
145  void setTypingNotification();
146 
147  void renderItem(const ChatLogItem &item, bool hideName, bool colorizeNames, ChatLine::Ptr &chatMessage);
148  void renderFile(QString displayName, ToxFile file, bool isSelf, QDateTime timestamp, ChatLine::Ptr &chatMessage);
149  bool needsToHideName(ChatLogIdx idx, bool prevIdxRendered) const;
150  bool shouldRenderMessage(ChatLogIdx idx) const;
151  void disableSearchText();
152 private:
153  enum class SelectionMode
154  {
155  None,
156  Precise,
157  Multi,
158  };
159 
161  {
162  NoDirection,
163  Up,
164  Down,
165  };
166 
167  QAction* copyAction = nullptr;
168  QAction* selectAllAction = nullptr;
169  QGraphicsScene* scene = nullptr;
170  QGraphicsScene* busyScene = nullptr;
174 
175  // selection
176 
177  // For the time being we store these selection indexes as ChatLine::Ptrs. In
178  // order to do multi-selection we do an O(n) search in the chatline storage
179  // to determine the index. This is inefficient but correct with the moving
180  // window of storage. If this proves to cause performance issues we can move
181  // this responsibility into ChatlineStorage and have it coordinate the
182  // shifting of indexes
183  ChatLine::Ptr selClickedRow; // These 4 are only valid while selectionMode != None
184  int selClickedCol = -1;
189  QPointF clickPos;
190  QGraphicsRectItem* selGraphItem = nullptr;
191  QTimer* selectionTimer = nullptr;
192  QTimer* workerTimer = nullptr;
193  QTimer* multiClickTimer = nullptr;
195  int clickCount = 0;
196  QPoint lastClickPos;
197  Qt::MouseButton lastClickButton;
198 
199  // worker vars
200  size_t workerLastIndex = 0;
201  bool workerStb = false;
203 
204  // layout
205  QMargins margins = QMargins(10, 10, 10, 10);
206  qreal lineSpacing = 5.0f;
207 
209  bool colorizeNames = false;
211  const Core& core;
213 
214  std::unique_ptr<ChatLineStorage> chatLineStorage;
215 
216  std::vector<std::function<void(void)>> renderCompletionFns;
217 };
ChatLineStorage
Definition: chatlinestorage.h:53
ChatWidget::selectAllAction
QAction * selectAllAction
Definition: chatwidget.h:168
style.h
ChatWidget::workerTimer
QTimer * workerTimer
Definition: chatwidget.h:192
ChatWidget::clickCount
int clickCount
Definition: chatwidget.h:195
ChatLogItem
Definition: chatlogitem.h:42
ChatWidget::clearSelection
void clearSelection()
Definition: chatwidget.cpp:310
ChatWidget::onMultiClickTimeout
void onMultiClickTimeout()
Definition: chatwidget.cpp:1099
ChatWidget::setTypingNotificationName
void setTypingNotificationName(const QString &displayName)
Definition: chatwidget.cpp:745
SearchDirection
SearchDirection
Definition: searchtypes.h:42
ChatWidget::getContentFromPos
ChatLineContent * getContentFromPos(QPointF scenePos) const
Definition: chatwidget.cpp:481
ChatWidget::startResizeWorker
void startResizeWorker()
Definition: chatwidget.cpp:596
ChatWidget::multiClickTimer
QTimer * multiClickTimer
Definition: chatwidget.h:193
ChatWidget::resizeEvent
void resizeEvent(QResizeEvent *ev) final
Definition: chatwidget.cpp:944
ChatWidget::selectionTimer
QTimer * selectionTimer
Definition: chatwidget.h:191
ChatWidget::getContentFromGlobalPos
ChatLineContent * getContentFromGlobalPos(QPoint pos) const
Finds the chat line object at a position on screen.
Definition: chatwidget.cpp:702
ChatWidget::startSearch
void startSearch(const QString &phrase, const ParameterSearch &parameter)
Definition: chatwidget.cpp:803
ChatWidget::typingNotification
ChatLine::Ptr typingNotification
Definition: chatwidget.h:172
ChatWidget::layout
void layout(int start, int end, qreal width)
Definition: chatwidget.cpp:340
ichatlog.h
ChatWidget::retranslateUi
void retranslateUi()
Definition: chatwidget.cpp:1369
ChatWidget::chatLog
IChatLog & chatLog
Definition: chatwidget.h:208
ChatWidget::selLastRow
ChatLine::Ptr selLastRow
Definition: chatwidget.h:186
ChatWidget::shouldRenderMessage
bool shouldRenderMessage(ChatLogIdx idx) const
Definition: chatwidget.cpp:1486
ChatWidget::renderMessage
void renderMessage(ChatLogIdx idx)
Definition: chatwidget.cpp:1111
ChatWidget::repNameAfter
const uint repNameAfter
Definition: chatwidget.h:63
ChatWidget::setRenderedWindowEnd
void setRenderedWindowEnd(ChatLogIdx end)
Definition: chatwidget.cpp:1178
ChatWidget::renderItem
void renderItem(const ChatLogItem &item, bool hideName, bool colorizeNames, ChatLine::Ptr &chatMessage)
Definition: chatwidget.cpp:1403
ParameterSearch
Definition: searchtypes.h:47
ChatWidget::focusOutEvent
void focusOutEvent(QFocusEvent *ev) final
Definition: chatwidget.cpp:1344
ChatWidget::core
const Core & core
Definition: chatwidget.h:211
ChatWidget::margins
QMargins margins
Definition: chatwidget.h:205
ChatWidget::scrollMonitoringEnabled
bool scrollMonitoringEnabled
Definition: chatwidget.h:212
ChatWidget::selFirstRow
ChatLine::Ptr selFirstRow
Definition: chatwidget.h:185
ChatWidget::disableSearchText
void disableSearchText()
Definition: chatwidget.cpp:1494
HistMessageContentType::file
@ file
ChatWidget::selectionScrollDir
AutoScrollDirection selectionScrollDir
Definition: chatwidget.h:194
ChatWidget::colorizeNames
bool colorizeNames
Definition: chatwidget.h:209
ChatWidget::~ChatWidget
virtual ~ChatWidget()
Definition: chatwidget.cpp:295
ChatWidget::updateTypingNotification
void updateTypingNotification()
Definition: chatwidget.cpp:978
ChatWidget::scrollToBottom
void scrollToBottom()
Definition: chatwidget.cpp:590
ChatWidget
Definition: chatwidget.h:41
ChatWidget::movePreciseSelectionUp
void movePreciseSelectionUp(int offset)
ChatWidget::removeSearchPhrase
void removeSearchPhrase()
Definition: chatwidget.cpp:1505
ChatWidget::ChatWidget
ChatWidget(IChatLog &chatLog, const Core &core, QWidget *parent=nullptr)
Definition: chatwidget.cpp:205
QList< ChatLine::Ptr >
ChatWidget::needsToHideName
bool needsToHideName(ChatLogIdx idx, bool prevIdxRendered) const
Determine if the name at the given idx needs to be hidden.
Definition: chatwidget.cpp:1461
ChatWidget::updateSceneRect
void updateSceneRect()
Definition: chatwidget.cpp:335
ChatWidget::lastClickButton
Qt::MouseButton lastClickButton
Definition: chatwidget.h:197
ChatWidget::focusInEvent
void focusInEvent(QFocusEvent *ev) final
Definition: chatwidget.cpp:1325
IChatLog
Definition: ichatlog.h:83
ChatWidget::messageNotFoundShow
void messageNotFoundShow(SearchDirection direction)
ChatWidget::lineSpacing
qreal lineSpacing
Definition: chatwidget.h:206
ChatWidget::scrollContentsBy
void scrollContentsBy(int dx, int dy) final
Definition: chatwidget.cpp:938
ChatWidget::removeLines
void removeLines(ChatLogIdx being, ChatLogIdx end)
Definition: chatwidget.cpp:1009
ChatWidget::clickPos
QPointF clickPos
Definition: chatwidget.h:189
ChatWidget::onScrollValueChanged
void onScrollValueChanged(int value)
Definition: chatwidget.cpp:1214
ChatWidget::workerLastIndex
size_t workerLastIndex
Definition: chatwidget.h:200
ChatWidget::insertChatlines
void insertChatlines(std::map< ChatLogIdx, ChatLine::Ptr > chatLines)
Definition: chatwidget.cpp:516
ChatWidget::workerStb
bool workerStb
Definition: chatwidget.h:201
chatline.h
ChatWidget::hideEvent
void hideEvent(QHideEvent *event) final
Definition: chatwidget.cpp:1307
ChatWidget::isOverSelection
bool isOverSelection(QPointF scenePos) const
Definition: chatwidget.cpp:496
ChatWidget::jumpToIdx
void jumpToIdx(ChatLogIdx idx)
Definition: chatwidget.cpp:1515
ChatWidget::showEvent
void showEvent(QShowEvent *) final
Definition: chatwidget.cpp:1300
ChatWidget::SelectionMode::Multi
@ Multi
ChatWidget::fontChanged
void fontChanged(const QFont &font)
Definition: chatwidget.cpp:782
ChatWidget::renderMessages
void renderMessages(ChatLogIdx begin, ChatLogIdx end)
Definition: chatwidget.cpp:1116
ChatWidget::selectionRectColor
QColor selectionRectColor
Definition: chatwidget.h:187
ChatWidget::lastClickPos
QPoint lastClickPos
Definition: chatwidget.h:196
ChatWidget::scene
QGraphicsScene * scene
Definition: chatwidget.h:169
ChatWidget::scrollToLine
void scrollToLine(ChatLine::Ptr line)
Definition: chatwidget.cpp:758
ChatWidget::stickToBottom
bool stickToBottom() const
Definition: chatwidget.cpp:585
ChatWidget::AutoScrollDirection
AutoScrollDirection
Definition: chatwidget.h:160
ChatWidget::firstVisibleLineChanged
void firstVisibleLineChanged(const ChatLine::Ptr &prevLine, const ChatLine::Ptr &firstLine)
ChatWidget::workerAnchorLine
ChatLine::Ptr workerAnchorLine
Definition: chatwidget.h:202
ChatWidget::hasTextToBeCopied
bool hasTextToBeCopied() const
Definition: chatwidget.cpp:692
ChatWidget::useableWidth
qreal useableWidth() const
Definition: chatwidget.cpp:511
ChatWidget::chatLineStorage
std::unique_ptr< ChatLineStorage > chatLineStorage
Definition: chatwidget.h:214
ChatWidget::renderFinished
void renderFinished()
ChatWidget::visibleLines
QList< ChatLine::Ptr > visibleLines
Definition: chatwidget.h:171
ChatWidget::moveMultiSelectionDown
void moveMultiSelectionDown(int offset)
ChatWidget::reloadTheme
void reloadTheme()
Definition: chatwidget.cpp:789
ChatLineContent
Definition: chatlinecontent.h:26
Style::SelectText
@ SelectText
Definition: style.h:51
ChatWidget::selectAll
void selectAll()
Definition: chatwidget.cpp:767
ChatWidget::setTypingNotification
void setTypingNotification()
Definition: chatwidget.cpp:1393
ChatWidget::movePreciseSelectionDown
void movePreciseSelectionDown(int offset)
Style::getColor
static QColor getColor(ColorPalette entry)
Definition: style.cpp:209
ChatWidget::getSelectedText
QString getSelectedText() const
Definition: chatwidget.cpp:659
ChatWidget::findLineByPosY
ChatLine::Ptr findLineByPosY(qreal yPos) const
Definition: chatwidget.cpp:999
ChatWidget::getVisibleRect
QRect getVisibleRect() const
Definition: chatwidget.cpp:330
ChatWidget::SelectionMode::Precise
@ Precise
ChatWidget::onSearchDown
void onSearchDown(const QString &phrase, const ParameterSearch &parameter)
Definition: chatwidget.cpp:849
ChatWidget::renderFile
void renderFile(QString displayName, ToxFile file, bool isSelf, QDateTime timestamp, ChatLine::Ptr &chatMessage)
Definition: chatwidget.cpp:1439
ChatWidget::searchPos
SearchPos searchPos
Definition: chatwidget.h:210
ChatWidget::mousePressEvent
void mousePressEvent(QMouseEvent *ev) final
Definition: chatwidget.cpp:363
ChatLogIdx
NamedType< size_t, struct ChatLogIdxTag, Orderable, UnderlyingAddable, UnitlessDifferencable, Incrementable > ChatLogIdx
Definition: ichatlog.h:38
ChatWidget::mouseDoubleClickEvent
void mouseDoubleClickEvent(QMouseEvent *ev) final
Definition: chatwidget.cpp:628
ChatWidget::setColorizedNames
void setColorizedNames(bool enable)
Definition: chatwidget.h:65
SearchPos
Definition: ichatlog.h:41
ChatWidget::onWorkerTimeout
void onWorkerTimeout()
Definition: chatwidget.cpp:1061
ChatWidget::checkVisibility
void checkVisibility()
Definition: chatwidget.cpp:899
ChatWidget::AutoScrollDirection::NoDirection
@ NoDirection
ChatWidget::selectionMode
SelectionMode selectionMode
Definition: chatwidget.h:188
ChatWidget::onSearchUp
void onSearchUp(const QString &phrase, const ParameterSearch &parameter)
Definition: chatwidget.cpp:843
ChatWidget::handleSearchResult
void handleSearchResult(SearchResult result, SearchDirection direction)
Definition: chatwidget.cpp:855
chatmessage.h
ChatWidget::setRenderedWindowStart
void setRenderedWindowStart(ChatLogIdx start)
Definition: chatwidget.cpp:1135
ChatWidget::SelectionMode
SelectionMode
Definition: chatwidget.h:153
ChatWidget::copyAction
QAction * copyAction
Definition: chatwidget.h:167
ChatWidget::updateBusyNotification
void updateBusyNotification()
Definition: chatwidget.cpp:992
ChatWidget::forceRelayout
void forceRelayout()
Definition: chatwidget.cpp:894
ChatWidget::moveSelectionRectUpIfSelected
void moveSelectionRectUpIfSelected(int offset)
ChatWidget::calculateSceneRect
QRectF calculateSceneRect() const
Definition: chatwidget.cpp:1034
ChatWidget::onRenderFinished
void onRenderFinished()
Definition: chatwidget.cpp:1186
ChatWidget::moveSelectionRectDownIfSelected
void moveSelectionRectDownIfSelected(int offset)
ChatWidget::selClickedRow
ChatLine::Ptr selClickedRow
Definition: chatwidget.h:183
ChatWidget::isActiveFileTransfer
bool isActiveFileTransfer(ChatLine::Ptr l)
Definition: chatwidget.cpp:1375
ChatWidget::selClickedCol
int selClickedCol
Definition: chatwidget.h:184
ChatWidget::selectionChanged
void selectionChanged()
ChatWidget::AutoScrollDirection::Up
@ Up
ToxFile
Definition: toxfile.h:32
ChatWidget::copySelectedText
void copySelectedText(bool toSelectionBuffer=false) const
Definition: chatwidget.cpp:728
ChatWidget::updateMultiSelectionRect
void updateMultiSelectionRect()
Definition: chatwidget.cpp:961
ChatWidget::jumpToDate
void jumpToDate(QDate date)
Definition: chatwidget.cpp:1510
ChatWidget::busyNotification
ChatLine::Ptr busyNotification
Definition: chatwidget.h:173
ChatWidget::mouseReleaseEvent
void mouseReleaseEvent(QMouseEvent *ev) final
Definition: chatwidget.cpp:386
ChatWidget::selGraphItem
QGraphicsRectItem * selGraphItem
Definition: chatwidget.h:190
ChatWidget::onMessageUpdated
void onMessageUpdated(ChatLogIdx idx)
Definition: chatwidget.cpp:1104
ChatWidget::moveMultiSelectionUp
void moveMultiSelectionUp(int offset)
ChatWidget::renderCompletionFns
std::vector< std::function< void(void)> > renderCompletionFns
Definition: chatwidget.h:216
ChatLine::Ptr
std::shared_ptr< ChatLine > Ptr
Definition: chatline.h:68
ChatWidget::handleMultiClickEvent
void handleMultiClickEvent()
Definition: chatwidget.cpp:1274
ChatWidget::setTypingNotificationVisible
void setTypingNotificationVisible(bool visible)
Definition: chatwidget.cpp:737
ChatWidget::mouseMoveEvent
void mouseMoveEvent(QMouseEvent *ev) final
Definition: chatwidget.cpp:395
ChatWidget::clear
void clear()
Definition: chatwidget.cpp:707
ChatWidget::SelectionMode::None
@ None
ChatWidget::onSelectionTimerTimeout
void onSelectionTimerTimeout()
Definition: chatwidget.cpp:1045
SearchResult
Definition: ichatlog.h:70
Core
Definition: core.h:59
ChatWidget::wheelEvent
void wheelEvent(QWheelEvent *event) final
Definition: chatwidget.cpp:1363
ChatWidget::AutoScrollDirection::Down
@ Down
ChatWidget::isEmpty
bool isEmpty() const
Definition: chatwidget.cpp:687
ChatWidget::busyScene
QGraphicsScene * busyScene
Definition: chatwidget.h:170