mirror of
https://github.com/2dust/v2rayN.git
synced 2026-05-14 01:55:58 +00:00
Compare commits
No commits in common. "4430c9bd747a3d21788aaceef6c12fd1bfa56b47" and "647f1d9c8b70b420431001245446d3a01405a886" have entirely different histories.
4430c9bd74
...
647f1d9c8b
24 changed files with 51 additions and 84 deletions
|
|
@ -860,19 +860,18 @@ namespace ServiceLib.Common
|
||||||
{
|
{
|
||||||
return new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator);
|
return new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator);
|
||||||
}
|
}
|
||||||
return false;
|
else
|
||||||
//else
|
{
|
||||||
//{
|
var id = GetLinuxUserId().Result ?? "1000";
|
||||||
// var id = GetLinuxUserId().Result ?? "1000";
|
if (int.TryParse(id, out var userId))
|
||||||
// if (int.TryParse(id, out var userId))
|
{
|
||||||
// {
|
return userId == 0;
|
||||||
// return userId == 0;
|
}
|
||||||
// }
|
else
|
||||||
// else
|
{
|
||||||
// {
|
return false;
|
||||||
// return false;
|
}
|
||||||
// }
|
}
|
||||||
//}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async Task<string?> GetLinuxUserId()
|
private static async Task<string?> GetLinuxUserId()
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,5 @@
|
||||||
{
|
{
|
||||||
Default = 0,
|
Default = 0,
|
||||||
Russia = 1,
|
Russia = 1,
|
||||||
Iran = 2,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -124,25 +124,21 @@
|
||||||
public static readonly List<string> GeoFilesSources = new() {
|
public static readonly List<string> GeoFilesSources = new() {
|
||||||
"",
|
"",
|
||||||
@"https://github.com/runetfreedom/russia-v2ray-rules-dat/releases/latest/download/{0}.dat",
|
@"https://github.com/runetfreedom/russia-v2ray-rules-dat/releases/latest/download/{0}.dat",
|
||||||
@"https://cdn.jsdelivr.net/gh/chocolate4u/Iran-v2ray-rules@release/{0}.dat",
|
|
||||||
};
|
};
|
||||||
|
|
||||||
public static readonly List<string> SingboxRulesetSources = new() {
|
public static readonly List<string> SingboxRulesetSources = new() {
|
||||||
"",
|
"",
|
||||||
@"https://cdn.jsdelivr.net/gh/runetfreedom/russia-v2ray-rules-dat@release/sing-box/rule-set-{0}/{1}.srs",
|
@"https://cdn.jsdelivr.net/gh/runetfreedom/russia-v2ray-rules-dat@release/sing-box/rule-set-{0}/{1}.srs",
|
||||||
@"https://cdn.jsdelivr.net/gh/chocolate4u/Iran-sing-box-rules@rule-set/{1}.srs",
|
|
||||||
};
|
};
|
||||||
|
|
||||||
public static readonly List<string> RoutingRulesSources = new() {
|
public static readonly List<string> RoutingRulesSources = new() {
|
||||||
"",
|
"",
|
||||||
@"https://cdn.jsdelivr.net/gh/runetfreedom/russia-v2ray-custom-routing-list@main/v2rayN/template.json",
|
@"https://cdn.jsdelivr.net/gh/runetfreedom/russia-v2ray-custom-routing-list@main/v2rayN/template.json",
|
||||||
@"https://cdn.jsdelivr.net/gh/Chocolate4U/Iran-v2ray-rules@main/v2rayN/template.json",
|
|
||||||
};
|
};
|
||||||
|
|
||||||
public static readonly List<string> DNSTemplateSources = new() {
|
public static readonly List<string> DNSTemplateSources = new() {
|
||||||
"",
|
"",
|
||||||
@"https://cdn.jsdelivr.net/gh/runetfreedom/russia-v2ray-custom-routing-list@main/v2rayN/",
|
@"https://cdn.jsdelivr.net/gh/runetfreedom/russia-v2ray-custom-routing-list@main/v2rayN/",
|
||||||
@"https://cdn.jsdelivr.net/gh/Chocolate4U/Iran-v2ray-rules@main/v2rayN/",
|
|
||||||
};
|
};
|
||||||
|
|
||||||
public static readonly Dictionary<string, string> UserAgentTexts = new()
|
public static readonly Dictionary<string, string> UserAgentTexts = new()
|
||||||
|
|
|
||||||
|
|
@ -68,7 +68,7 @@ namespace ServiceLib.Handler
|
||||||
config.RoutingBasicItem ??= new();
|
config.RoutingBasicItem ??= new();
|
||||||
if (Utils.IsNullOrEmpty(config.RoutingBasicItem.DomainStrategy))
|
if (Utils.IsNullOrEmpty(config.RoutingBasicItem.DomainStrategy))
|
||||||
{
|
{
|
||||||
config.RoutingBasicItem.DomainStrategy = Global.DomainStrategies.First();
|
config.RoutingBasicItem.DomainStrategy = Global.DomainStrategies.First();//"IPIfNonMatch";
|
||||||
}
|
}
|
||||||
|
|
||||||
config.KcpItem ??= new KcpItem
|
config.KcpItem ??= new KcpItem
|
||||||
|
|
@ -1868,16 +1868,6 @@ namespace ServiceLib.Handler
|
||||||
await SaveDNSItems(config, await GetExternalDNSItem(ECoreType.Xray, Global.DNSTemplateSources[1] + "v2ray.json"));
|
await SaveDNSItems(config, await GetExternalDNSItem(ECoreType.Xray, Global.DNSTemplateSources[1] + "v2ray.json"));
|
||||||
await SaveDNSItems(config, await GetExternalDNSItem(ECoreType.sing_box, Global.DNSTemplateSources[1] + "sing_box.json"));
|
await SaveDNSItems(config, await GetExternalDNSItem(ECoreType.sing_box, Global.DNSTemplateSources[1] + "sing_box.json"));
|
||||||
|
|
||||||
return true;
|
|
||||||
|
|
||||||
case EPresetType.Iran:
|
|
||||||
config.ConstItem.GeoSourceUrl = Global.GeoFilesSources[2];
|
|
||||||
config.ConstItem.SrsSourceUrl = Global.SingboxRulesetSources[2];
|
|
||||||
config.ConstItem.RouteRulesTemplateSourceUrl = Global.RoutingRulesSources[2];
|
|
||||||
|
|
||||||
await SaveDNSItems(config, await GetExternalDNSItem(ECoreType.Xray, Global.DNSTemplateSources[2] + "v2ray.json"));
|
|
||||||
await SaveDNSItems(config, await GetExternalDNSItem(ECoreType.sing_box, Global.DNSTemplateSources[2] + "sing_box.json"));
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 应用接口类型
|
/// 应用接口类型
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private static readonly List<string> LstInterface = ["Ethernet", "Wi-Fi", "Thunderbolt Bridge", "USB 10/100/1000 LAN"];
|
private static readonly List<string> LstInterface = ["Ethernet", "Wi-Fi", "Thunderbolt Bridge"];
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 代理类型,对应 http,https,socks
|
/// 代理类型,对应 http,https,socks
|
||||||
|
|
|
||||||
9
v2rayN/ServiceLib/Resx/ResUI.Designer.cs
generated
9
v2rayN/ServiceLib/Resx/ResUI.Designer.cs
generated
|
|
@ -1248,15 +1248,6 @@ namespace ServiceLib.Resx {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 查找类似 Iran 的本地化字符串。
|
|
||||||
/// </summary>
|
|
||||||
public static string menuRegionalPresetsIran {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("menuRegionalPresetsIran", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找类似 Russia 的本地化字符串。
|
/// 查找类似 Russia 的本地化字符串。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
||||||
|
|
@ -1129,9 +1129,6 @@
|
||||||
<data name="menuRegionalPresetsRussia" xml:space="preserve">
|
<data name="menuRegionalPresetsRussia" xml:space="preserve">
|
||||||
<value>روسیه</value>
|
<value>روسیه</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="menuRegionalPresetsIran" xml:space="preserve">
|
|
||||||
<value>ایران</value>
|
|
||||||
</data>
|
|
||||||
<data name="TbSettingsChinaUserTip" xml:space="preserve">
|
<data name="TbSettingsChinaUserTip" xml:space="preserve">
|
||||||
<value>کاربران در منطقه چین می توانند این مورد را نادیده بگیرند</value>
|
<value>کاربران در منطقه چین می توانند این مورد را نادیده بگیرند</value>
|
||||||
</data>
|
</data>
|
||||||
|
|
|
||||||
|
|
@ -1342,9 +1342,6 @@
|
||||||
<data name="menuRegionalPresetsRussia" xml:space="preserve">
|
<data name="menuRegionalPresetsRussia" xml:space="preserve">
|
||||||
<value>Oroszország</value>
|
<value>Oroszország</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="menuRegionalPresetsIran" xml:space="preserve">
|
|
||||||
<value>Irán</value>
|
|
||||||
</data>
|
|
||||||
<data name="TbSettingsChinaUserTip" xml:space="preserve">
|
<data name="TbSettingsChinaUserTip" xml:space="preserve">
|
||||||
<value>A Kínában élő felhasználók figyelmen kívül hagyhatják ezt a tételt</value>
|
<value>A Kínában élő felhasználók figyelmen kívül hagyhatják ezt a tételt</value>
|
||||||
</data>
|
</data>
|
||||||
|
|
|
||||||
|
|
@ -1342,9 +1342,6 @@
|
||||||
<data name="menuRegionalPresetsRussia" xml:space="preserve">
|
<data name="menuRegionalPresetsRussia" xml:space="preserve">
|
||||||
<value>Russia</value>
|
<value>Russia</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="menuRegionalPresetsIran" xml:space="preserve">
|
|
||||||
<value>Iran</value>
|
|
||||||
</data>
|
|
||||||
<data name="TbSettingsChinaUserTip" xml:space="preserve">
|
<data name="TbSettingsChinaUserTip" xml:space="preserve">
|
||||||
<value>Users in China region can ignore this item</value>
|
<value>Users in China region can ignore this item</value>
|
||||||
</data>
|
</data>
|
||||||
|
|
|
||||||
|
|
@ -1039,9 +1039,6 @@
|
||||||
<data name="menuRegionalPresetsRussia" xml:space="preserve">
|
<data name="menuRegionalPresetsRussia" xml:space="preserve">
|
||||||
<value>Россия</value>
|
<value>Россия</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="menuRegionalPresetsIran" xml:space="preserve">
|
|
||||||
<value>Иран</value>
|
|
||||||
</data>
|
|
||||||
<data name="TbSettingsChinaUserTip" xml:space="preserve">
|
<data name="TbSettingsChinaUserTip" xml:space="preserve">
|
||||||
<value>Используйте Настройки -> Региональные пресеты вместо изменения этого поля</value>
|
<value>Используйте Настройки -> Региональные пресеты вместо изменения этого поля</value>
|
||||||
</data>
|
</data>
|
||||||
|
|
|
||||||
|
|
@ -1342,9 +1342,6 @@
|
||||||
<data name="menuRegionalPresetsRussia" xml:space="preserve">
|
<data name="menuRegionalPresetsRussia" xml:space="preserve">
|
||||||
<value>俄罗斯</value>
|
<value>俄罗斯</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="menuRegionalPresetsIran" xml:space="preserve">
|
|
||||||
<value>伊朗</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuAddServerViaImage" xml:space="preserve">
|
<data name="menuAddServerViaImage" xml:space="preserve">
|
||||||
<value>扫描图片中的二维码</value>
|
<value>扫描图片中的二维码</value>
|
||||||
</data>
|
</data>
|
||||||
|
|
|
||||||
|
|
@ -1222,9 +1222,6 @@
|
||||||
<data name="menuRegionalPresetsRussia" xml:space="preserve">
|
<data name="menuRegionalPresetsRussia" xml:space="preserve">
|
||||||
<value>俄羅斯</value>
|
<value>俄羅斯</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="menuRegionalPresetsIran" xml:space="preserve">
|
|
||||||
<value>伊朗</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuAddServerViaImage" xml:space="preserve">
|
<data name="menuAddServerViaImage" xml:space="preserve">
|
||||||
<value>掃描圖片中的二維碼</value>
|
<value>掃描圖片中的二維碼</value>
|
||||||
</data>
|
</data>
|
||||||
|
|
|
||||||
|
|
@ -99,5 +99,10 @@
|
||||||
"domain": [
|
"domain": [
|
||||||
"geosite:cn"
|
"geosite:cn"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"remarks": "最终代理",
|
||||||
|
"port": "0-65535",
|
||||||
|
"outboundTag": "proxy"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
@ -50,8 +50,6 @@ namespace ServiceLib.ViewModels
|
||||||
|
|
||||||
public ReactiveCommand<Unit, Unit> RegionalPresetRussiaCmd { get; }
|
public ReactiveCommand<Unit, Unit> RegionalPresetRussiaCmd { get; }
|
||||||
|
|
||||||
public ReactiveCommand<Unit, Unit> RegionalPresetIranCmd { get; }
|
|
||||||
|
|
||||||
public ReactiveCommand<Unit, Unit> ReloadCmd { get; }
|
public ReactiveCommand<Unit, Unit> ReloadCmd { get; }
|
||||||
|
|
||||||
[Reactive]
|
[Reactive]
|
||||||
|
|
@ -199,11 +197,6 @@ namespace ServiceLib.ViewModels
|
||||||
await ApplyRegionalPreset(EPresetType.Russia);
|
await ApplyRegionalPreset(EPresetType.Russia);
|
||||||
});
|
});
|
||||||
|
|
||||||
RegionalPresetIranCmd = ReactiveCommand.CreateFromTask(async () =>
|
|
||||||
{
|
|
||||||
await ApplyRegionalPreset(EPresetType.Iran);
|
|
||||||
});
|
|
||||||
|
|
||||||
#endregion WhenAnyValue && ReactiveCommand
|
#endregion WhenAnyValue && ReactiveCommand
|
||||||
|
|
||||||
Init();
|
Init();
|
||||||
|
|
|
||||||
|
|
@ -74,16 +74,15 @@ namespace ServiceLib.ViewModels
|
||||||
SelectedSource.Protocol = ProtocolItems?.ToList();
|
SelectedSource.Protocol = ProtocolItems?.ToList();
|
||||||
SelectedSource.InboundTag = InboundTagItems?.ToList();
|
SelectedSource.InboundTag = InboundTagItems?.ToList();
|
||||||
|
|
||||||
var hasRule = SelectedSource.Domain?.Count > 0
|
bool hasRule = SelectedSource.Domain?.Count > 0
|
||||||
|| SelectedSource.Ip?.Count > 0
|
|| SelectedSource.Ip?.Count > 0
|
||||||
|| SelectedSource.Protocol?.Count > 0
|
|| SelectedSource.Protocol?.Count > 0
|
||||||
|| SelectedSource.Process?.Count > 0
|
|| SelectedSource.Process?.Count > 0
|
||||||
|| Utils.IsNotEmpty(SelectedSource.Port)
|
|| Utils.IsNotEmpty(SelectedSource.Port);
|
||||||
|| Utils.IsNotEmpty(SelectedSource.Network);
|
|
||||||
|
|
||||||
if (!hasRule)
|
if (!hasRule)
|
||||||
{
|
{
|
||||||
NoticeHandler.Instance.Enqueue(string.Format(ResUI.RoutingRuleDetailRequiredTips, "Network/Port/Protocol/Domain/IP/Process"));
|
NoticeHandler.Instance.Enqueue(string.Format(ResUI.RoutingRuleDetailRequiredTips, "Port/Protocol/Domain/IP/Process"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//NoticeHandler.Instance.Enqueue(ResUI.OperationSuccess);
|
//NoticeHandler.Instance.Enqueue(ResUI.OperationSuccess);
|
||||||
|
|
|
||||||
|
|
@ -177,12 +177,12 @@ namespace ServiceLib.ViewModels
|
||||||
}
|
}
|
||||||
|
|
||||||
var lst = new List<RulesItem>();
|
var lst = new List<RulesItem>();
|
||||||
var sources = SelectedSources ?? [SelectedSource];
|
foreach (var it in SelectedSources ?? [SelectedSource])
|
||||||
foreach (var it in _rules)
|
|
||||||
{
|
{
|
||||||
if (sources.Any(t => t.Id == it?.Id))
|
var item = _rules.FirstOrDefault(t => t.Id == it?.Id);
|
||||||
|
if (item != null)
|
||||||
{
|
{
|
||||||
var item2 = JsonUtils.DeepCopy(it);
|
var item2 = JsonUtils.DeepCopy(item); //JsonUtils.Deserialize<RulesItem4Ray>(JsonUtils.Serialize(item));
|
||||||
item2.Id = null;
|
item2.Id = null;
|
||||||
lst.Add(item2 ?? new());
|
lst.Add(item2 ?? new());
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -80,7 +80,6 @@
|
||||||
<MenuItem Header="{x:Static resx:ResUI.menuRegionalPresets}">
|
<MenuItem Header="{x:Static resx:ResUI.menuRegionalPresets}">
|
||||||
<MenuItem x:Name="menuRegionalPresetsDefault" Header="{x:Static resx:ResUI.menuRegionalPresetsDefault}" />
|
<MenuItem x:Name="menuRegionalPresetsDefault" Header="{x:Static resx:ResUI.menuRegionalPresetsDefault}" />
|
||||||
<MenuItem x:Name="menuRegionalPresetsRussia" Header="{x:Static resx:ResUI.menuRegionalPresetsRussia}" />
|
<MenuItem x:Name="menuRegionalPresetsRussia" Header="{x:Static resx:ResUI.menuRegionalPresetsRussia}" />
|
||||||
<MenuItem x:Name="menuRegionalPresetsIran" Header="{x:Static resx:ResUI.menuRegionalPresetsIran}" />
|
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
<MenuItem x:Name="menuBackupAndRestore" Header="{x:Static resx:ResUI.menuBackupAndRestore}" />
|
<MenuItem x:Name="menuBackupAndRestore" Header="{x:Static resx:ResUI.menuBackupAndRestore}" />
|
||||||
<MenuItem x:Name="menuOpenTheFileLocation" Header="{x:Static resx:ResUI.menuOpenTheFileLocation}" />
|
<MenuItem x:Name="menuOpenTheFileLocation" Header="{x:Static resx:ResUI.menuOpenTheFileLocation}" />
|
||||||
|
|
|
||||||
|
|
@ -104,7 +104,6 @@ namespace v2rayN.Desktop.Views
|
||||||
this.BindCommand(ViewModel, vm => vm.OpenTheFileLocationCmd, v => v.menuOpenTheFileLocation).DisposeWith(disposables);
|
this.BindCommand(ViewModel, vm => vm.OpenTheFileLocationCmd, v => v.menuOpenTheFileLocation).DisposeWith(disposables);
|
||||||
this.BindCommand(ViewModel, vm => vm.RegionalPresetDefaultCmd, v => v.menuRegionalPresetsDefault).DisposeWith(disposables);
|
this.BindCommand(ViewModel, vm => vm.RegionalPresetDefaultCmd, v => v.menuRegionalPresetsDefault).DisposeWith(disposables);
|
||||||
this.BindCommand(ViewModel, vm => vm.RegionalPresetRussiaCmd, v => v.menuRegionalPresetsRussia).DisposeWith(disposables);
|
this.BindCommand(ViewModel, vm => vm.RegionalPresetRussiaCmd, v => v.menuRegionalPresetsRussia).DisposeWith(disposables);
|
||||||
this.BindCommand(ViewModel, vm => vm.RegionalPresetIranCmd, v => v.menuRegionalPresetsIran).DisposeWith(disposables);
|
|
||||||
|
|
||||||
this.BindCommand(ViewModel, vm => vm.ReloadCmd, v => v.menuReload).DisposeWith(disposables);
|
this.BindCommand(ViewModel, vm => vm.ReloadCmd, v => v.menuReload).DisposeWith(disposables);
|
||||||
this.OneWayBind(ViewModel, vm => vm.BlReloadEnabled, v => v.menuReload.IsEnabled).DisposeWith(disposables);
|
this.OneWayBind(ViewModel, vm => vm.BlReloadEnabled, v => v.menuReload.IsEnabled).DisposeWith(disposables);
|
||||||
|
|
@ -134,7 +133,7 @@ namespace v2rayN.Desktop.Views
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
this.Title = $"{Utils.GetVersion()}";
|
this.Title = $"{Utils.GetVersion()} - {(AppHandler.Instance.IsAdministrator ? ResUI.RunAsAdmin : ResUI.NotRunAsAdmin)}";
|
||||||
if (Utils.IsWindows())
|
if (Utils.IsWindows())
|
||||||
{
|
{
|
||||||
ThreadPool.RegisterWaitForSingleObject(Program.ProgramStarted, OnProgramStarted, null, -1, false);
|
ThreadPool.RegisterWaitForSingleObject(Program.ProgramStarted, OnProgramStarted, null, -1, false);
|
||||||
|
|
|
||||||
|
|
@ -187,7 +187,12 @@ namespace v2rayN.Desktop.Views
|
||||||
|
|
||||||
private void lstProfiles_SelectionChanged(object? sender, SelectionChangedEventArgs e)
|
private void lstProfiles_SelectionChanged(object? sender, SelectionChangedEventArgs e)
|
||||||
{
|
{
|
||||||
ViewModel.SelectedProfiles = lstProfiles.SelectedItems.Cast<ProfileItemModel>().ToList();
|
List<ProfileItemModel> lst = [];
|
||||||
|
foreach (var item in lstProfiles.SelectedItems)
|
||||||
|
{
|
||||||
|
lst.Add((ProfileItemModel)item);
|
||||||
|
}
|
||||||
|
ViewModel.SelectedProfiles = lst;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void LstProfiles_DoubleTapped(object? sender, Avalonia.Input.TappedEventArgs e)
|
private void LstProfiles_DoubleTapped(object? sender, Avalonia.Input.TappedEventArgs e)
|
||||||
|
|
|
||||||
|
|
@ -166,7 +166,12 @@ namespace v2rayN.Desktop.Views
|
||||||
|
|
||||||
private void lstRules_SelectionChanged(object? sender, SelectionChangedEventArgs e)
|
private void lstRules_SelectionChanged(object? sender, SelectionChangedEventArgs e)
|
||||||
{
|
{
|
||||||
ViewModel.SelectedSources = lstRules.SelectedItems.Cast<RulesItemModel>().ToList();
|
List<RulesItemModel> lst = [];
|
||||||
|
foreach (var item in lstRules.SelectedItems)
|
||||||
|
{
|
||||||
|
lst.Add((RulesItemModel)item);
|
||||||
|
}
|
||||||
|
ViewModel.SelectedSources = lst;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void LstRules_DoubleTapped(object? sender, Avalonia.Input.TappedEventArgs e)
|
private void LstRules_DoubleTapped(object? sender, Avalonia.Input.TappedEventArgs e)
|
||||||
|
|
|
||||||
|
|
@ -107,7 +107,12 @@ namespace v2rayN.Desktop.Views
|
||||||
|
|
||||||
private void lstRoutings_SelectionChanged(object? sender, SelectionChangedEventArgs e)
|
private void lstRoutings_SelectionChanged(object? sender, SelectionChangedEventArgs e)
|
||||||
{
|
{
|
||||||
ViewModel.SelectedSources = lstRoutings.SelectedItems.Cast<RoutingItemModel>().ToList();
|
List<RoutingItemModel> lst = [];
|
||||||
|
foreach (var item in lstRoutings.SelectedItems)
|
||||||
|
{
|
||||||
|
lst.Add((RoutingItemModel)item);
|
||||||
|
}
|
||||||
|
ViewModel.SelectedSources = lst;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void LstRoutings_DoubleTapped(object? sender, TappedEventArgs e)
|
private void LstRoutings_DoubleTapped(object? sender, TappedEventArgs e)
|
||||||
|
|
|
||||||
|
|
@ -82,7 +82,12 @@ namespace v2rayN.Desktop.Views
|
||||||
|
|
||||||
private void LstSubscription_SelectionChanged(object? sender, SelectionChangedEventArgs e)
|
private void LstSubscription_SelectionChanged(object? sender, SelectionChangedEventArgs e)
|
||||||
{
|
{
|
||||||
ViewModel.SelectedSources = lstSubscription.SelectedItems.Cast<SubItem>().ToList();
|
List<SubItem> lst = [];
|
||||||
|
foreach (var item in lstSubscription.SelectedItems)
|
||||||
|
{
|
||||||
|
lst.Add((SubItem)item);
|
||||||
|
}
|
||||||
|
ViewModel.SelectedSources = lst;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void menuClose_Click(object? sender, RoutedEventArgs e)
|
private void menuClose_Click(object? sender, RoutedEventArgs e)
|
||||||
|
|
|
||||||
|
|
@ -194,10 +194,6 @@
|
||||||
x:Name="menuRegionalPresetsRussia"
|
x:Name="menuRegionalPresetsRussia"
|
||||||
Height="{StaticResource MenuItemHeight}"
|
Height="{StaticResource MenuItemHeight}"
|
||||||
Header="{x:Static resx:ResUI.menuRegionalPresetsRussia}" />
|
Header="{x:Static resx:ResUI.menuRegionalPresetsRussia}" />
|
||||||
<MenuItem
|
|
||||||
x:Name="menuRegionalPresetsIran"
|
|
||||||
Height="{StaticResource MenuItemHeight}"
|
|
||||||
Header="{x:Static resx:ResUI.menuRegionalPresetsIran}" />
|
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
<MenuItem
|
<MenuItem
|
||||||
x:Name="menuBackupAndRestore"
|
x:Name="menuBackupAndRestore"
|
||||||
|
|
|
||||||
|
|
@ -102,7 +102,6 @@ namespace v2rayN.Views
|
||||||
this.BindCommand(ViewModel, vm => vm.OpenTheFileLocationCmd, v => v.menuOpenTheFileLocation).DisposeWith(disposables);
|
this.BindCommand(ViewModel, vm => vm.OpenTheFileLocationCmd, v => v.menuOpenTheFileLocation).DisposeWith(disposables);
|
||||||
this.BindCommand(ViewModel, vm => vm.RegionalPresetDefaultCmd, v => v.menuRegionalPresetsDefault).DisposeWith(disposables);
|
this.BindCommand(ViewModel, vm => vm.RegionalPresetDefaultCmd, v => v.menuRegionalPresetsDefault).DisposeWith(disposables);
|
||||||
this.BindCommand(ViewModel, vm => vm.RegionalPresetRussiaCmd, v => v.menuRegionalPresetsRussia).DisposeWith(disposables);
|
this.BindCommand(ViewModel, vm => vm.RegionalPresetRussiaCmd, v => v.menuRegionalPresetsRussia).DisposeWith(disposables);
|
||||||
this.BindCommand(ViewModel, vm => vm.RegionalPresetIranCmd, v => v.menuRegionalPresetsIran).DisposeWith(disposables);
|
|
||||||
|
|
||||||
this.BindCommand(ViewModel, vm => vm.ReloadCmd, v => v.menuReload).DisposeWith(disposables);
|
this.BindCommand(ViewModel, vm => vm.ReloadCmd, v => v.menuReload).DisposeWith(disposables);
|
||||||
this.OneWayBind(ViewModel, vm => vm.BlReloadEnabled, v => v.menuReload.IsEnabled).DisposeWith(disposables);
|
this.OneWayBind(ViewModel, vm => vm.BlReloadEnabled, v => v.menuReload.IsEnabled).DisposeWith(disposables);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue