1
0
mirror of https://github.com/qTox/qTox.git synced 2024-03-22 14:00:36 +08:00
qTox/src/chatlog/chatlog.h

118 lines
3.3 KiB
C
Raw Normal View History

2014-11-16 19:58:43 +08:00
/*
Copyright (C) 2014 by Project Tox <https://tox.im>
This file is part of qTox, a Qt-based graphical interface for Tox.
This program is libre software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the COPYING file for more details.
*/
2014-11-12 21:11:25 +08:00
#ifndef CHATLOG_H
#define CHATLOG_H
#include <QGraphicsView>
#include <QDateTime>
#include <QMarginsF>
2014-11-12 21:11:25 +08:00
class QGraphicsScene;
2014-12-09 20:17:08 +08:00
class QGraphicsRectItem;
2014-11-12 21:11:25 +08:00
class ChatLine;
class ChatLineContent;
2014-11-12 23:45:24 +08:00
class ChatMessage;
2014-11-17 03:01:37 +08:00
class ToxFile;
2014-11-12 21:11:25 +08:00
class ChatLog : public QGraphicsView
{
Q_OBJECT
public:
explicit ChatLog(QWidget* parent = 0);
virtual ~ChatLog();
2014-12-31 20:42:06 +08:00
ChatMessage* addChatMessage(const QString& sender, const QString& msg, const QDateTime& timestamp, bool self, bool alert);
ChatMessage* addChatMessage(const QString& sender, const QString& msg, bool self, bool alert);
2014-12-14 04:11:03 +08:00
ChatMessage* addChatAction(const QString& sender, const QString& msg, const QDateTime& timestamp);
ChatMessage* addChatAction(const QString& sender, const QString& msg);
2014-11-16 19:40:44 +08:00
ChatMessage* addSystemMessage(const QString& msg, const QDateTime& timestamp);
2014-11-17 03:01:37 +08:00
ChatMessage* addFileTransferMessage(const QString& sender, const ToxFile& file, const QDateTime &timestamp, bool self);
2014-11-12 23:45:24 +08:00
2014-11-12 21:11:25 +08:00
void insertChatline(ChatLine* l);
void clearSelection();
void clear();
void copySelectedText() const;
QString getSelectedText() const;
2015-01-02 19:04:04 +08:00
QString toPlainText() const;
2014-11-12 21:11:25 +08:00
2014-12-14 04:11:03 +08:00
bool isEmpty() const;
2014-11-12 21:11:25 +08:00
protected:
QRect getVisibleRect() const;
ChatLineContent* getContentFromPos(QPointF scenePos) const;
bool layout(int start, int end, qreal width);
bool isOverSelection(QPointF scenePos);
bool stickToBottom();
qreal useableWidth();
2014-11-12 21:11:25 +08:00
void reposition(int start, int end);
void repositionDownTo(int start, qreal end);
void updateSceneRect();
void partialUpdate();
void fullUpdate();
void checkVisibility();
void scrollToBottom();
void showContextMenu(const QPoint& globalPos, const QPointF& scenePos);
virtual void mousePressEvent(QMouseEvent* ev);
virtual void mouseReleaseEvent(QMouseEvent* ev);
virtual void mouseMoveEvent(QMouseEvent* ev);
virtual void scrollContentsBy(int dx, int dy);
virtual void resizeEvent(QResizeEvent *ev);
void updateMultiSelectionRect();
2014-11-12 21:11:25 +08:00
private:
2014-12-09 20:17:08 +08:00
enum SelectionMode {
None,
Precise,
Multi,
};
2014-11-12 21:11:25 +08:00
QGraphicsScene* scene = nullptr;
QList<ChatLine*> lines;
QList<ChatLine*> visibleLines;
bool multiLineInsert = false;
bool stickToBtm = false;
int insertStartIndex = -1;
// selection
2014-12-09 20:17:08 +08:00
int selClickedRow = -1;
int selClickedCol = -1;
int selFirstRow = -1;
2014-11-12 21:11:25 +08:00
int selLastRow = -1;
2014-12-09 20:17:08 +08:00
SelectionMode selectionMode = None;
2014-11-12 21:11:25 +08:00
QPointF clickPos;
QPointF lastPos;
2014-12-09 20:17:08 +08:00
QGraphicsRectItem* selGraphItem = nullptr;
2014-11-12 21:11:25 +08:00
// actions
QAction* copyAction = nullptr;
// layout
QMarginsF margins = QMarginsF(10.0,10.0,10.0,10.0);
2014-11-12 21:11:25 +08:00
qreal lineSpacing = 10.0f;
};
#endif // CHATLOG_H