Rep>5tFI<^DAXxsX_k-OkrJ*8oEP`@X^iqc+AFZL14QBHT8LX*L
z`?Ixmnmk&R4~6GWj{Uj@P*{i0!>a)Ddk3ELiShBZu7<=nAOXii;;f)Z!L2?D7=0|F
zAP+Ql_MI4vpt>a%gvDtqfQDd_w@3kf#t|(*bX{cyAzDY;&zXF5M
z=N2ueZaOgf>S4`b^brDcq0raNUKlH105G5bS3v4*34(N`0O_hF$<))0L~sVv?yZux?AJRTRNZDf4{txasRIla^Afa4UC}
zw_R=0?L_>3f`_`_-OdWMCMM?ebxjyUZSWx!#$w2I{;WSUthzD0qxMr)FnO(|-XF0i
zFOrBk&lQ6f{lCyDi9sjGT`$fSonH~fWAP7S*g1Adf2GIN(kU*dxe@Mp?r2&PEefy4
zlu!XW4f=>7I=upw2@}Y&`hp_ea3$Dd_E3SxTEV|NykPd^>~fj9VhFNRSk3!S{7Gf`
z6P&xRX
z{;(k*Qd6UGl2DxxPtG=*toh3KRE;+z(R?7mVprXi4syIZo5_{rZ?>hP-E^@));
zN>!wD&TOUR{c_Iym{I=8@yT6(DU4ik2L>!F9>z#iIT$nX_>%HZv2L5dr-@$^_mF=X
z${E|v0Uu&u>}5lEjM_^m?fN8pLy%^N#|*ROIS>HG
zQIMN-Zn*XrI7^ovVpx^Zm+Grg<%3Lox-z|gUtu=mkT+2K4r3G%7llAqN0)2gUn6PyCCAV|me$5g=lZ*X?i7kstSSIV
z&O|ety}bg3D|$QrEq05dwFv@X%6<5fFWl%PnJMy|7VHQc+}-=u!g$$j~SLJD}607u05MQv4sbLiHXP
z`#5Hf)E19F(YTt#1_AWi$)=S|5^7?tP(X>o);vy9)ve_JWZ&}zQM8|X!uDtwg+iIV
zmjBqA2;rpZ%|4*SkcK-yPzwqQlwLDm(-qVK&=l#gUkRS6nfN?o7-NjaX>3#!l+?U={kr+H?d&;^Q#0rPdIA|A#3}_E1}Yxze_u(@
z9SW?xCsQT%JfKq$yuH1Ri|h^M475Tf@waAcItPFWPLb~v0pQg3+2CiCtST|T%d^R6
z52rH*JnAp`rHmySzjJv80zO5|D05EoaC%S9Lg9??58j$4zjvsg8Lixb+L}l-jibH<
z>0v5k>Ka+0Lhf7e4HUHD2oxOGI;XU%v-ZIPR41b3mN(1Iqz;J8WRwu^PFhJTy|KjD
zfcHbRo==;xgGQO~-^IO>j!}&FnR4^Vv{s3$PAptUy#;r&`z%C7-&kS|!9B5ku((yO
zdkp<{x@EJ`ds{E9zfxUMy5jqJS6ZFcS(AU=pkdI_5L+h=6^wQ
z9OOm9(ge8o{bCDEF&49sDMhHB)yhV`mwiB6qo@X7I
zm6e4}-rvIH$(W3uPn?aO?o-`nK`vZ465#9o_Ic(*8KxY;miw(KCQCIe{%1|(*kyDK
z!i*9DNTQ%kDmRH_MjD6M5M$?kCK6xrn6zz(5Yau`(14BeN;U^)78rSY&fLj4(&Z@&
zWsw=+lxpA#x=Ah;$BbDw!P^gRv^qCiK!R%;7I!K`r%etnG7QVFSFWecG(}A1V>L7I
zIeVi;S#867z#qb&;6Xdx*4w5!(V(LJ17cNCUCs>gdjGIgdYQq6e>jnu0M4xe;)vo$
z8GTD*Z_rdy@sS=75y4-QOW*?229~2+q2z{!eD}Jk%BKoM2CehWj79_5?4^F%Daj0EfNk)@6;JpVW=7!ioRJEOZt3~D)o)S<#4|W
zjwdc!y#ug7-p=8u;c$HOAE-W;cK5qF^~Rf9F|F5*aQm~4#v@hp#OZ;_x^mMW85u
zS%Yc*&5M-o5AKa7f9uShLevvOeSL(_@VH*M82C~Bx{lB0VvXWuEyY0mpZub5AHbeRZBYcOD~bm$LN-RjPk&;m~R`Evx;-`kU);`*}3TcYg8B@hIM8^qqq
zsd(%4G*9+#EsKUvuAr`@+jdM*I(7I~3eU*=!be4)K;glN^Qr2wx1!f6SkAF!eX*!j
z$FY7C&&6l1UUTxL8gg)X^OE*f^OxQQhwM1sVw%}hZ*oX19Nk1?Ivt;>JNL2bhVszU
zi~_77tV#yzu~g`N(525`tHkW){UEYJQAc(*8Y{tFZKwXWKsvh6lH)B&4!Y(!9<#UF
zfEZ!Pn`XFO$c{@XX+|$fpZeAhX+@R#yhR8dapaP=Q|9VjTOWC82v;LDc&+zv0KthI
zK;uYe7w_<`HL)>=h^EMmyVS`QuFWu_rOsjDmklW9CdcknHm+XqafV|
zp+Y^iaBm#NZ)w2ODt#&4eDA@Rq>hFd3Sz$bkuu_|*|*)if|+v+sdKYfehVV|oucks
zGzCGb@ml6~_|$nAoqNeAxx~5b74I9>$++g2Ey=WMWbL;_FOj}X8+&uBgZkXubILC?
z=!LNde%0Sr;M#(M+iSy;a7>}0`h9l^#3^ReiDX>HuXR&E_Fgr$@NIEf?3zE{_Z{PK
zW{WPG{8`?P&X(`f;VfCJ4@Qye1IxRU!V5J^OH1#;m?gMcSz0q}SeCTkb
zXWytAhkk2g1@fnnJ;%+-7H5wIOL)gFaSRRaINw#jY;HqSNl1oCcNH*fiFtm$044V%v^54ygTZ^Ve&IzktR~XBNPuXD-H4hy
zck7A)-FLutzy5EaC+qtQNt<{b;<0G3EQi>|m$I&+cj8r}=t*++M|Esk9;BPS#yi#F
zr!FM0vDSMkz5?M}Hm@tRW3w&SYgstGtUrS~70K5vKOf^3#7Q0ZSO?_|6wK0Mnx8
z&dR+xu`b+9YtOJ1zYyq+e7AeI;>@Cs|CYix%s9sNwU+!oAyf>oF67JQ^TTW)eb>
zyh^Z?YPjqorMy+U(Ut(AMC|VFasWNY%ZAsCby*Kh({50@d_8TtdW84zX#>EACiHet
zbxs=Oj@BujMFXe1K%*
z{-q)IZ_AOCUr|)TNjgT>#*@{;aw9-+JgLT0Gn2moIc#BLw**aK1$g+TnwF-|w0_B)
zNR@+rh2V_
zvlH1A)+Fb7cVGE(jq+;@{i9P}#HdZ8#M*69BQk6`U=fiR?2J#Wrj4QrW^m
zMO?5Y*b-#(+sE?q2WKLr-UaT#%&xT074BfCmFzWwSSB2fD_vUz;txO-5Af3M9VYwB7ls=Dh1XyR4UC>S{;p
zdU}wp<$Vr$^XZu12dR~A6<>Up-NT$gwy&^H@NFAjGNqX?h&sv3&;Q|?i@hSKqo!QkGy;SO
zc7`{K0S(2!4;x8-e&d_V&II7)Xs!R6xM)zu3j~viPassets/icons/ui_light/locate.png
assets/icons/ui_dark/sort.png
assets/icons/ui_light/sort.png
+ assets/icons/ui_dark/tray-connected.png
+ assets/icons/ui_dark/tray-systemproxy.png
+ assets/icons/ui_light/tray-connected.png
+ assets/icons/ui_light/tray-systemproxy.png
diff --git a/src/base/Qv2rayBase.hpp b/src/base/Qv2rayBase.hpp
index 6b03ee7c..55d89ea8 100644
--- a/src/base/Qv2rayBase.hpp
+++ b/src/base/Qv2rayBase.hpp
@@ -97,9 +97,11 @@ using namespace Qv2ray::base::objects::transfer;
#define ACCESS_OPTIONAL_VALUE(obj) (obj.value())
#endif
-#define QV2RAY_UI_COLORSCHEME_ROOT \
+#define Q_TRAYICON(name) (QIcon(GlobalConfig.uiConfig.useDarkTrayIcon ? ":/assets/icons/ui_dark/" name : ":/assets/icons/ui_light/" name))
+
+#define QV2RAY_COLORSCHEME_ROOT \
((GlobalConfig.uiConfig.useDarkTheme) ? QStringLiteral(":/assets/icons/ui_dark/") : QStringLiteral(":/assets/icons/ui_light/"))
-#define QICON_R(file) QIcon(QV2RAY_UI_COLORSCHEME_ROOT + file)
+#define QICON_R(file) QIcon(QV2RAY_COLORSCHEME_ROOT + file)
#define QSTRN(num) QString::number(num)
diff --git a/src/components/plugins/toolbar/QvToolbar.cpp b/src/components/plugins/toolbar/QvToolbar.cpp
index 6c6cde88..967bfd22 100644
--- a/src/components/plugins/toolbar/QvToolbar.cpp
+++ b/src/components/plugins/toolbar/QvToolbar.cpp
@@ -89,15 +89,15 @@ namespace Qv2ray::components::plugins
case 104:
{
// Current Connection Name
- CL.Message = GetDisplayName(ConnectionManager->CurrentConnection());
+ CL.Message = GetDisplayName(KernelInstance->CurrentConnection());
break;
}
case 105:
{
// Current Connection Status
- CL.Message = ConnectionManager->CurrentConnection() == NullConnectionId ? QObject::tr("Not connected") :
- QObject::tr("Connected");
+ CL.Message = KernelInstance->CurrentConnection() == NullConnectionId ? QObject::tr("Not connected") :
+ QObject::tr("Connected");
break;
}
@@ -132,14 +132,14 @@ namespace Qv2ray::components::plugins
case 301:
{
// Total Upload
- CL.Message = FormatBytes(get<0>(GetConnectionUsageAmount(ConnectionManager->CurrentConnection())));
+ CL.Message = FormatBytes(get<0>(GetConnectionUsageAmount(KernelInstance->CurrentConnection())));
break;
}
case 302:
{
// Total download
- CL.Message = FormatBytes(get<1>(GetConnectionUsageAmount(ConnectionManager->CurrentConnection())));
+ CL.Message = FormatBytes(get<1>(GetConnectionUsageAmount(KernelInstance->CurrentConnection())));
break;
}
@@ -160,7 +160,7 @@ namespace Qv2ray::components::plugins
case 305:
{
// Connection latency
- CL.Message = QSTRN(GetConnectionLatency(ConnectionManager->CurrentConnection())) + " ms";
+ CL.Message = QSTRN(GetConnectionLatency(KernelInstance->CurrentConnection())) + " ms";
break;
}
default:
diff --git a/src/core/handler/ConfigHandler.hpp b/src/core/handler/ConfigHandler.hpp
index 8dc430a9..d4220c28 100644
--- a/src/core/handler/ConfigHandler.hpp
+++ b/src/core/handler/ConfigHandler.hpp
@@ -29,11 +29,6 @@ namespace Qv2ray::core::handlers
~QvConfigHandler();
public slots:
- //
- inline const ConnectionId CurrentConnection() const
- {
- return kernelHandler->CurrentConnection();
- }
inline const QList Connections() const
{
return connections.keys();
diff --git a/src/core/handler/KernelInstanceHandler.cpp b/src/core/handler/KernelInstanceHandler.cpp
index 5a26b38c..80408904 100644
--- a/src/core/handler/KernelInstanceHandler.cpp
+++ b/src/core/handler/KernelInstanceHandler.cpp
@@ -4,8 +4,10 @@
#include "core/connection/Generation.hpp"
namespace Qv2ray::core::handlers
{
+#define isConnected (vCoreInstance->KernelStarted || !activeKernels.isEmpty())
KernelInstanceHandler::KernelInstanceHandler(QObject *parent) : QObject(parent)
{
+ KernelInstance = this;
vCoreInstance = new V2rayKernelInstance(this);
connect(vCoreInstance, &V2rayKernelInstance::OnNewStatsDataArrived, this, &KernelInstanceHandler::OnStatsDataArrived_p);
connect(vCoreInstance, &V2rayKernelInstance::OnProcessOutputReadyRead, this, &KernelInstanceHandler::OnKernelLogAvailable_p);
@@ -25,7 +27,7 @@ namespace Qv2ray::core::handlers
std::optional KernelInstanceHandler::StartConnection(const ConnectionId &id, const CONFIGROOT &root)
{
- if (vCoreInstance->KernelStarted || !activeKernels.isEmpty())
+ if (isConnected)
{
StopConnection();
}
@@ -240,7 +242,7 @@ namespace Qv2ray::core::handlers
void KernelInstanceHandler::StopConnection()
{
- if (vCoreInstance->KernelStarted || !activeKernels.isEmpty())
+ if (isConnected)
{
PluginHost->Send_ConnectivityEvent({ GetDisplayName(currentConnectionId), {}, Events::Connectivity::QvConnecticity_Disconnecting });
if (vCoreInstance->KernelStarted)
@@ -267,6 +269,9 @@ namespace Qv2ray::core::handlers
void KernelInstanceHandler::OnStatsDataArrived_p(const quint64 uploadSpeed, const quint64 downloadSpeed)
{
- emit OnStatsDataAvailable(currentConnectionId, uploadSpeed, downloadSpeed);
+ if (isConnected)
+ {
+ emit OnStatsDataAvailable(currentConnectionId, uploadSpeed, downloadSpeed);
+ }
}
} // namespace Qv2ray::core::handlers
diff --git a/src/ui/w_MainWindow.cpp b/src/ui/w_MainWindow.cpp
index f8fb0fdc..3ecc22ef 100644
--- a/src/ui/w_MainWindow.cpp
+++ b/src/ui/w_MainWindow.cpp
@@ -51,11 +51,11 @@ QvMessageBusSlotImpl(MainWindow)
void MainWindow::UpdateColorScheme()
{
- hTray.setIcon(QIcon(GlobalConfig.uiConfig.useDarkTrayIcon ? ":/assets/icons/ui_dark/tray.png" : ":/assets/icons/ui_light/tray.png"));
+ hTray.setIcon(KernelInstance->CurrentConnection() == NullConnectionId ? Q_TRAYICON("tray.png") : Q_TRAYICON("tray-connected.png"));
//
importConfigButton->setIcon(QICON_R("import.png"));
- updownImageBox->setStyleSheet("image: url(" + QV2RAY_UI_COLORSCHEME_ROOT + "netspeed_arrow.png)");
- updownImageBox_2->setStyleSheet("image: url(" + QV2RAY_UI_COLORSCHEME_ROOT + "netspeed_arrow.png)");
+ updownImageBox->setStyleSheet("image: url(" + QV2RAY_COLORSCHEME_ROOT + "netspeed_arrow.png)");
+ updownImageBox_2->setStyleSheet("image: url(" + QV2RAY_COLORSCHEME_ROOT + "netspeed_arrow.png)");
//
tray_action_ShowHide->setIcon(this->windowIcon());
action_RCM_Start->setIcon(QICON_R("connect.png"));
@@ -583,6 +583,7 @@ void MainWindow::on_connectionListWidget_itemDoubleClicked(QTreeWidgetItem *item
void MainWindow::OnDisconnected(const ConnectionId &id)
{
Q_UNUSED(id)
+ hTray.setIcon(Q_TRAYICON("tray.png"));
tray_action_Start->setEnabled(true);
tray_action_Stop->setEnabled(false);
tray_action_Restart->setEnabled(false);
@@ -606,6 +607,7 @@ void MainWindow::OnDisconnected(const ConnectionId &id)
void MainWindow::OnConnected(const ConnectionId &id)
{
Q_UNUSED(id)
+ hTray.setIcon(Q_TRAYICON("tray-connected.png"));
tray_action_Start->setEnabled(false);
tray_action_Stop->setEnabled(true);
tray_action_Restart->setEnabled(true);
@@ -817,7 +819,7 @@ void MainWindow::OnGroupDeleted(const GroupId &id, const QList &co
void MainWindow::on_locateBtn_clicked()
{
- auto id = ConnectionManager->CurrentConnection();
+ auto id = KernelInstance->CurrentConnection();
if (id != NullConnectionId)
{
connectionListWidget->setCurrentItem(connectionNodes.value(id).get());
diff --git a/src/ui/w_MainWindow_extra.cpp b/src/ui/w_MainWindow_extra.cpp
index eb059a48..62c87969 100644
--- a/src/ui/w_MainWindow_extra.cpp
+++ b/src/ui/w_MainWindow_extra.cpp
@@ -16,6 +16,7 @@ void MainWindow::MWSetSystemProxy()
{
proxyAddress = "127.0.0.1";
SetSystemProxy(proxyAddress, httpPort, socksPort);
+ hTray.setIcon(Q_TRAYICON("tray-systemproxy.png"));
if (!GlobalConfig.uiConfig.quietMode)
{
hTray.showMessage("Qv2ray", tr("System proxy configured."));
@@ -31,6 +32,7 @@ void MainWindow::MWSetSystemProxy()
void MainWindow::MWClearSystemProxy()
{
ClearSystemProxy();
+ hTray.setIcon(KernelInstance->CurrentConnection() == NullConnectionId ? Q_TRAYICON("tray.png") : Q_TRAYICON("tray-connected.png"));
if (!GlobalConfig.uiConfig.quietMode)
{
hTray.showMessage("Qv2ray", tr("System proxy removed."));