ctai/src/ctaiSessionWidget.cpp
JackLee 5247485491 1-调整类名和类文件名
2-给公式显示svg增加边距
3-增加字体和字号功能(未实装)
2025-03-09 18:29:30 +08:00

195 lines
7.2 KiB
C++

#include "ctaiSessionWidget.h"
ctaiSessionWidget::ctaiSessionWidget()
{
init_layout();
connect_signals();
}
ctaiSessionWidget::~ctaiSessionWidget()
{
for (auto* s : m_session_map) {
if (s) {
delete s->session_info;
delete s;
}
}
m_session_map.clear();
}
void ctaiSessionWidget::init_layout()
{
m_session_layout = new QHBoxLayout();
m_session_table_btn_layout = new QVBoxLayout();
splitter = new QSplitter(Qt::Horizontal);
m_table_widget = new QWidget();
m_info_widget = new QWidget();
// 会话列表顶部按钮布局
m_session_btn_layout = new QHBoxLayout();
m_btn_new_chat = new QPushButton(tr("新建"));
m_btn_new_chat->setObjectName("m_new_chat_btn");
m_btn_new_chat->setIcon(QIcon(":/res/img/btn/btn_new_chat.png"));
m_btn_set_chat = new QPushButton(tr("设置"));
m_btn_set_chat->setObjectName("m_btn_set_chat");
m_btn_set_chat->setIcon(QIcon(":/res/img/btn/btn_setting.png"));
m_btn_del_chat = new QPushButton("删除");
m_btn_del_chat->setObjectName("m_btn_del_chat");
m_btn_del_chat->setIcon(QIcon(tr(":/res/img/btn/btn_delete_chat.png")));
m_session_btn_layout->addWidget(m_btn_new_chat);
m_session_btn_layout->addWidget(m_btn_set_chat);
m_session_btn_layout->addWidget(m_btn_del_chat);
m_session_btn_layout->setContentsMargins(0, 0, 0, 0);
// 会话列表布局
m_session_table_layout = new QHBoxLayout();
m_session_table = new QTableWidget();
// 初始化设置界面
m_session_setting = new ctaiSessionSetting();
m_session_setting->hide(); // 初始时隐藏设置界面
is_setting_visible = false;
m_session_table->setColumnCount(1); // 设置列数为1
m_session_table->setSelectionBehavior(QAbstractItemView::SelectRows); // 整行选中
m_session_table->setSelectionMode(QAbstractItemView::SingleSelection); // 单行选择
m_session_table->verticalHeader()->hide(); // 隐藏行号
m_session_table->horizontalHeader()->hide(); // 隐藏表头
m_session_table->horizontalHeader()->setStretchLastSection(true); // 让列自动填充宽度
m_session_table->verticalHeader()->setDefaultSectionSize(40); // 设置默认行高
m_session_table->setStyleSheet("QTableWidget::item { padding: 8px; }"); // 设置内边距
m_session_table->setEditTriggers(QAbstractItemView::DoubleClicked |
QAbstractItemView::EditKeyPressed); // 允许编辑
m_session_table_layout->addWidget(m_session_table);
m_session_table_layout->addWidget(m_session_setting);
m_session_table_layout->setContentsMargins(0, 0, 0, 0);
// 会话列表和按钮总布局
m_session_table_btn_layout->addLayout(m_session_btn_layout);
m_session_table_btn_layout->addLayout(m_session_table_layout);
m_session_table_btn_layout->setStretch(1, 10);
m_session_table_btn_layout->setContentsMargins(0, 0, 0, 0);
m_table_widget->setLayout(m_session_table_btn_layout);
// 会话信息布局
m_session_info_layout = new QHBoxLayout();
m_session_info_layout->addItem(sparcer_item);
m_session_info_layout->setContentsMargins(0, 0, 0, 0);
m_info_widget->setLayout(m_session_info_layout);
// 窗口主布局
splitter->addWidget(m_table_widget);
splitter->addWidget(m_info_widget);
splitter->setSizes({80, 920});
m_session_layout->addWidget(splitter);
m_session_layout->setContentsMargins(0, 0, 0, 0);
setLayout(m_session_layout);
}
void ctaiSessionWidget::connect_signals()
{
// 连接信号槽
connect(m_btn_new_chat, SIGNAL(clicked()), this, SLOT(on_new_chat_clicked()));
connect(m_btn_set_chat, SIGNAL(clicked()), this, SLOT(on_set_chat_clicked()));
connect(m_btn_del_chat, SIGNAL(clicked()), this, SLOT(on_del_chat_clicked()));
connect(m_session_table, &QTableWidget::currentCellChanged,
this, [this](int currentRow, int currentCol, int, int) {
on_session_selected(currentRow, currentCol);
});
// 连接表格项目编辑完成信号
connect(m_session_table, &QTableWidget::itemChanged,
this, &ctaiSessionWidget::on_session_name_changed);
}
void ctaiSessionWidget::on_new_chat_clicked()
{
// 生成唯一会话ID
QString session_id = QUuid::createUuid().toString(QUuid::WithoutBraces);
// 创建新的session对象
session* new_session = new session();
new_session->session_id = session_id;
new_session->session_name = tr("新会话");
new_session->session_type = "chat";
new_session->session_info = new ctaiSessionInfo();
// 添加到vector中
m_session_map.push_back(new_session);
// 添加到表格中
int row = m_session_table->rowCount();
m_session_table->insertRow(row);
QTableWidgetItem* nameItem = new QTableWidgetItem(new_session->session_name);
m_session_table->setItem(row, 0, nameItem);
// 更新会话信息显示
m_session_info_layout->addWidget(new_session->session_info);
// 选中新创建的行
m_session_table->selectRow(row);
if (m_session_info_layout->count() > 0) {
// 移除弹簧
m_session_info_layout->removeItem(sparcer_item);
}
}
void ctaiSessionWidget::on_del_chat_clicked()
{
int currentRow = m_session_table->currentRow();
if (currentRow < 0 || currentRow >= m_session_map.size()) {
QMessageBox::warning(this, tr("警告"), tr("请先选择要删除的会话"));
return;
}
// 删除session对象
session* current_session = m_session_map[currentRow];
m_session_map.erase(m_session_map.begin() + currentRow);
delete current_session->session_info;
delete current_session;
// 从表格中删除
m_session_table->removeRow(currentRow);
}
void ctaiSessionWidget::on_session_selected(int currentRow, int currentColumn)
{
if (currentRow < 0 || currentRow >= m_session_map.size()) return;
// 获取选中的会话
session* current_session = m_session_map[currentRow];
// 清理当前布局
while (QLayoutItem* item = m_session_info_layout->takeAt(0)) {
if (QWidget* widget = item->widget()) {
widget->hide();
}
delete item;
}
// 显示新的会话信息
if (current_session && current_session->session_info) {
m_session_info_layout->addWidget(current_session->session_info);
current_session->session_info->show();
}
}
void ctaiSessionWidget::on_session_name_changed(QTableWidgetItem* item)
{
if (!item) return;
int row = item->row();
if (row < 0 || row >= m_session_map.size()) return;
// 更新 session 对象中的名称
session* current_session = m_session_map[row];
if (current_session) {
current_session->session_name = item->text();
}
}
void ctaiSessionWidget::on_set_chat_clicked()
{
is_setting_visible = !is_setting_visible;
if (is_setting_visible) {
m_session_table->hide();
m_session_setting->show();
m_btn_set_chat->setText(tr("返回"));
} else {
m_session_setting->hide();
m_session_table->show();
m_btn_set_chat->setText(tr("设置"));
}
}