mirror of
https://github.com/MatsuriDayo/nekoray.git
synced 2025-12-17 20:44:38 +03:00
refactor route settings
This commit is contained in:
@@ -12,40 +12,51 @@
|
||||
|
||||
#define REFRESH_ACTIVE_ROUTING(name, obj) \
|
||||
this->active_routing = name; \
|
||||
ui->active_routing->setText(name); \
|
||||
setWindowTitle(title_base + " [" + name + "]"); \
|
||||
SetRouteConfig(*obj);
|
||||
|
||||
#define SAVE_TO_ROUTING(r) \
|
||||
r->direct_ip = directIPTxt->toPlainText(); \
|
||||
r->direct_domain = directDomainTxt->toPlainText(); \
|
||||
r->proxy_ip = proxyIPTxt->toPlainText(); \
|
||||
r->proxy_domain = proxyDomainTxt->toPlainText(); \
|
||||
r->block_ip = blockIPTxt->toPlainText(); \
|
||||
r->block_domain = blockDomainTxt->toPlainText(); \
|
||||
r->def_outbound = ui->def_outbound->currentText(); \
|
||||
r->custom = CACHE.custom_route;
|
||||
UpdateDisplayRouting(obj, false);
|
||||
|
||||
DialogManageRoutes::DialogManageRoutes(QWidget *parent) : QDialog(parent), ui(new Ui::DialogManageRoutes) {
|
||||
ui->setupUi(this);
|
||||
title_base = windowTitle();
|
||||
|
||||
QStringList qsValue = {""};
|
||||
QString dnsHelpDocumentUrl;
|
||||
if (IS_NEKO_BOX) {
|
||||
ui->outbound_domain_strategy->addItems(Preset::SingBox::DomainStrategy);
|
||||
ui->domainStrategyCombo->addItems(Preset::SingBox::DomainStrategy);
|
||||
qsValue += QString("prefer_ipv4 prefer_ipv6 ipv4_only ipv6_only").split(" ");
|
||||
ui->dns_object->setPlaceholderText(DecodeB64IfValid("ewogICJzZXJ2ZXJzIjogW10sCiAgInJ1bGVzIjogW10sCiAgImZpbmFsIjogIiIsCiAgInN0cmF0ZWd5IjogIiIsCiAgImRpc2FibGVfY2FjaGUiOiBmYWxzZSwKICAiZGlzYWJsZV9leHBpcmUiOiBmYWxzZSwKICAiaW5kZXBlbmRlbnRfY2FjaGUiOiBmYWxzZSwKICAicmV2ZXJzZV9tYXBwaW5nIjogZmFsc2UsCiAgImZha2VpcCI6IHt9Cn0="));
|
||||
dnsHelpDocumentUrl = "https://sing-box.sagernet.org/configuration/dns/";
|
||||
} else {
|
||||
ui->outbound_domain_strategy->addItems({"AsIs", "UseIPv4", "UseIPv6", "PreferIPv4", "PreferIPv6"});
|
||||
ui->domainStrategyCombo->addItems({"AsIs", "IPIfNonMatch", "IPOnDemand"});
|
||||
qsValue += QString("use_ip use_ip4 use_ip6").split(" ");
|
||||
ui->dns_object->setPlaceholderText(DecodeB64IfValid("ewogICJzZXJ2ZXJzIjogW10sCiAgInJ1bGVzIjogW10sCiAgImZpbmFsIjogIiIsCiAgInN0cmF0ZWd5IjogIiIsCiAgImRpc2FibGVfY2FjaGUiOiBmYWxzZSwKICAiZGlzYWJsZV9leHBpcmUiOiBmYWxzZSwKICAiaW5kZXBlbmRlbnRfY2FjaGUiOiBmYWxzZSwKICAicmV2ZXJzZV9tYXBwaW5nIjogZmFsc2UsCiAgImZha2VpcCI6IHt9Cn0="));
|
||||
dnsHelpDocumentUrl = "https://www.v2fly.org/config/dns.html";
|
||||
}
|
||||
ui->direct_dns_strategy->addItems(qsValue);
|
||||
ui->remote_dns_strategy->addItems(qsValue);
|
||||
//
|
||||
ui->sniffing_mode->setCurrentIndex(NekoRay::dataStore->sniffing_mode);
|
||||
ui->outbound_domain_strategy->setCurrentText(NekoRay::dataStore->outbound_domain_strategy);
|
||||
ui->domainStrategyCombo->setCurrentText(NekoRay::dataStore->domain_strategy);
|
||||
ui->dns_routing->setChecked(NekoRay::dataStore->dns_routing);
|
||||
ui->dns_remote->setText(NekoRay::dataStore->remote_dns);
|
||||
ui->dns_direct->setText(NekoRay::dataStore->direct_dns);
|
||||
D_C_LOAD_STRING(custom_route_global)
|
||||
//
|
||||
connect(ui->use_dns_object, &QCheckBox::stateChanged, this, [=](int state) {
|
||||
auto useDNSObject = state == Qt::Checked;
|
||||
ui->simple_dns_box->setDisabled(useDNSObject);
|
||||
ui->dns_object->setDisabled(!useDNSObject);
|
||||
});
|
||||
ui->use_dns_object->stateChanged(Qt::Unchecked); // uncheck to uncheck
|
||||
connect(ui->dns_document, &QPushButton::clicked, this, [=] {
|
||||
MessageBoxInfo("DNS", dnsHelpDocumentUrl);
|
||||
});
|
||||
connect(ui->format_dns_object, &QPushButton::clicked, this, [=] {
|
||||
auto obj = QString2QJsonObject(ui->dns_object->toPlainText());
|
||||
if (obj.isEmpty()) {
|
||||
MessageBoxInfo("DNS", "invaild json");
|
||||
} else {
|
||||
ui->dns_object->setPlainText(QJsonObject2QString(obj, false));
|
||||
}
|
||||
});
|
||||
//
|
||||
connect(ui->custom_route_edit, &QPushButton::clicked, this, [=] {
|
||||
C_EDIT_JSON_ALLOW_EMPTY(custom_route)
|
||||
});
|
||||
@@ -88,16 +99,10 @@ DialogManageRoutes::~DialogManageRoutes() {
|
||||
}
|
||||
|
||||
void DialogManageRoutes::accept() {
|
||||
NekoRay::dataStore->sniffing_mode = ui->sniffing_mode->currentIndex();
|
||||
NekoRay::dataStore->domain_strategy = ui->domainStrategyCombo->currentText();
|
||||
NekoRay::dataStore->outbound_domain_strategy = ui->outbound_domain_strategy->currentText();
|
||||
NekoRay::dataStore->dns_routing = ui->dns_routing->isChecked();
|
||||
NekoRay::dataStore->remote_dns = ui->dns_remote->text();
|
||||
NekoRay::dataStore->direct_dns = ui->dns_direct->text();
|
||||
D_C_SAVE_STRING(custom_route_global)
|
||||
bool routeChanged = false;
|
||||
if (NekoRay::dataStore->active_routing != active_routing) routeChanged = true;
|
||||
SAVE_TO_ROUTING(NekoRay::dataStore->routing)
|
||||
SaveDisplayRouting(NekoRay::dataStore->routing);
|
||||
NekoRay::dataStore->active_routing = active_routing;
|
||||
NekoRay::dataStore->routing->fn = ROUTES_PREFIX + NekoRay::dataStore->active_routing;
|
||||
if (NekoRay::dataStore->routing->Save()) routeChanged = true;
|
||||
@@ -120,22 +125,57 @@ QList<QAction *> DialogManageRoutes::getBuiltInSchemes() {
|
||||
QAction *DialogManageRoutes::schemeToAction(const QString &name, const NekoRay::Routing &scheme) {
|
||||
auto *action = new QAction(this);
|
||||
action->setText(name);
|
||||
connect(action, &QAction::triggered, [this, &scheme] { this->SetRouteConfig(scheme); });
|
||||
connect(action, &QAction::triggered, [this, &scheme] { this->UpdateDisplayRouting((NekoRay::Routing *) &scheme, true); });
|
||||
return action;
|
||||
}
|
||||
|
||||
void DialogManageRoutes::SetRouteConfig(const NekoRay::Routing &conf) {
|
||||
void DialogManageRoutes::UpdateDisplayRouting(NekoRay::Routing *conf, bool qv) {
|
||||
//
|
||||
directDomainTxt->setPlainText(conf.direct_domain);
|
||||
proxyDomainTxt->setPlainText(conf.proxy_domain);
|
||||
blockDomainTxt->setPlainText(conf.block_domain);
|
||||
directDomainTxt->setPlainText(conf->direct_domain);
|
||||
proxyDomainTxt->setPlainText(conf->proxy_domain);
|
||||
blockDomainTxt->setPlainText(conf->block_domain);
|
||||
//
|
||||
blockIPTxt->setPlainText(conf.block_ip);
|
||||
directIPTxt->setPlainText(conf.direct_ip);
|
||||
proxyIPTxt->setPlainText(conf.proxy_ip);
|
||||
blockIPTxt->setPlainText(conf->block_ip);
|
||||
directIPTxt->setPlainText(conf->direct_ip);
|
||||
proxyIPTxt->setPlainText(conf->proxy_ip);
|
||||
//
|
||||
CACHE.custom_route = conf.custom;
|
||||
ui->def_outbound->setCurrentText(conf.def_outbound);
|
||||
CACHE.custom_route = conf->custom;
|
||||
ui->def_outbound->setCurrentText(conf->def_outbound);
|
||||
//
|
||||
if (qv) return;
|
||||
//
|
||||
ui->sniffing_mode->setCurrentIndex(conf->sniffing_mode);
|
||||
ui->outbound_domain_strategy->setCurrentText(conf->outbound_domain_strategy);
|
||||
ui->domainStrategyCombo->setCurrentText(conf->outbound_domain_strategy);
|
||||
ui->use_dns_object->setChecked(conf->use_dns_object);
|
||||
ui->dns_object->setPlainText(conf->dns_object);
|
||||
ui->dns_routing->setChecked(conf->dns_routing);
|
||||
ui->remote_dns->setText(conf->remote_dns);
|
||||
ui->remote_dns_strategy->setCurrentText(conf->remote_dns_strategy);
|
||||
ui->direct_dns->setText(conf->direct_dns);
|
||||
ui->direct_dns_strategy->setCurrentText(conf->direct_dns_strategy);
|
||||
}
|
||||
|
||||
void DialogManageRoutes::SaveDisplayRouting(NekoRay::Routing *conf) {
|
||||
conf->direct_ip = directIPTxt->toPlainText();
|
||||
conf->direct_domain = directDomainTxt->toPlainText();
|
||||
conf->proxy_ip = proxyIPTxt->toPlainText();
|
||||
conf->proxy_domain = proxyDomainTxt->toPlainText();
|
||||
conf->block_ip = blockIPTxt->toPlainText();
|
||||
conf->block_domain = blockDomainTxt->toPlainText();
|
||||
conf->def_outbound = ui->def_outbound->currentText();
|
||||
conf->custom = CACHE.custom_route;
|
||||
//
|
||||
conf->sniffing_mode = ui->sniffing_mode->currentIndex();
|
||||
conf->domain_strategy = ui->domainStrategyCombo->currentText();
|
||||
conf->outbound_domain_strategy = ui->outbound_domain_strategy->currentText();
|
||||
conf->use_dns_object = ui->use_dns_object->isChecked();
|
||||
conf->dns_object = ui->dns_object->toPlainText();
|
||||
conf->dns_routing = ui->dns_routing->isChecked();
|
||||
conf->remote_dns = ui->remote_dns->text();
|
||||
conf->remote_dns_strategy = ui->remote_dns_strategy->currentText();
|
||||
conf->direct_dns = ui->direct_dns->text();
|
||||
conf->direct_dns_strategy = ui->direct_dns_strategy->currentText();
|
||||
}
|
||||
|
||||
void DialogManageRoutes::on_load_save_clicked() {
|
||||
@@ -172,7 +212,7 @@ void DialogManageRoutes::on_load_save_clicked() {
|
||||
r->fn = ROUTES_PREFIX + fn;
|
||||
if (r->Load()) {
|
||||
if (QMessageBox::question(nullptr, software_name, tr("Load routing: %1").arg(fn) + "\n" + r->DisplayRouting()) == QMessageBox::Yes) {
|
||||
REFRESH_ACTIVE_ROUTING(fn, r)
|
||||
REFRESH_ACTIVE_ROUTING(fn, r.get())
|
||||
w->accept();
|
||||
}
|
||||
}
|
||||
@@ -182,11 +222,11 @@ void DialogManageRoutes::on_load_save_clicked() {
|
||||
auto fn = lineEdit->text();
|
||||
if (!fn.isEmpty()) {
|
||||
auto r = std::make_unique<NekoRay::Routing>();
|
||||
SAVE_TO_ROUTING(r)
|
||||
SaveDisplayRouting(r.get());
|
||||
r->fn = ROUTES_PREFIX + fn;
|
||||
if (QMessageBox::question(nullptr, software_name, tr("Save routing: %1").arg(fn) + "\n" + r->DisplayRouting()) == QMessageBox::Yes) {
|
||||
r->Save();
|
||||
REFRESH_ACTIVE_ROUTING(fn, r)
|
||||
REFRESH_ACTIVE_ROUTING(fn, r.get())
|
||||
w->accept();
|
||||
}
|
||||
}
|
||||
@@ -213,46 +253,3 @@ void DialogManageRoutes::on_load_save_clicked() {
|
||||
w->exec();
|
||||
w->deleteLater();
|
||||
}
|
||||
void DialogManageRoutes::on_queryStrategy_clicked() {
|
||||
auto w = new QDialog(this);
|
||||
w->setWindowTitle("DNS Query Strategy");
|
||||
auto layout = new QGridLayout;
|
||||
w->setLayout(layout);
|
||||
//
|
||||
QStringList qsValue{""};
|
||||
if (IS_NEKO_BOX) {
|
||||
qsValue += QString("prefer_ipv4 prefer_ipv6 ipv4_only ipv6_only").split(" ");
|
||||
} else {
|
||||
qsValue += QString("use_ip use_ip4 use_ip6").split(" ");
|
||||
}
|
||||
//
|
||||
auto remote_l = new QLabel(tr("Remote"));
|
||||
auto direct_l = new QLabel(tr("Direct"));
|
||||
auto remote = new QComboBox;
|
||||
auto direct = new QComboBox;
|
||||
remote->setEditable(true);
|
||||
remote->addItems(qsValue);
|
||||
remote->setCurrentText(NekoRay::dataStore->remote_dns_strategy);
|
||||
direct->setEditable(true);
|
||||
direct->addItems(qsValue);
|
||||
direct->setCurrentText(NekoRay::dataStore->direct_dns_strategy);
|
||||
//
|
||||
layout->addWidget(remote_l, 0, 0);
|
||||
layout->addWidget(remote, 0, 1);
|
||||
layout->addWidget(direct_l, 1, 0);
|
||||
layout->addWidget(direct, 1, 1);
|
||||
auto box = new QDialogButtonBox;
|
||||
box->setOrientation(Qt::Horizontal);
|
||||
box->setStandardButtons(QDialogButtonBox::Cancel | QDialogButtonBox::Ok);
|
||||
connect(box, &QDialogButtonBox::accepted, w, [=] {
|
||||
NekoRay::dataStore->remote_dns_strategy = remote->currentText();
|
||||
NekoRay::dataStore->direct_dns_strategy = direct->currentText();
|
||||
NekoRay::dataStore->Save();
|
||||
w->accept();
|
||||
});
|
||||
connect(box, &QDialogButtonBox::rejected, w, &QDialog::reject);
|
||||
layout->addWidget(box, 2, 1);
|
||||
//
|
||||
w->exec();
|
||||
w->deleteLater();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user