Use profile IDs for server move operations

Refactor `ConfigHandler.MoveServer` to accept a `List<string>` of profile `IndexId`s instead of full `ProfileItem` objects. In `ProfilesViewModel`, remove the duplicated `_lstProfile` cache and build move lists directly from `ProfileItems`, so move and drag-reorder actions use the live UI order and avoid stale profile snapshots.
This commit is contained in:
2dust
2026-09-06 10:31:45 +08:00
parent d05c3439f8
commit 3d50d9f82c
2 changed files with 14 additions and 19 deletions

View File

@@ -471,12 +471,12 @@ public static class ConfigHandler
/// Supports moving to top, up, down, bottom or specific position
/// </summary>
/// <param name="config">Current configuration</param>
/// <param name="lstProfile">List of server profiles</param>
/// <param name="lstProfile">List of server profile index ids</param>
/// <param name="index">Index of the server to move</param>
/// <param name="eMove">Direction to move the server</param>
/// <param name="pos">Target position when using EMove.Position</param>
/// <returns>0 if successful, -1 if failed</returns>
public static async Task<int> MoveServer(Config config, List<ProfileItem> lstProfile, int index, EMove eMove, int pos = -1)
public static async Task<int> MoveServer(Config config, List<string> lstProfile, int index, EMove eMove, int pos = -1)
{
var count = lstProfile.Count;
if (index < 0 || index > lstProfile.Count - 1)
@@ -486,7 +486,7 @@ public static class ConfigHandler
for (var i = 0; i < lstProfile.Count; i++)
{
ProfileExManager.Instance.SetSort(lstProfile[i].IndexId, (i + 1) * 10);
ProfileExManager.Instance.SetSort(lstProfile[i], (i + 1) * 10);
}
var sort = 0;
@@ -498,7 +498,7 @@ public static class ConfigHandler
{
return 0;
}
sort = ProfileExManager.Instance.GetSort(lstProfile.First().IndexId) - 1;
sort = ProfileExManager.Instance.GetSort(lstProfile.First()) - 1;
break;
}
@@ -508,7 +508,7 @@ public static class ConfigHandler
{
return 0;
}
sort = ProfileExManager.Instance.GetSort(lstProfile[index - 1].IndexId) - 1;
sort = ProfileExManager.Instance.GetSort(lstProfile[index - 1]) - 1;
break;
}
@@ -519,7 +519,7 @@ public static class ConfigHandler
{
return 0;
}
sort = ProfileExManager.Instance.GetSort(lstProfile[index + 1].IndexId) + 1;
sort = ProfileExManager.Instance.GetSort(lstProfile[index + 1]) + 1;
break;
}
@@ -529,7 +529,7 @@ public static class ConfigHandler
{
return 0;
}
sort = ProfileExManager.Instance.GetSort(lstProfile[^1].IndexId) + 1;
sort = ProfileExManager.Instance.GetSort(lstProfile[^1]) + 1;
break;
}
@@ -538,7 +538,7 @@ public static class ConfigHandler
break;
}
ProfileExManager.Instance.SetSort(lstProfile[index].IndexId, sort);
ProfileExManager.Instance.SetSort(lstProfile[index], sort);
return await Task.FromResult(0);
}

View File

@@ -15,7 +15,6 @@ public partial class ProfilesViewModel : MyReactiveObject
#region private prop
private List<ProfileItem> _lstProfile;
private string _serverFilter = string.Empty;
private readonly Dictionary<string, bool> _dicHeaderSort = new();
private SpeedtestService? _speedtestService;
@@ -362,7 +361,6 @@ public partial class ProfilesViewModel : MyReactiveObject
public async Task RefreshServersBiz()
{
var lstModel = await GetProfileItemsEx(_config.SubIndexId, _serverFilter);
_lstProfile = JsonUtils.Deserialize<List<ProfileItem>>(JsonUtils.Serialize(lstModel)) ?? [];
ProfileItems.ReplaceRange(lstModel ?? []);
if (lstModel?.Count > 0)
@@ -677,19 +675,15 @@ public partial class ProfilesViewModel : MyReactiveObject
public async Task MoveServer(EMove eMove)
{
var item = _lstProfile.FirstOrDefault(t => t.IndexId == SelectedProfile.IndexId);
if (item is null)
var lstProfile = ProfileItems?.Select(t => t.IndexId).ToList() ?? [];
var index = lstProfile.IndexOf(SelectedProfile.IndexId);
if (index < 0)
{
NoticeManager.Instance.Enqueue(ResUI.PleaseSelectServer);
return;
}
var index = _lstProfile.IndexOf(item);
if (index < 0)
{
return;
}
if (await ConfigHandler.MoveServer(_config, _lstProfile, index, eMove) == 0)
if (await ConfigHandler.MoveServer(_config, lstProfile, index, eMove) == 0)
{
await RefreshServers();
}
@@ -700,7 +694,8 @@ public partial class ProfilesViewModel : MyReactiveObject
var targetIndex = ProfileItems.IndexOf(targetItem);
if (startIndex >= 0 && targetIndex >= 0 && startIndex != targetIndex)
{
if (await ConfigHandler.MoveServer(_config, _lstProfile, startIndex, EMove.Position, targetIndex) == 0)
var lstProfile = ProfileItems?.Select(t => t.IndexId).ToList() ?? [];
if (await ConfigHandler.MoveServer(_config, lstProfile, startIndex, EMove.Position, targetIndex) == 0)
{
await RefreshServers();
}