From 6c9db51fd573a00bf3ff806e463b7db8051496a3 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 29 Aug 2024 15:48:51 +0800 Subject: [PATCH] Creating a new desktop app with avaloniaui --- v2rayN/v2rayN.Desktop/App.axaml | 31 + v2rayN/v2rayN.Desktop/App.axaml.cs | 121 +++ v2rayN/v2rayN.Desktop/Assets/NotifyIcon1.ico | Bin 0 -> 61439 bytes v2rayN/v2rayN.Desktop/Assets/NotifyIcon2.ico | Bin 0 -> 56851 bytes v2rayN/v2rayN.Desktop/Assets/NotifyIcon3.ico | Bin 0 -> 57065 bytes v2rayN/v2rayN.Desktop/Assets/add.png | Bin 0 -> 198 bytes v2rayN/v2rayN.Desktop/Assets/close.png | Bin 0 -> 388 bytes v2rayN/v2rayN.Desktop/Assets/copy.png | Bin 0 -> 377 bytes v2rayN/v2rayN.Desktop/Assets/delete.png | Bin 0 -> 295 bytes v2rayN/v2rayN.Desktop/Assets/edit.png | Bin 0 -> 329 bytes v2rayN/v2rayN.Desktop/Assets/fit.png | Bin 0 -> 455 bytes v2rayN/v2rayN.Desktop/Assets/light.png | Bin 0 -> 690 bytes v2rayN/v2rayN.Desktop/Assets/more.png | Bin 0 -> 450 bytes v2rayN/v2rayN.Desktop/Assets/refresh.png | Bin 0 -> 701 bytes v2rayN/v2rayN.Desktop/Common/AvaUtils.cs | 64 ++ v2rayN/v2rayN.Desktop/Common/UI.cs | 50 + .../Converters/DelayColorConverter.cs | 26 + v2rayN/v2rayN.Desktop/FodyWeavers.xml | 3 + v2rayN/v2rayN.Desktop/GlobalUsings.cs | 8 + .../v2rayN.Desktop/Handler/SysProxyHandler.cs | 61 ++ v2rayN/v2rayN.Desktop/Program.cs | 22 + .../v2rayN.Desktop/Styles/GlobalStyles.axaml | 39 + .../ViewModels/ThemeSettingViewModel.cs | 143 +++ .../Views/AddServer2Window.axaml | 179 ++++ .../Views/AddServer2Window.axaml.cs | 72 ++ .../Views/AddServerWindow.axaml | 842 +++++++++++++++++ .../Views/AddServerWindow.axaml.cs | 365 ++++++++ .../Views/ClashConnectionsView.axaml | 109 +++ .../Views/ClashConnectionsView.axaml.cs | 50 + .../Views/ClashProxiesView.axaml | 179 ++++ .../Views/ClashProxiesView.axaml.cs | 81 ++ .../Views/DNSSettingWindow.axaml | 174 ++++ .../Views/DNSSettingWindow.axaml.cs | 76 ++ .../Views/GlobalHotkeySettingWindow.axaml | 144 +++ .../Views/GlobalHotkeySettingWindow.axaml.cs | 129 +++ v2rayN/v2rayN.Desktop/Views/MainWindow.axaml | 292 ++++++ .../v2rayN.Desktop/Views/MainWindow.axaml.cs | 474 ++++++++++ v2rayN/v2rayN.Desktop/Views/MsgView.axaml | 107 +++ v2rayN/v2rayN.Desktop/Views/MsgView.axaml.cs | 127 +++ .../Views/OptionSettingWindow.axaml | 857 ++++++++++++++++++ .../Views/OptionSettingWindow.axaml.cs | 232 +++++ .../v2rayN.Desktop/Views/ProfilesView.axaml | 214 +++++ .../Views/ProfilesView.axaml.cs | 468 ++++++++++ v2rayN/v2rayN.Desktop/Views/QrcodeView.axaml | 48 + .../v2rayN.Desktop/Views/QrcodeView.axaml.cs | 26 + .../Views/RoutingRuleDetailsWindow.axaml | 197 ++++ .../Views/RoutingRuleDetailsWindow.axaml.cs | 100 ++ .../Views/RoutingRuleSettingWindow.axaml | 245 +++++ .../Views/RoutingRuleSettingWindow.axaml.cs | 214 +++++ .../Views/RoutingSettingWindow.axaml | 136 +++ .../Views/RoutingSettingWindow.axaml.cs | 155 ++++ .../v2rayN.Desktop/Views/SubEditWindow.axaml | 234 +++++ .../Views/SubEditWindow.axaml.cs | 64 ++ .../Views/SubSettingWindow.axaml | 71 ++ .../Views/SubSettingWindow.axaml.cs | 109 +++ .../Views/ThemeSettingView.axaml | 72 ++ .../Views/ThemeSettingView.axaml.cs | 37 + v2rayN/v2rayN.Desktop/v2rayN.Desktop.csproj | 39 + v2rayN/v2rayN.sln | 18 +- 59 files changed, 7498 insertions(+), 6 deletions(-) create mode 100644 v2rayN/v2rayN.Desktop/App.axaml create mode 100644 v2rayN/v2rayN.Desktop/App.axaml.cs create mode 100644 v2rayN/v2rayN.Desktop/Assets/NotifyIcon1.ico create mode 100644 v2rayN/v2rayN.Desktop/Assets/NotifyIcon2.ico create mode 100644 v2rayN/v2rayN.Desktop/Assets/NotifyIcon3.ico create mode 100644 v2rayN/v2rayN.Desktop/Assets/add.png create mode 100644 v2rayN/v2rayN.Desktop/Assets/close.png create mode 100644 v2rayN/v2rayN.Desktop/Assets/copy.png create mode 100644 v2rayN/v2rayN.Desktop/Assets/delete.png create mode 100644 v2rayN/v2rayN.Desktop/Assets/edit.png create mode 100644 v2rayN/v2rayN.Desktop/Assets/fit.png create mode 100644 v2rayN/v2rayN.Desktop/Assets/light.png create mode 100644 v2rayN/v2rayN.Desktop/Assets/more.png create mode 100644 v2rayN/v2rayN.Desktop/Assets/refresh.png create mode 100644 v2rayN/v2rayN.Desktop/Common/AvaUtils.cs create mode 100644 v2rayN/v2rayN.Desktop/Common/UI.cs create mode 100644 v2rayN/v2rayN.Desktop/Converters/DelayColorConverter.cs create mode 100644 v2rayN/v2rayN.Desktop/FodyWeavers.xml create mode 100644 v2rayN/v2rayN.Desktop/GlobalUsings.cs create mode 100644 v2rayN/v2rayN.Desktop/Handler/SysProxyHandler.cs create mode 100644 v2rayN/v2rayN.Desktop/Program.cs create mode 100644 v2rayN/v2rayN.Desktop/Styles/GlobalStyles.axaml create mode 100644 v2rayN/v2rayN.Desktop/ViewModels/ThemeSettingViewModel.cs create mode 100644 v2rayN/v2rayN.Desktop/Views/AddServer2Window.axaml create mode 100644 v2rayN/v2rayN.Desktop/Views/AddServer2Window.axaml.cs create mode 100644 v2rayN/v2rayN.Desktop/Views/AddServerWindow.axaml create mode 100644 v2rayN/v2rayN.Desktop/Views/AddServerWindow.axaml.cs create mode 100644 v2rayN/v2rayN.Desktop/Views/ClashConnectionsView.axaml create mode 100644 v2rayN/v2rayN.Desktop/Views/ClashConnectionsView.axaml.cs create mode 100644 v2rayN/v2rayN.Desktop/Views/ClashProxiesView.axaml create mode 100644 v2rayN/v2rayN.Desktop/Views/ClashProxiesView.axaml.cs create mode 100644 v2rayN/v2rayN.Desktop/Views/DNSSettingWindow.axaml create mode 100644 v2rayN/v2rayN.Desktop/Views/DNSSettingWindow.axaml.cs create mode 100644 v2rayN/v2rayN.Desktop/Views/GlobalHotkeySettingWindow.axaml create mode 100644 v2rayN/v2rayN.Desktop/Views/GlobalHotkeySettingWindow.axaml.cs create mode 100644 v2rayN/v2rayN.Desktop/Views/MainWindow.axaml create mode 100644 v2rayN/v2rayN.Desktop/Views/MainWindow.axaml.cs create mode 100644 v2rayN/v2rayN.Desktop/Views/MsgView.axaml create mode 100644 v2rayN/v2rayN.Desktop/Views/MsgView.axaml.cs create mode 100644 v2rayN/v2rayN.Desktop/Views/OptionSettingWindow.axaml create mode 100644 v2rayN/v2rayN.Desktop/Views/OptionSettingWindow.axaml.cs create mode 100644 v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml create mode 100644 v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml.cs create mode 100644 v2rayN/v2rayN.Desktop/Views/QrcodeView.axaml create mode 100644 v2rayN/v2rayN.Desktop/Views/QrcodeView.axaml.cs create mode 100644 v2rayN/v2rayN.Desktop/Views/RoutingRuleDetailsWindow.axaml create mode 100644 v2rayN/v2rayN.Desktop/Views/RoutingRuleDetailsWindow.axaml.cs create mode 100644 v2rayN/v2rayN.Desktop/Views/RoutingRuleSettingWindow.axaml create mode 100644 v2rayN/v2rayN.Desktop/Views/RoutingRuleSettingWindow.axaml.cs create mode 100644 v2rayN/v2rayN.Desktop/Views/RoutingSettingWindow.axaml create mode 100644 v2rayN/v2rayN.Desktop/Views/RoutingSettingWindow.axaml.cs create mode 100644 v2rayN/v2rayN.Desktop/Views/SubEditWindow.axaml create mode 100644 v2rayN/v2rayN.Desktop/Views/SubEditWindow.axaml.cs create mode 100644 v2rayN/v2rayN.Desktop/Views/SubSettingWindow.axaml create mode 100644 v2rayN/v2rayN.Desktop/Views/SubSettingWindow.axaml.cs create mode 100644 v2rayN/v2rayN.Desktop/Views/ThemeSettingView.axaml create mode 100644 v2rayN/v2rayN.Desktop/Views/ThemeSettingView.axaml.cs create mode 100644 v2rayN/v2rayN.Desktop/v2rayN.Desktop.csproj diff --git a/v2rayN/v2rayN.Desktop/App.axaml b/v2rayN/v2rayN.Desktop/App.axaml new file mode 100644 index 00000000..d326e4c0 --- /dev/null +++ b/v2rayN/v2rayN.Desktop/App.axaml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2rayN/v2rayN.Desktop/App.axaml.cs b/v2rayN/v2rayN.Desktop/App.axaml.cs new file mode 100644 index 00000000..5619e7e0 --- /dev/null +++ b/v2rayN/v2rayN.Desktop/App.axaml.cs @@ -0,0 +1,121 @@ +using Avalonia; +using Avalonia.Controls.ApplicationLifetimes; +using Avalonia.Markup.Xaml; +using Splat; +using v2rayN.Desktop.Common; +using v2rayN.Desktop.Views; + +namespace v2rayN.Desktop; + +public partial class App : Application +{ + public static EventWaitHandle ProgramStarted; + private static Config _config; + + public override void Initialize() + { + AvaloniaXamlLoader.Load(this); + } + + public override void OnFrameworkInitializationCompleted() + { + if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) + { + OnStartup(desktop.Args); + + desktop.Exit += OnExit; + desktop.MainWindow = new MainWindow(); + } + + base.OnFrameworkInitializationCompleted(); + } + + private void OnStartup(string[]? Args) + { + var exePathKey = Utils.GetMD5(Utils.GetExePath()); + + var rebootas = (Args ?? new string[] { }).Any(t => t == Global.RebootAs); + //ProgramStarted = new EventWaitHandle(false, EventResetMode.AutoReset, exePathKey, out bool bCreatedNew); + //if (!rebootas && !bCreatedNew) + //{ + // ProgramStarted.Set(); + // Environment.Exit(0); + // return; + //} + + Logging.Setup(); + Init(); + Logging.LoggingEnabled(_config.guiItem.enableLog); + Logging.SaveLog($"v2rayN start up | {Utils.GetVersion()} | {Utils.GetExePath()}"); + Logging.SaveLog($"{Environment.OSVersion} - {(Environment.Is64BitOperatingSystem ? 64 : 32)}"); + Logging.ClearLogs(); + + Thread.CurrentThread.CurrentUICulture = new(_config.uiItem.currentLanguage); + } + + private void Init() + { + if (ConfigHandler.LoadConfig(ref _config) != 0) + { + Logging.SaveLog($"Loading GUI configuration file is abnormal,please restart the application{Environment.NewLine}¼ÓÔØGUIÅäÖÃÎļþÒì³£,ÇëÖØÆôÓ¦ÓÃ"); + Environment.Exit(0); + return; + } + LazyConfig.Instance.SetConfig(_config); + Locator.CurrentMutable.RegisterLazySingleton(() => new NoticeHandler(), typeof(NoticeHandler)); + + //Under Win10 + if (Utils.IsWindows() && Environment.OSVersion.Version.Major < 10) + { + Environment.SetEnvironmentVariable("DOTNET_EnableWriteXorExecute", "0", EnvironmentVariableTarget.User); + } + } + + private void OnExit(object? sender, ControlledApplicationLifetimeExitEventArgs e) + { + } + + private void TrayIcon_Clicked(object? sender, EventArgs e) + { + if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) + { + if (desktop.MainWindow.IsVisible) + { + desktop.MainWindow?.Hide(); + } + else + { + desktop.MainWindow?.Show(); + } + } + } + + private void MenuAddServerViaClipboardClick(object? sender, EventArgs e) + { + if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) + { + var clipboardData = AvaUtils.GetClipboardData(desktop.MainWindow).Result; + Locator.Current.GetService()?.AddServerViaClipboardAsync(clipboardData); + } + } + + private void MenuSubUpdate_Click(object? sender, EventArgs e) + { + Locator.Current.GetService()?.UpdateSubscriptionProcess("", false); + } + + private void MenuSubUpdateViaProxy_Click(object? sender, EventArgs e) + { + Locator.Current.GetService()?.UpdateSubscriptionProcess("", true); + } + + private void MenuExit_Click(object? sender, EventArgs e) + { + if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) + { + Locator.Current.GetService()?.MyAppExitAsync(false); + + desktop.Shutdown(); + } + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN.Desktop/Assets/NotifyIcon1.ico b/v2rayN/v2rayN.Desktop/Assets/NotifyIcon1.ico new file mode 100644 index 0000000000000000000000000000000000000000..a978e0a899c972fcdaa2da4dd1449fbe700bb927 GIT binary patch literal 61439 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 literal 0 HcmV?d00001 diff --git a/v2rayN/v2rayN.Desktop/Assets/NotifyIcon2.ico b/v2rayN/v2rayN.Desktop/Assets/NotifyIcon2.ico new file mode 100644 index 0000000000000000000000000000000000000000..b625aa8e80542ca770ff1bdfb49eea3755d36d81 GIT binary patch literal 56851 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 literal 0 HcmV?d00001 diff --git a/v2rayN/v2rayN.Desktop/Assets/add.png b/v2rayN/v2rayN.Desktop/Assets/add.png new file mode 100644 index 0000000000000000000000000000000000000000..41170fbe0a0bac6dbcfa8d57bb33c34b5c4955ff GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}4W2HJArbCx zr(NVcpupo&I-lpF-#xyGjei0)oh&*uKR*5=y63a12z;Elxi6Tw)Q=2A)}#7kGIXOYCl$7eA_Cev$TnDubrJYLdug v2F@jdGcHU06I&qDajX14XJ!M-A`TN)pCrYs=`-YjZej3r^>bP0l+XkKa-BxX literal 0 HcmV?d00001 diff --git a/v2rayN/v2rayN.Desktop/Assets/close.png b/v2rayN/v2rayN.Desktop/Assets/close.png new file mode 100644 index 0000000000000000000000000000000000000000..7f25fe11453ff281b5721630faf46efffae8346f GIT binary patch literal 388 zcmV-~0ek+5P)Px$K1oDDR9HvtR=Z9EF%aDS6l$;k28D`H5gGywp(0WQG(Z|24Nw6U{El~f{$!BR z9kS3}&PR|8(p`0ucV=g2?X{T-e_S{}4FU!S1_wGF5RnBlZvr?~)wi5uDaP66I~1>h=@v8ukTB6QA;W8xSC;N8qN))Ek_A)?os1i-}19-BzL_Y(m3$=X(z zYn={6G7;G(qUV~JnWrIyyHtdT91ziUB6P>hzA$YrWC@61=iDwcKO{smRb5sBXGCK`k_?BcdXuwRKe4%ib)1MC5z$o(?pRgZ)*2zb z1yt=g`Brt@@pCgf?_1FS6Hv4TMK@v5V_0+$6(7Za;W8?F9rqn9edB*Li25d3>pk$B i$(pzZ2L=aPx$Gf6~2R9HvV)^SG!K^VvJ?~sUy6A_V!m}e4^NOZ3(_sTkn9Fcg4NJK;;A`(r8 z+vQGMV|MGQ{d=ByJ~KNz`*RpSuIeu$2f$%Ro`I?kbLN@`9OV>cjOqV-K=ukUcH_$- zO|RhZ0LF*2?LzDN>9g_e4v5G*P>*XXQPqjLasY3@Oxwm)eF@+dm<7^zJt%~v`z75o zlmK3Uxdc$vehENC(*05lcn0Pz0Z+h!CEyY0nE|}_56-zoGk}QP150Lr5W-!IaoG$Y zBDcVb86bpk6JuO81Bl2qux1Ik0@f`7m%zqv0jf}1hsqFw#u)vN1Dbv^B60z2S_002 zEla=|ux$w#0Xvp}Q()H;a02X=B%#l08Y5X#1MmH@b8g=ZFwS#b^-rO6B3E{n_e+Hz XqR%%lz=sor00000NkvXXu0mjf?Ma$V literal 0 HcmV?d00001 diff --git a/v2rayN/v2rayN.Desktop/Assets/delete.png b/v2rayN/v2rayN.Desktop/Assets/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..cdcfe3b08977ad0e436fd7e3c8f3eac5dbe1ec41 GIT binary patch literal 295 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}4?SHRLn7SY zPB-K_-MtNeH|<)RH|efK$047; zKR-V+=HAT7wl3wtzYeAon{rau-repnU1j^i=1NAFBk2k8%N8D6%71`8jJ<%(fP1b| zi2J9-_x+h$_{7#INABrfJk4N7aLWcU2bVj1IZAtGEqRw3Q`2O|u)U`?WFf<>2DJs8 z8BAd6Pb!lz!*#oJiVVS%wy&6crqlHaL&8VZBNLx&I=A?v*169$IXyQSXD~~+HrX)D qxnvR>9$NaIMd0R!$u%G94+?ML=~cYawt^k#Sq4v6KbLh*2~7axM|gGs literal 0 HcmV?d00001 diff --git a/v2rayN/v2rayN.Desktop/Assets/edit.png b/v2rayN/v2rayN.Desktop/Assets/edit.png new file mode 100644 index 0000000000000000000000000000000000000000..f269f777b54f4d3b23f98a8def2e568b3482ce04 GIT binary patch literal 329 zcmV-P0k-~$P)Px$14%?dR9HvtmeCP{Fbsx&*3l(&2wg{AN0)F3T}R0sy{k1%n~=Z@z2o2k_&)xI zv;$Ti!^(VY0+9(^0bBsw#%ZQ&c0>szc!E|XA_PjfC=nsB18@hhXEOgw!c&00oWSq# zEJ^$@y#!M1uTkJENQ5L%&UsCOEyTGA)C#VYpj6mjagIO@2;FEPSYOkga z*Sp*18c`B>0ytXQYcIT&0141IXnMN_-V!L^CGKvuU}-VRYoL2o^AxbY%k-RfH8eq_ bhcPx$fk{L`R9HvtmmyCBK@f%CY$~d77!=|}>CGw(K@~|!Kw(KBNDKlJRH-5Xfk6`Z z0Vqf)k_tjFnC@ILm*6mUsH$5y(k7*8OM2bpN^+}TX1;s-X0k^}`B2LJkpWDX1I%2q z)_O{*4`WQtWj?gl- zT#Lw#lMHyCHD486ps&cl5$n|q8&xL&NkZV{3MOfs x0sK1$Qh$=A`zUph_Hk=W*MGsd^e*(717G>pKrp?IMnC`n002ovPDHLkV1m|Dy$t{W literal 0 HcmV?d00001 diff --git a/v2rayN/v2rayN.Desktop/Assets/light.png b/v2rayN/v2rayN.Desktop/Assets/light.png new file mode 100644 index 0000000000000000000000000000000000000000..8a9c5d092b571f2647cfe73b78ad757e147a141b GIT binary patch literal 690 zcmV;j0!{siP)Px%Y)M2xR9HvtmOW?`K@`XTZ=(kaDoD~<_z{qEW>(HqyXZ9{S_*=Vg|QNXSg8b5 zP=i=01R;V|ItdnnAH?dA5CuQUyxqIv1i`}M2wJ4Lz1+<+D+wGCB)fNR8V9Bu-tV_> z-kZ0CbzZd2eEb*aNd`)#(uR7y9uUzaGmj;?)}9C`r7jWCJpiN3d?!kDieWXvA8*kqOSnz0A>LUJLk5AVYrZqfHCH- zh+HP3l88J6u)xd*lfqNgfH7vbh*SVfH=E7jTrO7^k*7p-e?`DKHyegwb1g!Ni%==` zf{2dw_4TQCyS){_yVW2fx^At#)pG%3%*myye-2=rnJ>lw-}etV=VFm~#c#qMBJ!=Z zwx>MRDo}h-jy^_D3h6LvDhZFRTTgs0NHNBO)@sT>0TLK%8?|l~V63mCEO( z4D4vNT7%VUb^c!noDh*K9f1b`>?5Lc0CI6Rh{#9~1P|5~+AT@lw45Ng;nbzwQFR Y0E(vhAt^-~i2wiq07*qoM6N<$f&<4i?*IS* literal 0 HcmV?d00001 diff --git a/v2rayN/v2rayN.Desktop/Assets/more.png b/v2rayN/v2rayN.Desktop/Assets/more.png new file mode 100644 index 0000000000000000000000000000000000000000..93cb6e81ad789787d0f8148be86e8ac48690070c GIT binary patch literal 450 zcmV;z0X_bSP)Px$d`Uz>R9HvtmOo3wKp2OA?{OAE9J@P~a4D7!4vzW>L><(j9TjI+^)m=|)WJVs z^&9BupilzsOPkTnK^%qBgq&Pyp#%}`hD0GZg>Wy=li&Mt7eda9a^|BDa8AJUyoL~B z1Hd8?Jw#D-8;0ShZA+a5DwWETl=2loc?wLDq}lKHFEbJFeg9BveU^efF!N?60-onB z3n7A8Sf&XWuu`f8paEbWKs%1(qc9BLGD%&|0sXSc&Md*XvoI0pnVieoo*Qv$aIjbdhipP)c0^*iFe_GxMJ92mMch+*@E` z&UFZF`~2H}rx_>&OakU2isN|IJWDB`gCO{DNye!K)oOJmNs=c33lr#<5Mr&{?Y`Jb zI0-1F&H?PFU@c}o$V%W2z*Y*@X6Egz1Wo`Pr(mbdY~EWfrxw)f^|{e#bfdK%|AZ3J seW_I1>2x}g72WkVw1pH0(VtG>8=Px%cS%G+R9HvtmOF?PK@f)jn%Q6jH8n63;f|f^*}w;QiGhKjqR}229GVD*20l&^ zd<5#9CYlIFYM|mqz7oMiP*K=mW@-jCFgr0)J+=d-k*WKASYj6!s!*q53-&9vu zHDSt)rmT-OfdAhE%zV*x-3LJse75nz%-aC?L^PwSTL9DnBt#UaX&T3IoD33IxgPL5 z?-&u?0q~57ZUb0Q)x&uLs`^S*&m~Fnp&yW30AtKuRXx(S(GLK(RCR@jzN+d5BHG%3 z%=-GK{V5T-(F-CMfSJDm*qCjis+Wt!;!>?v``u|{W6Wk%y#}C?&5KB`M%PKt^R^RF zyBoi!X}UK_lJ|Lk#?1QwJa5`mMP$C4eOCY*d;l(VSa?Z9>|AbRW*QO=4Dl_6bgksSq2>TIGA|> zz+qY!;0H=Ljf3L7FG2sfSV$6Vnl$!kHGi+18JH*0q|Nx zc8v%yco6!&Ka-}Zy*|HO*PRW5U}YGHk**;#zXh<9h?b)$Ix`HwNQuZ8Q&H8&P2sYL zgo8kgB^5KX1;{Gfei3=m55!oCQ6|L9+9FydqQxkRzH|Z^YdLNeVCItmt~bBg;#9L; zRqbf2-DDmltq`SBX$KKqA)?)R$1v6>StlXS^Gc56c#Qxp0q~kOaiiuZV}F$P6L6#2 jOuQWT0$c-_x(EIMrfVKBKzvKL00000NkvXXu0mjf6b?DF literal 0 HcmV?d00001 diff --git a/v2rayN/v2rayN.Desktop/Common/AvaUtils.cs b/v2rayN/v2rayN.Desktop/Common/AvaUtils.cs new file mode 100644 index 00000000..5b266748 --- /dev/null +++ b/v2rayN/v2rayN.Desktop/Common/AvaUtils.cs @@ -0,0 +1,64 @@ +using Avalonia; +using Avalonia.Controls; +using Avalonia.Input; +using Avalonia.Media.Imaging; +using Avalonia.Platform; +using System.Reflection; + +namespace v2rayN.Desktop.Common +{ + internal class AvaUtils + { + public static async Task GetClipboardData(Window owner) + { + try + { + var clipboard = TopLevel.GetTopLevel(owner)?.Clipboard; + if (clipboard == null) return null; + return await clipboard.GetTextAsync(); + } + catch + { + return null; + } + } + + public static async Task SetClipboardData(Visual? visual, string strData) + { + try + { + var clipboard = TopLevel.GetTopLevel(visual)?.Clipboard; + if (clipboard == null) return; + var dataObject = new DataObject(); + dataObject.Set(DataFormats.Text, strData); + await clipboard.SetDataObjectAsync(dataObject); + } + catch + { + } + } + + public static WindowIcon GetAppIcon(ESysProxyType sysProxyType) + { + int index = 1; + switch (sysProxyType) + { + case ESysProxyType.ForcedClear: + index = 1; + break; + + case ESysProxyType.ForcedChange: + case ESysProxyType.Pac: + index = 2; + break; + + case ESysProxyType.Unchanged: + index = 3; + break; + } + var uri = new Uri($"avares://{Assembly.GetExecutingAssembly().GetName().Name}/Assets/NotifyIcon{index}.ico"); + using var bitmap = new Bitmap(AssetLoader.Open(uri)); + return new(bitmap); + } + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN.Desktop/Common/UI.cs b/v2rayN/v2rayN.Desktop/Common/UI.cs new file mode 100644 index 00000000..0f72c55a --- /dev/null +++ b/v2rayN/v2rayN.Desktop/Common/UI.cs @@ -0,0 +1,50 @@ +using Avalonia.Controls; +using Avalonia.Platform.Storage; +using MsBox.Avalonia; +using MsBox.Avalonia.Enums; + +namespace v2rayN.Desktop.Common +{ + internal class UI + { + private static readonly string caption = Global.AppName; + + public static async Task ShowYesNo(Window owner, string msg) + { + var box = MessageBoxManager.GetMessageBoxStandard(caption, msg, ButtonEnum.YesNo); + return await box.ShowWindowDialogAsync(owner); + } + + public static async Task OpenFileDialog(Window owner, FilePickerFileType? filter) + { + var topLevel = TopLevel.GetTopLevel(owner); + if (topLevel == null) + { + return null; + } + // Start async operation to open the dialog. + var files = await topLevel.StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions + { + AllowMultiple = false, + FileTypeFilter = filter is null ? [FilePickerFileTypes.All, FilePickerFileTypes.ImagePng] : [filter] + }); + + return files.FirstOrDefault()?.TryGetLocalPath(); + } + + public static async Task SaveFileDialog(Window owner, string filter) + { + var topLevel = TopLevel.GetTopLevel(owner); + if (topLevel == null) + { + return null; + } + // Start async operation to open the dialog. + var files = await topLevel.StorageProvider.SaveFilePickerAsync(new FilePickerSaveOptions + { + }); + + return files?.TryGetLocalPath(); + } + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN.Desktop/Converters/DelayColorConverter.cs b/v2rayN/v2rayN.Desktop/Converters/DelayColorConverter.cs new file mode 100644 index 00000000..e61425f5 --- /dev/null +++ b/v2rayN/v2rayN.Desktop/Converters/DelayColorConverter.cs @@ -0,0 +1,26 @@ +using Avalonia.Data.Converters; +using Avalonia.Media; +using System.Globalization; + +namespace v2rayN.Desktop.Converters +{ + public class DelayColorConverter : IValueConverter + { + public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) + { + int.TryParse(value?.ToString(), out var delay); + + if (delay <= 0) + return new SolidColorBrush(Colors.Red); + if (delay <= 500) + return new SolidColorBrush(Colors.Green); + else + return new SolidColorBrush(Colors.IndianRed); + } + + public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) + { + return null; + } + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN.Desktop/FodyWeavers.xml b/v2rayN/v2rayN.Desktop/FodyWeavers.xml new file mode 100644 index 00000000..63fc1484 --- /dev/null +++ b/v2rayN/v2rayN.Desktop/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/v2rayN/v2rayN.Desktop/GlobalUsings.cs b/v2rayN/v2rayN.Desktop/GlobalUsings.cs new file mode 100644 index 00000000..bc789ab0 --- /dev/null +++ b/v2rayN/v2rayN.Desktop/GlobalUsings.cs @@ -0,0 +1,8 @@ +global using ServiceLib; +global using ServiceLib.Base; +global using ServiceLib.Common; +global using ServiceLib.Enums; +global using ServiceLib.Handler; +global using ServiceLib.Models; +global using ServiceLib.Resx; +global using ServiceLib.ViewModels; \ No newline at end of file diff --git a/v2rayN/v2rayN.Desktop/Handler/SysProxyHandler.cs b/v2rayN/v2rayN.Desktop/Handler/SysProxyHandler.cs new file mode 100644 index 00000000..55e2082d --- /dev/null +++ b/v2rayN/v2rayN.Desktop/Handler/SysProxyHandler.cs @@ -0,0 +1,61 @@ +namespace v2rayN.Desktop.Handler +{ + public static class SysProxyHandler + { + public static async Task UpdateSysProxy(Config config, bool forceDisable) + { + var type = config.systemProxyItem.sysProxyType; + + if (forceDisable && type != ESysProxyType.Unchanged) + { + type = ESysProxyType.ForcedClear; + } + + try + { + int port = LazyConfig.Instance.GetLocalPort(EInboundProtocol.http); + if (port <= 0) + { + return false; + } + if (type == ESysProxyType.ForcedChange) + { + var strProxy = $"{Global.Loopback}:{port}"; + await SetProxy(strProxy); + } + else if (type == ESysProxyType.ForcedClear) + { + await UnsetProxy(); + } + else if (type == ESysProxyType.Unchanged) + { + } + } + catch (Exception ex) + { + Logging.SaveLog(ex.Message, ex); + } + return true; + } + + private static async Task SetProxy(string? strProxy) + { + await Task.Run(() => + { + var httpProxy = strProxy is null ? null : $"{Global.HttpProtocol}{strProxy}"; + var socksProxy = strProxy is null ? null : $"{Global.SocksProtocol}{strProxy}"; + var noProxy = $"localhost,127.0.0.0/8,::1"; + + Environment.SetEnvironmentVariable("http_proxy", httpProxy, EnvironmentVariableTarget.User); + Environment.SetEnvironmentVariable("https_proxy", httpProxy, EnvironmentVariableTarget.User); + Environment.SetEnvironmentVariable("all_proxy", socksProxy, EnvironmentVariableTarget.User); + Environment.SetEnvironmentVariable("no_proxy", noProxy, EnvironmentVariableTarget.User); + }); + } + + private static async Task UnsetProxy() + { + await SetProxy(null); + } + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN.Desktop/Program.cs b/v2rayN/v2rayN.Desktop/Program.cs new file mode 100644 index 00000000..3149aab0 --- /dev/null +++ b/v2rayN/v2rayN.Desktop/Program.cs @@ -0,0 +1,22 @@ +using Avalonia; +using Avalonia.ReactiveUI; + +namespace v2rayN.Desktop; + +internal class Program +{ + // Initialization code. Don't use any Avalonia, third-party APIs or any + // SynchronizationContext-reliant code before AppMain is called: things aren't initialized + // yet and stuff might break. + [STAThread] + public static void Main(string[] args) => BuildAvaloniaApp() + .StartWithClassicDesktopLifetime(args); + + // Avalonia configuration, don't remove; also used by visual designer. + public static AppBuilder BuildAvaloniaApp() + => AppBuilder.Configure() + .UsePlatformDetect() + .WithInterFont() + .LogToTrace() + .UseReactiveUI(); +} \ No newline at end of file diff --git a/v2rayN/v2rayN.Desktop/Styles/GlobalStyles.axaml b/v2rayN/v2rayN.Desktop/Styles/GlobalStyles.axaml new file mode 100644 index 00000000..ca5f9081 --- /dev/null +++ b/v2rayN/v2rayN.Desktop/Styles/GlobalStyles.axaml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2rayN/v2rayN.Desktop/ViewModels/ThemeSettingViewModel.cs b/v2rayN/v2rayN.Desktop/ViewModels/ThemeSettingViewModel.cs new file mode 100644 index 00000000..0794c1b9 --- /dev/null +++ b/v2rayN/v2rayN.Desktop/ViewModels/ThemeSettingViewModel.cs @@ -0,0 +1,143 @@ +using Avalonia; +using Avalonia.Controls; +using Avalonia.Styling; +using ReactiveUI; +using ReactiveUI.Fody.Helpers; +using Splat; +using System.Reactive.Linq; + +namespace v2rayN.Desktop.ViewModels +{ + public class ThemeSettingViewModel : MyReactiveObject + { + [Reactive] + public bool ColorModeDark { get; set; } + + [Reactive] + public int CurrentFontSize { get; set; } + + [Reactive] + public string CurrentLanguage { get; set; } + + public ThemeSettingViewModel() + { + _config = LazyConfig.Instance.Config; + _noticeHandler = Locator.Current.GetService(); + + BindingUI(); + RestoreUI(); + } + + private void RestoreUI() + { + ModifyTheme(_config.uiItem.colorModeDark); + } + + private void BindingUI() + { + ColorModeDark = _config.uiItem.colorModeDark; + CurrentFontSize = _config.uiItem.currentFontSize; + CurrentLanguage = _config.uiItem.currentLanguage; + + this.WhenAnyValue(x => x.ColorModeDark) + .Subscribe(c => + { + if (_config.uiItem.colorModeDark != ColorModeDark) + { + _config.uiItem.colorModeDark = ColorModeDark; + ModifyTheme(ColorModeDark); + ConfigHandler.SaveConfig(_config); + } + }); + + this.WhenAnyValue( + x => x.CurrentFontSize, + y => y > 0) + .Subscribe(c => + { + if (CurrentFontSize >= Global.MinFontSize) + { + _config.uiItem.currentFontSize = CurrentFontSize; + double size = CurrentFontSize; + ModifyFontSize(size); + + ConfigHandler.SaveConfig(_config); + } + }); + + this.WhenAnyValue( + x => x.CurrentLanguage, + y => y != null && !y.IsNullOrEmpty()) + .Subscribe(c => + { + if (!Utils.IsNullOrEmpty(CurrentLanguage) && _config.uiItem.currentLanguage != CurrentLanguage) + { + _config.uiItem.currentLanguage = CurrentLanguage; + Thread.CurrentThread.CurrentUICulture = new(CurrentLanguage); + ConfigHandler.SaveConfig(_config); + _noticeHandler?.Enqueue(ResUI.NeedRebootTips); + } + }); + } + + private void ModifyTheme(bool isDarkTheme) + { + var app = Application.Current; + if (app is not null) + { + app.RequestedThemeVariant = isDarkTheme ? ThemeVariant.Dark : ThemeVariant.Light; + } + } + + private void ModifyFontSize(double size) + { + Style buttonStyle = new(x => x.OfType + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2rayN/v2rayN.Desktop/Views/ClashConnectionsView.axaml.cs b/v2rayN/v2rayN.Desktop/Views/ClashConnectionsView.axaml.cs new file mode 100644 index 00000000..5379ec4d --- /dev/null +++ b/v2rayN/v2rayN.Desktop/Views/ClashConnectionsView.axaml.cs @@ -0,0 +1,50 @@ +using Avalonia.Interactivity; +using Avalonia.ReactiveUI; +using Avalonia.Threading; +using ReactiveUI; +using System.Reactive.Disposables; + +namespace v2rayN.Desktop.Views +{ + public partial class ClashConnectionsView : ReactiveUserControl + { + public ClashConnectionsView() + { + InitializeComponent(); + ViewModel = new ClashConnectionsViewModel(UpdateViewHandler); + + this.WhenActivated(disposables => + { + this.OneWayBind(ViewModel, vm => vm.ConnectionItems, v => v.lstConnections.ItemsSource).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource, v => v.lstConnections.SelectedItem).DisposeWith(disposables); + + this.BindCommand(ViewModel, vm => vm.ConnectionCloseCmd, v => v.menuConnectionClose).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.ConnectionCloseAllCmd, v => v.menuConnectionCloseAll).DisposeWith(disposables); + + this.Bind(ViewModel, vm => vm.SortingSelected, v => v.cmbSorting.SelectedIndex).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.ConnectionCloseAllCmd, v => v.btnConnectionCloseAll).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.AutoRefresh, v => v.togAutoRefresh.IsChecked).DisposeWith(disposables); + }); + } + + private async Task UpdateViewHandler(EViewAction action, object? obj) + { + switch (action) + { + case EViewAction.DispatcherRefreshConnections: + if (obj is null) return false; + Dispatcher.UIThread.Post(() => + ViewModel?.RefreshConnections((List?)obj), + DispatcherPriority.Default); + break; + } + + return await Task.FromResult(true); + } + + private void btnClose_Click(object? sender, RoutedEventArgs e) + { + ViewModel?.ClashConnectionClose(false); + } + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN.Desktop/Views/ClashProxiesView.axaml b/v2rayN/v2rayN.Desktop/Views/ClashProxiesView.axaml new file mode 100644 index 00000000..0399ea16 --- /dev/null +++ b/v2rayN/v2rayN.Desktop/Views/ClashProxiesView.axaml @@ -0,0 +1,179 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2rayN/v2rayN.Desktop/Views/ClashProxiesView.axaml.cs b/v2rayN/v2rayN.Desktop/Views/ClashProxiesView.axaml.cs new file mode 100644 index 00000000..d46a2b2b --- /dev/null +++ b/v2rayN/v2rayN.Desktop/Views/ClashProxiesView.axaml.cs @@ -0,0 +1,81 @@ +using Avalonia.Input; +using Avalonia.ReactiveUI; +using Avalonia.Threading; +using DynamicData; +using ReactiveUI; +using Splat; +using System.Reactive.Disposables; + +namespace v2rayN.Desktop.Views +{ + public partial class ClashProxiesView : ReactiveUserControl + { + public ClashProxiesView() + { + InitializeComponent(); + ViewModel = new ClashProxiesViewModel(UpdateViewHandler); + Locator.CurrentMutable.RegisterLazySingleton(() => ViewModel, typeof(ClashProxiesViewModel)); + lstProxyDetails.DoubleTapped += LstProxyDetails_DoubleTapped; + this.KeyDown += ClashProxiesView_KeyDown; + + this.WhenActivated(disposables => + { + this.OneWayBind(ViewModel, vm => vm.ProxyGroups, v => v.lstProxyGroups.ItemsSource).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedGroup, v => v.lstProxyGroups.SelectedItem).DisposeWith(disposables); + + this.OneWayBind(ViewModel, vm => vm.ProxyDetails, v => v.lstProxyDetails.ItemsSource).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedDetail, v => v.lstProxyDetails.SelectedItem).DisposeWith(disposables); + + this.BindCommand(ViewModel, vm => vm.ProxiesReloadCmd, v => v.menuProxiesReload).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.ProxiesDelaytestCmd, v => v.menuProxiesDelaytest).DisposeWith(disposables); + + this.BindCommand(ViewModel, vm => vm.ProxiesDelaytestPartCmd, v => v.menuProxiesDelaytestPart).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.ProxiesSelectActivityCmd, v => v.menuProxiesSelectActivity).DisposeWith(disposables); + + this.Bind(ViewModel, vm => vm.RuleModeSelected, v => v.cmbRulemode.SelectedIndex).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SortingSelected, v => v.cmbSorting.SelectedIndex).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.AutoRefresh, v => v.togAutoRefresh.IsChecked).DisposeWith(disposables); + }); + } + + private async Task UpdateViewHandler(EViewAction action, object? obj) + { + switch (action) + { + case EViewAction.DispatcherRefreshProxyGroups: + Dispatcher.UIThread.Post(() => + ViewModel?.RefreshProxyGroups(), + DispatcherPriority.Default); + break; + + case EViewAction.DispatcherProxiesDelayTest: + if (obj is null) return false; + Dispatcher.UIThread.Post(() => + ViewModel?.ProxiesDelayTestResult((SpeedTestResult)obj), + DispatcherPriority.Default); + break; + } + + return await Task.FromResult(true); + } + + private void ClashProxiesView_KeyDown(object? sender, KeyEventArgs e) + { + switch (e.Key) + { + case Key.F5: + ViewModel?.ProxiesReload(); + break; + + case Key.Enter: + ViewModel?.SetActiveProxy(); + break; + } + } + + private void LstProxyDetails_DoubleTapped(object? sender, Avalonia.Input.TappedEventArgs e) + { + ViewModel?.SetActiveProxy(); + } + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN.Desktop/Views/DNSSettingWindow.axaml b/v2rayN/v2rayN.Desktop/Views/DNSSettingWindow.axaml new file mode 100644 index 00000000..dda0ad4e --- /dev/null +++ b/v2rayN/v2rayN.Desktop/Views/DNSSettingWindow.axaml @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2rayN/v2rayN.Desktop/Views/MsgView.axaml.cs b/v2rayN/v2rayN.Desktop/Views/MsgView.axaml.cs new file mode 100644 index 00000000..a99647f5 --- /dev/null +++ b/v2rayN/v2rayN.Desktop/Views/MsgView.axaml.cs @@ -0,0 +1,127 @@ +using Avalonia.Controls; +using Avalonia.Interactivity; +using Avalonia.Threading; +using ReactiveUI; +using System.Collections.Concurrent; +using System.Text.RegularExpressions; +using v2rayN.Desktop.Common; + +namespace v2rayN.Desktop.Views +{ + public partial class MsgView : UserControl + { + private static Config? _config; + + private string lastMsgFilter = string.Empty; + private bool lastMsgFilterNotAvailable; + private ConcurrentBag _lstMsg = []; + + public MsgView() + { + InitializeComponent(); + _config = LazyConfig.Instance.Config; + MessageBus.Current.Listen(Global.CommandSendMsgView).Subscribe(x => DelegateAppendText(x)); + //Global.PresetMsgFilters.ForEach(it => + //{ + // cmbMsgFilter.Items.Add(it); + //}); + if (!_config.uiItem.mainMsgFilter.IsNullOrEmpty()) + { + cmbMsgFilter.Text = _config.uiItem.mainMsgFilter; + } + cmbMsgFilter.TextChanged += (s, e) => + { + _config.uiItem.mainMsgFilter = cmbMsgFilter.Text?.ToString(); + }; + } + + private void DelegateAppendText(string msg) + { + Dispatcher.UIThread.Post(() => AppendText(msg), DispatcherPriority.ApplicationIdle); + } + + public void AppendText(string msg) + { + if (msg == Global.CommandClearMsg) + { + ClearMsg(); + return; + } + if (togAutoRefresh.IsChecked == false) + { + return; + } + + var MsgFilter = cmbMsgFilter.Text?.ToString(); + if (MsgFilter != lastMsgFilter) lastMsgFilterNotAvailable = false; + if (!Utils.IsNullOrEmpty(MsgFilter) && !lastMsgFilterNotAvailable) + { + try + { + if (!Regex.IsMatch(msg, MsgFilter)) + { + return; + } + } + catch (Exception) + { + lastMsgFilterNotAvailable = true; + } + } + lastMsgFilter = MsgFilter; + + ShowMsg(msg); + + if (togScrollToEnd.IsChecked ?? true) + { + } + } + + private void ShowMsg(string msg) + { + if (_lstMsg.Count > 999) + { + ClearMsg(); + } + if (!msg.EndsWith(Environment.NewLine)) + { + _lstMsg.Add(Environment.NewLine); + } + _lstMsg.Add(msg); + // if (!msg.EndsWith(Environment.NewLine)) + // { + // _lstMsg.Add(Environment.NewLine); + // } + this.txtMsg.Text = string.Join("", _lstMsg); + } + + public void ClearMsg() + { + _lstMsg.Clear(); + txtMsg.Clear(); + } + + private void menuMsgViewSelectAll_Click(object? sender, RoutedEventArgs e) + { + txtMsg.Focus(); + txtMsg.SelectAll(); + } + + private async void menuMsgViewCopy_Click(object? sender, RoutedEventArgs e) + { + var data = txtMsg.SelectedText.TrimEx(); + await AvaUtils.SetClipboardData(this, data); + } + + private async void menuMsgViewCopyAll_Click(object? sender, RoutedEventArgs e) + { + var data = txtMsg.Text.TrimEx(); + await AvaUtils.SetClipboardData(this, data); + } + + private void menuMsgViewClear_Click(object? sender, RoutedEventArgs e) + { + ClearMsg(); + } + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN.Desktop/Views/OptionSettingWindow.axaml b/v2rayN/v2rayN.Desktop/Views/OptionSettingWindow.axaml new file mode 100644 index 00000000..931c85a7 --- /dev/null +++ b/v2rayN/v2rayN.Desktop/Views/OptionSettingWindow.axaml @@ -0,0 +1,857 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml.cs b/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml.cs new file mode 100644 index 00000000..280a13b7 --- /dev/null +++ b/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml.cs @@ -0,0 +1,468 @@ +using Avalonia.Controls; +using Avalonia.Input; +using Avalonia.Interactivity; +using Avalonia.ReactiveUI; +using Avalonia.Threading; +using MsBox.Avalonia.Enums; +using ReactiveUI; +using Splat; +using System.Reactive.Disposables; +using v2rayN.Desktop.Common; + +namespace v2rayN.Desktop.Views +{ + public partial class ProfilesView : ReactiveUserControl + { + private static Config _config; + private Window _window; + + public ProfilesView(Window window) + { + InitializeComponent(); + + _config = LazyConfig.Instance.Config; + _window = window; + + menuSelectAll.Click += menuSelectAll_Click; + btnAutofitColumnWidth.Click += BtnAutofitColumnWidth_Click; + txtServerFilter.KeyDown += TxtServerFilter_KeyDown; + lstProfiles.KeyDown += LstProfiles_KeyDown; + lstProfiles.SelectionChanged += lstProfiles_SelectionChanged; + lstProfiles.DoubleTapped += LstProfiles_DoubleTapped; + lstProfiles.LoadingRow += LstProfiles_LoadingRow; + //if (_config.uiItem.enableDragDropSort) + //{ + // lstProfiles.AllowDrop = true; + // lstProfiles.PreviewMouseLeftButtonDown += LstProfiles_PreviewMouseLeftButtonDown; + // lstProfiles.MouseMove += LstProfiles_MouseMove; + // lstProfiles.DragEnter += LstProfiles_DragEnter; + // lstProfiles.Drop += LstProfiles_Drop; + //} + + ViewModel = new ProfilesViewModel(UpdateViewHandler); + Locator.CurrentMutable.RegisterLazySingleton(() => ViewModel, typeof(ProfilesViewModel)); + + this.WhenActivated(disposables => + { + this.OneWayBind(ViewModel, vm => vm.ProfileItems, v => v.lstProfiles.ItemsSource).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedProfile, v => v.lstProfiles.SelectedItem).DisposeWith(disposables); + + // this.OneWayBind(ViewModel, vm => vm.SubItems, v => v.lstGroup.ItemsSource).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSub, v => v.lstGroup.SelectedItem).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.ServerFilter, v => v.txtServerFilter.Text).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.AddSubCmd, v => v.btnAddSub).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.EditSubCmd, v => v.btnEditSub).DisposeWith(disposables); + + //servers delete + this.BindCommand(ViewModel, vm => vm.EditServerCmd, v => v.menuEditServer).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.RemoveServerCmd, v => v.menuRemoveServer).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.RemoveDuplicateServerCmd, v => v.menuRemoveDuplicateServer).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.CopyServerCmd, v => v.menuCopyServer).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.SetDefaultServerCmd, v => v.menuSetDefaultServer).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.ShareServerCmd, v => v.menuShareServer).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.SetDefaultMultipleServerCmd, v => v.menuSetDefaultMultipleServer).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.SetDefaultLoadBalanceServerCmd, v => v.menuSetDefaultLoadBalanceServer).DisposeWith(disposables); + + //servers move + this.OneWayBind(ViewModel, vm => vm.SubItems, v => v.cmbMoveToGroup.ItemsSource).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedMoveToGroup, v => v.cmbMoveToGroup.SelectedItem).DisposeWith(disposables); + + this.BindCommand(ViewModel, vm => vm.MoveTopCmd, v => v.menuMoveTop).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.MoveUpCmd, v => v.menuMoveUp).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.MoveDownCmd, v => v.menuMoveDown).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.MoveBottomCmd, v => v.menuMoveBottom).DisposeWith(disposables); + + //servers ping + this.BindCommand(ViewModel, vm => vm.MixedTestServerCmd, v => v.menuMixedTestServer).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.TcpingServerCmd, v => v.menuTcpingServer).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.RealPingServerCmd, v => v.menuRealPingServer).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.SpeedServerCmd, v => v.menuSpeedServer).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.SortServerResultCmd, v => v.menuSortServerResult).DisposeWith(disposables); + + //servers export + this.BindCommand(ViewModel, vm => vm.Export2ClientConfigCmd, v => v.menuExport2ClientConfig).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.Export2ClientConfigClipboardCmd, v => v.menuExport2ClientConfigClipboard).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.Export2ShareUrlCmd, v => v.menuExport2ShareUrl).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.Export2ShareUrlBase64Cmd, v => v.menuExport2ShareUrlBase64).DisposeWith(disposables); + }); + + //RestoreUI(); + ViewModel?.RefreshServers(); + } + + //#region Event + + private async Task UpdateViewHandler(EViewAction action, object? obj) + { + switch (action) + { + case EViewAction.SetClipboardData: + if (obj is null) return false; + await AvaUtils.SetClipboardData(this, (string)obj); + break; + + case EViewAction.AdjustMainLvColWidth: + Dispatcher.UIThread.Post(() => + AutofitColumnWidth(), + DispatcherPriority.Default); + + break; + + case EViewAction.ProfilesFocus: + lstProfiles.Focus(); + break; + + case EViewAction.ShowYesNo: + if (await UI.ShowYesNo(_window, ResUI.RemoveServer) == ButtonResult.No) + { + return false; + } + break; + + case EViewAction.SaveFileDialog: + if (obj is null) return false; + var fileName = await UI.SaveFileDialog(_window, ""); + if (fileName.IsNullOrEmpty()) + { + return false; + } + ViewModel?.Export2ClientConfigResult(fileName, (ProfileItem)obj); + break; + + case EViewAction.AddServerWindow: + if (obj is null) return false; + return await new AddServerWindow((ProfileItem)obj).ShowDialog(_window); + + case EViewAction.AddServer2Window: + if (obj is null) return false; + return await new AddServer2Window((ProfileItem)obj).ShowDialog(_window); + + case EViewAction.ShareServer: + if (obj is null) return false; + await ShareServer((string)obj); + break; + + case EViewAction.SubEditWindow: + if (obj is null) return false; + return await new SubEditWindow((SubItem)obj).ShowDialog(_window); + + case EViewAction.DispatcherSpeedTest: + if (obj is null) return false; + Dispatcher.UIThread.Post(() => + ViewModel?.SetSpeedTestResult((SpeedTestResult)obj), + DispatcherPriority.Default); + + break; + + case EViewAction.DispatcherRefreshServersBiz: + Dispatcher.UIThread.Post(() => + ViewModel?.RefreshServersBiz(), + DispatcherPriority.Default); + break; + } + + return await Task.FromResult(true); + } + + public async Task ShareServer(string url) + { + if (Utils.IsNullOrEmpty(url)) + { + return; + } + var dialog = new QrcodeView(url); + await dialog.ShowDialog(_window); + } + + private void lstProfiles_SelectionChanged(object? sender, SelectionChangedEventArgs e) + { + List lst = []; + foreach (var item in lstProfiles.SelectedItems) + { + lst.Add((ProfileItemModel)item); + } + ViewModel.SelectedProfiles = lst; + } + + private void LstProfiles_DoubleTapped(object? sender, Avalonia.Input.TappedEventArgs e) + { + if (_config.uiItem.doubleClick2Activate) + { + ViewModel?.SetDefaultServer(); + } + else + { + ViewModel?.EditServerAsync(EConfigType.Custom); + } + } + + private void LstProfiles_LoadingRow(object? sender, DataGridRowEventArgs e) + { + e.Row.Header = $" {e.Row.GetIndex() + 1}"; + } + + //private void LstProfiles_ColumnHeader_Click(object? sender, RoutedEventArgs e) + //{ + // var colHeader = sender as DataGridColumnHeader; + // if (colHeader == null || colHeader.TabIndex < 0 || colHeader.Column == null) + // { + // return; + // } + + // var colName = ((MyDGTextColumn)colHeader.Column).ExName; + // ViewModel?.SortServer(colName); + //} + + private void menuSelectAll_Click(object? sender, RoutedEventArgs e) + { + lstProfiles.SelectAll(); + } + + private void LstProfiles_KeyDown(object? sender, KeyEventArgs e) + { + if (e.KeyModifiers == KeyModifiers.Control) + { + switch (e.Key) + { + case Key.A: + menuSelectAll_Click(null, null); + break; + + case Key.C: + ViewModel?.Export2ShareUrlAsync(false); + break; + + case Key.D: + ViewModel?.EditServerAsync(EConfigType.Custom); + break; + + case Key.F: + ViewModel?.ShareServerAsync(); + break; + + case Key.O: + ViewModel?.ServerSpeedtest(ESpeedActionType.Tcping); + break; + + case Key.R: + ViewModel?.ServerSpeedtest(ESpeedActionType.Realping); + break; + + case Key.T: + ViewModel?.ServerSpeedtest(ESpeedActionType.Speedtest); + break; + + case Key.E: + ViewModel?.ServerSpeedtest(ESpeedActionType.Mixedtest); + break; + } + } + else + { + if (e.Key is Key.Enter or Key.Return) + { + ViewModel?.SetDefaultServer(); + } + else if (e.Key == Key.Delete) + { + ViewModel?.RemoveServerAsync(); + } + else if (e.Key == Key.T) + { + ViewModel?.MoveServer(EMove.Top); + } + else if (e.Key == Key.U) + { + ViewModel?.MoveServer(EMove.Up); + } + else if (e.Key == Key.D) + { + ViewModel?.MoveServer(EMove.Down); + } + else if (e.Key == Key.B) + { + ViewModel?.MoveServer(EMove.Bottom); + } + else if (e.Key == Key.Escape) + { + ViewModel?.ServerSpeedtestStop(); + } + } + } + + private void BtnAutofitColumnWidth_Click(object? sender, RoutedEventArgs e) + { + AutofitColumnWidth(); + } + + private void AutofitColumnWidth() + { + foreach (var it in lstProfiles.Columns) + { + it.Width = new DataGridLength(1, DataGridLengthUnitType.Auto); + } + } + + private void TxtServerFilter_KeyDown(object? sender, KeyEventArgs e) + { + if (e.Key is Key.Enter or Key.Return) + { + ViewModel?.RefreshServers(); + } + } + + //#endregion Event + + //#region UI + + //private void RestoreUI() + //{ + // var lvColumnItem = _config.uiItem.mainColumnItem.OrderBy(t => t.Index).ToList(); + // var displayIndex = 0; + // foreach (var item in lvColumnItem) + // { + // foreach (MyDGTextColumn item2 in lstProfiles.Columns) + // { + // if (item2.ExName == item.Name) + // { + // if (item.Width < 0) + // { + // item2.IsVisible = false; + // } + // else + // { + // item2.Width = item.Width; + // item2.DisplayIndex = displayIndex++; + // } + // } + // } + // } + + // if (!_config.guiItem.enableStatistics) + // { + // colTodayUp.IsVisible = + // colTodayDown.IsVisible = + // colTotalUp.IsVisible = + // colTotalDown.IsVisible = false; + // } + // else + // { + // colTodayUp.IsVisible = + // colTodayDown.IsVisible = + // colTotalUp.IsVisible = + // colTotalDown.IsVisible = true; + // } + //} + + //private void StorageUI() + //{ + // List lvColumnItem = new(); + // for (int k = 0; k < lstProfiles.Columns.Count; k++) + // { + // var item2 = (MyDGTextColumn)lstProfiles.Columns[k]; + // lvColumnItem.Add(new() + // { + // Name = item2.ExName, + // Width = item2.IsVisible == true ? Utils.ToInt(item2.ActualWidth) : -1, + // Index = item2.DisplayIndex + // }); + // } + // _config.uiItem.mainColumnItem = lvColumnItem; + // ConfigHandler.SaveConfig(_config); + //} + + //#endregion UI + + //#region Drag and Drop + + //private Point startPoint = new(); + //private int startIndex = -1; + //private string formatData = "ProfileItemModel"; + + ///// + ///// Helper to search up the VisualTree + ///// + ///// + ///// + ///// + //private static T? FindAncestor(DependencyObject current) where T : DependencyObject + //{ + // do + // { + // if (current is T) + // { + // return (T)current; + // } + // current = VisualTreeHelper.GetParent(current); + // } + // while (current != null); + // return null; + //} + + //private void LstProfiles_PreviewMouseLeftButtonDown(object? sender, MouseButtonEventArgs e) + //{ + // // Get current mouse position + // startPoint = e.GetPosition(null); + //} + + //private void LstProfiles_MouseMove(object? sender, MouseEventArgs e) + //{ + // // Get the current mouse position + // Point mousePos = e.GetPosition(null); + // Vector diff = startPoint - mousePos; + + // if (e.LeftButton == MouseButtonState.Pressed && + // (Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance || + // Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)) + // { + // // Get the dragged Item + // if (sender is not DataGrid listView) return; + // var listViewItem = FindAncestor((DependencyObject)e.OriginalSource); + // if (listViewItem == null) return; // Abort + // // Find the data behind the ListViewItem + // ProfileItemModel item = (ProfileItemModel)listView.ItemContainerGenerator.ItemFromContainer(listViewItem); + // if (item == null) return; // Abort + // // Initialize the drag & drop operation + // startIndex = lstProfiles.SelectedIndex; + // DataObject dragData = new(formatData, item); + // DragDrop.DoDragDrop(listViewItem, dragData, DragDropEffects.Copy | DragDropEffects.Move); + // } + //} + + //private void LstProfiles_DragEnter(object? sender, DragEventArgs e) + //{ + // if (!e.Data.GetDataPresent(formatData) || sender != e.Source) + // { + // e.Effects = DragDropEffects.None; + // } + //} + + //private void LstProfiles_Drop(object? sender, DragEventArgs e) + //{ + // if (e.Data.GetDataPresent(formatData) && sender == e.Source) + // { + // // Get the drop Item destination + // if (sender is not DataGrid listView) return; + // var listViewItem = FindAncestor((DependencyObject)e.OriginalSource); + // if (listViewItem == null) + // { + // // Abort + // e.Effects = DragDropEffects.None; + // return; + // } + // // Find the data behind the Item + // ProfileItemModel item = (ProfileItemModel)listView.ItemContainerGenerator.ItemFromContainer(listViewItem); + // if (item == null) return; + // // Move item into observable collection + // // (this will be automatically reflected to lstView.ItemsSource) + // e.Effects = DragDropEffects.Move; + + // ViewModel?.MoveServerTo(startIndex, item); + + // startIndex = -1; + // } + //} + + //#endregion Drag and Drop + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN.Desktop/Views/QrcodeView.axaml b/v2rayN/v2rayN.Desktop/Views/QrcodeView.axaml new file mode 100644 index 00000000..2f92209a --- /dev/null +++ b/v2rayN/v2rayN.Desktop/Views/QrcodeView.axaml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2rayN/v2rayN.Desktop/Views/ThemeSettingView.axaml.cs b/v2rayN/v2rayN.Desktop/Views/ThemeSettingView.axaml.cs new file mode 100644 index 00000000..1c544aad --- /dev/null +++ b/v2rayN/v2rayN.Desktop/Views/ThemeSettingView.axaml.cs @@ -0,0 +1,37 @@ +using Avalonia; +using Avalonia.ReactiveUI; +using ReactiveUI; +using System.Reactive.Disposables; +using v2rayN.Desktop.ViewModels; + +namespace v2rayN.Desktop.Views +{ + /// + /// ThemeSettingView.xaml + /// + public partial class ThemeSettingView : ReactiveUserControl + { + public ThemeSettingView() + { + InitializeComponent(); + ViewModel = new ThemeSettingViewModel(); + + for (int i = Global.MinFontSize; i <= Global.MinFontSize + 10; i++) + { + cmbCurrentFontSize.Items.Add(i); + } + + Global.Languages.ForEach(it => + { + cmbCurrentLanguage.Items.Add(it); + }); + + this.WhenActivated(disposables => + { + this.Bind(ViewModel, vm => vm.ColorModeDark, v => v.togDarkMode.IsChecked).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.CurrentFontSize, v => v.cmbCurrentFontSize.SelectedValue).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.CurrentLanguage, v => v.cmbCurrentLanguage.SelectedValue).DisposeWith(disposables); + }); + } + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN.Desktop/v2rayN.Desktop.csproj b/v2rayN/v2rayN.Desktop/v2rayN.Desktop.csproj new file mode 100644 index 00000000..b0fc246c --- /dev/null +++ b/v2rayN/v2rayN.Desktop/v2rayN.Desktop.csproj @@ -0,0 +1,39 @@ + + + WinExe + net8.0 + enable + enable + true + true + 6.55 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v2rayN/v2rayN.sln b/v2rayN/v2rayN.sln index f4afd009..47689a40 100644 --- a/v2rayN/v2rayN.sln +++ b/v2rayN/v2rayN.sln @@ -9,9 +9,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ProtosLib", "ProtosLib\Prot EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PacLib", "PacLib\PacLib.csproj", "{EE4E6CD8-8353-446B-8F29-A841A02AE5EC}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "v2rayUpgrade", "v2rayUpgrade\v2rayUpgrade.csproj", "{3CD0B9E8-331B-42C6-A395-4DA0FD4BC8EB}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ServiceLib", "ServiceLib\ServiceLib.csproj", "{1B6456C4-FFAA-4298-80F6-7B689A6E9243}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ServiceLib", "ServiceLib\ServiceLib.csproj", "{1B6456C4-FFAA-4298-80F6-7B689A6E9243}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "v2rayN.Desktop", "v2rayN.Desktop\v2rayN.Desktop.csproj", "{5D16541A-F971-4C17-9315-BB8955E3F984}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "v2rayUpgrade", "v2rayUpgrade\v2rayUpgrade.csproj", "{47D68B1C-601C-4C69-873B-FFF0DC13EC97}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -31,14 +33,18 @@ Global {EE4E6CD8-8353-446B-8F29-A841A02AE5EC}.Debug|Any CPU.Build.0 = Debug|Any CPU {EE4E6CD8-8353-446B-8F29-A841A02AE5EC}.Release|Any CPU.ActiveCfg = Release|Any CPU {EE4E6CD8-8353-446B-8F29-A841A02AE5EC}.Release|Any CPU.Build.0 = Release|Any CPU - {3CD0B9E8-331B-42C6-A395-4DA0FD4BC8EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3CD0B9E8-331B-42C6-A395-4DA0FD4BC8EB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3CD0B9E8-331B-42C6-A395-4DA0FD4BC8EB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3CD0B9E8-331B-42C6-A395-4DA0FD4BC8EB}.Release|Any CPU.Build.0 = Release|Any CPU {1B6456C4-FFAA-4298-80F6-7B689A6E9243}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1B6456C4-FFAA-4298-80F6-7B689A6E9243}.Debug|Any CPU.Build.0 = Debug|Any CPU {1B6456C4-FFAA-4298-80F6-7B689A6E9243}.Release|Any CPU.ActiveCfg = Release|Any CPU {1B6456C4-FFAA-4298-80F6-7B689A6E9243}.Release|Any CPU.Build.0 = Release|Any CPU + {5D16541A-F971-4C17-9315-BB8955E3F984}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5D16541A-F971-4C17-9315-BB8955E3F984}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5D16541A-F971-4C17-9315-BB8955E3F984}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5D16541A-F971-4C17-9315-BB8955E3F984}.Release|Any CPU.Build.0 = Release|Any CPU + {47D68B1C-601C-4C69-873B-FFF0DC13EC97}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {47D68B1C-601C-4C69-873B-FFF0DC13EC97}.Debug|Any CPU.Build.0 = Debug|Any CPU + {47D68B1C-601C-4C69-873B-FFF0DC13EC97}.Release|Any CPU.ActiveCfg = Release|Any CPU + {47D68B1C-601C-4C69-873B-FFF0DC13EC97}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE