From 796ada817da6dda4aa41d83a0adc98a3b7a68d17 Mon Sep 17 00:00:00 2001 From: Qv2ray-dev <59914293+Qv2ray-dev@users.noreply.github.com> Date: Sun, 12 Apr 2020 17:57:45 +0800 Subject: [PATCH] change: PreferencesWindow refactor and added custom Qv2ray proxy --- src/base/models/QvSettingsObject.hpp | 48 +- src/common/HTTPRequestHelper.cpp | 113 +- src/common/HTTPRequestHelper.hpp | 18 +- src/components/update/UpdateChecker.cpp | 4 +- src/core/handler/ConfigHandler.cpp | 2 +- src/ui/w_PreferencesWindow.cpp | 36 + src/ui/w_PreferencesWindow.hpp | 10 + src/ui/w_PreferencesWindow.ui | 1741 +++++++++++------------ src/ui/widgets/RouteSettingsMatrix.ui | 163 +-- 9 files changed, 1061 insertions(+), 1074 deletions(-) diff --git a/src/base/models/QvSettingsObject.hpp b/src/base/models/QvSettingsObject.hpp index 8c54f737..155e6ce9 100644 --- a/src/base/models/QvSettingsObject.hpp +++ b/src/base/models/QvSettingsObject.hpp @@ -214,6 +214,17 @@ namespace Qv2ray::base::config XTOSTRUCT(O(ignoredVersion, updateChannel)) }; + struct Qv2rayNetworkConfig + { + bool useCustomProxy; + QString address; + QString type; + int port; + QString userAgent; + Qv2rayNetworkConfig() : address(""), type("http"), port(8000), userAgent("Qv2ray/" QV2RAY_VERSION_STRING " WebRequestHelper"){}; + XTOSTRUCT(O(useCustomProxy, type, address, port, userAgent)) + }; + struct Qv2rayConfig { int config_version; @@ -233,18 +244,47 @@ namespace Qv2ray::base::config Qv2rayPluginConfig pluginConfig; Qv2rayKernelConfig kernelConfig; Qv2rayUpdateConfig updateConfig; + Qv2rayNetworkConfig networkConfig; Qv2rayToolBarConfig toolBarConfig; Qv2rayInboundsConfig inboundConfig; Qv2rayConnectionConfig connectionConfig; Qv2rayConfig() - : config_version(QV2RAY_CONFIG_VERSION), tProxySupport(false), logLevel(), autoStartId("null"), groups(), subscriptions(), - connections(), uiConfig(), apiConfig(), pluginConfig(), kernelConfig(), updateConfig(), toolBarConfig(), inboundConfig(), + : config_version(QV2RAY_CONFIG_VERSION), // + tProxySupport(false), // + logLevel(), // + autoStartId("null"), // + groups(), // + subscriptions(), // + connections(), // + uiConfig(), // + apiConfig(), // + pluginConfig(), // + kernelConfig(), // + updateConfig(), // + networkConfig(), // + toolBarConfig(), // + inboundConfig(), // connectionConfig() { } - XTOSTRUCT(O(config_version, tProxySupport, logLevel, uiConfig, pluginConfig, updateConfig, kernelConfig, groups, connections, - subscriptions, autoStartId, inboundConfig, connectionConfig, toolBarConfig, apiConfig)) + XTOSTRUCT(O(config_version, // + tProxySupport, // + logLevel, // + uiConfig, // + pluginConfig, // + updateConfig, // + kernelConfig, // + networkConfig, // + groups, // + connections, // + subscriptions, // + autoStartId, // + inboundConfig, // + connectionConfig, // + toolBarConfig, // + apiConfig // + )) }; } // namespace Qv2ray::base::config diff --git a/src/common/HTTPRequestHelper.cpp b/src/common/HTTPRequestHelper.cpp index 240f3b6e..04797596 100644 --- a/src/common/HTTPRequestHelper.cpp +++ b/src/common/HTTPRequestHelper.cpp @@ -16,112 +16,71 @@ namespace Qv2ray::common accessManager.disconnect(); } - bool QvHttpRequestHelper::setUrl(const QString &url) - { - QUrl qUrl = QUrl(url); - - if (!qUrl.isValid()) - { - LOG(MODULE_NETWORK, "Provided URL is invalid: " + url) - return false; - } - - request.setUrl(qUrl); - return true; - } - void QvHttpRequestHelper::setHeader(const QByteArray &key, const QByteArray &value) { DEBUG(MODULE_NETWORK, "Adding HTTP request header: " + key + ":" + value) request.setRawHeader(key, value); } - QByteArray QvHttpRequestHelper::syncget(const QString &url, bool useProxy) + QByteArray QvHttpRequestHelper::Get(const QString &url, bool useProxy) { - this->setUrl(url); - + request.setUrl({ url }); if (useProxy) { - auto proxy = QNetworkProxyFactory::systemProxyForQuery(); - accessManager.setProxy(proxy.first()); - LOG(MODULE_NETWORK, "Sync get is using system proxy settings") + auto p = GlobalConfig.networkConfig.useCustomProxy ? + QNetworkProxy{ + GlobalConfig.networkConfig.type == "http" ? QNetworkProxy::HttpProxy : QNetworkProxy::Socks5Proxy, // + GlobalConfig.networkConfig.address, // + quint16(GlobalConfig.networkConfig.port) // + } : + QNetworkProxyFactory::systemProxyForQuery().first(); + accessManager.setProxy(p); } else { + LOG(MODULE_NETWORK, "Get without proxy.") accessManager.setProxy(QNetworkProxy(QNetworkProxy::ProxyType::NoProxy)); } request.setAttribute(QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::NoLessSafeRedirectPolicy); request.setAttribute(QNetworkRequest::HTTP2AllowedAttribute, true); - request.setHeader(QNetworkRequest::KnownHeaders::UserAgentHeader, "Mozilla/5.0 (rv:71.0) Gecko/20100101 Firefox/71.0"); + request.setHeader(QNetworkRequest::KnownHeaders::UserAgentHeader, GlobalConfig.networkConfig.userAgent); reply = accessManager.get(request); - connect(reply, &QNetworkReply::finished, this, &QvHttpRequestHelper::onRequestFinished_p); // QEventLoop loop; connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit); loop.exec(); + // // Data or timeout? auto data = reply->readAll(); return data; } - void QvHttpRequestHelper::get(const QString &url) + void QvHttpRequestHelper::AsyncGet(const QString &url) { - this->setUrl(url); - // request.setRawHeader("Content-Type", - // "application/x-www-form-urlencoded"); + request.setUrl({ url }); + if (GlobalConfig.networkConfig.useCustomProxy) + { + QNetworkProxy p{ + GlobalConfig.networkConfig.type == "http" ? QNetworkProxy::HttpProxy : QNetworkProxy::Socks5Proxy, // + GlobalConfig.networkConfig.address, // + quint16(GlobalConfig.networkConfig.port) // + }; + accessManager.setProxy(p); + } + else + { + LOG(MODULE_NETWORK, "Get without proxy.") + accessManager.setProxy(QNetworkProxy(QNetworkProxy::ProxyType::NoProxy)); + } + request.setAttribute(QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::NoLessSafeRedirectPolicy); + request.setAttribute(QNetworkRequest::HTTP2AllowedAttribute, true); + request.setHeader(QNetworkRequest::KnownHeaders::UserAgentHeader, GlobalConfig.networkConfig.userAgent); reply = accessManager.get(request); connect(reply, &QNetworkReply::finished, this, &QvHttpRequestHelper::onRequestFinished_p); - connect(reply, &QNetworkReply::readyRead, this, &QvHttpRequestHelper::onReadyRead); + connect(reply, &QNetworkReply::readyRead, this, &QvHttpRequestHelper::onReadyRead_p); } - // void QvHttpRequestHelper::post(const QString &url, const QByteArray - // &data) - //{ - // this->setUrl(url); - // request.setRawHeader("Content-Type", "application/json"); - // reply = accessManager.post(request, data); - // connect(reply, &QNetworkReply::finished, this, - // &QvHttpRequestHelper::onRequestFinished); connect(reply, - // &QNetworkReply::readyRead, this, &QvHttpRequestHelper::onReadyRead); - //} - - // void QvHttpRequestHelper::put(const QString &url, const QByteArray - // &data) - // { - // this->setUrl(url); - // request.setRawHeader("Content-Type", "application/json"); - // reply = accessManager.put(request, data); - // connect(reply, &QNetworkReply::finished, this, - // &QvHttpRequestHelper::onRequestFinished); connect(reply, - // &QNetworkReply::readyRead, this, - // &QvHttpRequestHelper::onReadyRead); - // } - - // void QvHttpRequestHelper::del(const QString &url) - // { - // this->setUrl(url); - // request.setRawHeader("Content-Type", "application/json"); - // reply = accessManager.deleteResource(request); - // connect(reply, &QNetworkReply::finished, this, - // &QvHttpRequestHelper::onRequestFinished); connect(reply, - // &QNetworkReply::readyRead, this, - // &QvHttpRequestHelper::onReadyRead); - // } - - // void QvHttpRequestHelper::login(const QString &url, const QByteArray - // &data) - // { - // this->setUrl(url); - // request.setRawHeader("Content-Type", - // "application/x-www-form-urlencoded"); reply = - // accessManager.post(request, data); connect(reply, - // &QNetworkReply::finished, this, - // &QvHttpRequestHelper::onRequestFinished); connect(reply, - // &QNetworkReply::readyRead, this, - // &QvHttpRequestHelper::onReadyRead); - // } - void QvHttpRequestHelper::onRequestFinished_p() { if (reply->attribute(QNetworkRequest::HTTP2WasUsedAttribute).toBool()) @@ -134,15 +93,15 @@ namespace Qv2ray::common QString error = QMetaEnum::fromType().key(reply->error()); LOG(MODULE_NETWORK, "Network request error string: " + error) QByteArray empty; - emit httpRequestFinished(empty); + emit OnRequestFinished(empty); } else { - emit httpRequestFinished(this->data); + emit OnRequestFinished(this->data); } } - void QvHttpRequestHelper::onReadyRead() + void QvHttpRequestHelper::onReadyRead_p() { DEBUG(MODULE_NETWORK, "A request is now ready read") this->data += reply->readAll(); diff --git a/src/common/HTTPRequestHelper.hpp b/src/common/HTTPRequestHelper.hpp index c2ebc159..a2f8f14b 100644 --- a/src/common/HTTPRequestHelper.hpp +++ b/src/common/HTTPRequestHelper.hpp @@ -31,26 +31,18 @@ namespace Qv2ray::common public: explicit QvHttpRequestHelper(QObject *parent = nullptr); ~QvHttpRequestHelper(); - bool setUrl(const QString &url); - void setHeader(const QByteArray &key, const QByteArray &value); // get - QByteArray syncget(const QString &url, bool useProxy); - void get(const QString &url); - //// insert - // void post(const QString &url, const QByteArray &data); - //// update - // void put(const QString &url, const QByteArray &data); - //// delete - // void del(const QString &url); - // void login(const QString &url, const QByteArray &data); + void AsyncGet(const QString &url); + QByteArray Get(const QString &url, bool useProxy); signals: - void httpRequestFinished(QByteArray &data); + void OnRequestFinished(QByteArray &data); private slots: void onRequestFinished_p(); - void onReadyRead(); + void onReadyRead_p(); private: + void setHeader(const QByteArray &key, const QByteArray &value); QByteArray data; QUrl url; QNetworkReply *reply; diff --git a/src/components/update/UpdateChecker.cpp b/src/components/update/UpdateChecker.cpp index 93bac127..0662fb93 100644 --- a/src/components/update/UpdateChecker.cpp +++ b/src/components/update/UpdateChecker.cpp @@ -19,7 +19,7 @@ namespace Qv2ray::components QvUpdateChecker::QvUpdateChecker(QObject *parent) : QObject(parent) { requestHelper = new QvHttpRequestHelper(this); - connect(requestHelper, &QvHttpRequestHelper::httpRequestFinished, this, &QvUpdateChecker::VersionUpdate); + connect(requestHelper, &QvHttpRequestHelper::OnRequestFinished, this, &QvUpdateChecker::VersionUpdate); } QvUpdateChecker::~QvUpdateChecker() { @@ -29,7 +29,7 @@ namespace Qv2ray::components #ifndef DISABLE_AUTO_UPDATE auto updateChannel = GlobalConfig.updateConfig.updateChannel; LOG(MODULE_NETWORK, "Start checking update for channel ID: " + QSTRN(updateChannel)) - requestHelper->get(UpdateChannelLink[updateChannel]); + requestHelper->AsyncGet(UpdateChannelLink[updateChannel]); #endif } void QvUpdateChecker::VersionUpdate(QByteArray &data) diff --git a/src/core/handler/ConfigHandler.cpp b/src/core/handler/ConfigHandler.cpp index 6dc67556..ae39900a 100644 --- a/src/core/handler/ConfigHandler.cpp +++ b/src/core/handler/ConfigHandler.cpp @@ -467,7 +467,7 @@ namespace Qv2ray::core::handlers return false; } isHttpRequestInProgress = true; - auto data = httpHelper->syncget(groups[id].address, useSystemProxy); + auto data = httpHelper->Get(groups[id].address, useSystemProxy); isHttpRequestInProgress = false; return CHUpdateSubscription_p(id, data); } diff --git a/src/ui/w_PreferencesWindow.cpp b/src/ui/w_PreferencesWindow.cpp index 2a391da3..d375f16d 100644 --- a/src/ui/w_PreferencesWindow.cpp +++ b/src/ui/w_PreferencesWindow.cpp @@ -131,6 +131,11 @@ PreferencesWindow::PreferencesWindow(QWidget *parent) : QDialog(parent), Current pluginKernelV2rayIntegrationCB->setChecked(CurrentConfig.pluginConfig.v2rayIntegration); pluginKernelPortAllocateCB->setValue(CurrentConfig.pluginConfig.portAllocationStart); // + qvProxyPortCB->setValue(CurrentConfig.networkConfig.port); + qvProxyAddressTxt->setText(CurrentConfig.networkConfig.address); + qvProxyTypeCombo->setCurrentText(CurrentConfig.networkConfig.type); + qvNetworkUATxt->setText(CurrentConfig.networkConfig.userAgent); + qvUseProxyCB->setChecked(CurrentConfig.networkConfig.useCustomProxy); // DNSListTxt->clear(); for (auto dnsStr : CurrentConfig.connectionConfig.dnsList) @@ -1113,3 +1118,34 @@ void PreferencesWindow::on_pluginKernelPortAllocateCB_valueChanged(int arg1) LOADINGCHECK CurrentConfig.pluginConfig.portAllocationStart = arg1; } + +void PreferencesWindow::on_qvProxyAddressTxt_textEdited(const QString &arg1) +{ + LOADINGCHECK + CurrentConfig.networkConfig.address = arg1; +} + +void PreferencesWindow::on_qvProxyTypeCombo_currentTextChanged(const QString &arg1) +{ + LOADINGCHECK + CurrentConfig.networkConfig.type = arg1.toLower(); +} + +void PreferencesWindow::on_qvProxyPortCB_valueChanged(int arg1) +{ + LOADINGCHECK + CurrentConfig.networkConfig.port = arg1; +} + +void PreferencesWindow::on_qvNetworkUATxt_textEdited(const QString &arg1) +{ + LOADINGCHECK + CurrentConfig.networkConfig.userAgent = arg1; +} + +void PreferencesWindow::on_qvUseProxyCB_stateChanged(int arg1) +{ + + LOADINGCHECK + CurrentConfig.networkConfig.useCustomProxy = arg1 == Qt::Checked; +} diff --git a/src/ui/w_PreferencesWindow.hpp b/src/ui/w_PreferencesWindow.hpp index 679b5c14..7ead3d9a 100644 --- a/src/ui/w_PreferencesWindow.hpp +++ b/src/ui/w_PreferencesWindow.hpp @@ -160,6 +160,16 @@ class PreferencesWindow void on_pluginKernelPortAllocateCB_valueChanged(int arg1); + void on_qvProxyAddressTxt_textEdited(const QString &arg1); + + void on_qvProxyTypeCombo_currentTextChanged(const QString &arg1); + + void on_qvProxyPortCB_valueChanged(int arg1); + + void on_qvNetworkUATxt_textEdited(const QString &arg1); + + void on_qvUseProxyCB_stateChanged(int arg1); + private: // RouteSettingsMatrixWidget *routeSettingsWidget; diff --git a/src/ui/w_PreferencesWindow.ui b/src/ui/w_PreferencesWindow.ui index 40251149..61839397 100644 --- a/src/ui/w_PreferencesWindow.ui +++ b/src/ui/w_PreferencesWindow.ui @@ -9,8 +9,8 @@ 0 0 - 1010 - 622 + 890 + 617 @@ -19,457 +19,560 @@ true - + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + - 0 + 6 General Settings - - - - - QFrame::NoFrame + + + + + + + Appearance + + + + + + Darkmode UI Icons + + + + + + + Enabled + + + + + + + Darkmode Tray Icon + + + + + + + Enabled + + + + + + + UI Theme + + + + + + + + 200 + 0 + + + + + + + + Language + + + + + + + + 0 + 0 + + + + + 100 + 0 + + + + + + + + Maximum log lines + + + + + + + + 0 + 0 + + + + true + + + lines + + + 10 + + + 2500 + + + 200 + + + + + + + + + + Behavior + + + + + + Launch at Login + + + + + + + Enabled + + + + + + + Transparent Proxy + + + + + + + Enabled + + + + + + + Auto Connect + + + + + + + + + Group + + + + + + + + 180 + 0 + + + + + + + + + + + + + Connection + + + + + + + + + + + + + + + Network Settings + + + + + + Use Custom Proxy + + + + + + + Enabled + + + + + + + Custom Proxy Server + + + + + + + + + + + + : + + + Qt::AlignCenter + + + + + + + 0 + + + 65535 + + + + + + + + + + http + + + + + socks + + + + + + + + Proxy Type + + + + + + + User-Agent + + + + + + + Qv2ray/2 NetworkRequestHelper + + + + + + + + + + + + Qt::Vertical - - true + + + 20 + 40 + - - - - 0 - 0 - 964 - 546 - - - - - - - - - General Settings - - - - - - - - - - - - 0 - 0 - - - - true - - - lines - - - 10 - - - 2500 - - - 200 - - - - - - - UI Theme - - - - - - - Darkmode UI Icons - - - - - - - QFrame::Plain - - - 2 - - - Qt::Vertical - - - - - - - Language - - - - - - - - 0 - 0 - - - - - 100 - 0 - - - - - - - - Darkmode Tray Icon - - - - - - - Enabled - - - - - - - Maximum log lines - - - - - - - Enabled - - - - - - - - 200 - 0 - - - - - - - - Enabled - - - - - - - Launch at Login - - - - - - - Transparent Proxy Support - - - - - - - Enabled - - - - - - - - - - - Connection - - - - - - - Group/Subscription - - - - - - - - - - - 180 - 0 - - - - - - - - - - - - - QFrame::Plain - - - 2 - - - Qt::Vertical - - - - - - - - - - - V2ray Settings - - - - - - - - - - - Check V2ray Core Settings - - - - - - - Core Executable Path - - - - - - - - - - - - - - - - - Select - - - - - - - V2ray Assets Directory - - - - - - - Select - - - - - - - Log Level - - - - - - - - 0 - 0 - - - - - 150 - 0 - - - - - none - - - - - debug - - - - - info - - - - - warning - - - - - error - - - - - - - - QFrame::Plain - - - 2 - - - Qt::Vertical - - - - - - - - - - - API Subsystem - - - - - - - - - - - API Port - - - - - - - Status - - - - - - - - 116 - 30 - - - - 1024 - - - 65535 - - - 15934 - - - - - - - Enabled - - - - - - - QFrame::Plain - - - 2 - - - Qt::Vertical - - - - - - - - - Qt::Vertical + + + + + + + Kernel Settings + + + + + + V2ray Settings + + + + + + Log Level + + + + + + + + 0 + 0 + + + + + 150 + 0 + + + + + none - - - 20 - 40 - + + + + debug - - - - - - - - Auto Connect - - - - - - - + + + + info + + + + + warning + + + + + error + + + + + + + + Core Executable Path + + + + + + + + + + + + + + + + Select + + + + + + + + + V2ray Assets Directory + + + + + + + + + + + + Select + + + + + + + + + API SubSystem + + + + + + + Enabled + + + + + + + API Port + + + + + + + + 116 + 30 + + + + 1024 + + + 65535 + + + 15934 + + + + + + + Check V2ray Core Settings + + + + + + + + Plugin Kernel Settings + + + + + + Enabling V2ray Integration will allow the kernel benefit from the V2ray routing engine. + + + + + + + V2ray Integration + + + + + + + If not checked, these features will be disabled: + +Advanced Routing Settings +Bypass CN websites and IPs +Direct connection of Local LAN addresses +Custom DNS Settings + + + Enabled + + + + + + + Qv2ray will allocate ports, for HTTP and SOCKS respectively, if enabled, for each kernel plugin. + + + + + + + Port Allocation Start + + + + + + + 1 + + + 65535 + + + 13000 + + + + + + + + + + Qt::Vertical + + + + 20 + 106 + + + + @@ -490,7 +593,7 @@ 0 0 - 964 + 844 603 @@ -735,7 +838,7 @@ - All settings below will only be applied onto simple connection. + All settings below will only be applied on simple connection. @@ -1100,119 +1203,6 @@ - - - Plugin Settings - - - - - - QFrame::NoFrame - - - true - - - - - 0 - 0 - 964 - 506 - - - - - - - Kernel Plugin Behavior - - - - - - Enabling V2ray Integration will allow the kernel benefit from the V2ray routing engine. -Otherwise, these features will be disabled: - -Advanced Routing Settings -Bypass CN websites and IPs -Direct connection of Local LAN addresses -Custom DNS Settings - - - - - - - - - V2ray Integration - - - - - - - Enabled - - - - - - - - - Qv2ray will allocate ports, for HTTP and SOCKS respectively, if enabled, for each kernel plugin. - - - - - - - - - Port Allocation Start - - - - - - - 1 - - - 65535 - - - 13000 - - - - - - - - - Qt::Vertical - - - - 20 - 299 - - - - - - - - - - - - - true @@ -1233,7 +1223,7 @@ Custom DNS Settings Items - + @@ -1275,7 +1265,7 @@ Custom DNS Settings - Page Y Offset + Page Y Axis Offset @@ -1396,6 +1386,18 @@ Custom DNS Settings + + 0 + + + 0 + + + 0 + + + 0 + @@ -1483,67 +1485,67 @@ Custom DNS Settings - - + + A: - - - - 255 - - - - - - - R: - - - - - - - 255 - - - - + G: - + + + + 255 + + + + 255 - - - - B: - - - - + 255 - - + + + + 255 + + + + + - ... + R: + + + + + + + Select Color + + + + + + + B: @@ -1560,14 +1562,7 @@ Custom DNS Settings - - - Apply Network Speed Bar UI Settings - - - - - + Qt::Vertical @@ -1579,6 +1574,13 @@ Custom DNS Settings + + + + Apply Network Speed Bar UI Settings + + + @@ -1623,332 +1625,297 @@ Custom DNS Settings - - - - - - - - - - 24 - - - - Qv2ray - - - - - - - - - - 15 - - + + + + + - Version: + Ignored Version - - - - - 15 - - - - IBeamCursor - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - Plugin Interface - - - - - - - - 0 - 0 - - - - <html><head/><body><p><a href="https://github.com/Qv2ray/Qv2ray"><span style="text-decoration: underline; color:#2980b9;">https://github.com/Qv2ray/Qv2ray</span></a></p></body></html> - - - Qt::RichText - - - false - - - true - - - - - - - Extra Build Info - - - - - + + - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse - - + - - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse - - - - - - - - - - - - - - - 0 - 0 - - - - - 10 - - - - <html><head/><body><p><a href="https://www.gnu.org/licenses/gpl-3.0.txt"><span style="text-decoration: underline; color:#2980b9;">GPLv3 (https://www.gnu.org/licenses/gpl-3.0.txt)</span></a></p></body></html> - - - Qt::RichText - - - false - - - true + Cancel - + - Built Time + Update Channel - - - - Build Info - - - - - - - Official Repo - - - - - - - - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse - - - - - - - License - + + + + + Stable Release + + + + + Testing + + - - - - - QTextEdit::NoWrap - - - true - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> + + + + + + + + + + + 26 + + + + Qv2ray + + + + + + + + + + 14 + + + + Version: + + + + + + + + 14 + + + + IBeamCursor + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Plugin Interface + + + + + + + + 0 + 0 + + + + <html><head/><body><p><a href="https://github.com/Qv2ray/Qv2ray"><span style="text-decoration: underline; color:#2980b9;">https://github.com/Qv2ray/Qv2ray</span></a></p></body></html> + + + Qt::RichText + + + false + + + true + + + + + + + Extra Build Info + + + + + + + + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + + + + + + + + + 0 + 0 + + + + + 10 + + + + <html><head/><body><p><a href="https://www.gnu.org/licenses/gpl-3.0.txt"><span style="text-decoration: underline; color:#2980b9;">GPLv3 (https://www.gnu.org/licenses/gpl-3.0.txt)</span></a></p></body></html> + + + Qt::RichText + + + false + + + true + + + + + + + Built Time + + + + + + + Build Info + + + + + + + Official Repo + + + + + + + + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + License + + + + + + + + + QTextEdit::NoWrap + + + true + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'WenQuanYi Micro Hei'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> - - - - - - - - - - Update Settings - - - - - - Update Channel - - - - - - - Ignore Next Version - - - - - - - - - Cancel - - - - - - - IBeamCursor - - - - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse - - - - - - - - - - Stable Release - - - - - Testing - - - - - - - - - - - - 206 - 0 - - - - About Qt - - - - - + + + + + + + + + + + 206 + 0 + + + + About Qt + + + + - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - tabWidget - scrollArea darkThemeCB darkTrayCB themeCombo languageComboBox - startWithLoginCB - tProxyCheckBox - maxLogLinesSB autoStartSubsCombo autoStartConnCombo logLevelComboBox - vCorePathTxt - selectVCoreBtn - vCoreAssetsPathTxt - selectVAssetBtn checkVCoreSettings - enableAPI - statsPortBox scrollArea_2 listenIPTxt setSysProxyCB @@ -2001,15 +1968,7 @@ p, li { white-space: pre-wrap; } nsBarFontItalicCB nsBarFontSizeSB nsBarFontASB - nsBarFontRSB - nsBarFontGSB - nsBarFontBSB - chooseColorBtn applyNSBarSettingsBtn - textBrowser - updateChannelCombo - cancelIgnoreVersionBtn - aboutQt diff --git a/src/ui/widgets/RouteSettingsMatrix.ui b/src/ui/widgets/RouteSettingsMatrix.ui index c8094b5b..9fd91a20 100644 --- a/src/ui/widgets/RouteSettingsMatrix.ui +++ b/src/ui/widgets/RouteSettingsMatrix.ui @@ -6,8 +6,8 @@ 0 0 - 600 - 409 + 582 + 404 @@ -45,93 +45,84 @@ - - - Route Settings + + + Lines start with "geoip:" or "geosite:" will have its autocompletion from geoip.dat and geosite.dat - - - - - Lines start with "geoip:" or "geosite:" will have its autocompletion from geoip.dat and geosite.dat - - - - - - - - - Block - - - Qt::AlignCenter - - - - - - - - - - Direct - - - Qt::AlignCenter - - - - - - - Domain - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - - - - - - Proxy - - - Qt::AlignCenter - - - - - - - - - - - - - IP - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - - + + + + + + Block + + + Qt::AlignCenter + + + + + + + + + + Direct + + + Qt::AlignCenter + + + + + + + Domain + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + + Proxy + + + Qt::AlignCenter + + + + + + + + + + + + + IP + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + +