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

148 lines
4.0 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>
2015-02-15 18:53:26 +08:00
#include <QMargins>
2014-11-12 21:11:25 +08:00
2015-01-04 20:29:14 +08:00
#include "chatline.h"
#include "chatmessage.h"
2014-11-12 21:11:25 +08:00
class QGraphicsScene;
2014-12-09 20:17:08 +08:00
class QGraphicsRectItem;
2015-01-20 17:44:05 +08:00
class QMouseEvent;
2015-01-04 22:18:23 +08:00
class QTimer;
2014-11-12 21:11:25 +08:00
class ChatLineContent;
struct ToxFile;
2014-11-12 21:11:25 +08:00
class ChatLog : public QGraphicsView
{
Q_OBJECT
public:
explicit ChatLog(QWidget* parent = 0);
2015-02-08 17:11:55 +08:00
virtual ~ChatLog();
2014-11-12 21:11:25 +08:00
void insertChatlineAtBottom(ChatLine::Ptr l);
void insertChatlineOnTop(ChatLine::Ptr l);
void insertChatlineOnTop(const QList<ChatLine::Ptr>& newLines);
2014-11-12 21:11:25 +08:00
void clearSelection();
void clear();
void copySelectedText(bool toSelectionBuffer = false) const;
void setBusyNotification(ChatLine::Ptr notification);
2015-01-10 18:57:46 +08:00
void setTypingNotification(ChatLine::Ptr notification);
void setTypingNotificationVisible(bool visible);
void scrollToLine(ChatLine::Ptr line);
void selectAll();
void forceRelayout();
2014-11-12 21:11:25 +08:00
QString getSelectedText() const;
2014-12-14 04:11:03 +08:00
bool isEmpty() const;
bool hasTextToBeCopied() const;
2014-12-14 04:11:03 +08:00
2015-01-10 18:57:46 +08:00
ChatLine::Ptr getTypingNotification() const;
QVector<ChatLine::Ptr> getLines();
2015-01-10 18:57:46 +08:00
2015-02-11 23:32:42 +08:00
signals:
void selectionChanged();
2014-11-12 21:11:25 +08:00
protected:
QRectF calculateSceneRect() const;
2014-11-12 21:11:25 +08:00
QRect getVisibleRect() const;
ChatLineContent* getContentFromPos(QPointF scenePos) const;
void layout(int start, int end, qreal width);
2015-01-14 06:59:38 +08:00
bool isOverSelection(QPointF scenePos) const;
bool stickToBottom() const;
2014-11-12 21:11:25 +08:00
2015-01-14 06:59:38 +08:00
qreal useableWidth() const;
2014-11-12 21:11:25 +08:00
2015-01-05 21:06:14 +08:00
void reposition(int start, int end, qreal deltaY);
2014-11-12 21:11:25 +08:00
void updateSceneRect();
void checkVisibility();
void scrollToBottom();
void startResizeWorker();
2014-11-12 21:11:25 +08:00
2015-01-19 22:19:54 +08:00
virtual void mouseDoubleClickEvent(QMouseEvent* ev);
2014-11-12 21:11:25 +08:00
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);
virtual void showEvent(QShowEvent*);
virtual void focusInEvent(QFocusEvent* ev);
virtual void focusOutEvent(QFocusEvent* ev);
2014-11-12 21:11:25 +08:00
void updateMultiSelectionRect();
2015-01-10 18:57:46 +08:00
void updateTypingNotification();
void updateBusyNotification();
ChatLine::Ptr findLineByPosY(qreal yPos) const;
2015-01-04 22:18:23 +08:00
private slots:
void onSelectionTimerTimeout();
void onWorkerTimeout();
2015-01-04 22:18:23 +08:00
2014-11-12 21:11:25 +08:00
private:
2014-12-09 20:17:08 +08:00
enum SelectionMode {
None,
Precise,
Multi,
};
2015-01-04 22:18:23 +08:00
enum AutoScrollDirection {
NoDirection,
Up,
Down,
};
QAction* copyAction = nullptr;
2014-11-12 21:11:25 +08:00
QGraphicsScene* scene = nullptr;
QGraphicsScene* busyScene = nullptr;
2015-01-07 20:05:28 +08:00
QVector<ChatLine::Ptr> lines;
2015-01-04 20:29:14 +08:00
QList<ChatLine::Ptr> visibleLines;
2015-01-10 18:57:46 +08:00
ChatLine::Ptr typingNotification;
ChatLine::Ptr busyNotification;
2014-11-12 21:11:25 +08:00
// selection
int selClickedRow = -1; //These 4 are only valid while selectionMode != None
2014-12-09 20:17:08 +08:00
int selClickedCol = -1;
int selFirstRow = -1;
2014-11-12 21:11:25 +08:00
int selLastRow = -1;
QColor selectionRectColor = QColor::fromRgbF(0.23, 0.68, 0.91).lighter(150);
2014-12-09 20:17:08 +08:00
SelectionMode selectionMode = None;
2014-11-12 21:11:25 +08:00
QPointF clickPos;
2014-12-09 20:17:08 +08:00
QGraphicsRectItem* selGraphItem = nullptr;
2015-01-04 22:18:23 +08:00
QTimer* selectionTimer = nullptr;
QTimer* workerTimer = nullptr;
2015-01-04 22:18:23 +08:00
AutoScrollDirection selectionScrollDir = NoDirection;
2014-11-12 21:11:25 +08:00
//worker vars
int workerLastIndex = 0;
bool workerStb = false;
ChatLine::Ptr workerAnchorLine;
2014-11-12 21:11:25 +08:00
// layout
2015-02-15 17:19:38 +08:00
QMargins margins = QMargins(10,10,10,10);
2015-01-05 21:06:14 +08:00
qreal lineSpacing = 5.0f;
2014-11-12 21:11:25 +08:00
};
#endif // CHATLOG_H