From e3cbace6d08c493126f7a8634c8ffb950f06b1b7 Mon Sep 17 00:00:00 2001 From: parhelia512 <0011d3@gmail.com> Date: Tue, 22 Jul 2025 19:08:17 +0800 Subject: [PATCH] improve --- src/ui/mainwindow.cpp | 84 +++++++++++++++++++++++-------------------- 1 file changed, 45 insertions(+), 39 deletions(-) diff --git a/src/ui/mainwindow.cpp b/src/ui/mainwindow.cpp index b2aa93e..35e1368 100644 --- a/src/ui/mainwindow.cpp +++ b/src/ui/mainwindow.cpp @@ -422,51 +422,57 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi ui->menu_server->removeAction(ui->menu_stop_testing); } }); + + QStringList profileList; + auto resp = NetworkRequestHelper::HttpGet("https://api.github.com/repos/throneproj/routeprofiles/releases/latest"); + if (!resp.error.isEmpty()) { + runOnUiThread([=] { + MessageBoxWarning(QObject::tr("Download Profiles"), QObject::tr("Requesting list error: %1").arg(resp.error + "\n" + resp.data)); + }); + return; + } + QJsonObject release = QString2QJsonObject(resp.data); + for (const QJsonValue asset : release["assets"].toArray()) { + auto profile = asset["name"].toString(); + if (profile.section('.', -1) == QString("json") && (profile.startsWith("bypass",Qt::CaseInsensitive) || profile.startsWith("proxy",Qt::CaseInsensitive))) { + profile.chop(5); + profileList.push_back(profile); + } + } + connect(ui->menuRouting_Menu, &QMenu::aboutToShow, this, [=]() { ui->menuRouting_Menu->clear(); ui->menuRouting_Menu->addAction(ui->menu_routing_settings); - QMenu* profilesMenu = ui->menuRouting_Menu->addMenu("Download Profiles"); - - auto resp = NetworkRequestHelper::HttpGet("https://api.github.com/repos/throneproj/routeprofiles/releases/latest"); - if (!resp.error.isEmpty()) { - runOnUiThread([=] { - MessageBoxWarning(QObject::tr("Download Profiles"), QObject::tr("Requesting list error: %1").arg(resp.error + "\n" + resp.data)); + QMenu* profilesMenu = ui->menuRouting_Menu->addMenu(QObject::tr("Download Profiles")); + for (const auto& profile : profileList) + { + auto* action = new QAction(profilesMenu); + action->setText(profile); + connect(action, &QAction::triggered, this, [=]() + { + auto res = NetworkRequestHelper::HttpGet("https://github.com/throneproj/routeprofiles/releases/latest/download/" + profile + ".json"); + if (!res.error.isEmpty()) { + runOnUiThread([=] { + MessageBoxWarning(QObject::tr("Download Profiles"), QObject::tr("Requesting profile error: %1").arg(res.error + "\n" + res.data)); + }); + return; + } + auto err = new QString; + auto parsed = Configs::RoutingChain::parseJsonArray(QString2QJsonArray(res.data), err); + if (!err->isEmpty()) { + MessageBoxInfo(tr("Invalid JSON Array"), tr("The provided input cannot be parsed to a valid route rule array:\n") + *err); + return; + } + auto chain = Configs::ProfileManager::NewRouteChain(); + chain->name = QString(profile).replace('_', ' '); + chain->defaultOutboundID = profile.startsWith("bypass",Qt::CaseInsensitive) ? Configs::proxyID : Configs::directID; + chain->Rules.clear(); + chain->Rules << parsed; + Configs::profileManager->AddRouteChain(chain); }); - return; - } - QJsonObject release = QString2QJsonObject(resp.data); - for (const QJsonValue asset : release["assets"].toArray()) { - auto profile = asset["name"].toString(); - if (profile.section('.', -1) == QString("json") && (profile.startsWith("bypass",Qt::CaseInsensitive) || profile.startsWith("proxy",Qt::CaseInsensitive))) { - profile.chop(5); - auto* action = new QAction(profilesMenu); - action->setText(profile); - connect(action, &QAction::triggered, this, [=]() - { - auto res = NetworkRequestHelper::HttpGet("https://github.com/throneproj/routeprofiles/releases/latest/download/" + profile + ".json"); - if (!res.error.isEmpty()) { - runOnUiThread([=] { - MessageBoxWarning(QObject::tr("Download Profiles"), QObject::tr("Requesting profile error: %1").arg(res.error + "\n" + res.data)); - }); - return; - } - auto err = new QString; - auto parsed = Configs::RoutingChain::parseJsonArray(QString2QJsonArray(res.data), err); - if (!err->isEmpty()) { - MessageBoxInfo(tr("Invalid JSON Array"), tr("The provided input cannot be parsed to a valid route rule array:\n") + *err); - return; - } - auto chain = Configs::ProfileManager::NewRouteChain(); - chain->name = QString(profile).replace('_', ' '); - chain->defaultOutboundID = profile.startsWith("bypass",Qt::CaseInsensitive) ? Configs::proxyID : Configs::directID; - chain->Rules.clear(); - chain->Rules << parsed; - Configs::profileManager->AddRouteChain(chain); - }); - profilesMenu->addAction(action); - } + profilesMenu->addAction(action); } ui->menuRouting_Menu->addSeparator();