diff --git a/Stars Assistant/Services/PlanetManager.cs b/Stars Assistant/Services/PlanetManager.cs
index e532f20..72cd2be 100644
--- a/Stars Assistant/Services/PlanetManager.cs
+++ b/Stars Assistant/Services/PlanetManager.cs
@@ -1,6 +1,9 @@
using System;
using System.ComponentModel;
+using System.Reactive;
+using System.Reactive.Disposables;
using System.Reactive.Linq;
+using System.Reactive.Subjects;
using DynamicData;
using DynamicData.Binding;
using Splat;
@@ -27,10 +30,21 @@ public class PlanetManager : IDisposable, IEnableLogger
.Filter(planet => planet.OwnerId == Game.Player.Name)
.Transform(planet => new PlayerPlanetViewModel(planet));
+ ///
+ /// Observable subject to trigger when we update the planet cache, allows the
+ /// UI to react to it.
+ ///
+ private readonly Subject _planetsReloadedSubject = new();
+
+ ///
+ /// Exposes _planetReloadedSubject as IObservable.
+ ///
+ public IObservable PlanetsReloaded => _planetsReloadedSubject.AsObservable();
+
+
public PlanetManager()
{
FleetManager fleetManager = Locator.Current.GetService()!;
-
}
///
@@ -50,6 +64,7 @@ public class PlanetManager : IDisposable, IEnableLogger
innerCache.AddOrUpdate(allPlanets);
}
);
+ _planetsReloadedSubject.OnNext(Unit.Default);
}
///
@@ -60,6 +75,7 @@ public class PlanetManager : IDisposable, IEnableLogger
if (disposing)
{
_planets.Dispose();
+ _planetsReloadedSubject.Dispose();
}
}
diff --git a/Stars Assistant/ViewModels/BuColViewModel.cs b/Stars Assistant/ViewModels/BuColViewModel.cs
index 6fbdf8a..b89e1dc 100644
--- a/Stars Assistant/ViewModels/BuColViewModel.cs
+++ b/Stars Assistant/ViewModels/BuColViewModel.cs
@@ -15,23 +15,38 @@ public partial class BuColViewModel : ViewModelBase
private readonly ReadOnlyObservableCollection _playerPlanetsView;
public ReadOnlyObservableCollection PlayerPlanets => _playerPlanetsView;
+ [Reactive]
+ private PlayerPlanetViewModel? _selectedPlanet;
+
+ private string? _lastSelectedPlanetName;
+
public BuColViewModel()
{
- var PlanetManager = Locator.Current.GetService()!;
+ var planetManager = Locator.Current.GetService()!;
- PlanetManager.PlayerPlanetsSource
+ planetManager.PlayerPlanetsSource
.ObserveOn(RxApp.MainThreadScheduler)
.Bind(out _playerPlanetsView)
.DisposeMany()
.Subscribe();
+ this.WhenAnyValue(x => x.SelectedPlanet)
+ .Subscribe(planet => _lastSelectedPlanetName = planet?.Name);
+
this.WhenActivated((CompositeDisposable disposables) =>
{
- // /* handle activation */
- // Disposable
- // .Create(() => { /* handle deactivation */ })
- // .DisposeWith(disposables);
+ planetManager.PlanetsReloaded
+ .ObserveOn(RxApp.MainThreadScheduler)
+ .Subscribe(_ => RestoreSelection())
+ .DisposeWith(disposables);
});
}
+ private void RestoreSelection()
+ {
+ if (_lastSelectedPlanetName != null)
+ {
+ SelectedPlanet = PlayerPlanets.FirstOrDefault(p => p.Name == _lastSelectedPlanetName);
+ }
+ }
}
diff --git a/Stars Assistant/ViewModels/PlayerPlanetViewModel.cs b/Stars Assistant/ViewModels/PlayerPlanetViewModel.cs
index 0598f80..3586d1f 100644
--- a/Stars Assistant/ViewModels/PlayerPlanetViewModel.cs
+++ b/Stars Assistant/ViewModels/PlayerPlanetViewModel.cs
@@ -67,6 +67,8 @@ public partial class PlayerPlanetViewModel : ViewModelBase
_fleetSummaryChanges = fm.FleetSummariesByDestination
.Connect()
.Watch(Name)
+ .Replay(1)
+ .RefCount()
.Log(this, "fleetSummaryChange", change => $"{Name}: {change.Reason}: {change.Previous} => {change.Current}")
;
@@ -94,8 +96,9 @@ public partial class PlayerPlanetViewModel : ViewModelBase
.ToProperty(this, vm => vm.EnRouteGermanium)
;
- this.WhenActivated((CompositeDisposable disposables) =>
+ this.WhenActivated((CompositeDisposable disposables) =>
{
+ _fleetSummaryChanges.Subscribe().DisposeWith(disposables);
disposables.Add(_enRoutePopulationHelper);
disposables.Add(_enRouteIroniumHelper);
disposables.Add(_enRouteBoraniumHelper);
diff --git a/Stars Assistant/Views/BuColView.axaml b/Stars Assistant/Views/BuColView.axaml
index 7b54092..da301bf 100644
--- a/Stars Assistant/Views/BuColView.axaml
+++ b/Stars Assistant/Views/BuColView.axaml
@@ -10,11 +10,12 @@
-
+
+