mirror of
https://github.com/Qv2ray/Qv2ray.git
synced 2025-05-20 19:00:22 +08:00
fix: several fix of complex editor
This commit is contained in:
parent
1a3a3c3266
commit
c6075b1dc6
@ -1 +1 @@
|
|||||||
2992
|
3005
|
||||||
|
@ -20,7 +20,7 @@ static bool isLoading = false;
|
|||||||
|
|
||||||
#define CHECKEMPTYRULES if (this->rules.isEmpty()) { \
|
#define CHECKEMPTYRULES if (this->rules.isEmpty()) { \
|
||||||
LOG(MODULE_UI, "No rules currently, we add one.") \
|
LOG(MODULE_UI, "No rules currently, we add one.") \
|
||||||
on_addRouteBtn_clicked(); \
|
AddNewRule(); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define GRAPH_GLOBAL_OFFSET_X -80
|
#define GRAPH_GLOBAL_OFFSET_X -80
|
||||||
@ -82,17 +82,17 @@ RouteEditor::RouteEditor(QJsonObject connection, QWidget *parent) : QDialog(pare
|
|||||||
// Show connections in the node graph
|
// Show connections in the node graph
|
||||||
for (auto in : root["inbounds"].toArray()) {
|
for (auto in : root["inbounds"].toArray()) {
|
||||||
INBOUND _in = INBOUND(in.toObject());
|
INBOUND _in = INBOUND(in.toObject());
|
||||||
AddNewInbound(_in);
|
AddInbound(_in);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto out : root["outbounds"].toArray()) {
|
for (auto out : root["outbounds"].toArray()) {
|
||||||
OUTBOUND _out = OUTBOUND(out.toObject());
|
OUTBOUND _out = OUTBOUND(out.toObject());
|
||||||
AddNewOutbound(_out);
|
AddOutbound(_out);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto item : root["routing"].toObject()["rules"].toArray()) {
|
for (auto item : root["routing"].toObject()["rules"].toArray()) {
|
||||||
auto _rule = StructFromJsonString<RuleObject>(JsonToString(item.toObject()));
|
auto _rule = StructFromJsonString<RuleObject>(JsonToString(item.toObject()));
|
||||||
AddNewRule(_rule);
|
AddRule(_rule);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set default outboung combo text AFTER adding all outbounds.
|
// Set default outboung combo text AFTER adding all outbounds.
|
||||||
@ -300,11 +300,18 @@ CONFIGROOT RouteEditor::OpenEditor()
|
|||||||
|
|
||||||
// Convert our internal data format to QJsonArray
|
// Convert our internal data format to QJsonArray
|
||||||
for (auto x : inbounds) {
|
for (auto x : inbounds) {
|
||||||
|
if (x.isEmpty())
|
||||||
|
continue;
|
||||||
|
|
||||||
_inbounds.append(x.raw());
|
_inbounds.append(x.raw());
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto x : outbounds) {
|
for (auto x : outbounds) {
|
||||||
|
if (x.isEmpty())
|
||||||
|
continue;
|
||||||
|
|
||||||
if (getTag(x) == defaultOutbound) {
|
if (getTag(x) == defaultOutbound) {
|
||||||
|
LOG(MODULE_CONNECTION, "Pushing default outbound to the front.")
|
||||||
// Put the default outbound to the first.
|
// Put the default outbound to the first.
|
||||||
_outbounds.push_front(x.raw());
|
_outbounds.push_front(x.raw());
|
||||||
} else {
|
} else {
|
||||||
@ -328,7 +335,13 @@ void RouteEditor::ShowCurrentRuleDetail()
|
|||||||
{
|
{
|
||||||
LOADINGCHECK
|
LOADINGCHECK
|
||||||
|
|
||||||
|
if (currentRuleTag.isEmpty()) {
|
||||||
|
LOG(MODULE_UI, "WARNING, trying to access a non-exist rule entry. return.")
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!rules.contains(currentRuleTag)) {
|
if (!rules.contains(currentRuleTag)) {
|
||||||
|
QvMessageBoxWarn(this, tr("Show rule details"), tr("A rule cannot be found: ") + currentRuleTag);
|
||||||
LOG(MODULE_UI, "WARNING, trying to access a non-exist rule entry. return.")
|
LOG(MODULE_UI, "WARNING, trying to access a non-exist rule entry. return.")
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -389,15 +402,17 @@ void RouteEditor::ShowCurrentRuleDetail()
|
|||||||
ipList->setPlainText(ips);
|
ipList->setPlainText(ips);
|
||||||
LOAD_FLAG_END
|
LOAD_FLAG_END
|
||||||
}
|
}
|
||||||
|
|
||||||
void RouteEditor::on_insertDirectBtn_clicked()
|
void RouteEditor::on_insertDirectBtn_clicked()
|
||||||
{
|
{
|
||||||
auto freedom = GenerateFreedomOUT("as-is", "", 0);
|
auto freedom = GenerateFreedomOUT("as-is", "", 0);
|
||||||
auto tag = "Freedom_" + QSTRN(QTime::currentTime().msecsSinceStartOfDay());
|
auto tag = "Freedom_" + QSTRN(QTime::currentTime().msecsSinceStartOfDay());
|
||||||
auto out = GenerateOutboundEntry("freedom", freedom, QJsonObject(), QJsonObject(), "0.0.0.0", tag);
|
auto out = GenerateOutboundEntry("freedom", freedom, QJsonObject(), QJsonObject(), "0.0.0.0", tag);
|
||||||
// ADD NODE
|
// ADD NODE
|
||||||
AddNewOutbound(out);
|
AddOutbound(out);
|
||||||
statusLabel->setText(tr("Added DIRECT outbound"));
|
statusLabel->setText(tr("Added DIRECT outbound"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void RouteEditor::on_routeProtocolHTTPCB_stateChanged(int arg1)
|
void RouteEditor::on_routeProtocolHTTPCB_stateChanged(int arg1)
|
||||||
{
|
{
|
||||||
LOADINGCHECK
|
LOADINGCHECK
|
||||||
@ -488,18 +503,8 @@ void RouteEditor::on_routeUserTxt_textEdited(const QString &arg1)
|
|||||||
}
|
}
|
||||||
void RouteEditor::on_addRouteBtn_clicked()
|
void RouteEditor::on_addRouteBtn_clicked()
|
||||||
{
|
{
|
||||||
LOADINGCHECK
|
auto ruleName = AddNewRule();
|
||||||
// Add Route
|
Q_UNUSED(ruleName)
|
||||||
RuleObject rule;
|
|
||||||
//
|
|
||||||
rule.QV2RAY_RULE_ENABLED = true;
|
|
||||||
rule.QV2RAY_RULE_USE_BALANCER = false;
|
|
||||||
// Default balancer tag, it's a random string.
|
|
||||||
auto bTag = GenerateRandomString();
|
|
||||||
rule.QV2RAY_RULE_TAG = rules.isEmpty() ? tr("Default rule") : (tr("rule") + "-" + GenerateRandomString(5));
|
|
||||||
rule.balancerTag = bTag;
|
|
||||||
balancers[bTag] = QStringList();
|
|
||||||
AddNewRule(rule);
|
|
||||||
}
|
}
|
||||||
void RouteEditor::on_netBothRB_clicked()
|
void RouteEditor::on_netBothRB_clicked()
|
||||||
{
|
{
|
||||||
@ -570,8 +575,8 @@ void RouteEditor::on_addDefaultBtn_clicked()
|
|||||||
auto _in_HTTP = GenerateInboundEntry(_Inconfig.listenip, _Inconfig.http_port, "http", _in_httpConf, "HTTP_gConf");
|
auto _in_HTTP = GenerateInboundEntry(_Inconfig.listenip, _Inconfig.http_port, "http", _in_httpConf, "HTTP_gConf");
|
||||||
auto _in_SOCKS = GenerateInboundEntry(_Inconfig.listenip, _Inconfig.socks_port, "socks", _in_socksConf, "SOCKS_gConf");
|
auto _in_SOCKS = GenerateInboundEntry(_Inconfig.listenip, _Inconfig.socks_port, "socks", _in_socksConf, "SOCKS_gConf");
|
||||||
//
|
//
|
||||||
AddNewInbound(_in_HTTP);
|
AddInbound(_in_HTTP);
|
||||||
AddNewInbound(_in_SOCKS);
|
AddInbound(_in_SOCKS);
|
||||||
CHECKEMPTYRULES
|
CHECKEMPTYRULES
|
||||||
}
|
}
|
||||||
void RouteEditor::on_insertBlackBtn_clicked()
|
void RouteEditor::on_insertBlackBtn_clicked()
|
||||||
@ -580,7 +585,7 @@ void RouteEditor::on_insertBlackBtn_clicked()
|
|||||||
auto blackHole = GenerateBlackHoleOUT(false);
|
auto blackHole = GenerateBlackHoleOUT(false);
|
||||||
auto tag = "blackhole_" + QSTRN(QTime::currentTime().msecsSinceStartOfDay());
|
auto tag = "blackhole_" + QSTRN(QTime::currentTime().msecsSinceStartOfDay());
|
||||||
auto _blackHoleOutbound = GenerateOutboundEntry("blackhole", blackHole, QJsonObject(), QJsonObject(), "0.0.0.0", tag);
|
auto _blackHoleOutbound = GenerateOutboundEntry("blackhole", blackHole, QJsonObject(), QJsonObject(), "0.0.0.0", tag);
|
||||||
AddNewOutbound(_blackHoleOutbound);
|
AddOutbound(_blackHoleOutbound);
|
||||||
}
|
}
|
||||||
void RouteEditor::on_addInboundBtn_clicked()
|
void RouteEditor::on_addInboundBtn_clicked()
|
||||||
{
|
{
|
||||||
@ -589,7 +594,7 @@ void RouteEditor::on_addInboundBtn_clicked()
|
|||||||
auto _result = w.OpenEditor();
|
auto _result = w.OpenEditor();
|
||||||
|
|
||||||
if (w.result() == QDialog::Accepted) {
|
if (w.result() == QDialog::Accepted) {
|
||||||
AddNewInbound(_result);
|
AddInbound(_result);
|
||||||
}
|
}
|
||||||
|
|
||||||
CHECKEMPTYRULES
|
CHECKEMPTYRULES
|
||||||
@ -612,7 +617,7 @@ void RouteEditor::on_addOutboundBtn_clicked()
|
|||||||
auto confList = conf["outbounds"].toArray();
|
auto confList = conf["outbounds"].toArray();
|
||||||
|
|
||||||
for (int i = 0; i < confList.count(); i++) {
|
for (int i = 0; i < confList.count(); i++) {
|
||||||
AddNewOutbound(OUTBOUND(confList[i].toObject()));
|
AddOutbound(OUTBOUND(confList[i].toObject()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -642,22 +647,41 @@ void RouteEditor::on_delBtn_clicked()
|
|||||||
// Then remove the node container.
|
// Then remove the node container.
|
||||||
if (isInbound) {
|
if (isInbound) {
|
||||||
currentInboundOutboundTag = GetFirstNodeData(*firstNode, QvInboundNodeModel, InboundNodeData)->GetInbound();
|
currentInboundOutboundTag = GetFirstNodeData(*firstNode, QvInboundNodeModel, InboundNodeData)->GetInbound();
|
||||||
inbounds.remove(currentInboundOutboundTag);
|
|
||||||
nodeScene->removeNode(*inboundNodes[currentInboundOutboundTag]);
|
nodeScene->removeNode(*inboundNodes[currentInboundOutboundTag]);
|
||||||
inboundNodes.remove(currentInboundOutboundTag);
|
inboundNodes.remove(currentInboundOutboundTag);
|
||||||
|
|
||||||
|
// Remove corresponded inboundtags from the rules.
|
||||||
|
for (auto k : rules.keys()) {
|
||||||
|
auto v = rules[k];
|
||||||
|
v.inboundTag.removeAll(currentInboundOutboundTag);
|
||||||
|
rules[k] = v;
|
||||||
|
}
|
||||||
|
|
||||||
|
inbounds.remove(currentInboundOutboundTag);
|
||||||
} else if (isOutbound) {
|
} else if (isOutbound) {
|
||||||
currentInboundOutboundTag = GetFirstNodeData(*firstNode, QvOutboundNodeModel, OutboundNodeData)->GetOutbound();
|
currentInboundOutboundTag = GetFirstNodeData(*firstNode, QvOutboundNodeModel, OutboundNodeData)->GetOutbound();
|
||||||
outbounds.remove(currentInboundOutboundTag);
|
outbounds.remove(currentInboundOutboundTag);
|
||||||
nodeScene->removeNode(*outboundNodes[currentInboundOutboundTag]);
|
defaultOutboundCombo->clear();
|
||||||
outboundNodes.remove(currentInboundOutboundTag);
|
defaultOutboundCombo->addItems(outbounds.keys());
|
||||||
//
|
|
||||||
defaultOutboundCombo->removeItem(defaultOutbound.indexOf(currentInboundOutboundTag));
|
// Remove corresponded inboundtags from the rules.
|
||||||
|
for (auto k : rules.keys()) {
|
||||||
|
auto v = rules[k];
|
||||||
|
|
||||||
|
if (v.outboundTag == currentInboundOutboundTag)
|
||||||
|
v.outboundTag.clear();
|
||||||
|
|
||||||
|
rules[k] = v;
|
||||||
|
}
|
||||||
|
|
||||||
if (currentInboundOutboundTag == defaultOutbound) {
|
if (currentInboundOutboundTag == defaultOutbound) {
|
||||||
// Set default outbound to the new one since the current has been removed.
|
// Set default outbound to the new one since the current has been removed.
|
||||||
defaultOutbound = outbounds.firstKey();
|
defaultOutbound = outbounds.firstKey();
|
||||||
defaultOutboundCombo->setCurrentText(defaultOutbound);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
defaultOutboundCombo->setCurrentText(defaultOutbound);
|
||||||
|
nodeScene->removeNode(*outboundNodes[currentInboundOutboundTag]);
|
||||||
|
outboundNodes.remove(currentInboundOutboundTag);
|
||||||
} else if (isRule) {
|
} else if (isRule) {
|
||||||
ruleEnableCB->setEnabled(false);
|
ruleEnableCB->setEnabled(false);
|
||||||
currentRuleTag = GetFirstNodeData(*firstNode, QvRuleNodeDataModel, RuleNodeData)->GetRuleTag();
|
currentRuleTag = GetFirstNodeData(*firstNode, QvRuleNodeDataModel, RuleNodeData)->GetRuleTag();
|
||||||
@ -683,12 +707,18 @@ void RouteEditor::on_editBtn_clicked()
|
|||||||
QvMessageBoxWarn(this, tr("Edit Inbound/Outbound"), tr("Please select a node from the graph to continue."));
|
QvMessageBoxWarn(this, tr("Edit Inbound/Outbound"), tr("Please select a node from the graph to continue."));
|
||||||
}
|
}
|
||||||
|
|
||||||
auto firstNode = nodeScene->selectedNodes()[0];
|
auto firstNode = nodeScene->selectedNodes().at(0);
|
||||||
auto isInbound = inboundNodes.values().contains(firstNode);
|
auto isInbound = inboundNodes.values().contains(firstNode);
|
||||||
auto isOutbound = outboundNodes.values().contains(firstNode);
|
auto isOutbound = outboundNodes.values().contains(firstNode);
|
||||||
|
|
||||||
if (isInbound) {
|
if (isInbound) {
|
||||||
currentInboundOutboundTag = GetFirstNodeData(*firstNode, QvInboundNodeModel, InboundNodeData)->GetInbound();
|
currentInboundOutboundTag = GetFirstNodeData(*firstNode, QvInboundNodeModel, InboundNodeData)->GetInbound();
|
||||||
|
|
||||||
|
if (!inbounds.contains(currentInboundOutboundTag)) {
|
||||||
|
QvMessageBoxWarn(this, tr("Edit Inbound"), tr("No inbound tag found: ") + currentInboundOutboundTag);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
auto _in = inbounds[currentInboundOutboundTag];
|
auto _in = inbounds[currentInboundOutboundTag];
|
||||||
INBOUND _result;
|
INBOUND _result;
|
||||||
auto protocol = _in["protocol"].toString();
|
auto protocol = _in["protocol"].toString();
|
||||||
@ -719,13 +749,22 @@ void RouteEditor::on_editBtn_clicked()
|
|||||||
RenameItemTag(RENAME_INBOUND, getTag(_in), getTag(_result));
|
RenameItemTag(RENAME_INBOUND, getTag(_in), getTag(_result));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DEBUG(MODULE_UI, "Removed old tag: " + getTag(_in))
|
||||||
|
inbounds.remove(getTag(_in));
|
||||||
|
DEBUG(MODULE_UI, "Adding new tag: " + getTag(_result))
|
||||||
inbounds[getTag(_result)] = _result;
|
inbounds[getTag(_result)] = _result;
|
||||||
}
|
}
|
||||||
} else if (isOutbound) {
|
} else if (isOutbound) {
|
||||||
currentInboundOutboundTag = GetFirstNodeData(*firstNode, QvOutboundNodeModel, OutboundNodeData)->GetOutbound();
|
currentInboundOutboundTag = GetFirstNodeData(*firstNode, QvOutboundNodeModel, OutboundNodeData)->GetOutbound();
|
||||||
|
|
||||||
|
if (!outbounds.contains(currentInboundOutboundTag)) {
|
||||||
|
QvMessageBoxWarn(this, tr("Edit Inbound"), tr("No inbound tag found: ") + currentInboundOutboundTag);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
OUTBOUND _result;
|
OUTBOUND _result;
|
||||||
auto _out = outbounds[currentInboundOutboundTag];
|
auto _out = outbounds[currentInboundOutboundTag];
|
||||||
auto protocol = _out["protocol"].toString();
|
auto protocol = _out["protocol"].toString().toLower();
|
||||||
int _code;
|
int _code;
|
||||||
|
|
||||||
if (protocol != "vmess" && protocol != "shadowsocks" && protocol != "socks") {
|
if (protocol != "vmess" && protocol != "shadowsocks" && protocol != "socks") {
|
||||||
@ -747,9 +786,13 @@ void RouteEditor::on_editBtn_clicked()
|
|||||||
bool isTagChanged = getTag(_out) != getTag(_result);
|
bool isTagChanged = getTag(_out) != getTag(_result);
|
||||||
|
|
||||||
if (isTagChanged) {
|
if (isTagChanged) {
|
||||||
|
DEBUG(MODULE_UI, "Outbound tag is changed: " + QString(isTagChanged))
|
||||||
RenameItemTag(RENAME_OUTBOUND, getTag(_out), getTag(_result));
|
RenameItemTag(RENAME_OUTBOUND, getTag(_out), getTag(_result));
|
||||||
|
DEBUG(MODULE_UI, "Removed old tag: " + getTag(_out))
|
||||||
|
outbounds.remove(getTag(_out));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DEBUG(MODULE_UI, "Adding new tag: " + getTag(_result))
|
||||||
outbounds[getTag(_result)] = _result;
|
outbounds[getTag(_result)] = _result;
|
||||||
statusLabel->setText(tr("OK"));
|
statusLabel->setText(tr("OK"));
|
||||||
}
|
}
|
||||||
|
@ -112,7 +112,7 @@ class RouteEditor : public QDialog, private Ui::RouteEditor
|
|||||||
void onConnectionDeleted(QtNodes::Connection const &c);
|
void onConnectionDeleted(QtNodes::Connection const &c);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void RenameItemTag(ROUTE_EDIT_MODE mode, const QString &originalTag, const QString &newTag);
|
void RenameItemTag(ROUTE_EDIT_MODE mode, const QString originalTag, const QString newTag);
|
||||||
void ShowCurrentRuleDetail();
|
void ShowCurrentRuleDetail();
|
||||||
//
|
//
|
||||||
QString currentRuleTag;
|
QString currentRuleTag;
|
||||||
@ -136,7 +136,8 @@ class RouteEditor : public QDialog, private Ui::RouteEditor
|
|||||||
//
|
//
|
||||||
FlowScene *nodeScene;
|
FlowScene *nodeScene;
|
||||||
// ---------------------------- Extra Source File Headers ----------------
|
// ---------------------------- Extra Source File Headers ----------------
|
||||||
void AddNewInbound(INBOUND in);
|
void AddInbound(INBOUND in);
|
||||||
void AddNewOutbound(OUTBOUND out);
|
void AddOutbound(OUTBOUND out);
|
||||||
void AddNewRule(RuleObject rule);
|
void AddRule(RuleObject rule);
|
||||||
|
QString AddNewRule();
|
||||||
};
|
};
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
// Supplementary source file for Routes editor, basically providing routes-related operations.
|
// Supplementary source file for Routes editor, basically providing routes-related operations.
|
||||||
|
|
||||||
|
|
||||||
void RouteEditor::AddNewInbound(INBOUND in)
|
void RouteEditor::AddInbound(INBOUND in)
|
||||||
{
|
{
|
||||||
QString tag = getTag(in);
|
QString tag = getTag(in);
|
||||||
|
|
||||||
@ -14,6 +14,7 @@ void RouteEditor::AddNewInbound(INBOUND in)
|
|||||||
tag = tag + "_" + GenerateRandomString(5);
|
tag = tag + "_" + GenerateRandomString(5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
in["tag"] = tag;
|
||||||
auto _nodeData = make_unique<QvInboundNodeModel>(make_shared<InboundNodeData>(tag));
|
auto _nodeData = make_unique<QvInboundNodeModel>(make_shared<InboundNodeData>(tag));
|
||||||
auto &node = nodeScene->createNode(std::move(_nodeData));
|
auto &node = nodeScene->createNode(std::move(_nodeData));
|
||||||
auto pos = QPointF();
|
auto pos = QPointF();
|
||||||
@ -24,7 +25,7 @@ void RouteEditor::AddNewInbound(INBOUND in)
|
|||||||
inbounds[getTag(in)] = in;
|
inbounds[getTag(in)] = in;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RouteEditor::AddNewOutbound(OUTBOUND out)
|
void RouteEditor::AddOutbound(OUTBOUND out)
|
||||||
{
|
{
|
||||||
QString tag = getTag(out);
|
QString tag = getTag(out);
|
||||||
|
|
||||||
@ -32,6 +33,7 @@ void RouteEditor::AddNewOutbound(OUTBOUND out)
|
|||||||
tag = tag + "_" + GenerateRandomString(5);
|
tag = tag + "_" + GenerateRandomString(5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out["tag"] = tag;
|
||||||
auto _nodeData = make_unique<QvOutboundNodeModel>(make_shared<OutboundNodeData>(tag));
|
auto _nodeData = make_unique<QvOutboundNodeModel>(make_shared<OutboundNodeData>(tag));
|
||||||
auto pos = nodeGraphWidget->pos();
|
auto pos = nodeGraphWidget->pos();
|
||||||
pos.setX(pos.x() + 850 + GRAPH_GLOBAL_OFFSET_X);
|
pos.setX(pos.x() + 850 + GRAPH_GLOBAL_OFFSET_X);
|
||||||
@ -43,7 +45,23 @@ void RouteEditor::AddNewOutbound(OUTBOUND out)
|
|||||||
defaultOutboundCombo->addItem(tag);
|
defaultOutboundCombo->addItem(tag);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RouteEditor::AddNewRule(RuleObject rule)
|
QString RouteEditor::AddNewRule()
|
||||||
|
{
|
||||||
|
// Add Route
|
||||||
|
RuleObject rule;
|
||||||
|
//
|
||||||
|
rule.QV2RAY_RULE_ENABLED = true;
|
||||||
|
rule.QV2RAY_RULE_USE_BALANCER = false;
|
||||||
|
// Default balancer tag, it's a random string.
|
||||||
|
auto bTag = GenerateRandomString();
|
||||||
|
rule.QV2RAY_RULE_TAG = rules.isEmpty() ? tr("Default rule") : (tr("rule") + "-" + GenerateRandomString(6));
|
||||||
|
rule.balancerTag = bTag;
|
||||||
|
balancers[bTag] = QStringList();
|
||||||
|
AddRule(rule);
|
||||||
|
return rule.QV2RAY_RULE_TAG;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RouteEditor::AddRule(RuleObject rule)
|
||||||
{
|
{
|
||||||
// Prevent duplicate
|
// Prevent duplicate
|
||||||
if (ruleNodes.contains(rule.QV2RAY_RULE_TAG)) {
|
if (ruleNodes.contains(rule.QV2RAY_RULE_TAG)) {
|
||||||
@ -59,54 +77,68 @@ void RouteEditor::AddNewRule(RuleObject rule)
|
|||||||
nodeScene->setNodePosition(node, pos);
|
nodeScene->setNodePosition(node, pos);
|
||||||
|
|
||||||
for (auto inTag : rule.inboundTag) {
|
for (auto inTag : rule.inboundTag) {
|
||||||
auto inboundNode = inboundNodes[inTag];
|
if (!inboundNodes.contains(inTag)) {
|
||||||
nodeScene->createConnection(node, 0, *inboundNode, 0);
|
LOG(MODULE_UI, "No inbound tag found for rule: " + rule.QV2RAY_RULE_TAG + ", inbound tag: " + inTag)
|
||||||
|
QvMessageBoxWarn(this, tr("No Inbound"), tr("No inbound item found: ") + inTag);
|
||||||
|
rule.inboundTag.removeAll(inTag);
|
||||||
|
} else {
|
||||||
|
auto inboundNode = inboundNodes[inTag];
|
||||||
|
nodeScene->createConnection(node, 0, *inboundNode, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If not using balancers (use outbound tag)
|
// If not using balancers (use outbound tag)
|
||||||
if (!rule.QV2RAY_RULE_USE_BALANCER && outboundNodes.contains(rule.outboundTag)) {
|
if (!rule.QV2RAY_RULE_USE_BALANCER) {
|
||||||
nodeScene->createConnection(*outboundNodes[rule.outboundTag], 0, node, 0);
|
if (outboundNodes.contains(rule.outboundTag)) {
|
||||||
|
DEBUG(MODULE_GRAPH, "Found outbound tag: " + rule.outboundTag + ", for rule: " + rule.QV2RAY_RULE_TAG)
|
||||||
|
nodeScene->createConnection(*outboundNodes[rule.outboundTag], 0, node, 0);
|
||||||
|
} else {
|
||||||
|
LOG(MODULE_GRAPH, "Outbound tag not found: " + rule.outboundTag + ", for: " + rule.QV2RAY_RULE_TAG)
|
||||||
|
QvMessageBoxWarn(this, tr("No outbound tag"), tr("Please connect the rule with an outbound."));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this->ruleNodes[rule.QV2RAY_RULE_TAG] = &node;
|
this->ruleNodes[rule.QV2RAY_RULE_TAG] = &node;
|
||||||
ruleListWidget->addItem(rule.QV2RAY_RULE_TAG);
|
ruleListWidget->addItem(rule.QV2RAY_RULE_TAG);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RouteEditor::RenameItemTag(ROUTE_EDIT_MODE mode, const QString &originalTag, const QString &newTag)
|
// Do not use reference here, we need deep
|
||||||
|
void RouteEditor::RenameItemTag(ROUTE_EDIT_MODE mode, const QString originalTag, QString newTag)
|
||||||
{
|
{
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case RENAME_RULE:
|
case RENAME_RULE:
|
||||||
if (rules.contains(originalTag) && ruleNodes.contains(originalTag)) {
|
if (rules.contains(originalTag) && ruleNodes.contains(originalTag)) {
|
||||||
if (rules.contains(newTag) && rules.contains(newTag)) {
|
if (rules.contains(newTag) && rules.contains(newTag)) {
|
||||||
QvMessageBoxWarn(this, tr("Rename tags"), tr("The new tag has been used, please suggest another."));
|
QvMessageBoxWarn(this, tr("Rename tags"), tr("The new tag has been used, we appended a postfix."));
|
||||||
return;
|
newTag += "_" + GenerateRandomString(5);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
auto node = static_cast<QvRuleNodeDataModel *>(ruleNodes[originalTag]->nodeDataModel());
|
auto node = static_cast<QvRuleNodeDataModel *>(ruleNodes[originalTag]->nodeDataModel());
|
||||||
|
|
||||||
|
if (node == nullptr) {
|
||||||
|
LOG(MODULE_GRAPH, "EMPTY NODE WARN")
|
||||||
|
}
|
||||||
|
|
||||||
node->setData(newTag);
|
node->setData(newTag);
|
||||||
//
|
//
|
||||||
rules[newTag] = rules.take(originalTag);
|
rules[newTag] = rules.take(originalTag);
|
||||||
|
rules[newTag].QV2RAY_RULE_TAG = newTag;
|
||||||
ruleNodes[newTag] = ruleNodes.take(originalTag);
|
ruleNodes[newTag] = ruleNodes.take(originalTag);
|
||||||
|
//
|
||||||
// No other operation needed, but need to rename the one in the ruleOrder list widget.
|
// No other operation needed, but need to rename the one in the ruleOrder list widget.
|
||||||
auto items = ruleListWidget->findItems(originalTag, Qt::MatchExactly);
|
auto items = ruleListWidget->findItems(originalTag, Qt::MatchExactly);
|
||||||
|
|
||||||
if (!items.isEmpty()) {
|
if (items.isEmpty()) {
|
||||||
auto item = items.first();
|
|
||||||
item->setText(newTag);
|
|
||||||
} else {
|
|
||||||
LOG(MODULE_UI, "Cannot find a node: " + originalTag)
|
LOG(MODULE_UI, "Cannot find a node: " + originalTag)
|
||||||
|
} else {
|
||||||
|
items.first()->setText(newTag);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (currentRuleTag == originalTag) {
|
if (currentRuleTag == originalTag) {
|
||||||
currentRuleTag = newTag;
|
currentRuleTag = newTag;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Do not move this line, since originalTag is a reference (implicitly a pointer) to this value.
|
|
||||||
// We must change this at last.
|
|
||||||
rules[newTag].QV2RAY_RULE_TAG = newTag;
|
|
||||||
} else {
|
} else {
|
||||||
LOG(MODULE_UI, "There's thing match " + originalTag + " in the containers.")
|
LOG(MODULE_UI, "There's nothing match " + originalTag + " in the containers.")
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@ -114,13 +146,18 @@ void RouteEditor::RenameItemTag(ROUTE_EDIT_MODE mode, const QString &originalTag
|
|||||||
case RENAME_OUTBOUND:
|
case RENAME_OUTBOUND:
|
||||||
if (outbounds.contains(originalTag) && outboundNodes.contains(originalTag)) {
|
if (outbounds.contains(originalTag) && outboundNodes.contains(originalTag)) {
|
||||||
if (outbounds.contains(newTag) && outboundNodes.contains(newTag)) {
|
if (outbounds.contains(newTag) && outboundNodes.contains(newTag)) {
|
||||||
QvMessageBoxWarn(this, tr("Rename tags"), tr("The new tag has been used, please suggest another."));
|
QvMessageBoxWarn(this, tr("Rename tags"), tr("The new tag has been used, we appended a postfix."));
|
||||||
return;
|
newTag += "_" + GenerateRandomString(5);
|
||||||
}
|
}
|
||||||
|
|
||||||
outbounds[newTag] = outbounds.take(originalTag);
|
outbounds[newTag] = outbounds.take(originalTag);
|
||||||
outboundNodes[newTag] = outboundNodes.take(originalTag);
|
outboundNodes[newTag] = outboundNodes.take(originalTag);
|
||||||
auto node = static_cast<QvOutboundNodeModel *>(outboundNodes[newTag]->nodeDataModel());
|
auto node = static_cast<QvOutboundNodeModel *>(outboundNodes[newTag]->nodeDataModel());
|
||||||
|
|
||||||
|
if (node == nullptr) {
|
||||||
|
LOG(MODULE_GRAPH, "EMPTY NODE WARN")
|
||||||
|
}
|
||||||
|
|
||||||
node->setData(newTag);
|
node->setData(newTag);
|
||||||
|
|
||||||
// Change outbound tag in rules accordingly.
|
// Change outbound tag in rules accordingly.
|
||||||
@ -142,21 +179,29 @@ void RouteEditor::RenameItemTag(ROUTE_EDIT_MODE mode, const QString &originalTag
|
|||||||
case RENAME_INBOUND:
|
case RENAME_INBOUND:
|
||||||
if (inbounds.contains(originalTag) && inboundNodes.contains(originalTag)) {
|
if (inbounds.contains(originalTag) && inboundNodes.contains(originalTag)) {
|
||||||
if (inbounds.contains(newTag) && inboundNodes.contains(newTag)) {
|
if (inbounds.contains(newTag) && inboundNodes.contains(newTag)) {
|
||||||
QvMessageBoxWarn(this, tr("Rename tags"), tr("The new tag has been used, please suggest another."));
|
QvMessageBoxWarn(this, tr("Rename tags"), tr("The new tag has been used, we appended a postfix."));
|
||||||
return;
|
newTag += "_" + GenerateRandomString(5);
|
||||||
}
|
}
|
||||||
|
|
||||||
inbounds[newTag] = inbounds.take(originalTag);
|
inbounds[newTag] = inbounds.take(originalTag);
|
||||||
inboundNodes[newTag] = inboundNodes.take(originalTag);
|
inboundNodes[newTag] = inboundNodes.take(originalTag);
|
||||||
static_cast<QvInboundNodeModel *>(inboundNodes[newTag]->nodeDataModel())->setData(newTag);
|
auto node = static_cast<QvInboundNodeModel *>(inboundNodes[newTag]->nodeDataModel());
|
||||||
|
|
||||||
|
if (node == nullptr) {
|
||||||
|
LOG(MODULE_GRAPH, "EMPTY NODE WARN")
|
||||||
|
}
|
||||||
|
|
||||||
|
node->setData(newTag);
|
||||||
|
|
||||||
// Change inbound tag in rules accordingly.
|
// Change inbound tag in rules accordingly.
|
||||||
|
// k -> rule tag
|
||||||
|
// v -> rule object
|
||||||
for (auto k : rules.keys()) {
|
for (auto k : rules.keys()) {
|
||||||
auto v = rules[k];
|
auto v = rules[k];
|
||||||
|
|
||||||
if (v.inboundTag.contains(originalTag)) {
|
if (v.inboundTag.contains(originalTag)) {
|
||||||
v.inboundTag.removeAll(originalTag);
|
|
||||||
v.inboundTag.append(newTag);
|
v.inboundTag.append(newTag);
|
||||||
|
v.inboundTag.removeAll(originalTag);
|
||||||
// Put this inside the if block since no need an extra operation if the condition is false.
|
// Put this inside the if block since no need an extra operation if the condition is false.
|
||||||
rules[k] = v;
|
rules[k] = v;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user