// ctaitextedit.h #ifndef CTAI_TEXTEDIT_H #define CTAI_TEXTEDIT_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "ctai_base.h" #include "ctai_parsestring.h" #define MD4QT_QT_SUPPORT #include <3rdparty/md4qt/md4qt/parser.h> #include <3rdparty/md4qt/md4qt/html.h> typedef struct tokens_args{ QString prompt_tokens={}; QString completion_tokens={}; QString total_tokens={}; QString cache_hit_tokens={}; QString cache_miss_tokens={}; }tokens_data; class ctai_textedit : public QWidget { Q_OBJECT public: ctai_textedit(msg_type msg_type_mode); ~ctai_textedit(); void add_message(const model_data &message); int get_content_height() const; private slots: void on_delete_clicked(); // 删除按钮 void on_copy_clicked(); // 复制按钮 void on_save_clicked(); // 保存按钮 void on_menu_clicked(); // 菜单按钮 void on_fold_clicked(); // 折叠按钮 void on_tokens_clicked(); // tokens按钮 signals: void delete_requested(); // 请求删除此消息 private: void init_layout(msg_type msg_type_mode); void connect_signals(msg_type msg_type_mode); // 连接信号和槽 private: QSpacerItem *sparcer_item = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Fixed); QVBoxLayout *mainLayout={}; QVBoxLayout *headerLayout={}; QHBoxLayout *header_info_Layout={}; QVBoxLayout *historyLayout={}; QHBoxLayout *header_opts_Layout={}; QPushButton *m_msg_header_ico={}; QLineEdit *m_msg_header={}; QTextEdit *m_msg_history={}; QPushButton *m_msg_del={}; QPushButton *m_msg_copy={}; QPushButton *m_msg_save={}; QPushButton *m_msg_menu={}; QPushButton *m_msg_fold={}; // 折叠按钮 QPushButton *m_msg_tokens={}; QMenu *m_msg_tokens_menu={}; QAction *m_menu_prompt_tokens={}; QAction *m_menu_completion_tokens={}; QAction *m_menu_total_tokens={}; QAction *m_menu_cache_hit_tokens={}; QAction *m_menu_cache_miss_tokens={}; bool m_is_folded = false; // 折叠状态 tokens_data m_tokens_data; QSpacerItem *bottom_spacer = new QSpacerItem(0, 0, QSizePolicy::Fixed, QSizePolicy::Expanding); }; #endif // CTAI_TEXTEDIT_H