diff --git a/src/QvCoreConfigOperations.h b/src/QvCoreConfigOperations.h index 9b72e415..a84ef830 100644 --- a/src/QvCoreConfigOperations.h +++ b/src/QvCoreConfigOperations.h @@ -10,6 +10,8 @@ #define DROOT QJsonObject root; #define RROOT return root; +#define JSON_ROOT_TRY_REMOVE(obj) if (root.contains(obj)) { root.remove(obj); } + namespace Qv2ray { namespace ConfigOperations @@ -32,15 +34,24 @@ namespace Qv2ray // // Misc template - QJsonObject GetRootObject(T out); + QJsonObject GetRootObject(T t) + { + auto json = StructToJSON(t); + QJsonDocument doc = QJsonDocument::fromJson(QByteArray::fromStdString(json.toStdString())); + return doc.object(); + } + template QJsonObject GetRootObject(StreamSettingsObject t); + template QJsonObject GetRootObject(VMessOut t); // // -------------------------- BEGIN CONFIG VALIDATIONS --------------------------------------------- int VerifyVMessProtocolString(QString vmess); + // // -------------------------- BEGIN CONFIG CONVERSIONS --------------------------------------------- // Save Connection Config int SaveConnectionConfig(QJsonObject obj, const QString *alias); // VMess Protocol - QJsonObject ConvertOutboundFromVMessString(QString vmess); + QJsonObject ConvertConfigFromVMessString(QString vmess); + QJsonObject ConvertConfigFromFile(QString sourceFilePath, bool overrideInbounds); } } diff --git a/src/QvCoreConfigOperations_Convertion.cpp b/src/QvCoreConfigOperations_Convertion.cpp index ccca8a7a..d849f5d9 100644 --- a/src/QvCoreConfigOperations_Convertion.cpp +++ b/src/QvCoreConfigOperations_Convertion.cpp @@ -17,5 +17,112 @@ namespace Qv2ray SaveStringToFile(doc.toJson(), &config); return 0; } + + // This generates an "OutBoundObject" + QJsonObject ConvertConfigFromVMessString(QString str) + { + DROOT + QStringRef vmessJsonB64(&str, 8, str.length() - 8); + auto vmessConf = StructFromJSON(Base64Decode(vmessJsonB64.toString()).toStdString()); + VMessOut vConf; + VMessOut::ServerObject serv; + serv.port = stoi(vmessConf.port); + serv.address = vmessConf.add; + // User + VMessOut::ServerObject::UserObject user; + user.id = vmessConf.id; + user.alterId = stoi(vmessConf.aid); + // Server + serv.users.push_back(user); + // VMess root config + vConf.vnext.push_back(serv); + // + // Stream Settings + StreamSettingsObject streaming; + + // Fill hosts for HTTP + foreach (auto host, QString::fromStdString(vmessConf.host).split(',')) { + streaming.httpSettings.host.push_back(host.toStdString()); + } + + // hosts for ws, h2 and security for QUIC + streaming.wsSettings.headers.insert(make_pair("Host", vmessConf.host)); + streaming.quicSettings.security = vmessConf.host; + // + // Fake type for tcp, kcp and QUIC + streaming.tcpSettings.header.type = vmessConf.type; + streaming.kcpSettings.header.type = vmessConf.type; + streaming.quicSettings.header.type = vmessConf.type; + // + // Path for ws, h2, Quic + streaming.wsSettings.path = vmessConf.path; + streaming.httpSettings.path = vmessConf.path; + streaming.quicSettings.key = vmessConf.path; + streaming.security = vmessConf.tls; + // + // Network type + streaming.network = vmessConf.net; + // + // Root + root.insert("sendThrough", "0.0.0.0"); + root.insert("protocol", "vmess"); + root.insert("settings", GetRootObject(vConf)); + root.insert("tag", OUTBOUND_TAG_PROXY); + root.insert("streamSettings", GetRootObject(streaming)); + root.insert("QV2RAY_ALIAS", QString::fromStdString(vmessConf.ps)); + RROOT + } + + QJsonObject ConvertConfigFromFile(QString sourceFilePath, bool overrideInbounds) + { + auto globalConf = GetGlobalConfig(); + QFile configFile(sourceFilePath); + configFile.open(QIODevice::ReadOnly | QIODevice::ExistingOnly); + QByteArray allData = configFile.readAll(); + configFile.close(); + QJsonDocument v2conf = QJsonDocument::fromJson(allData); + QJsonObject root = v2conf.object(); + + if (overrideInbounds) { + JSON_ROOT_TRY_REMOVE("inbounds") + } + + // + JSON_ROOT_TRY_REMOVE("log") + JSON_ROOT_TRY_REMOVE("api") + JSON_ROOT_TRY_REMOVE("stats") + JSON_ROOT_TRY_REMOVE("policy") + JSON_ROOT_TRY_REMOVE("dns") + // + return root; + } + /* + * { + QFile configFile(path); + + if (!configFile.open(QIODevice::ReadOnly)) { + QvMessageBox(this, tr("ImportConfig"), tr("CannotOpenFile")); + qDebug() << "ImportConfig::CannotOpenFile"; + return -1; + } + + QByteArray allData = configFile.readAll(); + configFile.close(); + QJsonDocument v2conf(QJsonDocument::fromJson(allData)); + QJsonObject rootobj = v2conf.object(); + QJsonObject outbound; + + if (rootobj.contains("outbounds")) { + outbound = rootobj.value("outbounds").toArray().first().toObject(); + } else { + outbound = rootobj.value("outbound").toObject(); + } + + if (!QFile::copy(path, "newFile")) { + QvMessageBox(this, tr("ImportConfig"), tr("CannotCopyCustomConfig")); + qDebug() << "ImportConfig::CannotCopyCustomConfig"; + } + } + */ } } diff --git a/src/QvCoreConfigOperations_Generation.cpp b/src/QvCoreConfigOperations_Generation.cpp index 48fc3dab..b0d50216 100644 --- a/src/QvCoreConfigOperations_Generation.cpp +++ b/src/QvCoreConfigOperations_Generation.cpp @@ -62,14 +62,6 @@ namespace Qv2ray RROOT } - template - QJsonObject GetRootObject(T out) - { - auto json = StructToJSON(out); - QJsonDocument doc = QJsonDocument::fromJson(QByteArray::fromStdString(json.toStdString())); - return doc.object(); - } - QJsonObject GenerateShadowSocksServerOUT(QString email, QString address, int port, QString method, QString password, bool ota, int level) { DROOT @@ -122,62 +114,6 @@ namespace Qv2ray JADD(auth, accounts, udp, ip, userLevel) RROOT } - - // This generates an "OutBoundObject" - QJsonObject ConvertOutboundFromVMessString(QString str) - { - DROOT - QStringRef vmessJsonB64(&str, 8, str.length() - 8); - auto vmessConf = StructFromJSON(Base64Decode(vmessJsonB64.toString()).toStdString()); - VMessOut vConf; - VMessOut::ServerObject serv; - serv.port = stoi(vmessConf.port); - serv.address = vmessConf.add; - // User - VMessOut::ServerObject::UserObject user; - user.id = vmessConf.id; - user.alterId = stoi(vmessConf.aid); - // Server - serv.users.push_back(user); - // VMess root config - vConf.vnext.push_back(serv); - // - // Stream Settings - StreamSettingsObject streaming; - - // Fill hosts for HTTP - foreach (auto host, QString::fromStdString(vmessConf.host).split(',')) { - streaming.httpSettings.host.push_back(host.toStdString()); - } - - // hosts for ws, h2 and security for QUIC - streaming.wsSettings.headers.insert(make_pair("Host", vmessConf.host)); - streaming.quicSettings.security = vmessConf.host; - // - // Fake type for tcp, kcp and QUIC - streaming.tcpSettings.header.type = vmessConf.type; - streaming.kcpSettings.header.type = vmessConf.type; - streaming.quicSettings.header.type = vmessConf.type; - // - // Path for ws, h2, Quic - streaming.wsSettings.path = vmessConf.path; - streaming.httpSettings.path = vmessConf.path; - streaming.quicSettings.key = vmessConf.path; - streaming.security = vmessConf.tls; - // - // Network type - streaming.network = vmessConf.net; - // - // Root - root.insert("sendThrough", "0.0.0.0"); - root.insert("protocol", "vmess"); - root.insert("settings", GetRootObject(vConf)); - root.insert("tag", OUTBOUND_TAG_PROXY); - root.insert("streamSettings", GetRootObject(streaming)); - root.insert("QV2RAY_ALIAS", QString::fromStdString(vmessConf.ps)); - RROOT - } - // -------------------------- END CONFIG GENERATIONS ------------------------------------------------------------------------------ } } diff --git a/src/QvCoreInteractions.cpp b/src/QvCoreInteractions.cpp index 78f62581..392f76b3 100644 --- a/src/QvCoreInteractions.cpp +++ b/src/QvCoreInteractions.cpp @@ -5,11 +5,14 @@ namespace Qv2ray { - bool Qv2Instance::checkConfigFile(const QString path) + bool Qv2Instance::VerifyVConfigFile(const QString path) { - if (checkCoreExe()) { + if (ValidateV2rayCoreExe()) { + QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); + env.insert("V2RAY_LOCATION_ASSET", QString::fromStdString(GetGlobalConfig().v2AssetsPath)); QProcess process; - process.start(QString::fromStdString(Utils::GetGlobalConfig().v2Path), QStringList() << "-test" + process.setProcessEnvironment(env); + process.start(QString::fromStdString(Utils::GetGlobalConfig().v2CorePath), QStringList() << "-test" << "-config" << path, QIODevice::ReadWrite | QIODevice::Text); @@ -37,9 +40,9 @@ namespace Qv2ray Status = STOPPED; } - bool Qv2Instance::checkCoreExe() + bool Qv2Instance::ValidateV2rayCoreExe() { - auto path = QString::fromStdString(Utils::GetGlobalConfig().v2Path); + auto path = QString::fromStdString(Utils::GetGlobalConfig().v2CorePath); if (!QFile::exists(path)) { Utils::QvMessageBox(nullptr, QObject::tr("CoreNotFound"), QObject::tr("CoreFileNotFoundExplainationAt:") + path); @@ -47,7 +50,7 @@ namespace Qv2ray } else return true; } - bool Qv2Instance::start() + bool Qv2Instance::Start() { if (Status != STOPPED) { return false; @@ -55,23 +58,28 @@ namespace Qv2ray Status = STARTING; - if (checkCoreExe()) { - if (checkConfigFile(QV2RAY_GENERATED_CONFIG_DIRPATH + "config.json")) { + if (ValidateV2rayCoreExe()) { + if (VerifyVConfigFile(QV2RAY_GENERATED_CONFIG_DIRPATH + "config.json")) { + QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); + env.insert("V2RAY_LOCATION_ASSET", QString::fromStdString(GetGlobalConfig().v2AssetsPath)); + vProcess->setProcessEnvironment(env); + vProcess->start(QString::fromStdString(_config.v2CorePath), QStringList() << "-config" + << QV2RAY_GENERATED_CONFIG_DIRPATH + "config.json", + QIODevice::ReadWrite | QIODevice::Text); + vProcess->waitForStarted(); + Status = STARTED; + return true; + } else { + Status = STOPPED; + return false; } - - vProcess->start(QString::fromStdString(_config.v2Path), QStringList() << "-config" - << QV2RAY_GENERATED_CONFIG_DIRPATH + "config.json", - QIODevice::ReadWrite | QIODevice::Text); - vProcess->waitForStarted(); - Status = STARTED; - return true; } else { Status = STOPPED; return false; } } - void Qv2Instance::stop() + void Qv2Instance::Stop() { vProcess->close(); Status = STOPPED; @@ -84,7 +92,7 @@ namespace Qv2ray Qv2Instance::~Qv2Instance() { - stop(); + Stop(); delete vProcess; } } diff --git a/src/QvCoreInteractions.h b/src/QvCoreInteractions.h index ff806b72..469c0059 100644 --- a/src/QvCoreInteractions.h +++ b/src/QvCoreInteractions.h @@ -17,13 +17,13 @@ namespace Qv2ray public: explicit Qv2Instance(QWidget *parent = nullptr); - bool start(); - void stop(); + bool Start(); + void Stop(); QString readOutput(); V2RAY_INSTANCE_STARTUP_STATUS Status; - static bool checkConfigFile(QString path); - static bool checkCoreExe(); + static bool VerifyVConfigFile(QString path); + static bool ValidateV2rayCoreExe(); ~Qv2Instance(); private: diff --git a/src/QvGUIConfigObjects.h b/src/QvGUIConfigObjects.h index 79458a95..7560f9b1 100644 --- a/src/QvGUIConfigObjects.h +++ b/src/QvGUIConfigObjects.h @@ -41,22 +41,24 @@ namespace Qv2ray struct Qv2Config { string language; bool runAsRoot; - string logLevel; - string v2Path; + int logLevel; + string v2CorePath; + string v2AssetsPath; QvInbondSetting httpSetting; QvInbondSetting socksSetting; list configs; - Qv2Config(): language(), runAsRoot(), logLevel(), httpSetting(), socksSetting(), configs() { } - Qv2Config(string lang, string exePath, string log, QvInbondSetting httpIn, QvInbondSetting socksIN): Qv2Config() + Qv2Config(): httpSetting(), socksSetting(), configs() { } + Qv2Config(string lang, string exePath, string assetsPath, int log, QvInbondSetting httpIn, QvInbondSetting socksIN): Qv2Config() { - v2Path = exePath; language = lang; + v2CorePath = exePath; + v2AssetsPath = assetsPath; logLevel = log; httpSetting = httpIn; socksSetting = socksIN; runAsRoot = false; } - XTOSTRUCT(O(language, v2Path, runAsRoot, logLevel, httpSetting, socksSetting, configs)) + XTOSTRUCT(O(language, v2CorePath, v2AssetsPath, runAsRoot, logLevel, httpSetting, socksSetting, configs)) }; } } diff --git a/src/QvUtils.cpp b/src/QvUtils.cpp index 787ee5e1..40abdda2 100644 --- a/src/QvUtils.cpp +++ b/src/QvUtils.cpp @@ -78,14 +78,17 @@ namespace Qv2ray { return dir->entryList(QStringList() << "*" << "*.*", QDir::Hidden | QDir::Files); } + bool CheckFile(QDir *dir, QString fileName) { return GetFileList(dir).indexOf(fileName) >= 0; } + void QvMessageBox(QWidget *parent, QString title, QString text) { QMessageBox::warning(parent, title, text, QMessageBox::Ok | QMessageBox::Default, 0); } + QTranslator *getTranslator(QString lang) { QTranslator *translator = new QTranslator(); diff --git a/src/main.cpp b/src/main.cpp index ff247665..efbff7e0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -16,17 +16,20 @@ bool initializeQv() /// Qv2ray Config Path and ends with "/" QString configPath = ""; QString exeDefaultPath = ""; + QString v2AssetsPath = ""; #if defined(__WIN32) || defined(__APPLE__) // For Windows and MacOS, there's no such 'installation' of a software // package, So as what ShadowSocks and v2rayX does, save config files next to // the executable. - configPath = "./qv2ray.conf.d"; - exeDefaultPath = "./v2ray"; + configPath = "./qv2ray.d"; + exeDefaultPath = "./qv2ray.d/v2ray"; + v2AssetsPath = "./qv2ray.d"; #else // However, for linux, this software can be and/or will be provided as a // package and install to whatever /usr/bin or /usr/local/bin or even /opt/ // Thus we save config files in the user's home directory. - configPath = QDir::homePath() + "/.qv2ray/"; + configPath = QDir::homePath() + "/.qv2ray"; + v2AssetsPath = "/etc/v2ray"; exeDefaultPath = "/bin/v2ray"; #endif SetConfigDirPath(configPath); @@ -60,7 +63,7 @@ bool initializeQv() // These below genenrated very basic global config. QvInbondSetting inHttp = QvInbondSetting(true, "127.0.0.1", 8080); QvInbondSetting inSocks = QvInbondSetting(true, "127.0.0.1", 1080); - Qv2Config conf = Qv2Config("zh-CN", exeDefaultPath.toStdString(), "info", inHttp, inSocks); + Qv2Config conf = Qv2Config("zh-CN", exeDefaultPath.toStdString(), v2AssetsPath.toStdString(), 2, inHttp, inSocks); // // Save initial config. SetGlobalConfig(conf); diff --git a/src/w_ImportConfig.cpp b/src/w_ImportConfig.cpp index 99a2ca3f..51b2add8 100644 --- a/src/w_ImportConfig.cpp +++ b/src/w_ImportConfig.cpp @@ -25,84 +25,56 @@ ImportConfigWindow::~ImportConfigWindow() delete ui; } -void ImportConfigWindow::on_pushButton_clicked() +void ImportConfigWindow::on_importSourceCombo_currentIndexChanged(int index) +{ + ui->stackedWidget->setCurrentIndex(index); +} + +void ImportConfigWindow::on_selectFileBtn_clicked() { QString dir = QFileDialog::getOpenFileName(this, tr("OpenConfigFile"), "~/"); ui->fileLineTxt->setText(dir); } -void ImportConfigWindow::savefromFile(QString path, QString alias) -{ - Q_UNUSED(path) - Q_UNUSED(alias) - QFile configFile(path); - - if (!configFile.open(QIODevice::ReadOnly)) { - QvMessageBox(this, tr("ImportConfig"), tr("CannotOpenFile")); - qDebug() << "ImportConfig::CannotOpenFile"; - return; - } - - QByteArray allData = configFile.readAll(); - configFile.close(); - QJsonDocument v2conf(QJsonDocument::fromJson(allData)); - QJsonObject rootobj = v2conf.object(); - QJsonObject outbound; - - if (rootobj.contains("outbounds")) { - outbound = rootobj.value("outbounds").toArray().first().toObject(); - } else { - outbound = rootobj.value("outbound").toObject(); - } - - if (!QFile::copy(path, "newFile")) { - QvMessageBox(this, tr("ImportConfig"), tr("CannotCopyCustomConfig")); - qDebug() << "ImportConfig::CannotCopyCustomConfig"; - } -} - -void ImportConfigWindow::on_buttonBox_accepted() +void ImportConfigWindow::on_buttonBox_clicked(QAbstractButton *button) { QString alias = ui->nameTxt->text(); + QJsonObject config; if (ui->importSourceCombo->currentIndex() == 0) { // From File... - bool overrideInBound = ui->useCurrentSettingRidBtn->isChecked(); - on_verifyFileBtn_clicked(); + bool overrideInBound = ui->keepInboundCheckBox->isChecked(); + + if (!Qv2Instance::VerifyVConfigFile(ui->fileLineTxt->text())) { + QvMessageBox(this, tr("#InvalidConfigFile"), tr("ConfigFileCheckFailed")); + return; + } + QString path = ui->fileLineTxt->text(); - savefromFile(path, alias); - // !!! TODO + config = ConvertConfigFromFile(path, overrideInBound); } else { - on_verifyVMessBtn_clicked(); - auto config = ConvertOutboundFromVMessString(ui->vmessConnectionStringTxt->toPlainText()); + QString vmess = ui->vmessConnectionStringTxt->toPlainText(); + int result = VerifyVMessProtocolString(vmess); + + if (result == 0) { + //QvMessageBox(this, tr("#VMessCheck"), tr("#AbleToImportConfig")); + } else if (result == -1) { + QvMessageBox(this, tr("#VMessCheck"), tr("#NotValidVMessProtocolString")); + done(0); + return; + } else { + QvMessageBox(this, tr("#VMessCheck"), tr("#INTERNAL_ERROR")); + return; + } + + config = ConvertConfigFromVMessString(ui->vmessConnectionStringTxt->toPlainText()); + // alias = alias != "" ? alias : config["QV2RAY_ALIAS"].toString(); config.remove("QV2RAY_ALIAS"); - Qv2Config conf = GetGlobalConfig(); - conf.configs.push_back(alias.toStdString()); - SetGlobalConfig(conf); - SaveConnectionConfig(config, &alias); - emit s_reload_config(); } -} -void ImportConfigWindow::on_verifyVMessBtn_clicked() -{ - QString vmess = ui->vmessConnectionStringTxt->toPlainText(); - int result = VerifyVMessProtocolString(vmess); - - if (result == 0) { - QvMessageBox(this, tr("#VMessCheck"), tr("#AbleToImportConfig")); - } else if (result == -1) { - QvMessageBox(this, tr("#VMessCheck"), tr("#NotValidVMessProtocolString")); - } else { - QvMessageBox(this, tr("#VMessCheck"), tr("#INTERNAL_ERROR")); - } -} - -void ImportConfigWindow::on_verifyFileBtn_clicked() -{ - if (!Qv2Instance::checkConfigFile(ui->fileLineTxt->text())) { - QvMessageBox(this, tr("#InvalidConfigFile"), tr("ConfigFileCheckFailed")); - } else { - QvMessageBox(this, tr("#VConfigFileCheckPassed"), tr("#AbleToImportConfig")); - } + Qv2Config conf = GetGlobalConfig(); + conf.configs.push_back(alias.toStdString()); + SetGlobalConfig(conf); + SaveConnectionConfig(config, &alias); + emit s_reload_config(); } diff --git a/src/w_ImportConfig.h b/src/w_ImportConfig.h index c2de25f2..a9b8193c 100644 --- a/src/w_ImportConfig.h +++ b/src/w_ImportConfig.h @@ -15,18 +15,19 @@ class ImportConfigWindow : public QDialog public: explicit ImportConfigWindow(QWidget *parent = nullptr); - void savefromFile(QString path, QString alias); ~ImportConfigWindow(); signals: void s_reload_config(); private slots: - void on_pushButton_clicked(); - void on_buttonBox_accepted(); - void on_verifyVMessBtn_clicked(); - void on_verifyFileBtn_clicked(); + void on_importSourceCombo_currentIndexChanged(int index); + + void on_selectFileBtn_clicked(); + + void on_buttonBox_clicked(QAbstractButton *button); private: Ui::ImportConfigWindow *ui; + }; #endif // IMPORTCONF_H diff --git a/src/w_ImportConfig.ui b/src/w_ImportConfig.ui index ca947fce..895e1562 100644 --- a/src/w_ImportConfig.ui +++ b/src/w_ImportConfig.ui @@ -6,174 +6,165 @@ 0 0 - 650 - 350 + 370 + 420 - 650 - 350 + 370 + 420 + + + + + 370 + 420 Import file - - - - + + false + + + true + + + + + + + + #Name + + + + + + + #ImportFrom - + + + + 0 + 0 + + - Existing File + #ExistingFile - VMess Connection String + #VMessConnectionString - - + + - #From VMess Connection String + #Import - + - - - #VMess Connection String - - - - - - - - - - Verify + + + 0 + + + + + + + + #Path + + + + + + + + + + + + + + + + #SelectFile + + + + + + + + + #Inbound + + + + + + + #KeepImportedInbounds + + + + + + + + + + + + + #VMess Connection String + + + + + + + + - + Qt::Horizontal - QDialogButtonBox::Cancel|QDialogButtonBox::Ok + QDialogButtonBox::Discard|QDialogButtonBox::Save - - - - #FromFile - - - - - - - - #Path - - - - - - - - - - - - - - - - #SelectFile - - - - - - - - - #Name - - - - - - - - - - #Inbound - - - - - - - - - #UseCurrent - - - true - - - - - - - #UseImported - - - - - - - - - - - Verify - - - - - - - importSourceCombo fileLineTxt selectFileBtn - nameTxt - useCurrentSettingRidBtn - useImportedRidBtn - vmessConnectionStringTxt diff --git a/src/w_MainWindow.cpp b/src/w_MainWindow.cpp index 9ca421d0..491cb8bf 100644 --- a/src/w_MainWindow.cpp +++ b/src/w_MainWindow.cpp @@ -101,7 +101,7 @@ void MainWindow::UpdateLog() void MainWindow::on_startButton_clicked() { ui->logText->clear(); - bool startFlag = this->vinstance->start(); + bool startFlag = this->vinstance->Start(); trayMenu->actions()[2]->setEnabled(!startFlag); trayMenu->actions()[3]->setEnabled(startFlag); trayMenu->actions()[4]->setEnabled(startFlag); @@ -109,7 +109,7 @@ void MainWindow::on_startButton_clicked() void MainWindow::on_stopButton_clicked() { - this->vinstance->stop(); + this->vinstance->Stop(); ui->logText->clear(); trayMenu->actions()[2]->setEnabled(true); trayMenu->actions()[3]->setEnabled(false); diff --git a/src/w_PrefrencesWindow.cpp b/src/w_PrefrencesWindow.cpp index 3e597e02..c7fd1d9d 100644 --- a/src/w_PrefrencesWindow.cpp +++ b/src/w_PrefrencesWindow.cpp @@ -14,7 +14,7 @@ PrefrencesWindow::PrefrencesWindow(QWidget *parent) : QDialog(parent), CurrentConfig = GetGlobalConfig(); ui->languageComboBox->setCurrentText(QString::fromStdString(CurrentConfig.language)); ui->runAsRootCheckBox->setChecked(CurrentConfig.runAsRoot); - ui->logLevelCheckBox->setCurrentText(QString::fromStdString(CurrentConfig.logLevel)); + ui->logLevelComboBox->setCurrentIndex(CurrentConfig.logLevel); // ui->httpCB->setChecked(CurrentConfig.httpSetting.enabled); ui->httpPortLE->setText(QString::fromStdString(to_string(CurrentConfig.httpSetting.port))); @@ -29,7 +29,7 @@ PrefrencesWindow::PrefrencesWindow(QWidget *parent) : QDialog(parent), ui->socksAuthUsernameTxt->setText(QString::fromStdString(CurrentConfig.socksSetting.authUsername)); ui->socksAuthPasswordTxt->setText(QString::fromStdString(CurrentConfig.socksSetting.authPassword)); // - ui->vCoreExePathTxt->setText(QString::fromStdString(CurrentConfig.v2Path)); + ui->vCoreExePathTxt->setText(QString::fromStdString(CurrentConfig.v2CorePath)); // ui->httpPortLE->setValidator(new QIntValidator()); ui->socksPortLE->setValidator(new QIntValidator()); @@ -98,7 +98,7 @@ void PrefrencesWindow::on_runAsRootCheckBox_stateChanged(int arg1) { Q_UNUSED(arg1) #ifdef _WIN32 - showWarnMessageBox(this, tr("Prefrences"), tr("RunAsRootNotOnWindows")); + QvMessageBox(this, tr("Prefrences"), tr("RunAsRootNotOnWindows")); #endif } diff --git a/src/w_PrefrencesWindow.ui b/src/w_PrefrencesWindow.ui index 74162f8d..62c1d1cc 100644 --- a/src/w_PrefrencesWindow.ui +++ b/src/w_PrefrencesWindow.ui @@ -77,7 +77,7 @@ - + 0 @@ -336,7 +336,7 @@ languageComboBox runAsRootCheckBox - logLevelCheckBox + logLevelComboBox muxEnabledCB muxConcurrencyTxt httpCB diff --git a/translations/en-US.ts b/translations/en-US.ts index 231dda73..b1c2937e 100644 --- a/translations/en-US.ts +++ b/translations/en-US.ts @@ -262,135 +262,91 @@ ImportConfigWindow - + Import file Import file - + #ImportFrom Import From - - Existing File - Existing File - - - - VMess Connection String - VMess Connection String - - - - - Verify - - - - - #FromFile - From file - - - + #Path Path - + #SelectFile Select File - + #Name Name - + + #ExistingFile + + + + + #VMessConnectionString + + + + + #Import + + + + #Inbound Inbound Settings + + + #KeepImportedInbounds + + - #UseCurrent - Use Current Settings - - - - #UseImported - Use Imported Inbound Settings - - - - #From VMess Connection String - From VMess Connection String - - - #VMess Connection String VMess Connection String - + OpenConfigFile Open Config File - - - ImportConfig - Import Config - - - - CannotOpenFile - - - - - CannotCopyCustomConfig - - - - + #NotValidVMessProtocolString - - - #AbleToImportConfig - - - - - - + + #VMessCheck - + #INTERNAL_ERROR - + #InvalidConfigFile - + ConfigFileCheckFailed - - - #VConfigFileCheckPassed - - MainWindow @@ -666,27 +622,27 @@ QObject - + AnotherInstanceRunning Another instance is already running - + Qv2ray - + CoreNotFound Core files are not found - + CoreFileNotFoundExplainationAt: - + ConfigurationError Configuration Error diff --git a/translations/zh-CN.ts b/translations/zh-CN.ts index 73f9ed12..b2a2a23f 100644 --- a/translations/zh-CN.ts +++ b/translations/zh-CN.ts @@ -262,135 +262,91 @@ ImportConfigWindow - + Import file 导入文件 - + #ImportFrom 导入源 - - Existing File - 现有文件 - - - - VMess Connection String - VMess 连接字符串 - - - - - Verify - - - - - #FromFile - 从文件 - - - + #Path 路径 - + #SelectFile 选择文件 - + #Name 名称 - + + #ExistingFile + + + + + #VMessConnectionString + + + + + #Import + + + + #Inbound 入站设置 + + + #KeepImportedInbounds + + - #UseCurrent - 使用现有设置 - - - - #UseImported - 使用导入的设置 - - - - #From VMess Connection String - 从 VMess 连接字符串 - - - #VMess Connection String VMess 连接字符串 - + OpenConfigFile 打开配置文件 - - - ImportConfig - 导入配置 - - - - CannotOpenFile - - - - - CannotCopyCustomConfig - - - - + #NotValidVMessProtocolString - - - #AbleToImportConfig - - - - - - + + #VMessCheck - + #INTERNAL_ERROR - + #InvalidConfigFile - + ConfigFileCheckFailed - - - #VConfigFileCheckPassed - - MainWindow @@ -666,27 +622,27 @@ QObject - + AnotherInstanceRunning 另一个实例正在运行 - + Qv2ray - + CoreNotFound 核心文件未找到 - + CoreFileNotFoundExplainationAt: - + ConfigurationError 配置出错