244 lines
7.9 KiB
C++
244 lines
7.9 KiB
C++
#include "dialognetconfig.h"
|
|
#include "ui_dialognetconfig.h"
|
|
#include "IVrBeltTearingConfig.h"
|
|
#include "PathManager.h"
|
|
#include <QRegExp>
|
|
#include <QTextCodec>
|
|
#include <QJsonObject>
|
|
#include <QJsonDocument>
|
|
#include "StyledMessageBox.h"
|
|
#include <QShowEvent>
|
|
|
|
DialogNetConfig::DialogNetConfig(QWidget *parent)
|
|
: QDialog(parent)
|
|
, ui(new Ui::DialogNetConfig)
|
|
, m_config(nullptr)
|
|
{
|
|
// 设置窗口标志,隐藏标题栏并使窗口成为模态对话框
|
|
// setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);
|
|
setModal(true);
|
|
|
|
ui->setupUi(this);
|
|
|
|
// 创建配置实例
|
|
IVrBeltTearingConfig::CreateInstance(&m_config);
|
|
|
|
// 连接信号和槽
|
|
connect(ui->btn_camer_ok, &QPushButton::clicked, this, &DialogNetConfig::onSaveConfig);
|
|
connect(ui->btn_camer_cancel, &QPushButton::clicked, this, &DialogNetConfig::onCancel);
|
|
connect(ui->pushButton_2, &QPushButton::clicked, this, &DialogNetConfig::onRemoveServer);
|
|
|
|
// 加载配置
|
|
loadConfig();
|
|
}
|
|
|
|
void DialogNetConfig::showEvent(QShowEvent *event)
|
|
{
|
|
// 调用基类的showEvent
|
|
QDialog::showEvent(event);
|
|
|
|
// 每次显示时重新加载配置
|
|
loadConfig();
|
|
}
|
|
|
|
DialogNetConfig::~DialogNetConfig()
|
|
{
|
|
if (m_config) {
|
|
delete m_config;
|
|
m_config = nullptr;
|
|
}
|
|
delete ui;
|
|
}
|
|
|
|
void DialogNetConfig::loadConfig()
|
|
{
|
|
if (!m_config) {
|
|
return;
|
|
}
|
|
|
|
QString configPath = PathManager::GetConfigFilePath();
|
|
BeltTearingConfigResult configResult = m_config->LoadConfig(configPath.toStdString());
|
|
|
|
// 清空组合框
|
|
ui->combo_server->clear();
|
|
|
|
// 添加服务器到组合框,并将索引作为用户数据存储
|
|
for (size_t i = 0; i < configResult.servers.size(); ++i) {
|
|
const auto& server = configResult.servers[i];
|
|
ui->combo_server->addItem(QString::fromStdString(server.name), static_cast<int>(i));
|
|
}
|
|
|
|
// 添加"新增"选项
|
|
ui->combo_server->addItem("新增", -1);
|
|
|
|
// 如果有服务器,选择第一个并加载其配置
|
|
if (!configResult.servers.empty()) {
|
|
ui->combo_server->setCurrentIndex(0);
|
|
const ServerInfo& server = configResult.servers[0];
|
|
ui->lineEdit_name->setText(QString::fromStdString(server.name));
|
|
ui->lineEdit_ip->setText(QString::fromStdString(server.ip));
|
|
ui->lineEdit_port->setText(QString::number(server.port));
|
|
}
|
|
|
|
// 连接组合框的信号和槽
|
|
connect(ui->combo_server, &QComboBox::currentTextChanged, this, &DialogNetConfig::onServerSelectionChanged);
|
|
}
|
|
|
|
void DialogNetConfig::onServerSelectionChanged(const QString& text)
|
|
{
|
|
if (!m_config) {
|
|
return;
|
|
}
|
|
|
|
// 如果选择的是"新增",则清空输入框
|
|
if (text == "新增") {
|
|
ui->lineEdit_name->clear();
|
|
ui->lineEdit_ip->clear();
|
|
ui->lineEdit_port->clear();
|
|
ui->lineEdit_name->setFocus();
|
|
return;
|
|
}
|
|
|
|
QString configPath = PathManager::GetConfigFilePath();
|
|
BeltTearingConfigResult configResult = m_config->LoadConfig(configPath.toStdString());
|
|
|
|
// 获取当前选中项的索引
|
|
int index = ui->combo_server->currentData().toInt();
|
|
|
|
// 检查索引是否有效
|
|
if (index >= 0 && index < static_cast<int>(configResult.servers.size())) {
|
|
const ServerInfo& server = configResult.servers[index];
|
|
ui->lineEdit_name->setText(QString::fromStdString(server.name));
|
|
ui->lineEdit_ip->setText(QString::fromStdString(server.ip));
|
|
ui->lineEdit_port->setText(QString::number(server.port));
|
|
}
|
|
}
|
|
|
|
void DialogNetConfig::onSaveConfig()
|
|
{
|
|
if (!m_config) {
|
|
return;
|
|
}
|
|
|
|
QString configPath = PathManager::GetConfigFilePath();
|
|
BeltTearingConfigResult configResult = m_config->LoadConfig(configPath.toStdString());
|
|
|
|
// 获取当前输入的服务器信息
|
|
QString inputName = ui->lineEdit_name->text();
|
|
QString inputIp = ui->lineEdit_ip->text();
|
|
int inputPort = ui->lineEdit_port->text().toInt();
|
|
|
|
// 检查输入的名称是否为空
|
|
if (inputName.isEmpty()) {
|
|
StyledMessageBox::warning(this, "警告", "服务器名称不能为空");
|
|
return;
|
|
}
|
|
|
|
// 检查IP地址是否为空
|
|
if (inputIp.isEmpty()) {
|
|
StyledMessageBox::warning(this, "警告", "服务器IP地址不能为空");
|
|
return;
|
|
}
|
|
|
|
// 检查IP地址格式是否正确
|
|
QRegExp ipRegex("^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])$");
|
|
if (!ipRegex.exactMatch(inputIp)) {
|
|
StyledMessageBox::warning(this, "警告", "服务器IP地址格式不正确");
|
|
return;
|
|
}
|
|
|
|
// 检查端口是否为空或无效
|
|
if (ui->lineEdit_port->text().isEmpty() || inputPort <= 0 || inputPort > 65535) {
|
|
StyledMessageBox::warning(this, "警告", "端口号必须在1-65535之间");
|
|
return;
|
|
}
|
|
|
|
// 获取当前选中的服务器名称
|
|
QString selectedName = ui->combo_server->currentText();
|
|
|
|
// 如果当前没有选中服务器或选中的服务器名称与输入的名称不同,则添加新服务器
|
|
if (selectedName.isEmpty() || selectedName == "新增") {
|
|
ServerInfo newServer;
|
|
newServer.name = inputName.toStdString();
|
|
newServer.ip = inputIp.toStdString();
|
|
newServer.port = inputPort;
|
|
configResult.servers.push_back(newServer);
|
|
} else {
|
|
// 更新当前选中的服务器配置
|
|
for (auto& server : configResult.servers) {
|
|
QString serverName = QString::fromStdString(server.name);
|
|
if (serverName == selectedName) {
|
|
server.name = inputName.toStdString();
|
|
server.ip = inputIp.toStdString();
|
|
server.port = inputPort;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// 保存配置
|
|
bool success = m_config->SaveConfig(configPath.toStdString(), configResult);
|
|
if (success) {
|
|
StyledMessageBox::information(this, "提示", "配置保存成功");
|
|
|
|
// 通知主窗口重新初始化
|
|
emit configSaved();
|
|
|
|
// 关闭对话框
|
|
this->accept();
|
|
} else {
|
|
StyledMessageBox::critical(this, "错误", "配置保存失败");
|
|
}
|
|
}
|
|
|
|
void DialogNetConfig::onCancel()
|
|
{
|
|
this->reject();
|
|
}
|
|
|
|
|
|
void DialogNetConfig::onRemoveServer()
|
|
{
|
|
if (!m_config) {
|
|
return;
|
|
}
|
|
|
|
QString selectedName = ui->combo_server->currentText();
|
|
if (selectedName.isEmpty()) {
|
|
StyledMessageBox::warning(this, "警告", "请选择要删除的服务器");
|
|
return;
|
|
}
|
|
|
|
// 不能删除"新增"选项
|
|
if (selectedName == "新增") {
|
|
StyledMessageBox::warning(this, "警告", "不能删除\"新增\"选项");
|
|
return;
|
|
}
|
|
|
|
QString configPath = PathManager::GetConfigFilePath();
|
|
BeltTearingConfigResult configResult = m_config->LoadConfig(configPath.toStdString());
|
|
|
|
// 获取当前选中项的索引
|
|
int index = ui->combo_server->currentData().toInt();
|
|
|
|
// 检查索引是否有效
|
|
if (index >= 0 && index < static_cast<int>(configResult.servers.size())) {
|
|
// 删除指定索引的服务器
|
|
configResult.servers.erase(configResult.servers.begin() + index);
|
|
|
|
// 保存配置
|
|
bool success = m_config->SaveConfig(configPath.toStdString(), configResult);
|
|
if (success) {
|
|
StyledMessageBox::information(this, "提示", "服务器删除成功");
|
|
|
|
// 重新加载配置
|
|
loadConfig();
|
|
} else {
|
|
StyledMessageBox::critical(this, "错误", "服务器删除失败");
|
|
}
|
|
} else {
|
|
StyledMessageBox::warning(this, "警告", "未找到要删除的服务器");
|
|
}
|
|
}
|
|
|