#ifndef CHATWINDOW_H #define CHATWINDOW_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "network/websocketclient.h" class ChatView; // 多格式输入框类 class MultiFormatInputEdit : public QTextEdit { Q_OBJECT public: explicit MultiFormatInputEdit(QWidget *parent = nullptr); // 获取纯文本内容 QString getPlainText() const; // 获取所有图片路径 QStringList getImagePaths() const; // 添加图片到输入框 void insertImage(const QString &imagePath); // 清空内容 void clearContent(); // 验证输入内容 bool validateContent() const; // 移除指定图片 void removeImage(const QString &imagePath); signals: void contentChanged(); void imageInserted(const QString &imagePath); void imageRemoved(const QString &imagePath); void sendRequested(); protected: void dragEnterEvent(QDragEnterEvent *event) override; void dropEvent(QDropEvent *event) override; void keyPressEvent(QKeyEvent *event) override; void insertFromMimeData(const QMimeData *source) override; void contextMenuEvent(QContextMenuEvent *event) override; private slots: void onTextChanged(); private: QStringList m_imagePaths; QMap m_imageResourceMap; // 图片路径到资源名称的映射 void processImageData(const QByteArray &imageData, const QString &format = "PNG"); bool isImageFormat(const QString &fileName) const; QString saveImageToTemp(const QPixmap &pixmap, const QString &format = "PNG"); void insertImageIntoDocument(const QString &imagePath); QString generateResourceName(const QString &imagePath); }; class ChatWindow : public QWidget { Q_OBJECT public: ChatWindow(WebSocketClient *webSocketClient, QWidget *parent = nullptr); void initWebsocket(const QString &roomId); protected: void closeEvent(QCloseEvent *event) override; signals: void windowCloseRequested(); private slots: void onSendClicked(); void onImageClicked(); void onFileClicked(); void onRecallClicked(); void onInputContentChanged(); void onImageInserted(const QString &imagePath); void onQuickButtonClicked(); void onStreamNotification(bool show); void hideQuickButtons(); void onStreamButtonClicked(); private: ChatView *m_messageView; MultiFormatInputEdit *m_inputEdit; QPushButton *m_sendButton; QPushButton *m_imageButton; QPushButton *m_fileButton; QPushButton *m_streamButton; QButtonGroup *m_quickButtonGroup; QWidget *m_quickButtonContainer; QTimer *m_hideTimer; QString m_roomId; WebSocketClient *m_webSocketClient; void setupUI(); void setupInputArea(); void connectSignals(); void sendMessage(); void sendImageMessage(const QString &imagePath, const QString &text = QString()); bool validateInput() const; void showQuickButtons(); void setQuickButtonsVisible(bool visible); }; #endif // CHATWINDOW_H