Files
MyChat_Client/ChatClient/include/messageshowarea.h

121 lines
3.2 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef MESSAGESHOWAREA_H
#define MESSAGESHOWAREA_H
#include <QScrollArea>
#include <QWidget>
#include <QVBoxLayout>
#include <QScrollBar>
#include <QPushButton>
#include <QLabel>
#include <QFontMetrics>
#include <QPainter>
#include <QPainterPath>
#include "model/data.h"
#include "debug.h"
//.h文件中不宜使用namespace xxx
using model::Message;
////////////////////////////////////////////
/// 表示消息展示区
////////////////////////////////////////////
class MessageShowArea : public QScrollArea
{
Q_OBJECT
public:
MessageShowArea();
//头插
void addFrontMessage(bool isLeft, const Message& message);
//尾插
void addMessage(bool isLeft, const Message& message);
//清空
void clear();
//滚动到末尾
void scrollToEnd();
private:
QWidget* container;
};
////////////////////////////////////////////
/// 表示一个消息元素
/// 我们可能考虑要同时支持文本,文件,图片,视频,语音
////////////////////////////////////////////
class MessageItem : public QWidget {
public:
//isLeft表示当前的这个消息是否是左侧的消息
MessageItem(bool isLeft);
//通过工厂方法创建MessageItem实例
static MessageItem* makeMessageItem(bool isLeft, const Message& message);
//添加工厂函数
static QWidget* makeTextMessageItem(bool isLeft, const QString& message);
static QWidget* makeImageMessageItem(bool isLeft, const QString& fileId, const QByteArray& content);
static QWidget* makeFileMessageItem(bool isLeft, const Message& message);
static QWidget* makeSpeechMessageItem(bool isLeft, const Message& message);
private:
bool isLeft;
};
////////////////////////////////////////////
/// 创建类表示“文本消息”正文部分
//也让这个类表示文件消息
////////////////////////////////////////////
class MessageContentLabel : public QWidget {
public:
MessageContentLabel(const QString& text, bool isLeft, model::MessageType messageType, const QString& fileId,
const QByteArray& content);
void paintEvent(QPaintEvent* event) override;
void mousePressEvent(QMouseEvent* event) override;
void updateUI(const QString& fileId, const QByteArray& fileContent);
void saveAsFile(const QByteArray& content);
void playDone();
void contextMenuEvent(QContextMenuEvent* event) override;
void speechConverTextDone(const QString& fileId, const QString& text);
private:
QLabel* label;
bool isLeft;
model::MessageType messageType;
QString fileId;
QByteArray content;
QString fileName;
bool loadContentDone = false;
};
////////////////////////////////////////////
/// 创建类表示“图片消息”部分
////////////////////////////////////////////
class MessageImageLabel : public QWidget {
Q_OBJECT
public:
MessageImageLabel(const QString& fileId, const QByteArray& content, bool isLeft);
void updateUI(const QString& fileId, const QByteArray& content);
void paintEvent(QPaintEvent* event) override;
private:
QPushButton* imageBtn;
QString fileId; //该图片在服务器对应的文件id
QByteArray content; //图片的二进制数据
bool isLeft;
};
#endif // MESSAGESHOWAREA_H