Take the remaining I/O out of the domain and drop AppState.Instance

Scenery translations and load weights get repositories; AppState moves to the
application layer.
This commit is contained in:
maj00r
2026-09-04 21:06:23 +02:00
parent 0444070e12
commit 8e5fe01104
16 changed files with 479 additions and 216 deletions

View File

@@ -146,7 +146,7 @@ public partial class Depot : UserControl
_drag.VehicleListPressed(sender, e);
private Dynamic NewVehicle(VehicleTexture texture) =>
_consist.MakeDynamic(texture, _listScenery ?? AppState.Instance.CurrentScenery);
_consist.MakeDynamic(texture, _listScenery ?? AppServices.Current.State.CurrentScenery);
private void SyncFromSelection()
{
@@ -155,7 +155,7 @@ public partial class Depot : UserControl
PopulateSceneryConsists();
var trainset = AppState.Instance.CurrentTrainset;
var trainset = AppServices.Current.State.CurrentTrainset;
if (trainset != null && !ReferenceEquals(trainset, _consist.EditingTrainset))
_consist.LoadFrom(trainset);
else if (_consist.EditingTrainset != null)
@@ -220,7 +220,7 @@ public partial class Depot : UserControl
_consist.EditingTrainset,
_info.PhysicsFor,
car => _db.TextureForSkin(car.SkinFile) is { } t ? VehicleInfo.CategoryOf(t) : null,
LoadWeights.WeightOf));
AppServices.Current.LoadWeights.Table.WeightOf));
}
private void RemoveVehicleButton_OnClick(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
@@ -245,7 +245,7 @@ public partial class Depot : UserControl
depotShowAiCheck.IsChecked = StarterNG.Classes.Settings.Instance.ShowAiVehicles;
depotDrivableOnlyCheck.IsChecked = StarterNG.Classes.Settings.Instance.DrivableOnly;
_listScenery = AppState.Instance.CurrentScenery ?? _sceneries.FirstOrDefault();
_listScenery = AppServices.Current.State.CurrentScenery ?? _sceneries.FirstOrDefault();
sceneryConsistsTab.Header = App.Loc["SceneryConsists"];
ToolTip.SetTip(sceneryConsistsTab,
_listScenery != null ? Path.GetFileNameWithoutExtension(_listScenery.Path) : App.Loc["NoSceneryConsists"]);
@@ -276,7 +276,7 @@ public partial class Depot : UserControl
randomTurn: ToolRandomOrientation);
sceneryConsistList.Items.Add(entry);
if (ReferenceEquals(trainset, AppState.Instance.CurrentTrainset))
if (ReferenceEquals(trainset, AppServices.Current.State.CurrentTrainset))
sceneryConsistList.SelectedItem = entry;
}
}
@@ -289,9 +289,9 @@ public partial class Depot : UserControl
if (sceneryConsistList.SelectedItem is not ListBoxItem { Tag: Trainset trainset })
return;
AppState.Instance.CurrentScenery = _listScenery;
AppState.Instance.CurrentTrainset = trainset;
AppState.Instance.StartingVehicleName = TrainsetDisplay.DefaultStartingVehicle(trainset);
AppServices.Current.State.CurrentScenery = _listScenery;
AppServices.Current.State.CurrentTrainset = trainset;
AppServices.Current.State.StartingVehicleName = TrainsetDisplay.DefaultStartingVehicle(trainset);
_consist.LoadFrom(trainset);
}
@@ -313,8 +313,8 @@ public partial class Depot : UserControl
private void ApplyConsist(Trainset target, List<Dynamic> vehicles)
{
target.Vehicles = vehicles;
AppState.Instance.CurrentScenery = _listScenery;
AppState.Instance.CurrentTrainset = target;
AppServices.Current.State.CurrentScenery = _listScenery;
AppServices.Current.State.CurrentTrainset = target;
_consist.LoadFrom(target);
PopulateSceneryConsists();
}
@@ -322,8 +322,8 @@ public partial class Depot : UserControl
private void RemoveAllVehicles(Trainset target)
{
target.Vehicles = new List<Dynamic>();
AppState.Instance.CurrentScenery = _listScenery;
AppState.Instance.CurrentTrainset = target;
AppServices.Current.State.CurrentScenery = _listScenery;
AppServices.Current.State.CurrentTrainset = target;
_consist.LoadFrom(target);
PopulateSceneryConsists();
}
@@ -355,7 +355,7 @@ public partial class Depot : UserControl
public async Task RandomizeCurrentTrainsetAsync()
{
if (AppState.Instance.CurrentTrainset is not { } trainset)
if (AppServices.Current.State.CurrentTrainset is not { } trainset)
return;
if (!ReferenceEquals(trainset, _consist.EditingTrainset))

View File

@@ -13,6 +13,7 @@ using StarterNG.Classes;
using StarterNG.Controls;
using StarterNG.Domain;
using StarterNG.Domain.Vehicles;
using StarterNG.Application;
namespace StarterNG.Views;
@@ -277,7 +278,7 @@ public sealed class VehicleDetails
if (ReferenceEquals(_consist.Selected, item))
_consist.SyncStartingVehicle();
_redraw();
AppState.Instance.NotifyChanged();
AppServices.Current.State.NotifyChanged();
};
driver.MinWidth = 0;
driver.HorizontalAlignment = HorizontalAlignment.Stretch;
@@ -617,7 +618,7 @@ public sealed class VehicleDetails
var typeCombo = new ComboBox { FontSize = 12, MinWidth = 120 };
typeCombo.Items.Add(new ComboBoxItem { Content = App.Loc["None"], Tag = null });
foreach (var name in available)
typeCombo.Items.Add(new ComboBoxItem { Content = LoadWeights.Describe(name), Tag = name });
typeCombo.Items.Add(new ComboBoxItem { Content = DescribeLoad(name), Tag = name });
typeCombo.SelectedIndex = 0;
if (!string.IsNullOrEmpty(lead.LoadType))
@@ -754,4 +755,14 @@ public sealed class VehicleDetails
countRow,
BuildVehicleLoadTools(item));
}
/// <summary>
/// Label for a cargo type. The pantograph state is carried as a pseudo load
/// and gets a translated name rather than its raw token.
/// </summary>
private static string DescribeLoad(string name) =>
string.Equals(name, Dynamic.PantState, StringComparison.OrdinalIgnoreCase)
? App.Loc["LoadPantState"]
: name;
}

View File

@@ -76,7 +76,7 @@ public partial class Scenarios : UserControl
continue;
bool expand = StarterNG.Classes.Settings.Instance.AutoExpandSceneryTree;
SceneryI18n.LoadFor(scenery, App.Loc.CurrentLangCode);
AppServices.Current.SceneryTexts.LoadFor(scenery, App.Loc.CurrentLangCode);
string label = scenery.DisplayName;
if (string.IsNullOrEmpty(scenery.Group))
@@ -93,7 +93,7 @@ public partial class Scenarios : UserControl
{
groupNode = new TreeViewItem
{
Header = SceneryI18n.T(scenery.Group),
Header = AppServices.Current.SceneryTexts.Translate(scenery.Group),
IsExpanded = expand
};
groupNodes[scenery.Group] = groupNode;
@@ -261,7 +261,7 @@ public partial class Scenarios : UserControl
{
trainset.Vehicles = vehicles;
item.Content = TrainsetListContent(trainset);
if (ReferenceEquals(AppState.Instance.CurrentTrainset, trainset))
if (ReferenceEquals(AppServices.Current.State.CurrentTrainset, trainset))
ShowConsist(trainset);
}
@@ -309,8 +309,8 @@ public partial class Scenarios : UserControl
private void ShowSceneryInfo(Scenery scenery)
{
SceneryI18n.LoadFor(scenery, App.Loc.CurrentLangCode);
sceneryDescription.Text = scenery.LocalizedDescription;
AppServices.Current.SceneryTexts.LoadFor(scenery, App.Loc.CurrentLangCode);
sceneryDescription.Text = scenery.LocalizedDescription(AppServices.Current.SceneryTexts);
string? imagePath = AppServices.Current.SceneryImages.Resolve(scenery);
if (imagePath is not null)
@@ -401,7 +401,7 @@ public partial class Scenarios : UserControl
public void RebuildAfterLanguageChange()
{
string? selected = AppState.Instance.CurrentScenery?.Path;
string? selected = AppServices.Current.State.CurrentScenery?.Path;
BuildSceneryTree();
if (!string.IsNullOrEmpty(selected))
{
@@ -409,8 +409,8 @@ public partial class Scenarios : UserControl
Path.GetFileNameWithoutExtension(selected);
RestoreLastScenery();
}
if (AppState.Instance.CurrentScenery != null)
ShowSceneryInfo(AppState.Instance.CurrentScenery);
if (AppServices.Current.State.CurrentScenery != null)
ShowSceneryInfo(AppServices.Current.State.CurrentScenery);
RefreshSelectedConsist();
}
@@ -422,7 +422,7 @@ public partial class Scenarios : UserControl
_reloading = true;
try
{
string? selected = AppState.Instance.CurrentScenery?.Path;
string? selected = AppServices.Current.State.CurrentScenery?.Path;
await Task.Run(() => AppServices.Current.Library.ReloadSceneries());
Sceneries = AppServices.Current.Library.Sceneries;
BuildSceneryTree();
@@ -443,14 +443,14 @@ public partial class Scenarios : UserControl
private void RandomTexturesButton_OnClick(object? sender, RoutedEventArgs e)
{
if (AppState.Instance.CurrentScenery is { } scenery)
if (AppServices.Current.State.CurrentScenery is { } scenery)
RandomizeTexturesRequested?.Invoke(scenery);
}
public void RefreshConsistView()
{
RefreshVehicleLabels();
if (AppState.Instance.CurrentTrainset is { } trainset)
if (AppServices.Current.State.CurrentTrainset is { } trainset)
ShowConsist(trainset);
}
@@ -505,7 +505,7 @@ public partial class Scenarios : UserControl
private void OpenSceneryDir_OnClick(object? sender, RoutedEventArgs e)
{
var scn = AppState.Instance.CurrentScenery;
var scn = AppServices.Current.State.CurrentScenery;
string dir = scn != null
? (Path.GetDirectoryName(Path.GetFullPath(scn.Path)) ?? "scenery")
: Path.GetFullPath("scenery");
@@ -538,9 +538,9 @@ public partial class Scenarios : UserControl
return;
Trainset selectedTrainset = selectedScn.Trainsets[vTag];
AppState.Instance.CurrentScenery = selectedScn;
AppState.Instance.CurrentTrainset = selectedTrainset;
AppState.Instance.StartingVehicleName = TrainsetDisplay.DefaultStartingVehicle(selectedTrainset);
AppServices.Current.State.CurrentScenery = selectedScn;
AppServices.Current.State.CurrentTrainset = selectedTrainset;
AppServices.Current.State.StartingVehicleName = TrainsetDisplay.DefaultStartingVehicle(selectedTrainset);
ShowConsist(selectedTrainset);
ShowTimetable(selectedScn, selectedTrainset);
@@ -874,13 +874,13 @@ public partial class Scenarios : UserControl
trainset.Vehicles.Remove(v);
bool wasPicked = !string.IsNullOrEmpty(v.Name) &&
string.Equals(v.Name, AppState.Instance.StartingVehicleName,
string.Equals(v.Name, AppServices.Current.State.StartingVehicleName,
StringComparison.OrdinalIgnoreCase);
if (wasPicked && trainset.Vehicles.Count > 0)
{
int next = Math.Clamp(gap, 0, trainset.Vehicles.Count - 1);
AppState.Instance.StartingVehicleName = trainset.Vehicles[next].Name;
AppState.Instance.NotifyChanged();
AppServices.Current.State.StartingVehicleName = trainset.Vehicles[next].Name;
AppServices.Current.State.NotifyChanged();
}
RefreshVehicleLabels();
@@ -909,7 +909,7 @@ public partial class Scenarios : UserControl
: MissingMiniBox(train.SkinFile, thumbH);
bool selected = !string.IsNullOrEmpty(train.Name) &&
string.Equals(train.Name, AppState.Instance.StartingVehicleName,
string.Equals(train.Name, AppServices.Current.State.StartingVehicleName,
StringComparison.OrdinalIgnoreCase);
var slot = new Border
@@ -946,7 +946,7 @@ public partial class Scenarios : UserControl
string desc = trainset.Description ?? "";
if (desc.TrimStart().StartsWith('-'))
desc = desc.TrimStart()[1..].TrimStart();
missionDescription.Text = SceneryI18n.T(desc);
missionDescription.Text = AppServices.Current.SceneryTexts.Translate(desc);
UpdateTrainStats(trainset);
}
@@ -995,8 +995,8 @@ public partial class Scenarios : UserControl
index >= clicked.Vehicles.Count)
return;
AppState.Instance.StartingVehicleName = clicked.Vehicles[index].Name;
AppState.Instance.NotifyChanged();
AppServices.Current.State.StartingVehicleName = clicked.Vehicles[index].Name;
AppServices.Current.State.NotifyChanged();
ShowConsist(clicked);
return;
}
@@ -1204,7 +1204,7 @@ public partial class Scenarios : UserControl
private void RefreshSelectedConsist()
{
if (AppState.Instance.CurrentTrainset is { } trainset)
if (AppServices.Current.State.CurrentTrainset is { } trainset)
ShowConsist(trainset);
}
}