From fa08f03fecd151c2a426e7ccc6e1f1df046866be Mon Sep 17 00:00:00 2001 From: "Leroy.H.Y" Date: Sat, 22 Jun 2019 21:53:36 +0800 Subject: [PATCH] [Add] Finished UI-Implementation Former-commit-id: 4f0cbce1bd43934dfc9f89c4a77065acbdaf5456 --- Hv2ray.pro | 11 +- src/ImportConfig.cpp | 128 ++++++++++++++++++ src/{importconf.h => ImportConfig.h} | 10 +- src/ImportConfig.ui | 186 +++++++++++++++++++++++++++ src/MainWindow.cpp | 40 +++--- src/MainWindow.h | 14 +- src/MainWindow.ui | 20 +-- src/import_vmess.cpp | 53 -------- src/import_vmess.h | 26 ---- src/import_vmess.ui | 100 -------------- src/importconf.cpp | 84 ------------ src/importconf.ui | 124 ------------------ src/vinteract.cpp | 16 +-- src/vinteract.h | 9 +- 14 files changed, 362 insertions(+), 459 deletions(-) create mode 100644 src/ImportConfig.cpp rename src/{importconf.h => ImportConfig.h} (66%) create mode 100644 src/ImportConfig.ui delete mode 100644 src/import_vmess.cpp delete mode 100644 src/import_vmess.h delete mode 100644 src/import_vmess.ui delete mode 100644 src/importconf.cpp delete mode 100644 src/importconf.ui diff --git a/Hv2ray.pro b/Hv2ray.pro index 1a3f72c9..af80cf45 100644 --- a/Hv2ray.pro +++ b/Hv2ray.pro @@ -31,29 +31,26 @@ SOURCES += \ main.cpp \ MainWindow.cpp \ ConnectionEditWindow.cpp \ - importconf.cpp \ + ImportConfig.cpp \ PrefrencesWindow.cpp \ vinteract.cpp \ - import_vmess.cpp \ utils.cpp \ runguard.cpp HEADERS += \ MainWindow.h \ ConnectionEditWindow.h \ - importconf.h \ + ImportConfig.h \ PrefrencesWindow.h \ vinteract.h \ - import_vmess.h \ utils.h \ runguard.h FORMS += \ MainWindow.ui \ ConnectionEditWindow.ui \ - importconf.ui \ - PrefrencesWindow.ui \ - import_vmess.ui + ImportConfig.ui \ + PrefrencesWindow.ui TRANSLATIONS += ./translations/zh-CN.ts diff --git a/src/ImportConfig.cpp b/src/ImportConfig.cpp new file mode 100644 index 00000000..dbbe51d4 --- /dev/null +++ b/src/ImportConfig.cpp @@ -0,0 +1,128 @@ +#include +#include +#include +#include +#include +#include + +#pragma push_macro("slots") +#undef slots +#include "Python.h" +#pragma pop_macro("slots") + +#include "ConnectionEditWindow.h" +#include "vinteract.h" +#include "utils.h" +#include "ImportConfig.h" +#include "ui_ImportConfig.h" + +ImportConfig::ImportConfig(QWidget *parent) : + QDialog(parent), + ui(new Ui::ImportConfig) +{ + ui->setupUi(this); + connect(this, SIGNAL(updateConfTable()), parentWidget(), SLOT(updateConfTable())); +} + +ImportConfig::~ImportConfig() +{ + delete ui; +} + +void ImportConfig::on_pushButton_clicked() +{ + QString dir = QFileDialog::getOpenFileName(this, tr("Open Config File"), "~/"); + ui->fileLineTxt->setText(dir); +} + +void ImportConfig::savefromFile(QString path, QString alias) +{ + vConfig newConf; + newConf.alias = alias; + QFile configFile(path); + if(!configFile.open(QIODevice::ReadOnly)) { + qDebug() << "Couldn't open config json"; + 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(); + } + QJsonObject vnext = switchJsonArrayObject(outbound.value("settings").toObject(), "vnext"); + QJsonObject user = switchJsonArrayObject(vnext, "users"); + newConf.host = vnext.value("address").toString(); + newConf.port = QString::number(vnext.value("port").toInt()); + newConf.alterid = QString::number(user.value("alterId").toInt()); + newConf.uuid = user.value("id").toString(); + newConf.security = user.value("security").toString(); + if (newConf.security.isNull()) { + newConf.security = "auto"; + } + newConf.isCustom = 1; + int id = newConf.save(); + if(id < 0) + { + showWarnMessageBox(this, "Database Error", "Failed to open database while saving"); + return; + } + emit updateConfTable(); + QString newFile = "conf/" + QString::number(id) + ".conf"; + if(!QFile::copy(path, newFile)) { + showWarnMessageBox(this, "Copy error", "Failed to copy custom config file."); + } +} + +void ImportConfig::on_buttonBox_accepted() +{ + QString alias = ui->nameTxt->text(); + if(ui->importSourceCombo->currentIndex() == 0) // From File... + { + QString path = ui->fileLineTxt->text(); + bool isValid = validationCheck(path); + if(isValid) { + savefromFile(path, alias); + } + } + else + { + QString vmess = ui->vmessConnectionStringTxt->toPlainText(); + Py_Initialize(); + if ( !Py_IsInitialized() ) { + qDebug() << "Python is not initialized"; + } + QString param = "--inbound socks:1080 " + vmess + " -o config.json.tmp"; + PyRun_SimpleString("import sys"); + PyRun_SimpleString("sys.path.append('./utils')"); + PyObject *pModule = PyImport_ImportModule("vmess2json"); + PyObject *pFunc = PyObject_GetAttrString(pModule, "main"); + PyObject *arg = PyTuple_New(1); + PyObject *arg1 = Py_BuildValue("s", param.toStdString().c_str()); + PyTuple_SetItem(arg, 0, arg1); + PyObject_CallObject(pFunc, arg); + Py_Finalize(); + if(QFile::exists(QCoreApplication::applicationDirPath() + "/config.json.tmp")) { + ImportConfig *im = new ImportConfig(this->parentWidget()); + if (validationCheck(QCoreApplication::applicationDirPath() + "/config.json.tmp")) { + im->savefromFile("config.json.tmp", alias); + } + QFile::remove("config.json.tmp"); + } else { + showWarnMessageBox(this, "Error occured", "Failed to generate config file."); + } + } + + if(ui->useCurrentSettingRidBtn->isChecked()) + { + // TODO: Use Current Settings... + } + else + { + // TODO: Override Inbound.... + } +} diff --git a/src/importconf.h b/src/ImportConfig.h similarity index 66% rename from src/importconf.h rename to src/ImportConfig.h index 49b6c3c6..ea8a97cc 100644 --- a/src/importconf.h +++ b/src/ImportConfig.h @@ -5,17 +5,17 @@ namespace Ui { - class importConf; + class ImportConfig; } -class importConf : public QDialog +class ImportConfig : public QDialog { Q_OBJECT public: - explicit importConf(QWidget *parent = nullptr); + explicit ImportConfig(QWidget *parent = nullptr); void savefromFile(QString path, QString alias); - ~importConf(); + ~ImportConfig(); private slots: void on_pushButton_clicked(); @@ -24,7 +24,7 @@ signals: void updateConfTable(); private: - Ui::importConf *ui; + Ui::ImportConfig *ui; }; #endif // IMPORTCONF_H diff --git a/src/ImportConfig.ui b/src/ImportConfig.ui new file mode 100644 index 00000000..4aec2832 --- /dev/null +++ b/src/ImportConfig.ui @@ -0,0 +1,186 @@ + + + ImportConfig + + + + 0 + 0 + 650 + 350 + + + + + 650 + 350 + + + + Import file + + + + + + + + Import From + + + + + + + + Existing File + + + + + VMess Connection String + + + + + + + + + + From File + + + + + + Path + + + + + + + + + + + + + + + + Select File + + + + + + + + + Name + + + + + + + + + + Inbound + + + + + + + + + Use Current + + + true + + + + + + + Use Imported + + + + + + + + + + + + From VMess Connection String + + + + + + VMess Connection String + + + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + ImportConfig + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + ImportConfig + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 7f6cf05d..eef323b9 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -8,12 +8,11 @@ #include #include -#include "import_vmess.h" #include "PrefrencesWindow.h" #include "MainWindow.h" #include #include "ConnectionEditWindow.h" -#include "importconf.h" +#include "ImportConfig.h" #include "vinteract.h" #include "utils.h" @@ -23,17 +22,17 @@ MainWindow::MainWindow(QWidget *parent) : { this->setWindowIcon(QIcon("Himeki.ico")); ui->setupUi(this); - updateConfTable(); + UpdateConfigTable(); // ui->configTable->setContextMenuPolicy(Qt::CustomContextMenu); // connect(ui->configTable, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showMenu(QPoint))); - this->v2Inst = new v2Instance(); + this->v2instance = new v2Instance(); hTray = new QSystemTrayIcon(); hTray->setToolTip("Hv2ray"); hTray->setIcon(QIcon("Himeki.ico")); connect(hTray, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(on_activatedTray(QSystemTrayIcon::ActivationReason))); createTrayAction(); if(QFileInfo("config.json").exists()) { - v2Inst->start(this); + v2instance->start(this); } // QAction *select = new QAction("Select", ui->configTable); @@ -52,7 +51,7 @@ MainWindow::MainWindow(QWidget *parent) : MainWindow::~MainWindow() { delete ui; - delete this->v2Inst; + delete this->v2instance; } void MainWindow::on_actionEdit_triggered() @@ -64,10 +63,11 @@ void MainWindow::on_actionEdit_triggered() void MainWindow::on_actionExisting_config_triggered() { - importConf *f = new importConf(this); + ImportConfig *f = new ImportConfig(this); f->setAttribute(Qt::WA_DeleteOnClose); f->show(); } + void MainWindow::showMenu(QPoint pos) { // if(ui->configTable->indexAt(pos).column() != -1) { @@ -85,18 +85,18 @@ void MainWindow::select_triggered() // } } -void MainWindow::delConf() +void MainWindow::DeleteConfig() { } -void MainWindow::updateConfTable() +void MainWindow::UpdateConfigTable() { } -void MainWindow::generateConfig(int idIntable) +void MainWindow::GenerateConfig(int idIntable) { vConfig tmpConf; - emit updateConfTable(); + emit UpdateConfigTable(); if (tmpConf.isCustom == 1) { QString src = "conf/" + QString::number(idIntable) + ".conf"; overrideInbounds(src); @@ -108,15 +108,15 @@ void MainWindow::generateConfig(int idIntable) // TODO: Config generator } } -void MainWindow::updateLog() +void MainWindow::UpdateLog() { - ui->logText->insertPlainText(this->v2Inst->v2Process->readAllStandardOutput()); + ui->logText->insertPlainText(this->v2instance->vProcess->readAllStandardOutput()); } void MainWindow::on_startButton_clicked() { ui->logText->clear(); - bool startFlag = this->v2Inst->start(this); + bool startFlag = this->v2instance->start(this); trayMenu->actions()[2]->setEnabled(!startFlag); trayMenu->actions()[3]->setEnabled(startFlag); trayMenu->actions()[4]->setEnabled(startFlag); @@ -124,7 +124,7 @@ void MainWindow::on_startButton_clicked() void MainWindow::on_stopButton_clicked() { - this->v2Inst->stop(); + this->v2instance->stop(); ui->logText->clear(); trayMenu->actions()[2]->setEnabled(true); trayMenu->actions()[3]->setEnabled(false); @@ -144,13 +144,7 @@ void MainWindow::on_clbutton_clicked() void MainWindow::on_rtButton_clicked() { - emit updateConfTable(); -} - -void MainWindow::on_actionVmess_triggered() -{ - import_vmess *inVmess = new import_vmess(this); - inVmess->show(); + emit UpdateConfigTable(); } void MainWindow::closeEvent(QCloseEvent *event) @@ -205,7 +199,7 @@ void MainWindow::on_activatedTray(QSystemTrayIcon::ActivationReason reason) case QSystemTrayIcon::MiddleClick: // TODO: Check if an alert message box is present. // If so, do nothing but please wait for the message box to be closed. - if(this->v2Inst->v2Process->state() == QProcess::ProcessState::Running) { + if(this->v2instance->vProcess->state() == QProcess::ProcessState::Running) { on_stopButton_clicked(); } else { on_startButton_clicked(); diff --git a/src/MainWindow.h b/src/MainWindow.h index 591310ce..d3956117 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -8,7 +8,8 @@ #include #include -class v2Instance; +#include "vinteract.h" + namespace Ui { class MainWindow; @@ -20,7 +21,7 @@ class MainWindow : public QMainWindow public: explicit MainWindow(QWidget *parent = nullptr); - v2Instance *v2Inst; + v2Instance *v2instance; QSystemTrayIcon *hTray; QMenu *trayMenu = new QMenu(this); QMenu *popMenu = new QMenu(this); @@ -31,17 +32,16 @@ private slots: void on_restartButton_clicked(); void on_actionEdit_triggered(); void on_actionExisting_config_triggered(); - void updateConfTable(); - void delConf(); + void UpdateConfigTable(); + void DeleteConfig(); void showMenu(QPoint pos); - void updateLog(); + void UpdateLog(); void on_startButton_clicked(); void on_stopButton_clicked(); void select_triggered(); void on_clbutton_clicked(); void on_rtButton_clicked(); - void generateConfig(int idIntable); - void on_actionVmess_triggered(); + void GenerateConfig(int idIntable); void on_activatedTray(QSystemTrayIcon::ActivationReason reason); void toggleMainWindowVisibility(); void quit(); diff --git a/src/MainWindow.ui b/src/MainWindow.ui index fb9630c3..5c8f2f9a 100644 --- a/src/MainWindow.ui +++ b/src/MainWindow.ui @@ -255,17 +255,10 @@ - New + New Connection - - - From - - - - + - @@ -283,17 +276,12 @@ - Edit - - - - - Vmess + Manual - Existing config + Import diff --git a/src/import_vmess.cpp b/src/import_vmess.cpp deleted file mode 100644 index 744982c1..00000000 --- a/src/import_vmess.cpp +++ /dev/null @@ -1,53 +0,0 @@ -#include "import_vmess.h" -#pragma push_macro("slots") -#undef slots -#include "Python.h" -#pragma pop_macro("slots") -#include -#include - -#include "vinteract.h" -#include "utils.h" -#include "importconf.h" -#include "ui_import_vmess.h" - -import_vmess::import_vmess(QWidget *parent) : - QDialog(parent), - ui(new Ui::import_vmess) -{ - ui->setupUi(this); -} - -import_vmess::~import_vmess() -{ - delete ui; -} - -void import_vmess::on_buttonBox_accepted() -{ - QString vmess = ui->vmessTextEdit->toPlainText(); - QString alias = ui->aliasLineEdit->text(); - Py_Initialize(); - if ( !Py_IsInitialized() ) { - qDebug() << "Python is not initialized"; - } - QString param = "--inbound socks:1080 " + vmess + " -o config.json.tmp"; - PyRun_SimpleString("import sys"); - PyRun_SimpleString("sys.path.append('./utils')"); - PyObject *pModule = PyImport_ImportModule("vmess2json"); - PyObject *pFunc = PyObject_GetAttrString(pModule, "main"); - PyObject *arg = PyTuple_New(1); - PyObject *arg1 = Py_BuildValue("s", param.toStdString().c_str()); - PyTuple_SetItem(arg, 0, arg1); - PyObject_CallObject(pFunc, arg); - Py_Finalize(); - if(QFile::exists(QCoreApplication::applicationDirPath() + "/config.json.tmp")) { - importConf *im = new importConf(this->parentWidget()); - if (validationCheck(QCoreApplication::applicationDirPath() + "/config.json.tmp")) { - im->savefromFile("config.json.tmp", alias); - } - QFile::remove("config.json.tmp"); - } else { - showWarnMessageBox(this, "Error occured", "Failed to generate config file."); - } -} diff --git a/src/import_vmess.h b/src/import_vmess.h deleted file mode 100644 index 853fabb3..00000000 --- a/src/import_vmess.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef VMESS_H -#define VMESS_H - -#include - -namespace Ui -{ - class import_vmess; -} - -class import_vmess : public QDialog -{ - Q_OBJECT - -public: - explicit import_vmess(QWidget *parent = nullptr); - ~import_vmess(); - -private slots: - void on_buttonBox_accepted(); - -private: - Ui::import_vmess *ui; -}; - -#endif // VMESS_H diff --git a/src/import_vmess.ui b/src/import_vmess.ui deleted file mode 100644 index ff537182..00000000 --- a/src/import_vmess.ui +++ /dev/null @@ -1,100 +0,0 @@ - - - import_vmess - - - - 0 - 0 - 733 - 446 - - - - Vmess - - - - - 350 - 380 - 341 - 32 - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - 20 - 20 - 681 - 321 - - - - - - - 20 - 370 - 241 - 51 - - - - - - - Alias: - - - - - - - - - - - - - buttonBox - accepted() - import_vmess - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - import_vmess - reject() - - - 316 - 260 - - - 286 - 274 - - - - - diff --git a/src/importconf.cpp b/src/importconf.cpp deleted file mode 100644 index 739033cb..00000000 --- a/src/importconf.cpp +++ /dev/null @@ -1,84 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include "ConnectionEditWindow.h" -#include "vinteract.h" -#include "utils.h" -#include "importconf.h" -#include "ui_importconf.h" - -importConf::importConf(QWidget *parent) : - QDialog(parent), - ui(new Ui::importConf) -{ - ui->setupUi(this); - connect(this, SIGNAL(updateConfTable()), parentWidget(), SLOT(updateConfTable())); -} - -importConf::~importConf() -{ - delete ui; -} - -void importConf::on_pushButton_clicked() -{ - QString dir = QFileDialog::getOpenFileName(this, tr("Open Config File"), "~/"); - ui->fileLinedit->setText(dir); -} - -void importConf::savefromFile(QString path, QString alias) -{ - vConfig newConf; - newConf.alias = alias; - QFile configFile(path); - if(!configFile.open(QIODevice::ReadOnly)) { - qDebug() << "Couldn't open config json"; - 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(); - } - QJsonObject vnext = switchJsonArrayObject(outbound.value("settings").toObject(), "vnext"); - QJsonObject user = switchJsonArrayObject(vnext, "users"); - newConf.host = vnext.value("address").toString(); - newConf.port = QString::number(vnext.value("port").toInt()); - newConf.alterid = QString::number(user.value("alterId").toInt()); - newConf.uuid = user.value("id").toString(); - newConf.security = user.value("security").toString(); - if (newConf.security.isNull()) { - newConf.security = "auto"; - } - newConf.isCustom = 1; - int id = newConf.save(); - if(id < 0) - { - showWarnMessageBox(this, "Database Error", "Failed to open database while saving"); - return; - } - emit updateConfTable(); - QString newFile = "conf/" + QString::number(id) + ".conf"; - if(!QFile::copy(path, newFile)) { - showWarnMessageBox(this, "Copy error", "Failed to copy custom config file."); - } -} - -void importConf::on_buttonBox_accepted() -{ - QString path = ui->fileLinedit->text(); - QString alias = ui-> aliasLinedit->text(); - bool isValid = validationCheck(path); - if(isValid) { - savefromFile(path, alias); - } -} diff --git a/src/importconf.ui b/src/importconf.ui deleted file mode 100644 index e1bfeb49..00000000 --- a/src/importconf.ui +++ /dev/null @@ -1,124 +0,0 @@ - - - importConf - - - - 0 - 0 - 400 - 300 - - - - Import file - - - - - 190 - 240 - 181 - 32 - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - 20 - 90 - 318 - 68 - - - - - - - File name: - - - - - - - - - - - - - - open - - - - - - - Alias: - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - buttonBox - accepted() - importConf - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - importConf - reject() - - - 316 - 260 - - - 286 - 274 - - - - - diff --git a/src/vinteract.cpp b/src/vinteract.cpp index 0f5d8c58..eae2f417 100644 --- a/src/vinteract.cpp +++ b/src/vinteract.cpp @@ -35,7 +35,7 @@ bool validationCheck(QString path) v2Instance::v2Instance() { - this->v2Process = new QProcess(); + this->vProcess = new QProcess(); } v2Instance::~v2Instance() @@ -43,18 +43,18 @@ v2Instance::~v2Instance() this->stop(); } -bool v2Instance::start(MainWindow *parent) +bool v2Instance::start(QWidget *parent) { - if(this->v2Process->state() == QProcess::Running) { + if(this->vProcess->state() == QProcess::Running) { this->stop(); } if (checkVCoreExes()) { QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); env.insert("V2RAY_LOCATION_ASSET", QDir::currentPath()); - this->v2Process->setProcessEnvironment(env); - this->v2Process->start("./v2ray", QStringList() << "-config" << "config.json", QIODevice::ReadWrite | QIODevice::Text); - this->v2Process->waitForStarted(); - QObject::connect(v2Process, SIGNAL(readyReadStandardOutput()), parent, SLOT(updateLog())); + this->vProcess->setProcessEnvironment(env); + this->vProcess->start("./v2ray", QStringList() << "-config" << "config.json", QIODevice::ReadWrite | QIODevice::Text); + this->vProcess->waitForStarted(); + QObject::connect(vProcess, SIGNAL(readyReadStandardOutput()), parent, SLOT(updateLog())); return true; } else return false; @@ -62,5 +62,5 @@ bool v2Instance::start(MainWindow *parent) void v2Instance::stop() { - this->v2Process->close(); + this->vProcess->close(); } diff --git a/src/vinteract.h b/src/vinteract.h index 1c35f861..cdc9d5d6 100644 --- a/src/vinteract.h +++ b/src/vinteract.h @@ -2,21 +2,18 @@ #define VINTERACT_H #include #include -#include "MainWindow.h" bool validationCheck(QString path); + class v2Instance { public: explicit v2Instance(); - bool start(MainWindow *parent); + bool start(QWidget *parent); void stop(); void restart(); - QProcess *v2Process; + QProcess *vProcess; ~v2Instance(); -private: - - }; #endif // VINTERACT_H