mirror of
https://github.com/2dust/v2rayN.git
synced 2026-04-18 05:25:46 +00:00
Compare commits
6 commits
93389cdfc8
...
aee8de9b84
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
aee8de9b84 | ||
|
|
214a09bc48 | ||
|
|
e6af9ab342 | ||
|
|
0f4031f445 | ||
|
|
5cf3d6eff6 | ||
|
|
daa09fc0bf |
29 changed files with 69 additions and 74 deletions
|
|
@ -1,7 +1,7 @@
|
||||||
<Project>
|
<Project>
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<Version>7.19.3</Version>
|
<Version>7.19.4</Version>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
|
|
|
||||||
|
|
@ -9,18 +9,18 @@
|
||||||
<PackageVersion Include="Avalonia.Controls.DataGrid" Version="11.3.12" />
|
<PackageVersion Include="Avalonia.Controls.DataGrid" Version="11.3.12" />
|
||||||
<PackageVersion Include="Avalonia.Desktop" Version="11.3.12" />
|
<PackageVersion Include="Avalonia.Desktop" Version="11.3.12" />
|
||||||
<PackageVersion Include="Avalonia.Diagnostics" Version="11.3.12" />
|
<PackageVersion Include="Avalonia.Diagnostics" Version="11.3.12" />
|
||||||
<PackageVersion Include="ReactiveUI.Avalonia" Version="11.3.8" />
|
<PackageVersion Include="ReactiveUI.Avalonia" Version="11.4.12" />
|
||||||
<PackageVersion Include="CliWrap" Version="3.10.0" />
|
<PackageVersion Include="CliWrap" Version="3.10.0" />
|
||||||
<PackageVersion Include="Downloader" Version="4.1.1" />
|
<PackageVersion Include="Downloader" Version="5.1.0" />
|
||||||
<PackageVersion Include="H.NotifyIcon.Wpf" Version="2.4.1" />
|
<PackageVersion Include="H.NotifyIcon.Wpf" Version="2.4.1" />
|
||||||
<PackageVersion Include="MaterialDesignThemes" Version="5.3.0" />
|
<PackageVersion Include="MaterialDesignThemes" Version="5.3.0" />
|
||||||
<PackageVersion Include="MessageBox.Avalonia" Version="3.3.1.1" />
|
<PackageVersion Include="MessageBox.Avalonia" Version="3.3.1.1" />
|
||||||
<PackageVersion Include="QRCoder" Version="1.7.0" />
|
<PackageVersion Include="QRCoder" Version="1.7.0" />
|
||||||
<PackageVersion Include="ReactiveUI" Version="22.3.1" />
|
<PackageVersion Include="ReactiveUI" Version="23.1.8" />
|
||||||
<PackageVersion Include="ReactiveUI.Fody" Version="19.5.41" />
|
<PackageVersion Include="ReactiveUI.Fody" Version="19.5.41" />
|
||||||
<PackageVersion Include="ReactiveUI.WPF" Version="22.3.1" />
|
<PackageVersion Include="ReactiveUI.WPF" Version="23.1.8" />
|
||||||
<PackageVersion Include="Semi.Avalonia" Version="11.3.7.3" />
|
<PackageVersion Include="Semi.Avalonia" Version="11.3.7.3" />
|
||||||
<PackageVersion Include="Semi.Avalonia.AvaloniaEdit" Version="11.2.0.1" />
|
<PackageVersion Include="Semi.Avalonia.AvaloniaEdit" Version="11.2.0.2" />
|
||||||
<PackageVersion Include="Semi.Avalonia.DataGrid" Version="11.3.7.3" />
|
<PackageVersion Include="Semi.Avalonia.DataGrid" Version="11.3.7.3" />
|
||||||
<PackageVersion Include="NLog" Version="6.1.1" />
|
<PackageVersion Include="NLog" Version="6.1.1" />
|
||||||
<PackageVersion Include="sqlite-net-pcl" Version="1.9.172" />
|
<PackageVersion Include="sqlite-net-pcl" Version="1.9.172" />
|
||||||
|
|
|
||||||
2
v2rayN/ServiceLib/Resx/ResUI.Designer.cs
generated
2
v2rayN/ServiceLib/Resx/ResUI.Designer.cs
generated
|
|
@ -3376,7 +3376,7 @@ namespace ServiceLib.Resx {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找类似 Process name: Linux/Windows/macOS (sing-box) 的本地化字符串。
|
/// 查找类似 Process (Linux/Windows) 的本地化字符串。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static string TbRoutingRuleProcess {
|
public static string TbRoutingRuleProcess {
|
||||||
get {
|
get {
|
||||||
|
|
|
||||||
|
|
@ -1027,7 +1027,7 @@
|
||||||
<value>پروتکل sing-box Mux</value>
|
<value>پروتکل sing-box Mux</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbRoutingRuleProcess" xml:space="preserve">
|
<data name="TbRoutingRuleProcess" xml:space="preserve">
|
||||||
<value>Process name: Linux/Windows/macOS (sing-box)</value>
|
<value>Process (Linux/Windows)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbRoutingRuleIP" xml:space="preserve">
|
<data name="TbRoutingRuleIP" xml:space="preserve">
|
||||||
<value>IP or IP CIDR</value>
|
<value>IP or IP CIDR</value>
|
||||||
|
|
|
||||||
|
|
@ -1024,7 +1024,7 @@
|
||||||
<value>Protocole de multiplexage Mux (sing-box)</value>
|
<value>Protocole de multiplexage Mux (sing-box)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbRoutingRuleProcess" xml:space="preserve">
|
<data name="TbRoutingRuleProcess" xml:space="preserve">
|
||||||
<value>Process name: Linux/Windows/macOS (sing-box)</value>
|
<value>Process (Linux/Windows)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbRoutingRuleIP" xml:space="preserve">
|
<data name="TbRoutingRuleIP" xml:space="preserve">
|
||||||
<value>IP ou IP CIDR</value>
|
<value>IP ou IP CIDR</value>
|
||||||
|
|
|
||||||
|
|
@ -1027,7 +1027,7 @@
|
||||||
<value>sing-box Mux protokoll</value>
|
<value>sing-box Mux protokoll</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbRoutingRuleProcess" xml:space="preserve">
|
<data name="TbRoutingRuleProcess" xml:space="preserve">
|
||||||
<value>Process name: Linux/Windows/macOS (sing-box)</value>
|
<value>Process (Linux/Windows)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbRoutingRuleIP" xml:space="preserve">
|
<data name="TbRoutingRuleIP" xml:space="preserve">
|
||||||
<value>IP vagy IP CIDR</value>
|
<value>IP vagy IP CIDR</value>
|
||||||
|
|
|
||||||
|
|
@ -1027,7 +1027,7 @@
|
||||||
<value>sing-box Mux Protocol</value>
|
<value>sing-box Mux Protocol</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbRoutingRuleProcess" xml:space="preserve">
|
<data name="TbRoutingRuleProcess" xml:space="preserve">
|
||||||
<value>Process name: Linux/Windows/macOS (sing-box)</value>
|
<value>Process (Linux/Windows)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbRoutingRuleIP" xml:space="preserve">
|
<data name="TbRoutingRuleIP" xml:space="preserve">
|
||||||
<value>IP or IP CIDR</value>
|
<value>IP or IP CIDR</value>
|
||||||
|
|
|
||||||
|
|
@ -1027,7 +1027,7 @@
|
||||||
<value>Протокол Mux для sing-box</value>
|
<value>Протокол Mux для sing-box</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbRoutingRuleProcess" xml:space="preserve">
|
<data name="TbRoutingRuleProcess" xml:space="preserve">
|
||||||
<value>Process name: Linux/Windows/macOS (sing-box)</value>
|
<value>Process (Linux/Windows)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbRoutingRuleIP" xml:space="preserve">
|
<data name="TbRoutingRuleIP" xml:space="preserve">
|
||||||
<value>IP-адрес или сеть CIDR</value>
|
<value>IP-адрес или сеть CIDR</value>
|
||||||
|
|
|
||||||
|
|
@ -1024,7 +1024,7 @@
|
||||||
<value>sing-box Mux 多路复用协议</value>
|
<value>sing-box Mux 多路复用协议</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbRoutingRuleProcess" xml:space="preserve">
|
<data name="TbRoutingRuleProcess" xml:space="preserve">
|
||||||
<value>进程名 Linux/Windows/macOS(sing-box)</value>
|
<value>进程 (Linux/Windows)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbRoutingRuleIP" xml:space="preserve">
|
<data name="TbRoutingRuleIP" xml:space="preserve">
|
||||||
<value>IP 或 IP CIDR</value>
|
<value>IP 或 IP CIDR</value>
|
||||||
|
|
|
||||||
|
|
@ -1024,7 +1024,7 @@
|
||||||
<value>sing-box Mux 多路復用協定</value>
|
<value>sing-box Mux 多路復用協定</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbRoutingRuleProcess" xml:space="preserve">
|
<data name="TbRoutingRuleProcess" xml:space="preserve">
|
||||||
<value>行程名 Linux/Windows/macOS(sing-box)</value>
|
<value>行程 (Linux/Windows)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbRoutingRuleIP" xml:space="preserve">
|
<data name="TbRoutingRuleIP" xml:space="preserve">
|
||||||
<value>IP 或 IP CIDR</value>
|
<value>IP 或 IP CIDR</value>
|
||||||
|
|
|
||||||
|
|
@ -727,13 +727,12 @@ public partial class CoreConfigSingboxService
|
||||||
}, null);
|
}, null);
|
||||||
}
|
}
|
||||||
var idx = echConfig.IndexOf('+');
|
var idx = echConfig.IndexOf('+');
|
||||||
// NOTE: query_server_name, since sing-box 1.13.0
|
var queryServerName = idx > 0 ? echConfig[..idx] : null;
|
||||||
//var queryServerName = idx > 0 ? echConfig[..idx] : null;
|
|
||||||
var echDnsServer = idx > 0 ? echConfig[(idx + 1)..] : echConfig;
|
var echDnsServer = idx > 0 ? echConfig[(idx + 1)..] : echConfig;
|
||||||
return (new Ech4Sbox()
|
return (new Ech4Sbox()
|
||||||
{
|
{
|
||||||
enabled = true,
|
enabled = true,
|
||||||
query_server_name = null,
|
query_server_name = queryServerName,
|
||||||
}, ParseDnsAddress(echDnsServer));
|
}, ParseDnsAddress(echDnsServer));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -204,7 +204,7 @@ public class CheckUpdateViewModel : MyReactiveObject
|
||||||
|
|
||||||
private async Task UpdateFinishedSub(bool blReload)
|
private async Task UpdateFinishedSub(bool blReload)
|
||||||
{
|
{
|
||||||
RxApp.MainThreadScheduler.Schedule(blReload, (scheduler, blReload) =>
|
RxSchedulers.MainThreadScheduler.Schedule(blReload, (scheduler, blReload) =>
|
||||||
{
|
{
|
||||||
_ = UpdateFinishedResult(blReload);
|
_ = UpdateFinishedResult(blReload);
|
||||||
return Disposable.Empty;
|
return Disposable.Empty;
|
||||||
|
|
@ -317,7 +317,7 @@ public class CheckUpdateViewModel : MyReactiveObject
|
||||||
Remarks = msg,
|
Remarks = msg,
|
||||||
};
|
};
|
||||||
|
|
||||||
RxApp.MainThreadScheduler.Schedule(item, (scheduler, model) =>
|
RxSchedulers.MainThreadScheduler.Schedule(item, (scheduler, model) =>
|
||||||
{
|
{
|
||||||
_ = UpdateViewResult(model);
|
_ = UpdateViewResult(model);
|
||||||
return Disposable.Empty;
|
return Disposable.Empty;
|
||||||
|
|
|
||||||
|
|
@ -56,7 +56,7 @@ public class ClashConnectionsViewModel : MyReactiveObject
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
RxApp.MainThreadScheduler.Schedule(ret?.connections, (scheduler, model) =>
|
RxSchedulers.MainThreadScheduler.Schedule(ret?.connections, (scheduler, model) =>
|
||||||
{
|
{
|
||||||
_ = RefreshConnections(model);
|
_ = RefreshConnections(model);
|
||||||
return Disposable.Empty;
|
return Disposable.Empty;
|
||||||
|
|
|
||||||
|
|
@ -90,7 +90,7 @@ public class ClashProxiesViewModel : MyReactiveObject
|
||||||
|
|
||||||
AppEvents.ProxiesReloadRequested
|
AppEvents.ProxiesReloadRequested
|
||||||
.AsObservable()
|
.AsObservable()
|
||||||
.ObserveOn(RxApp.MainThreadScheduler)
|
.ObserveOn(RxSchedulers.MainThreadScheduler)
|
||||||
.Subscribe(async _ => await ProxiesReload());
|
.Subscribe(async _ => await ProxiesReload());
|
||||||
|
|
||||||
#endregion AppEvents
|
#endregion AppEvents
|
||||||
|
|
@ -173,7 +173,7 @@ public class ClashProxiesViewModel : MyReactiveObject
|
||||||
|
|
||||||
if (refreshUI)
|
if (refreshUI)
|
||||||
{
|
{
|
||||||
RxApp.MainThreadScheduler.Schedule(() => _ = RefreshProxyGroups());
|
RxSchedulers.MainThreadScheduler.Schedule(() => _ = RefreshProxyGroups());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -387,7 +387,7 @@ public class ClashProxiesViewModel : MyReactiveObject
|
||||||
}
|
}
|
||||||
|
|
||||||
var model = new SpeedTestResult() { IndexId = item.Name, Delay = result };
|
var model = new SpeedTestResult() { IndexId = item.Name, Delay = result };
|
||||||
RxApp.MainThreadScheduler.Schedule(model, (scheduler, model) =>
|
RxSchedulers.MainThreadScheduler.Schedule(model, (scheduler, model) =>
|
||||||
{
|
{
|
||||||
_ = ProxiesDelayTestResult(model);
|
_ = ProxiesDelayTestResult(model);
|
||||||
return Disposable.Empty;
|
return Disposable.Empty;
|
||||||
|
|
|
||||||
|
|
@ -228,22 +228,22 @@ public class MainWindowViewModel : MyReactiveObject
|
||||||
|
|
||||||
AppEvents.ReloadRequested
|
AppEvents.ReloadRequested
|
||||||
.AsObservable()
|
.AsObservable()
|
||||||
.ObserveOn(RxApp.MainThreadScheduler)
|
.ObserveOn(RxSchedulers.MainThreadScheduler)
|
||||||
.Subscribe(async _ => await Reload());
|
.Subscribe(async _ => await Reload());
|
||||||
|
|
||||||
AppEvents.AddServerViaScanRequested
|
AppEvents.AddServerViaScanRequested
|
||||||
.AsObservable()
|
.AsObservable()
|
||||||
.ObserveOn(RxApp.MainThreadScheduler)
|
.ObserveOn(RxSchedulers.MainThreadScheduler)
|
||||||
.Subscribe(async _ => await AddServerViaScanAsync());
|
.Subscribe(async _ => await AddServerViaScanAsync());
|
||||||
|
|
||||||
AppEvents.AddServerViaClipboardRequested
|
AppEvents.AddServerViaClipboardRequested
|
||||||
.AsObservable()
|
.AsObservable()
|
||||||
.ObserveOn(RxApp.MainThreadScheduler)
|
.ObserveOn(RxSchedulers.MainThreadScheduler)
|
||||||
.Subscribe(async _ => await AddServerViaClipboardAsync(null));
|
.Subscribe(async _ => await AddServerViaClipboardAsync(null));
|
||||||
|
|
||||||
AppEvents.SubscriptionsUpdateRequested
|
AppEvents.SubscriptionsUpdateRequested
|
||||||
.AsObservable()
|
.AsObservable()
|
||||||
.ObserveOn(RxApp.MainThreadScheduler)
|
.ObserveOn(RxSchedulers.MainThreadScheduler)
|
||||||
.Subscribe(async blProxy => await UpdateSubscriptionProcess("", blProxy));
|
.Subscribe(async blProxy => await UpdateSubscriptionProcess("", blProxy));
|
||||||
|
|
||||||
#endregion AppEvents
|
#endregion AppEvents
|
||||||
|
|
@ -583,7 +583,7 @@ public class MainWindowViewModel : MyReactiveObject
|
||||||
|
|
||||||
private void ReloadResult(bool showClashUI)
|
private void ReloadResult(bool showClashUI)
|
||||||
{
|
{
|
||||||
RxApp.MainThreadScheduler.Schedule(() =>
|
RxSchedulers.MainThreadScheduler.Schedule(() =>
|
||||||
{
|
{
|
||||||
ShowClashUI = showClashUI;
|
ShowClashUI = showClashUI;
|
||||||
TabMainSelectedIndex = showClashUI ? TabMainSelectedIndex : 0;
|
TabMainSelectedIndex = showClashUI ? TabMainSelectedIndex : 0;
|
||||||
|
|
@ -592,7 +592,7 @@ public class MainWindowViewModel : MyReactiveObject
|
||||||
|
|
||||||
private void SetReloadEnabled(bool enabled)
|
private void SetReloadEnabled(bool enabled)
|
||||||
{
|
{
|
||||||
RxApp.MainThreadScheduler.Schedule(() => BlReloadEnabled = enabled);
|
RxSchedulers.MainThreadScheduler.Schedule(() => BlReloadEnabled = enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task LoadCore(CoreConfigContext? mainContext, CoreConfigContext? preContext)
|
private async Task LoadCore(CoreConfigContext? mainContext, CoreConfigContext? preContext)
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ public class MsgViewModel : MyReactiveObject
|
||||||
|
|
||||||
AppEvents.SendMsgViewRequested
|
AppEvents.SendMsgViewRequested
|
||||||
.AsObservable()
|
.AsObservable()
|
||||||
//.ObserveOn(RxApp.MainThreadScheduler)
|
//.ObserveOn(RxSchedulers.MainThreadScheduler)
|
||||||
.Subscribe(content => _ = AppendQueueMsg(content));
|
.Subscribe(content => _ = AppendQueueMsg(content));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -188,14 +188,9 @@ public class ProfilesSelectViewModel : MyReactiveObject
|
||||||
{
|
{
|
||||||
SubItems.Add(item);
|
SubItems.Add(item);
|
||||||
}
|
}
|
||||||
if (_subIndexId != null && SubItems.FirstOrDefault(t => t.Id == _subIndexId) != null)
|
SelectedSub = (_config.SubIndexId.IsNotEmpty()
|
||||||
{
|
? SubItems.FirstOrDefault(t => t.Id == _config.SubIndexId)
|
||||||
SelectedSub = SubItems.FirstOrDefault(t => t.Id == _subIndexId);
|
: null) ?? SubItems.LastOrDefault();
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SelectedSub = SubItems.First();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<List<ProfileItemModel>?> GetProfileItemsEx(string subid, string filter)
|
private async Task<List<ProfileItemModel>?> GetProfileItemsEx(string subid, string filter)
|
||||||
|
|
|
||||||
|
|
@ -228,22 +228,22 @@ public class ProfilesViewModel : MyReactiveObject
|
||||||
|
|
||||||
AppEvents.ProfilesRefreshRequested
|
AppEvents.ProfilesRefreshRequested
|
||||||
.AsObservable()
|
.AsObservable()
|
||||||
.ObserveOn(RxApp.MainThreadScheduler)
|
.ObserveOn(RxSchedulers.MainThreadScheduler)
|
||||||
.Subscribe(async _ => await RefreshServersBiz());
|
.Subscribe(async _ => await RefreshServersBiz());
|
||||||
|
|
||||||
AppEvents.SubscriptionsRefreshRequested
|
AppEvents.SubscriptionsRefreshRequested
|
||||||
.AsObservable()
|
.AsObservable()
|
||||||
.ObserveOn(RxApp.MainThreadScheduler)
|
.ObserveOn(RxSchedulers.MainThreadScheduler)
|
||||||
.Subscribe(async _ => await RefreshSubscriptions());
|
.Subscribe(async _ => await RefreshSubscriptions());
|
||||||
|
|
||||||
AppEvents.DispatcherStatisticsRequested
|
AppEvents.DispatcherStatisticsRequested
|
||||||
.AsObservable()
|
.AsObservable()
|
||||||
.ObserveOn(RxApp.MainThreadScheduler)
|
.ObserveOn(RxSchedulers.MainThreadScheduler)
|
||||||
.Subscribe(async result => await UpdateStatistics(result));
|
.Subscribe(async result => await UpdateStatistics(result));
|
||||||
|
|
||||||
AppEvents.SetDefaultServerRequested
|
AppEvents.SetDefaultServerRequested
|
||||||
.AsObservable()
|
.AsObservable()
|
||||||
.ObserveOn(RxApp.MainThreadScheduler)
|
.ObserveOn(RxSchedulers.MainThreadScheduler)
|
||||||
.Subscribe(async indexId => await SetDefaultServer(indexId));
|
.Subscribe(async indexId => await SetDefaultServer(indexId));
|
||||||
|
|
||||||
#endregion AppEvents
|
#endregion AppEvents
|
||||||
|
|
@ -391,14 +391,9 @@ public class ProfilesViewModel : MyReactiveObject
|
||||||
{
|
{
|
||||||
SubItems.Add(item);
|
SubItems.Add(item);
|
||||||
}
|
}
|
||||||
if (_config.SubIndexId != null && SubItems.FirstOrDefault(t => t.Id == _config.SubIndexId) != null)
|
SelectedSub = (_config.SubIndexId.IsNotEmpty()
|
||||||
{
|
? SubItems.FirstOrDefault(t => t.Id == _config.SubIndexId)
|
||||||
SelectedSub = SubItems.FirstOrDefault(t => t.Id == _config.SubIndexId);
|
: null) ?? SubItems.LastOrDefault();
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SelectedSub = SubItems.First();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<List<ProfileItemModel>?> GetProfileItemsEx(string subid, string filter)
|
private async Task<List<ProfileItemModel>?> GetProfileItemsEx(string subid, string filter)
|
||||||
|
|
@ -732,7 +727,7 @@ public class ProfilesViewModel : MyReactiveObject
|
||||||
|
|
||||||
_speedtestService ??= new SpeedtestService(_config, async (SpeedTestResult result) =>
|
_speedtestService ??= new SpeedtestService(_config, async (SpeedTestResult result) =>
|
||||||
{
|
{
|
||||||
RxApp.MainThreadScheduler.Schedule(result, (scheduler, result) =>
|
RxSchedulers.MainThreadScheduler.Schedule(result, (scheduler, result) =>
|
||||||
{
|
{
|
||||||
_ = SetSpeedTestResult(result);
|
_ = SetSpeedTestResult(result);
|
||||||
return Disposable.Empty;
|
return Disposable.Empty;
|
||||||
|
|
|
||||||
|
|
@ -200,27 +200,27 @@ public class StatusBarViewModel : MyReactiveObject
|
||||||
|
|
||||||
AppEvents.DispatcherStatisticsRequested
|
AppEvents.DispatcherStatisticsRequested
|
||||||
.AsObservable()
|
.AsObservable()
|
||||||
.ObserveOn(RxApp.MainThreadScheduler)
|
.ObserveOn(RxSchedulers.MainThreadScheduler)
|
||||||
.Subscribe(async result => await UpdateStatistics(result));
|
.Subscribe(async result => await UpdateStatistics(result));
|
||||||
|
|
||||||
AppEvents.RoutingsMenuRefreshRequested
|
AppEvents.RoutingsMenuRefreshRequested
|
||||||
.AsObservable()
|
.AsObservable()
|
||||||
.ObserveOn(RxApp.MainThreadScheduler)
|
.ObserveOn(RxSchedulers.MainThreadScheduler)
|
||||||
.Subscribe(async _ => await RefreshRoutingsMenu());
|
.Subscribe(async _ => await RefreshRoutingsMenu());
|
||||||
|
|
||||||
AppEvents.TestServerRequested
|
AppEvents.TestServerRequested
|
||||||
.AsObservable()
|
.AsObservable()
|
||||||
.ObserveOn(RxApp.MainThreadScheduler)
|
.ObserveOn(RxSchedulers.MainThreadScheduler)
|
||||||
.Subscribe(async _ => await TestServerAvailability());
|
.Subscribe(async _ => await TestServerAvailability());
|
||||||
|
|
||||||
AppEvents.InboundDisplayRequested
|
AppEvents.InboundDisplayRequested
|
||||||
.AsObservable()
|
.AsObservable()
|
||||||
.ObserveOn(RxApp.MainThreadScheduler)
|
.ObserveOn(RxSchedulers.MainThreadScheduler)
|
||||||
.Subscribe(async _ => await InboundDisplayStatus());
|
.Subscribe(async _ => await InboundDisplayStatus());
|
||||||
|
|
||||||
AppEvents.SysProxyChangeRequested
|
AppEvents.SysProxyChangeRequested
|
||||||
.AsObservable()
|
.AsObservable()
|
||||||
.ObserveOn(RxApp.MainThreadScheduler)
|
.ObserveOn(RxSchedulers.MainThreadScheduler)
|
||||||
.Subscribe(async result => await SetListenerType(result));
|
.Subscribe(async result => await SetListenerType(result));
|
||||||
|
|
||||||
#endregion AppEvents
|
#endregion AppEvents
|
||||||
|
|
@ -243,7 +243,7 @@ public class StatusBarViewModel : MyReactiveObject
|
||||||
{
|
{
|
||||||
AppEvents.ProfilesRefreshRequested
|
AppEvents.ProfilesRefreshRequested
|
||||||
.AsObservable()
|
.AsObservable()
|
||||||
.ObserveOn(RxApp.MainThreadScheduler)
|
.ObserveOn(RxSchedulers.MainThreadScheduler)
|
||||||
.Subscribe(async _ => await RefreshServersBiz()); //.DisposeWith(_disposables);
|
.Subscribe(async _ => await RefreshServersBiz()); //.DisposeWith(_disposables);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -362,7 +362,7 @@ public class StatusBarViewModel : MyReactiveObject
|
||||||
|
|
||||||
private async Task TestServerAvailabilitySub(string msg)
|
private async Task TestServerAvailabilitySub(string msg)
|
||||||
{
|
{
|
||||||
RxApp.MainThreadScheduler.Schedule(msg, (scheduler, msg) =>
|
RxSchedulers.MainThreadScheduler.Schedule(msg, (scheduler, msg) =>
|
||||||
{
|
{
|
||||||
_ = TestServerAvailabilityResult(msg);
|
_ = TestServerAvailabilityResult(msg);
|
||||||
return Disposable.Empty;
|
return Disposable.Empty;
|
||||||
|
|
|
||||||
|
|
@ -59,7 +59,7 @@ internal class Program
|
||||||
//.WithInterFont()
|
//.WithInterFont()
|
||||||
.WithFontByDefault()
|
.WithFontByDefault()
|
||||||
.LogToTrace()
|
.LogToTrace()
|
||||||
.UseReactiveUI();
|
.UseReactiveUI(_ => { });
|
||||||
|
|
||||||
if (OperatingSystem.IsMacOS())
|
if (OperatingSystem.IsMacOS())
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ public partial class ClashConnectionsView : ReactiveUserControl<ClashConnections
|
||||||
|
|
||||||
AppEvents.AppExitRequested
|
AppEvents.AppExitRequested
|
||||||
.AsObservable()
|
.AsObservable()
|
||||||
.ObserveOn(RxApp.MainThreadScheduler)
|
.ObserveOn(RxSchedulers.MainThreadScheduler)
|
||||||
.Subscribe(_ => StorageUI())
|
.Subscribe(_ => StorageUI())
|
||||||
.DisposeWith(disposables);
|
.DisposeWith(disposables);
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -128,25 +128,25 @@ public partial class MainWindow : WindowBase<MainWindowViewModel>
|
||||||
|
|
||||||
AppEvents.SendSnackMsgRequested
|
AppEvents.SendSnackMsgRequested
|
||||||
.AsObservable()
|
.AsObservable()
|
||||||
.ObserveOn(RxApp.MainThreadScheduler)
|
.ObserveOn(RxSchedulers.MainThreadScheduler)
|
||||||
.Subscribe(async content => await DelegateSnackMsg(content))
|
.Subscribe(async content => await DelegateSnackMsg(content))
|
||||||
.DisposeWith(disposables);
|
.DisposeWith(disposables);
|
||||||
|
|
||||||
AppEvents.AppExitRequested
|
AppEvents.AppExitRequested
|
||||||
.AsObservable()
|
.AsObservable()
|
||||||
.ObserveOn(RxApp.MainThreadScheduler)
|
.ObserveOn(RxSchedulers.MainThreadScheduler)
|
||||||
.Subscribe(_ => StorageUI())
|
.Subscribe(_ => StorageUI())
|
||||||
.DisposeWith(disposables);
|
.DisposeWith(disposables);
|
||||||
|
|
||||||
AppEvents.ShutdownRequested
|
AppEvents.ShutdownRequested
|
||||||
.AsObservable()
|
.AsObservable()
|
||||||
.ObserveOn(RxApp.MainThreadScheduler)
|
.ObserveOn(RxSchedulers.MainThreadScheduler)
|
||||||
.Subscribe(content => Shutdown(content))
|
.Subscribe(content => Shutdown(content))
|
||||||
.DisposeWith(disposables);
|
.DisposeWith(disposables);
|
||||||
|
|
||||||
AppEvents.ShowHideWindowRequested
|
AppEvents.ShowHideWindowRequested
|
||||||
.AsObservable()
|
.AsObservable()
|
||||||
.ObserveOn(RxApp.MainThreadScheduler)
|
.ObserveOn(RxSchedulers.MainThreadScheduler)
|
||||||
.Subscribe(blShow => ShowHideWindow(blShow))
|
.Subscribe(blShow => ShowHideWindow(blShow))
|
||||||
.DisposeWith(disposables);
|
.DisposeWith(disposables);
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -90,13 +90,13 @@ public partial class ProfilesView : ReactiveUserControl<ProfilesViewModel>
|
||||||
|
|
||||||
AppEvents.AppExitRequested
|
AppEvents.AppExitRequested
|
||||||
.AsObservable()
|
.AsObservable()
|
||||||
.ObserveOn(RxApp.MainThreadScheduler)
|
.ObserveOn(RxSchedulers.MainThreadScheduler)
|
||||||
.Subscribe(_ => StorageUI())
|
.Subscribe(_ => StorageUI())
|
||||||
.DisposeWith(disposables);
|
.DisposeWith(disposables);
|
||||||
|
|
||||||
AppEvents.AdjustMainLvColWidthRequested
|
AppEvents.AdjustMainLvColWidthRequested
|
||||||
.AsObservable()
|
.AsObservable()
|
||||||
.ObserveOn(RxApp.MainThreadScheduler)
|
.ObserveOn(RxSchedulers.MainThreadScheduler)
|
||||||
.Subscribe(_ => AutofitColumnWidth())
|
.Subscribe(_ => AutofitColumnWidth())
|
||||||
.DisposeWith(disposables);
|
.DisposeWith(disposables);
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,11 @@ public partial class App : Application
|
||||||
}
|
}
|
||||||
|
|
||||||
AppManager.Instance.InitComponents();
|
AppManager.Instance.InitComponents();
|
||||||
|
|
||||||
|
RxAppBuilder.CreateReactiveUIBuilder()
|
||||||
|
.WithWpf()
|
||||||
|
.BuildApp();
|
||||||
|
|
||||||
base.OnStartup(e);
|
base.OnStartup(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ global using System.Windows.Threading;
|
||||||
global using DynamicData;
|
global using DynamicData;
|
||||||
global using DynamicData.Binding;
|
global using DynamicData.Binding;
|
||||||
global using ReactiveUI;
|
global using ReactiveUI;
|
||||||
|
global using ReactiveUI.Builder;
|
||||||
global using ReactiveUI.Fody.Helpers;
|
global using ReactiveUI.Fody.Helpers;
|
||||||
global using ServiceLib;
|
global using ServiceLib;
|
||||||
global using ServiceLib.Base;
|
global using ServiceLib.Base;
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,7 @@ public partial class ClashConnectionsView
|
||||||
|
|
||||||
AppEvents.AppExitRequested
|
AppEvents.AppExitRequested
|
||||||
.AsObservable()
|
.AsObservable()
|
||||||
.ObserveOn(RxApp.MainThreadScheduler)
|
.ObserveOn(RxSchedulers.MainThreadScheduler)
|
||||||
.Subscribe(_ => StorageUI())
|
.Subscribe(_ => StorageUI())
|
||||||
.DisposeWith(disposables);
|
.DisposeWith(disposables);
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -127,25 +127,25 @@ public partial class MainWindow
|
||||||
|
|
||||||
AppEvents.SendSnackMsgRequested
|
AppEvents.SendSnackMsgRequested
|
||||||
.AsObservable()
|
.AsObservable()
|
||||||
.ObserveOn(RxApp.MainThreadScheduler)
|
.ObserveOn(RxSchedulers.MainThreadScheduler)
|
||||||
.Subscribe(async content => await DelegateSnackMsg(content))
|
.Subscribe(async content => await DelegateSnackMsg(content))
|
||||||
.DisposeWith(disposables);
|
.DisposeWith(disposables);
|
||||||
|
|
||||||
AppEvents.AppExitRequested
|
AppEvents.AppExitRequested
|
||||||
.AsObservable()
|
.AsObservable()
|
||||||
.ObserveOn(RxApp.MainThreadScheduler)
|
.ObserveOn(RxSchedulers.MainThreadScheduler)
|
||||||
.Subscribe(_ => StorageUI())
|
.Subscribe(_ => StorageUI())
|
||||||
.DisposeWith(disposables);
|
.DisposeWith(disposables);
|
||||||
|
|
||||||
AppEvents.ShutdownRequested
|
AppEvents.ShutdownRequested
|
||||||
.AsObservable()
|
.AsObservable()
|
||||||
.ObserveOn(RxApp.MainThreadScheduler)
|
.ObserveOn(RxSchedulers.MainThreadScheduler)
|
||||||
.Subscribe(content => Shutdown(content))
|
.Subscribe(content => Shutdown(content))
|
||||||
.DisposeWith(disposables);
|
.DisposeWith(disposables);
|
||||||
|
|
||||||
AppEvents.ShowHideWindowRequested
|
AppEvents.ShowHideWindowRequested
|
||||||
.AsObservable()
|
.AsObservable()
|
||||||
.ObserveOn(RxApp.MainThreadScheduler)
|
.ObserveOn(RxSchedulers.MainThreadScheduler)
|
||||||
.Subscribe(blShow => ShowHideWindow(blShow))
|
.Subscribe(blShow => ShowHideWindow(blShow))
|
||||||
.DisposeWith(disposables);
|
.DisposeWith(disposables);
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -84,13 +84,13 @@ public partial class ProfilesView
|
||||||
|
|
||||||
AppEvents.AppExitRequested
|
AppEvents.AppExitRequested
|
||||||
.AsObservable()
|
.AsObservable()
|
||||||
.ObserveOn(RxApp.MainThreadScheduler)
|
.ObserveOn(RxSchedulers.MainThreadScheduler)
|
||||||
.Subscribe(_ => StorageUI())
|
.Subscribe(_ => StorageUI())
|
||||||
.DisposeWith(disposables);
|
.DisposeWith(disposables);
|
||||||
|
|
||||||
AppEvents.AdjustMainLvColWidthRequested
|
AppEvents.AdjustMainLvColWidthRequested
|
||||||
.AsObservable()
|
.AsObservable()
|
||||||
.ObserveOn(RxApp.MainThreadScheduler)
|
.ObserveOn(RxSchedulers.MainThreadScheduler)
|
||||||
.Subscribe(_ => AutofitColumnWidth())
|
.Subscribe(_ => AutofitColumnWidth())
|
||||||
.DisposeWith(disposables);
|
.DisposeWith(disposables);
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<OutputType>WinExe</OutputType>
|
<OutputType>WinExe</OutputType>
|
||||||
<TargetFramework>net8.0-windows10.0.17763</TargetFramework>
|
<TargetFramework>net8.0-windows10.0.19041.0</TargetFramework>
|
||||||
<GenerateSatelliteAssembliesForCore>true</GenerateSatelliteAssembliesForCore>
|
<GenerateSatelliteAssembliesForCore>true</GenerateSatelliteAssembliesForCore>
|
||||||
<UseWPF>true</UseWPF>
|
<UseWPF>true</UseWPF>
|
||||||
<ApplicationIcon>Resources\v2rayN.ico</ApplicationIcon>
|
<ApplicationIcon>Resources\v2rayN.ico</ApplicationIcon>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue