Compare commits

..

No commits in common. "3f67a23f8b4dcdff69b532e9e74d2f201d419661" and "1d6991641077cfe5b8a64edafa4d8eb2cdce6ce6" have entirely different histories.

10 changed files with 86 additions and 74 deletions

View file

@ -1,7 +1,7 @@
<Project>
<PropertyGroup>
<Version>7.14.5</Version>
<Version>7.14.4</Version>
</PropertyGroup>
<PropertyGroup>

View file

@ -13,11 +13,11 @@ namespace ServiceLib.ViewModels;
public class CheckUpdateViewModel : MyReactiveObject
{
private const string _geo = "GeoFiles";
private readonly string _v2rayN = ECoreType.v2rayN.ToString();
private string _v2rayN = ECoreType.v2rayN.ToString();
private List<CheckUpdateModel> _lstUpdated = [];
private static readonly string _tag = "CheckUpdateViewModel";
public IObservableCollection<CheckUpdateModel> CheckUpdateModels { get; } = new ObservableCollectionExtended<CheckUpdateModel>();
private IObservableCollection<CheckUpdateModel> _checkUpdateModel = new ObservableCollectionExtended<CheckUpdateModel>();
public IObservableCollection<CheckUpdateModel> CheckUpdateModels => _checkUpdateModel;
public ReactiveCommand<Unit, Unit> CheckUpdateCmd { get; }
[Reactive] public bool EnableCheckPreReleaseUpdate { get; set; }
@ -26,11 +26,9 @@ public class CheckUpdateViewModel : MyReactiveObject
_config = AppManager.Instance.Config;
_updateView = updateView;
CheckUpdateCmd = ReactiveCommand.CreateFromTask(CheckUpdate);
CheckUpdateCmd.ThrownExceptions.Subscribe(ex =>
CheckUpdateCmd = ReactiveCommand.CreateFromTask(async () =>
{
Logging.SaveLog(_tag, ex);
_ = UpdateView(_v2rayN, ex.Message);
await CheckUpdate();
});
EnableCheckPreReleaseUpdate = _config.CheckUpdateItem.CheckPreReleaseUpdate;
@ -45,20 +43,20 @@ public class CheckUpdateViewModel : MyReactiveObject
private void RefreshCheckUpdateItems()
{
CheckUpdateModels.Clear();
_checkUpdateModel.Clear();
if (RuntimeInformation.ProcessArchitecture != Architecture.X86)
{
CheckUpdateModels.Add(GetCheckUpdateModel(_v2rayN));
_checkUpdateModel.Add(GetCheckUpdateModel(_v2rayN));
//Not Windows and under Win10
if (!(Utils.IsWindows() && Environment.OSVersion.Version.Major < 10))
{
CheckUpdateModels.Add(GetCheckUpdateModel(ECoreType.Xray.ToString()));
CheckUpdateModels.Add(GetCheckUpdateModel(ECoreType.mihomo.ToString()));
CheckUpdateModels.Add(GetCheckUpdateModel(ECoreType.sing_box.ToString()));
_checkUpdateModel.Add(GetCheckUpdateModel(ECoreType.Xray.ToString()));
_checkUpdateModel.Add(GetCheckUpdateModel(ECoreType.mihomo.ToString()));
_checkUpdateModel.Add(GetCheckUpdateModel(ECoreType.sing_box.ToString()));
}
}
CheckUpdateModels.Add(GetCheckUpdateModel(_geo));
_checkUpdateModel.Add(GetCheckUpdateModel(_geo));
}
private CheckUpdateModel GetCheckUpdateModel(string coreType)
@ -73,7 +71,7 @@ public class CheckUpdateViewModel : MyReactiveObject
private async Task SaveSelectedCoreTypes()
{
_config.CheckUpdateItem.SelectedCoreTypes = CheckUpdateModels.Where(t => t.IsSelected == true).Select(t => t.CoreType ?? "").ToList();
_config.CheckUpdateItem.SelectedCoreTypes = _checkUpdateModel.Where(t => t.IsSelected == true).Select(t => t.CoreType ?? "").ToList();
await ConfigHandler.SaveConfig(_config);
}
@ -85,13 +83,13 @@ public class CheckUpdateViewModel : MyReactiveObject
private async Task CheckUpdateTask()
{
_lstUpdated.Clear();
_lstUpdated = CheckUpdateModels.Where(x => x.IsSelected == true)
_lstUpdated = _checkUpdateModel.Where(x => x.IsSelected == true)
.Select(x => new CheckUpdateModel() { CoreType = x.CoreType }).ToList();
await SaveSelectedCoreTypes();
for (var k = CheckUpdateModels.Count - 1; k >= 0; k--)
for (var k = _checkUpdateModel.Count - 1; k >= 0; k--)
{
var item = CheckUpdateModels[k];
var item = _checkUpdateModel[k];
if (item.IsSelected != true)
{
continue;
@ -322,7 +320,7 @@ public class CheckUpdateViewModel : MyReactiveObject
public async Task UpdateViewResult(CheckUpdateModel model)
{
var found = CheckUpdateModels.FirstOrDefault(t => t.CoreType == model.CoreType);
var found = _checkUpdateModel.FirstOrDefault(t => t.CoreType == model.CoreType);
if (found == null)
{
return;
@ -330,6 +328,6 @@ public class CheckUpdateViewModel : MyReactiveObject
var itemCopy = JsonUtils.DeepCopy(found);
itemCopy.Remarks = model.Remarks;
CheckUpdateModels.Replace(found, itemCopy);
_checkUpdateModel.Replace(found, itemCopy);
}
}

View file

@ -10,7 +10,8 @@ namespace ServiceLib.ViewModels;
public class ClashConnectionsViewModel : MyReactiveObject
{
public IObservableCollection<ClashConnectionModel> ConnectionItems { get; } = new ObservableCollectionExtended<ClashConnectionModel>();
private IObservableCollection<ClashConnectionModel> _connectionItems = new ObservableCollectionExtended<ClashConnectionModel>();
public IObservableCollection<ClashConnectionModel> ConnectionItems => _connectionItems;
[Reactive]
public ClashConnectionModel SelectedSource { get; set; }
@ -73,7 +74,7 @@ public class ClashConnectionsViewModel : MyReactiveObject
public async Task RefreshConnections(List<ConnectionItem>? connections)
{
ConnectionItems.Clear();
_connectionItems.Clear();
var dtNow = DateTime.Now;
var lstModel = new List<ClashConnectionModel>();
@ -103,7 +104,7 @@ public class ClashConnectionsViewModel : MyReactiveObject
return;
}
ConnectionItems.AddRange(lstModel);
_connectionItems.AddRange(lstModel);
}
public async Task ClashConnectionClose(bool all)
@ -120,7 +121,7 @@ public class ClashConnectionsViewModel : MyReactiveObject
}
else
{
ConnectionItems.Clear();
_connectionItems.Clear();
}
await ClashApiManager.Instance.ClashConnectionClose(id);
await GetClashConnections();

View file

@ -17,8 +17,11 @@ public class ClashProxiesViewModel : MyReactiveObject
private Dictionary<string, ProvidersItem>? _providers;
private readonly int _delayTimeout = 99999999;
public IObservableCollection<ClashProxyModel> ProxyGroups { get; } = new ObservableCollectionExtended<ClashProxyModel>();
public IObservableCollection<ClashProxyModel> ProxyDetails { get; } = new ObservableCollectionExtended<ClashProxyModel>();
private IObservableCollection<ClashProxyModel> _proxyGroups = new ObservableCollectionExtended<ClashProxyModel>();
private IObservableCollection<ClashProxyModel> _proxyDetails = new ObservableCollectionExtended<ClashProxyModel>();
public IObservableCollection<ClashProxyModel> ProxyGroups => _proxyGroups;
public IObservableCollection<ClashProxyModel> ProxyDetails => _proxyDetails;
[Reactive]
public ClashProxyModel SelectedGroup { get; set; }
@ -179,7 +182,7 @@ public class ClashProxiesViewModel : MyReactiveObject
}
var selectedName = SelectedGroup?.Name;
ProxyGroups.Clear();
_proxyGroups.Clear();
var proxyGroups = ClashApiManager.Instance.GetClashProxyGroups();
if (proxyGroups != null && proxyGroups.Count > 0)
@ -195,7 +198,7 @@ public class ClashProxiesViewModel : MyReactiveObject
{
continue;
}
ProxyGroups.Add(new ClashProxyModel()
_proxyGroups.Add(new ClashProxyModel()
{
Now = item.now,
Name = item.name,
@ -211,12 +214,12 @@ public class ClashProxiesViewModel : MyReactiveObject
{
continue;
}
var item = ProxyGroups.FirstOrDefault(t => t.Name == kv.Key);
var item = _proxyGroups.FirstOrDefault(t => t.Name == kv.Key);
if (item != null && item.Name.IsNotEmpty())
{
continue;
}
ProxyGroups.Add(new ClashProxyModel()
_proxyGroups.Add(new ClashProxyModel()
{
Now = kv.Value.now,
Name = kv.Key,
@ -224,15 +227,15 @@ public class ClashProxiesViewModel : MyReactiveObject
});
}
if (ProxyGroups != null && ProxyGroups.Count > 0)
if (_proxyGroups != null && _proxyGroups.Count > 0)
{
if (selectedName != null && ProxyGroups.Any(t => t.Name == selectedName))
if (selectedName != null && _proxyGroups.Any(t => t.Name == selectedName))
{
SelectedGroup = ProxyGroups.FirstOrDefault(t => t.Name == selectedName);
SelectedGroup = _proxyGroups.FirstOrDefault(t => t.Name == selectedName);
}
else
{
SelectedGroup = ProxyGroups.First();
SelectedGroup = _proxyGroups.First();
}
}
else
@ -243,7 +246,7 @@ public class ClashProxiesViewModel : MyReactiveObject
private void RefreshProxyDetails(bool c)
{
ProxyDetails.Clear();
_proxyDetails.Clear();
if (!c)
{
return;
@ -296,7 +299,7 @@ public class ClashProxiesViewModel : MyReactiveObject
default:
break;
}
ProxyDetails.AddRange(lstDetails);
_proxyDetails.AddRange(lstDetails);
}
private ProxiesItem? TryGetProxy(string name)
@ -358,12 +361,12 @@ public class ClashProxiesViewModel : MyReactiveObject
await ClashApiManager.Instance.ClashSetActiveProxy(name, nameNode);
selectedProxy.now = nameNode;
var group = ProxyGroups.FirstOrDefault(it => it.Name == SelectedGroup.Name);
var group = _proxyGroups.FirstOrDefault(it => it.Name == SelectedGroup.Name);
if (group != null)
{
group.Now = nameNode;
var group2 = JsonUtils.DeepCopy(group);
ProxyGroups.Replace(group, group2);
_proxyGroups.Replace(group, group2);
SelectedGroup = group2;
}
@ -372,7 +375,7 @@ public class ClashProxiesViewModel : MyReactiveObject
private async Task ProxiesDelayTest(bool blAll = true)
{
ClashApiManager.Instance.ClashProxiesDelayTest(blAll, ProxyDetails.ToList(), async (item, result) =>
ClashApiManager.Instance.ClashProxiesDelayTest(blAll, _proxyDetails.ToList(), async (item, result) =>
{
if (item == null || result.IsNullOrEmpty())
{
@ -392,7 +395,7 @@ public class ClashProxiesViewModel : MyReactiveObject
public async Task ProxiesDelayTestResult(SpeedTestResult result)
{
//UpdateHandler(false, $"{item.name}={result}");
var detail = ProxyDetails.FirstOrDefault(it => it.Name == result.IndexId);
var detail = _proxyDetails.FirstOrDefault(it => it.Name == result.IndexId);
if (detail == null)
{
return;
@ -414,7 +417,7 @@ public class ClashProxiesViewModel : MyReactiveObject
detail.Delay = _delayTimeout;
detail.DelayName = string.Empty;
}
ProxyDetails.Replace(detail, JsonUtils.DeepCopy(detail));
_proxyDetails.Replace(detail, JsonUtils.DeepCopy(detail));
}
#endregion proxy function

View file

@ -8,8 +8,8 @@ namespace ServiceLib.ViewModels;
public class MsgViewModel : MyReactiveObject
{
private readonly ConcurrentQueue<string> _queueMsg = new();
private readonly int _numMaxMsg = 500;
private ConcurrentQueue<string> _queueMsg = new();
private int _numMaxMsg = 500;
private bool _lastMsgFilterNotAvailable;
private bool _blLockShow = false;

View file

@ -23,9 +23,13 @@ public class ProfilesViewModel : MyReactiveObject
#region ObservableCollection
public IObservableCollection<ProfileItemModel> ProfileItems { get; } = new ObservableCollectionExtended<ProfileItemModel>();
private IObservableCollection<ProfileItemModel> _profileItems = new ObservableCollectionExtended<ProfileItemModel>();
public IObservableCollection<ProfileItemModel> ProfileItems => _profileItems;
public IObservableCollection<SubItem> SubItems { get; } = new ObservableCollectionExtended<SubItem>();
private IObservableCollection<SubItem> _subItems = new ObservableCollectionExtended<SubItem>();
public IObservableCollection<SubItem> SubItems => _subItems;
private IObservableCollection<ComboItem> _servers = new ObservableCollectionExtended<ComboItem>();
[Reactive]
public ProfileItemModel SelectedProfile { get; set; }
@ -289,7 +293,7 @@ public class ProfilesViewModel : MyReactiveObject
NoticeManager.Instance.Enqueue(result.Delay);
return;
}
var item = ProfileItems.FirstOrDefault(it => it.IndexId == result.IndexId);
var item = _profileItems.FirstOrDefault(it => it.IndexId == result.IndexId);
if (item == null)
{
return;
@ -319,7 +323,7 @@ public class ProfilesViewModel : MyReactiveObject
try
{
var item = ProfileItems.FirstOrDefault(it => it.IndexId == update.IndexId);
var item = _profileItems.FirstOrDefault(it => it.IndexId == update.IndexId);
if (item != null)
{
item.TodayDown = Utils.HumanFy(update.TodayDown);
@ -386,8 +390,8 @@ public class ProfilesViewModel : MyReactiveObject
var lstModel = await GetProfileItemsEx(_config.SubIndexId, _serverFilter);
_lstProfile = JsonUtils.Deserialize<List<ProfileItem>>(JsonUtils.Serialize(lstModel)) ?? [];
ProfileItems.Clear();
ProfileItems.AddRange(lstModel);
_profileItems.Clear();
_profileItems.AddRange(lstModel);
if (lstModel.Count > 0)
{
var selected = lstModel.FirstOrDefault(t => t.IndexId == _config.IndexId);
@ -406,21 +410,21 @@ public class ProfilesViewModel : MyReactiveObject
public async Task RefreshSubscriptions()
{
SubItems.Clear();
_subItems.Clear();
SubItems.Add(new SubItem { Remarks = ResUI.AllGroupServers });
_subItems.Add(new SubItem { Remarks = ResUI.AllGroupServers });
foreach (var item in await AppManager.Instance.SubItems())
{
SubItems.Add(item);
_subItems.Add(item);
}
if (_config.SubIndexId != null && SubItems.FirstOrDefault(t => t.Id == _config.SubIndexId) != null)
if (_config.SubIndexId != null && _subItems.FirstOrDefault(t => t.Id == _config.SubIndexId) != null)
{
SelectedSub = SubItems.FirstOrDefault(t => t.Id == _config.SubIndexId);
SelectedSub = _subItems.FirstOrDefault(t => t.Id == _config.SubIndexId);
}
else
{
SelectedSub = SubItems.First();
SelectedSub = _subItems.First();
}
}
@ -544,9 +548,9 @@ public class ProfilesViewModel : MyReactiveObject
await ConfigHandler.RemoveServers(_config, lstSelected);
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
if (lstSelected.Count == ProfileItems.Count)
if (lstSelected.Count == _profileItems.Count)
{
ProfileItems.Clear();
_profileItems.Clear();
}
await RefreshServers();
if (exists)
@ -736,7 +740,7 @@ public class ProfilesViewModel : MyReactiveObject
public async Task MoveServerTo(int startIndex, ProfileItemModel targetItem)
{
var targetIndex = ProfileItems.IndexOf(targetItem);
var targetIndex = _profileItems.IndexOf(targetItem);
if (startIndex >= 0 && targetIndex >= 0 && startIndex != targetIndex)
{
if (await ConfigHandler.MoveServer(_config, _lstProfile, startIndex, EMove.Position, targetIndex) == 0)
@ -750,7 +754,7 @@ public class ProfilesViewModel : MyReactiveObject
{
if (actionType == ESpeedActionType.Mixedtest)
{
SelectedProfiles = ProfileItems;
SelectedProfiles = _profileItems;
}
var lstSelected = await GetProfileItems(false);
if (lstSelected == null)

View file

@ -13,7 +13,9 @@ public class RoutingRuleSettingViewModel : MyReactiveObject
[Reactive]
public RoutingItem SelectedRouting { get; set; }
public IObservableCollection<RulesItemModel> RulesItems { get; } = new ObservableCollectionExtended<RulesItemModel>();
private IObservableCollection<RulesItemModel> _rulesItems = new ObservableCollectionExtended<RulesItemModel>();
public IObservableCollection<RulesItemModel> RulesItems => _rulesItems;
[Reactive]
public RulesItemModel SelectedSource { get; set; }
@ -99,7 +101,7 @@ public class RoutingRuleSettingViewModel : MyReactiveObject
public void RefreshRulesItems()
{
RulesItems.Clear();
_rulesItems.Clear();
foreach (var item in _rules)
{
@ -116,7 +118,7 @@ public class RoutingRuleSettingViewModel : MyReactiveObject
Enabled = item.Enabled,
Remarks = item.Remarks,
};
RulesItems.Add(it);
_rulesItems.Add(it);
}
}

View file

@ -9,7 +9,8 @@ public class RoutingSettingViewModel : MyReactiveObject
{
#region Reactive
public IObservableCollection<RoutingItemModel> RoutingItems { get; } = new ObservableCollectionExtended<RoutingItemModel>();
private IObservableCollection<RoutingItemModel> _routingItems = new ObservableCollectionExtended<RoutingItemModel>();
public IObservableCollection<RoutingItemModel> RoutingItems => _routingItems;
[Reactive]
public RoutingItemModel SelectedSource { get; set; }
@ -81,7 +82,7 @@ public class RoutingSettingViewModel : MyReactiveObject
public async Task RefreshRoutingItems()
{
RoutingItems.Clear();
_routingItems.Clear();
var routings = await AppManager.Instance.RoutingItems();
foreach (var item in routings)
@ -97,7 +98,7 @@ public class RoutingSettingViewModel : MyReactiveObject
CustomRulesetPath4Singbox = item.CustomRulesetPath4Singbox,
Sort = item.Sort,
};
RoutingItems.Add(it);
_routingItems.Add(it);
}
}

View file

@ -13,9 +13,11 @@ public class StatusBarViewModel : MyReactiveObject
{
#region ObservableCollection
public IObservableCollection<RoutingItem> RoutingItems { get; } = new ObservableCollectionExtended<RoutingItem>();
private IObservableCollection<RoutingItem> _routingItems = new ObservableCollectionExtended<RoutingItem>();
public IObservableCollection<RoutingItem> RoutingItems => _routingItems;
public IObservableCollection<ComboItem> Servers { get; } = new ObservableCollectionExtended<ComboItem>();
private IObservableCollection<ComboItem> _servers = new ObservableCollectionExtended<ComboItem>();
public IObservableCollection<ComboItem> Servers => _servers;
[Reactive]
public RoutingItem SelectedRouting { get; set; }
@ -293,7 +295,7 @@ public class StatusBarViewModel : MyReactiveObject
{
var lstModel = await AppManager.Instance.ProfileItems(_config.SubIndexId, "");
Servers.Clear();
_servers.Clear();
if (lstModel.Count > _config.GuiItem.TrayMenuServersLimit)
{
BlServers = false;
@ -307,7 +309,7 @@ public class StatusBarViewModel : MyReactiveObject
string name = it.GetSummary();
var item = new ComboItem() { ID = it.IndexId, Text = name };
Servers.Add(item);
_servers.Add(item);
if (_config.IndexId == it.IndexId)
{
SelectedServer = item;
@ -395,13 +397,13 @@ public class StatusBarViewModel : MyReactiveObject
public async Task RefreshRoutingsMenu()
{
RoutingItems.Clear();
_routingItems.Clear();
BlRouting = true;
var routings = await AppManager.Instance.RoutingItems();
foreach (var item in routings)
{
RoutingItems.Add(item);
_routingItems.Add(item);
if (item.IsActive)
{
SelectedRouting = item;

View file

@ -8,7 +8,8 @@ namespace ServiceLib.ViewModels;
public class SubSettingViewModel : MyReactiveObject
{
public IObservableCollection<SubItem> SubItems { get; } = new ObservableCollectionExtended<SubItem>();
private IObservableCollection<SubItem> _subItems = new ObservableCollectionExtended<SubItem>();
public IObservableCollection<SubItem> SubItems => _subItems;
[Reactive]
public SubItem SelectedSource { get; set; }
@ -59,8 +60,8 @@ public class SubSettingViewModel : MyReactiveObject
public async Task RefreshSubItems()
{
SubItems.Clear();
SubItems.AddRange(await AppManager.Instance.SubItems());
_subItems.Clear();
_subItems.AddRange(await AppManager.Instance.SubItems());
}
public async Task EditSubAsync(bool blNew)