#include "settingspage.h" #include "utils/Constants.h" #include #include #include #include #include #include #include #include #include #include #include #include "ElaLineEdit.h" #include "ElaComboBox.h" #include "ElaPushButton.h" #include "src/utils/configmanager.h" SettingsPage::SettingsPage(QWidget *parent) : QWidget(parent) { initUI(); loadSettings(); } SettingsPage::~SettingsPage() { } void SettingsPage::initUI() { QVBoxLayout *layout = new QVBoxLayout(this); layout->setContentsMargins(30, 30, 30, 30); layout->setSpacing(20); // ========================================== // 第一部分:环境配置 // ========================================== QGroupBox *envBox = new QGroupBox("环境配置"); QVBoxLayout *envLayout = new QVBoxLayout(envBox); envLayout->setSpacing(15); // UFT30项目环境路径 QHBoxLayout *uft30Layout = new QHBoxLayout; QLabel *uft30Label = new QLabel("UFT30项目环境路径:"); uft30Label->setMinimumWidth(160); m_uft30PathEdit = new ElaLineEdit; ElaPushButton *uft30Btn = new ElaPushButton("浏览..."); connect(uft30Btn, &QPushButton::clicked, this, &SettingsPage::onSelectUFT30Path); uft30Layout->addWidget(uft30Label); uft30Layout->addWidget(m_uft30PathEdit); uft30Layout->addWidget(uft30Btn); envLayout->addLayout(uft30Layout); // UF20项目环境路径 QHBoxLayout *uf20Layout = new QHBoxLayout; QLabel *uf20Label = new QLabel("UF20项目环境路径:"); uf20Label->setMinimumWidth(160); m_uf20PathEdit = new ElaLineEdit; ElaPushButton *uf20Btn = new ElaPushButton("浏览..."); connect(uf20Btn, &QPushButton::clicked, this, &SettingsPage::onSelectUF20Path); uf20Layout->addWidget(uf20Label); uf20Layout->addWidget(m_uf20PathEdit); uf20Layout->addWidget(uf20Btn); envLayout->addLayout(uf20Layout); // UF20账户项目环境路径 QHBoxLayout *uf20AccountLayout = new QHBoxLayout; QLabel *uf20AccountLabel = new QLabel("UF20账户项目环境路径:"); uf20AccountLabel->setMinimumWidth(160); m_uf20AccountPathEdit = new ElaLineEdit; ElaPushButton *uf20AccountBtn = new ElaPushButton("浏览..."); connect(uf20AccountBtn, &QPushButton::clicked, this, &SettingsPage::onSelectUF20AccountPath); uf20AccountLayout->addWidget(uf20AccountLabel); uf20AccountLayout->addWidget(m_uf20AccountPathEdit); uf20AccountLayout->addWidget(uf20AccountBtn); envLayout->addLayout(uf20AccountLayout); // 转码生成路径 QHBoxLayout *outputLayout = new QHBoxLayout; QLabel *outputLabel = new QLabel("转码生成路径:"); outputLabel->setMinimumWidth(160); m_outputPathEdit = new ElaLineEdit; ElaPushButton *outputBtn = new ElaPushButton("浏览..."); connect(outputBtn, &QPushButton::clicked, this, &SettingsPage::onSelectOutputPath); outputLayout->addWidget(outputLabel); outputLayout->addWidget(m_outputPathEdit); outputLayout->addWidget(outputBtn); envLayout->addLayout(outputLayout); layout->addWidget(envBox); // ========================================== // 第二部分:系统配置 // ========================================== QGroupBox *systemBox = new QGroupBox("系统配置"); QVBoxLayout *systemLayout = new QVBoxLayout(systemBox); systemLayout->setSpacing(15); // 主题切换 QHBoxLayout *themeLayout = new QHBoxLayout; QLabel *themeLabel = new QLabel("主题模式:"); themeLabel->setMinimumWidth(160); m_themeCombo = new ElaComboBox; m_themeCombo->addItems({"日间模式", "夜间模式"}); m_themeCombo->setMinimumWidth(150); connect(m_themeCombo, QOverload::of(&QComboBox::currentIndexChanged), this, &SettingsPage::onThemeChanged); themeLayout->addWidget(themeLabel); themeLayout->addWidget(m_themeCombo); themeLayout->addStretch(); systemLayout->addLayout(themeLayout); layout->addWidget(systemBox); // ========================================== // 底部按钮 // ========================================== QHBoxLayout *btnLayout = new QHBoxLayout; ElaPushButton *saveBtn = new ElaPushButton("保存设置"); connect(saveBtn, &QPushButton::clicked, this, &SettingsPage::onSaveSettings); ElaPushButton *resetBtn = new ElaPushButton("恢复默认"); connect(resetBtn, &QPushButton::clicked, this, &SettingsPage::onResetSettings); btnLayout->addStretch(); btnLayout->addWidget(saveBtn); btnLayout->addWidget(resetBtn); layout->addLayout(btnLayout); // 添加弹性空间 layout->addStretch(); } void SettingsPage::loadSettings() { loadFromConfigIni(); QSettings settings("UFT30", "ChangeCode"); QString theme = settings.value("Theme", "日间模式").toString(); int index = m_themeCombo->findText(theme); if (index >= 0) { m_themeCombo->setCurrentIndex(index); } } QString SettingsPage::getConfigIniPath() { return Constants::configIni(); } bool SettingsPage::isValidUtf8(const QByteArray &data) { QString test = QString::fromUtf8(data); return test.toUtf8() == data; } void SettingsPage::loadFromConfigIni() { QString iniPath = getConfigIniPath(); if (!QFile::exists(iniPath)) { return; } QFile file(iniPath); if (!file.open(QIODevice::ReadOnly)) { return; } QByteArray data = file.readAll(); file.close(); QString content; if (isValidUtf8(data)) { content = QString::fromUtf8(data); } else { content = QString::fromLocal8Bit(data); } bool inProjectPath = false; const QStringList lines = content.split('\n'); for (const QString &rawLine : lines) { QString line = rawLine.trimmed(); if (line.startsWith('[')) { inProjectPath = (line == "[projectPath]"); continue; } if (!inProjectPath || line.isEmpty() || line.startsWith(';') || line.startsWith('#')) { continue; } int eqPos = line.indexOf('='); if (eqPos < 0) continue; QString key = line.left(eqPos).trimmed(); QString value = line.mid(eqPos + 1).trimmed(); value.replace("/", "\\"); if (key == "uft30") m_uft30PathEdit->setText(value); else if (key == "uf20") m_uf20PathEdit->setText(value); else if (key == "ufAcct20") m_uf20AccountPathEdit->setText(value); else if (key == "createPath") m_outputPathEdit->setText(value); } } void SettingsPage::saveToConfigIni() { QString iniPath = getConfigIniPath(); QString content; bool isUtf8 = true; if (QFile::exists(iniPath)) { QFile file(iniPath); if (file.open(QIODevice::ReadOnly)) { QByteArray data = file.readAll(); file.close(); isUtf8 = isValidUtf8(data); if (isUtf8) { content = QString::fromUtf8(data); } else { content = QString::fromLocal8Bit(data); } } } auto toWinPath = [](const QString &p) -> QString { return p.trimmed().replace("/", "\\"); }; QString uft30Val = toWinPath(m_uft30PathEdit->text()); QString uf20Val = toWinPath(m_uf20PathEdit->text()); QString ufAcct20Val = toWinPath(m_uf20AccountPathEdit->text()); QString createPathVal = toWinPath(m_outputPathEdit->text()); bool inProjectPath = false; QStringList newLines; QSet updatedKeys; QStringList lines = content.split('\n'); for (int i = 0; i < lines.size(); ++i) { QString line = lines[i]; QString trimmed = line.trimmed(); if (trimmed.startsWith('[')) { inProjectPath = (trimmed == "[projectPath]"); newLines << line; continue; } if (trimmed.startsWith("uft30pub=")) { int eqPos = trimmed.indexOf('='); QString pathValue = trimmed.mid(eqPos + 1); int pubIndex = pathValue.indexOf("\\upub"); if (pubIndex >= 0) { QString pubSuffix = pathValue.mid(pubIndex); QString newPath = uft30Val + pubSuffix; newLines << ("uft30pub=" + newPath); continue; } } if (inProjectPath && !trimmed.isEmpty() && !trimmed.startsWith(';') && !trimmed.startsWith('#')) { int eqPos = trimmed.indexOf('='); if (eqPos > 0) { QString key = trimmed.left(eqPos).trimmed(); if (key == "uft30") { newLines << ("uft30=" + uft30Val); updatedKeys.insert(key); continue; } else if (key == "uf20") { newLines << ("uf20=" + uf20Val); updatedKeys.insert(key); continue; } else if (key == "ufAcct20") { newLines << ("ufAcct20=" + ufAcct20Val); updatedKeys.insert(key); continue; } else if (key == "createPath") { newLines << ("createPath=" + createPathVal); updatedKeys.insert(key); continue; } } } newLines << line; } bool hasProjectPath = content.contains("[projectPath]"); if (!hasProjectPath) { if (!newLines.isEmpty() && !newLines.last().isEmpty()) { newLines << ""; } newLines << "[projectPath]"; newLines << ("uft30=" + uft30Val); newLines << ("uf20=" + uf20Val); newLines << ("ufAcct20=" + ufAcct20Val); newLines << ("createPath=" + createPathVal); } QFile outFile(iniPath); if (outFile.open(QIODevice::WriteOnly | QIODevice::Truncate)) { QByteArray outData; if (isUtf8) { outData = newLines.join("\n").toUtf8(); } else { outData = newLines.join("\n").toLocal8Bit(); } outFile.write(outData); outFile.close(); } } void SettingsPage::onSaveSettings() { QSettings settings("UFT30", "ChangeCode"); settings.setValue("Theme", m_themeCombo->currentText()); ConfigManager* configManager = ConfigManager::instance(); QString uft30Val = m_uft30PathEdit->text().trimmed().replace("/", "\\"); QString uf20Val = m_uf20PathEdit->text().trimmed().replace("/", "\\"); QString ufAcct20Val = m_uf20AccountPathEdit->text().trimmed().replace("/", "\\"); QString createPathVal = m_outputPathEdit->text().trimmed().replace("/", "\\"); configManager->setValue("projectPath", "uft30", uft30Val); configManager->setValue("projectPath", "uf20", uf20Val); configManager->setValue("projectPath", "ufAcct20", ufAcct20Val); configManager->setValue("projectPath", "createPath", createPathVal); QString uft30PubVal = uft30Val + "\\upub\\dev_codes"; configManager->setValue("projectPath", "uft30pub", uft30PubVal); configManager->saveConfig(); QMessageBox::information(this, "保存成功", "配置已保存!"); } void SettingsPage::onResetSettings() { QMessageBox::StandardButton reply; reply = QMessageBox::question(this, "确认重置", "确定要恢复所有默认设置吗?", QMessageBox::Yes | QMessageBox::No); if (reply == QMessageBox::Yes) { m_uft30PathEdit->clear(); m_uf20PathEdit->clear(); m_uf20AccountPathEdit->clear(); m_outputPathEdit->clear(); m_themeCombo->setCurrentIndex(0); saveToConfigIni(); QSettings settings("UFT30", "ChangeCode"); settings.clear(); QMessageBox::information(this, "重置成功", "已恢复默认设置!"); } } void SettingsPage::onSelectUFT30Path() { QString dir = QFileDialog::getExistingDirectory(this, "选择UFT30项目环境路径", m_uft30PathEdit->text()); if (!dir.isEmpty()) { m_uft30PathEdit->setText(dir); } } void SettingsPage::onSelectUF20Path() { QString dir = QFileDialog::getExistingDirectory(this, "选择UF20项目环境路径", m_uf20PathEdit->text()); if (!dir.isEmpty()) { m_uf20PathEdit->setText(dir); } } void SettingsPage::onSelectUF20AccountPath() { QString dir = QFileDialog::getExistingDirectory(this, "选择UF20账户项目环境路径", m_uf20AccountPathEdit->text()); if (!dir.isEmpty()) { m_uf20AccountPathEdit->setText(dir); } } void SettingsPage::onSelectOutputPath() { QString dir = QFileDialog::getExistingDirectory(this, "选择转码生成路径", m_outputPathEdit->text()); if (!dir.isEmpty()) { m_outputPathEdit->setText(dir); } } void SettingsPage::onThemeChanged() { }