Intermediate commit rewrite player planet cache
This commit is contained in:
@ -30,6 +30,11 @@ public class PlanetManager : IDisposable, IEnableLogger
|
||||
.Filter(planet => planet.OwnerId == Game.Player.Name)
|
||||
.Transform(planet => new PlayerPlanetViewModel(planet));
|
||||
|
||||
/// <summary>
|
||||
/// Cache with all player planets, indexed by planet name.
|
||||
/// </summary>
|
||||
private SourceCache<PlayerPlanetViewModel, string> _playerPlanets = new(p => p.Planet.Name);
|
||||
|
||||
/// <summary>
|
||||
/// Observable subject to trigger when we update the planet cache, allows the
|
||||
/// UI to react to it.
|
||||
@ -64,6 +69,27 @@ public class PlanetManager : IDisposable, IEnableLogger
|
||||
innerCache.AddOrUpdate(allPlanets);
|
||||
}
|
||||
);
|
||||
|
||||
var allPlayerPlanets = allPlanets.Where(planet => planet.OwnerId == Game.Player.Name);
|
||||
var allPlayerCacheKeys = _playerPlanets.Keys.ToList();
|
||||
var playerPlanetNames = from p in allPlayerPlanets select p.Name;
|
||||
var playerPlanetsToDelete = allPlayerCacheKeys.Except(playerPlanetNames);
|
||||
|
||||
_playerPlanets.Edit(innerCache =>
|
||||
{
|
||||
foreach (var name in playerPlanetsToDelete)
|
||||
innerCache.RemoveKey(name);
|
||||
foreach (var planet in allPlayerPlanets)
|
||||
{
|
||||
var playerPlanet = innerCache.Lookup(planet.Name);
|
||||
if (playerPlanet.HasValue)
|
||||
playerPlanet.Value.Planet = planet;
|
||||
else
|
||||
innerCache.Add(new PlayerPlanetViewModel(planet));
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
_planetsReloadedSubject.OnNext(Unit.Default);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user