✨ Add undo import
This commit is contained in:
parent
fc4a627c92
commit
f64b85f9b8
@ -1,4 +1,5 @@
|
||||
using Pal.Common;
|
||||
using System;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
@ -79,12 +80,17 @@ namespace Pal.Client
|
||||
string path = GetSaveLocation(TerritoryType);
|
||||
|
||||
ApplyFilters();
|
||||
if (Markers.Count == 0)
|
||||
File.Delete(path);
|
||||
else
|
||||
{
|
||||
File.WriteAllText(path, JsonSerializer.Serialize(new SaveFile
|
||||
{
|
||||
Version = _currentVersion,
|
||||
Markers = new HashSet<Marker>(Markers)
|
||||
}, _jsonSerializerOptions));
|
||||
}
|
||||
}
|
||||
|
||||
private static string GetSaveLocation(uint territoryType) => Path.Join(Service.PluginInterface.GetPluginConfigDirectory(), $"{territoryType}.json");
|
||||
|
||||
@ -98,6 +104,14 @@ namespace Pal.Client
|
||||
}
|
||||
}
|
||||
|
||||
public void UndoImport(List<Guid> importIds)
|
||||
{
|
||||
// When saving a floor state, any markers not seen, not remote seen, and not having an import id are removed;
|
||||
// so it is possible to remove "wrong" markers by not having them be in the current import.
|
||||
foreach (var marker in Markers)
|
||||
marker.Imports.RemoveAll(id => importIds.Contains(id));
|
||||
}
|
||||
|
||||
public class SaveFile
|
||||
{
|
||||
public int Version { get; set; }
|
||||
|
@ -3,7 +3,7 @@
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0-windows</TargetFramework>
|
||||
<LangVersion>10.0</LangVersion>
|
||||
<Version>1.26</Version>
|
||||
<Version>1.27</Version>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
|
@ -37,7 +37,7 @@ namespace Pal.Client.Scheduled
|
||||
ushort territoryType = (ushort)remoteFloor.TerritoryType;
|
||||
var localState = plugin.GetFloorMarkers(territoryType);
|
||||
|
||||
CleanupFloor(localState, oldExportIds);
|
||||
localState.UndoImport(oldExportIds);
|
||||
ImportFloor(remoteFloor, localState);
|
||||
|
||||
localState.Save();
|
||||
@ -89,14 +89,6 @@ namespace Pal.Client.Scheduled
|
||||
return true;
|
||||
}
|
||||
|
||||
private void CleanupFloor(LocalState localState, List<Guid> oldExportIds)
|
||||
{
|
||||
// When saving a floor state, any markers not seen, not remote seen, and not having an import id are removed;
|
||||
// so it is possible to remove "wrong" markers by not having them be in the current import.
|
||||
foreach (var marker in localState.Markers)
|
||||
marker.Imports.RemoveAll(id => oldExportIds.Contains(id));
|
||||
}
|
||||
|
||||
private void ImportFloor(ExportFloor remoteFloor, LocalState localState)
|
||||
{
|
||||
var remoteMarkers = remoteFloor.Objects.Select(m => new Marker((Marker.EType)m.Type, new Vector3(m.X, m.Y, m.Z)) { WasImported = true });
|
||||
|
35
Pal.Client/Scheduled/QueuedUndoImport.cs
Normal file
35
Pal.Client/Scheduled/QueuedUndoImport.cs
Normal file
@ -0,0 +1,35 @@
|
||||
using ECommons.Configuration;
|
||||
using Pal.Common;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Pal.Client.Scheduled
|
||||
{
|
||||
internal class QueuedUndoImport : IQueueOnFrameworkThread
|
||||
{
|
||||
private readonly Guid _exportId;
|
||||
|
||||
public QueuedUndoImport(Guid exportId)
|
||||
{
|
||||
_exportId = exportId;
|
||||
}
|
||||
|
||||
public void Run(Plugin plugin, ref bool recreateLayout, ref bool saveMarkers)
|
||||
{
|
||||
recreateLayout = true;
|
||||
saveMarkers = true;
|
||||
|
||||
foreach (ETerritoryType territoryType in typeof(ETerritoryType).GetEnumValues())
|
||||
{
|
||||
var localState = plugin.GetFloorMarkers((ushort)territoryType);
|
||||
localState.UndoImport(new List<Guid> { _exportId });
|
||||
localState.Save();
|
||||
}
|
||||
|
||||
Service.Configuration.ImportHistory.RemoveAll(hist => hist.Id == _exportId);
|
||||
}
|
||||
}
|
||||
}
|
@ -11,7 +11,6 @@ using Google.Protobuf;
|
||||
using ImGuiNET;
|
||||
using Pal.Client.Net;
|
||||
using Pal.Client.Scheduled;
|
||||
using Pal.Common;
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
@ -199,9 +198,6 @@ namespace Pal.Client.Windows
|
||||
|
||||
private void DrawImportTab()
|
||||
{
|
||||
if (Service.Configuration.BetaKey != "import")
|
||||
return;
|
||||
|
||||
if (ImGui.BeginTabItem("Import"))
|
||||
{
|
||||
ImGui.TextWrapped("Using an export is useful if you're unable to connect to the server, or don't wish to share your findings.");
|
||||
@ -232,6 +228,17 @@ namespace Pal.Client.Windows
|
||||
if (ImGui.Button("Start Import"))
|
||||
DoImport(_openImportPath);
|
||||
ImGui.EndDisabled();
|
||||
|
||||
var importHistory = Service.Configuration.ImportHistory.OrderByDescending(x => x.ImportedAt).ThenBy(x => x.Id).FirstOrDefault();
|
||||
if (importHistory != null)
|
||||
{
|
||||
ImGui.Separator();
|
||||
ImGui.TextWrapped($"Your last import was on {importHistory.ImportedAt}, which added the trap/hoard coffer database from {importHistory.RemoteUrl} created on {importHistory.ExportedAt:d}.");
|
||||
ImGui.TextWrapped("If you think that was a mistake, you can remove all locations only found in the import (any location you've seen yourself is not changed).");
|
||||
if (ImGui.Button("Undo Import"))
|
||||
UndoImport(importHistory.Id);
|
||||
}
|
||||
|
||||
ImGui.EndTabItem();
|
||||
}
|
||||
}
|
||||
@ -406,6 +413,11 @@ namespace Pal.Client.Windows
|
||||
Service.Plugin.EarlyEventQueue.Enqueue(new QueuedImport(sourcePath));
|
||||
}
|
||||
|
||||
internal void UndoImport(Guid importId)
|
||||
{
|
||||
Service.Plugin.EarlyEventQueue.Enqueue(new QueuedUndoImport(importId));
|
||||
}
|
||||
|
||||
internal void DoExport(string destinationPath)
|
||||
{
|
||||
Task.Run(async () =>
|
||||
|
Loading…
Reference in New Issue
Block a user