GrabBag/App/BeltTearing/BeltTearingApp/dialognetconfig.cpp

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, "警告", "未找到要删除的服务器");
}
}