195 lines
7.2 KiB
C++
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("设置"));
|
|
}
|
|
} |