From eb1376d8f03fe6c448f7c55a5ba6e91c932e5519 Mon Sep 17 00:00:00 2001 From: Benjamin Sutas Date: Wed, 10 Jun 2026 16:51:28 +1000 Subject: [PATCH 1/5] remove old files --- DataQuery/DataQuery.csproj | 15 -- DataQuery/Program.cs | 190 ------------------------ dlls/Avalonia.Controls.TreeDataGrid.dll | Bin 277504 -> 0 bytes 3 files changed, 205 deletions(-) delete mode 100644 DataQuery/DataQuery.csproj delete mode 100644 DataQuery/Program.cs delete mode 100644 dlls/Avalonia.Controls.TreeDataGrid.dll diff --git a/DataQuery/DataQuery.csproj b/DataQuery/DataQuery.csproj deleted file mode 100644 index 02017247..00000000 --- a/DataQuery/DataQuery.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - Exe - net9.0 - enable - enable - - - - - - - - diff --git a/DataQuery/Program.cs b/DataQuery/Program.cs deleted file mode 100644 index 08d46af5..00000000 --- a/DataQuery/Program.cs +++ /dev/null @@ -1,190 +0,0 @@ -// See https://aka.ms/new-console-template for more information -using OpenLoco.Common.Logging; -using Common.Logging; -using OpenLoco.Dat.Data; -using Common.Logging; -using OpenLoco.Dat.FileParsing; -using Common.Logging; -using OpenLoco.Dat.Objects; -using Common.Logging; -using OpenLoco.Definitions.Database; -using Common.Logging; -using System.Reflection; -using Common.Logging; - -var dir = "Q:\\Games\\Locomotion\\Server\\Objects"; -var logger = new Logger(); -var index = ObjectIndex.LoadOrCreateIndex(dir, logger); - -//QueryCostIndices(dir, logger, index); -//QueryCargoCategories(dir, logger, index); -//QueryVehicleBodyUnkSprites(dir, logger, index); -//QueryIndustryHasShadows(dir, logger, index); - -Console.WriteLine("done"); - -Console.ReadLine(); - -static void QueryIndustryHasShadows(string dir, Logger logger, ObjectIndex index) -{ - var results = new List<(ObjectIndexEntry Obj, ObjectSource ObjectSource)>(); - - foreach (var obj in index.Objects.Where(x => x.ObjectType == ObjectType.Industry)) - { - try - { - var o = SawyerStreamReader.LoadFullObjectFromFile(Path.Combine(dir, obj.FileName), logger); - if (o?.LocoObject != null) - { - var struc = (IndustryObject)o.Value.LocoObject.Object; - var header = o.Value.DatFileInfo.S5Header; - var source = OriginalObjectFiles.GetFileSource(header.Name, header.Checksum); - - if (struc.Flags.HasFlag(IndustryObjectFlags.HasShadows)) - { - results.Add((obj, source)); - } - } - } - catch (Exception ex) - { - Console.WriteLine($"{obj.FileName} - {ex.Message}"); - } - } - - Console.WriteLine(results.Count); - - const string csvHeader = "DatName, ObjectSource"; - var lines = results - .OrderBy(x => x.Obj.DisplayName) - .Select(x => string.Join(',', x.Obj.DisplayName, x.ObjectSource)); - - File.WriteAllLines("vehicleBodiesWithUnkSpritesFlag.csv", [csvHeader, .. lines]); -} - -static void QueryVehicleBodyUnkSprites(string dir, Logger logger, ObjectIndex index) -{ - var results = new List<(ObjectIndexEntry Obj, ObjectSource ObjectSource)>(); - - foreach (var obj in index.Objects.Where(x => x.ObjectType == ObjectType.Vehicle)) - { - try - { - var o = SawyerStreamReader.LoadFullObjectFromFile(Path.Combine(dir, obj.FileName), logger); - if (o?.LocoObject != null) - { - var struc = (VehicleObject)o.Value.LocoObject.Object; - var header = o.Value.DatFileInfo.S5Header; - var source = OriginalObjectFiles.GetFileSource(header.Name, header.Checksum); - - if (struc.Flags.HasFlag(VehicleObjectFlags.AlternatingCarSprite)) - { - results.Add((obj, source)); - } - } - } - catch (Exception ex) - { - Console.WriteLine($"{obj.FileName} - {ex.Message}"); - } - } - - Console.WriteLine(results.Count); - - const string csvHeader = "DatName, ObjectSource"; - var lines = results - .OrderBy(x => x.Obj.DisplayName) - .Select(x => string.Join(',', x.Obj.DisplayName, x.ObjectSource)); - - File.WriteAllLines("vehicleBodiesWithUnkSpritesFlag.csv", [csvHeader, .. lines]); -} - -static void QueryCargoCategories(string dir, Logger logger, ObjectIndex index) -{ - var results = new List<(ObjectIndexEntry Obj, CargoCategory CargoCategory, string LocalisedName, ObjectSource ObjectSource)>(); - - foreach (var obj in index.Objects.Where(x => x.ObjectType == ObjectType.Cargo)) - { - try - { - var o = SawyerStreamReader.LoadFullObjectFromFile(Path.Combine(dir, obj.FileName), logger); - if (o?.LocoObject != null) - { - var struc = (CargoObject)o.Value.LocoObject.Object; - - var header = o.Value.DatFileInfo.S5Header; - var source = OriginalObjectFiles.GetFileSource(header.Name, header.Checksum); - - results.Add((obj, struc.CargoCategory, o.Value.LocoObject.StringTable.Table["Name"][LanguageId.English_UK], source)); - } - } - catch (Exception ex) - { - Console.WriteLine($"{obj.FileName} - {ex.Message}"); - } - } - - Console.WriteLine("writing to file"); - - const string csvHeader = "DatName, CargoCategory, LocalisedName, ObjectSource"; - var lines = results - .OrderBy(x => x.Obj.DisplayName) - .Select(x => string.Join(',', x.Obj.DisplayName, (int)x.CargoCategory, x.LocalisedName, x.ObjectSource)); - File.WriteAllLines("cargoCategories.csv", [csvHeader, .. lines]); -} - -static void QueryCostIndices(string dir, Logger logger, ObjectIndex index) -{ - var results = new List<(ObjectIndexEntry Obj, byte CostIndex, short? RunCostIndex)>(); - - foreach (var obj in index.Objects) - { - try - { - var o = SawyerStreamReader.LoadFullObjectFromFile(Path.Combine(dir, obj.FileName), logger); - if (o?.LocoObject != null) - { - var struc = o.Value.LocoObject.Object; - var type = struc.GetType(); - - var costIndexProperty = type.GetProperty("CostIndex", BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance); - var paymentIndexProperty = type.GetProperty("PaymentIndex", BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance); - var runCostIndexProperty = type.GetProperty("RunCostIndex", BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance); - - byte? costIndex = null; - byte? runCostIndex = null; - - if (costIndexProperty?.PropertyType == typeof(byte) && costIndexProperty.GetValue(struc) is byte costIndexValue) - { - costIndex = costIndexValue; - } - else if (paymentIndexProperty?.PropertyType == typeof(byte) && paymentIndexProperty.GetValue(struc) is byte paymentIndexValue) - { - costIndex = paymentIndexValue; - } - - if (runCostIndexProperty?.PropertyType == typeof(byte) && runCostIndexProperty.GetValue(struc) is byte runCostIndexValue) - { - runCostIndex = runCostIndexValue; - } - - if (costIndex != null) - { - results.Add((obj, costIndex.Value, runCostIndex)); - } - } - } - catch (Exception ex) - { - Console.WriteLine($"{obj.FileName} - {ex.Message}"); - } - } - - Console.WriteLine("writing to file"); - - const string header = "DatName, ObjectType, CostIndex, RunCostIndex"; - var lines = results - .OrderBy(x => x.Obj.DisplayName) - .Select(x => string.Join(',', x.Obj.DisplayName, x.Obj.ObjectType, x.CostIndex, x.RunCostIndex)); - File.WriteAllLines("costIndex.csv", [header, .. lines]); -} diff --git a/dlls/Avalonia.Controls.TreeDataGrid.dll b/dlls/Avalonia.Controls.TreeDataGrid.dll deleted file mode 100644 index 16db0de53390271a8f931d2274363e5782ab2fd8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 277504 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 !^*c(*96OV)wQ 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

=N2Kpo{`PhA`x7e~j%(V-jzez+D( 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 tPiy|V3p9P Date: Wed, 10 Jun 2026 17:49:44 +1000 Subject: [PATCH 2/5] add image table group configuration and update related functionality --- Definitions/Definitions.csproj | 6 + .../Graphics/ImageTableGroupConfiguration.cs | 13 ++ .../Graphics/ImageTableGrouper.cs | 184 ++++++++---------- .../Graphics/ImageTableGroups.json | 100 ++++++++++ Gui/EditorSettings.cs | 6 + Gui/Gui.csproj | 6 + Gui/Models/ObjectEditorContext.cs | 34 ++++ 7 files changed, 251 insertions(+), 98 deletions(-) create mode 100644 Definitions/ObjectModels/Graphics/ImageTableGroupConfiguration.cs create mode 100644 Definitions/ObjectModels/Graphics/ImageTableGroups.json diff --git a/Definitions/Definitions.csproj b/Definitions/Definitions.csproj index 1d3364be..90a994c0 100644 --- a/Definitions/Definitions.csproj +++ b/Definitions/Definitions.csproj @@ -63,6 +63,12 @@ + + + PreserveNewest + + + diff --git a/Definitions/ObjectModels/Graphics/ImageTableGroupConfiguration.cs b/Definitions/ObjectModels/Graphics/ImageTableGroupConfiguration.cs new file mode 100644 index 00000000..1c0207d8 --- /dev/null +++ b/Definitions/ObjectModels/Graphics/ImageTableGroupConfiguration.cs @@ -0,0 +1,13 @@ +using System.Text.Json.Serialization; + +namespace Definitions.ObjectModels.Graphics; + +internal sealed record ImageTableGroupDefinition( + [property: JsonPropertyName("name")] string Name, + [property: JsonPropertyName("start")] int Start +); + +internal sealed record ImageTableGroupConfiguration( + [property: JsonPropertyName("objectType")] string ObjectType, + [property: JsonPropertyName("groups")] List Groups +); diff --git a/Definitions/ObjectModels/Graphics/ImageTableGrouper.cs b/Definitions/ObjectModels/Graphics/ImageTableGrouper.cs index 98e4463d..6b36130d 100644 --- a/Definitions/ObjectModels/Graphics/ImageTableGrouper.cs +++ b/Definitions/ObjectModels/Graphics/ImageTableGrouper.cs @@ -1,7 +1,10 @@ +using Common.Json; using Definitions.ObjectModels.Objects.Competitor; using Definitions.ObjectModels.Objects.Vehicle; using Definitions.ObjectModels.Types; using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Text.Json; namespace Definitions.ObjectModels.Graphics; @@ -33,7 +36,7 @@ private static IEnumerable CreateGroups(ILocoStruct obj, Object switch (objectType) { case ObjectType.InterfaceSkin: - return CreateInterfaceGroups(imageList); + return CreateGroupsFromConfig(ObjectType.InterfaceSkin, imageList); case ObjectType.Sound: return [new("", [.. imageList])]; case ObjectType.Currency: @@ -41,15 +44,15 @@ private static IEnumerable CreateGroups(ILocoStruct obj, Object case ObjectType.Steam: return [new("", [.. imageList])]; case ObjectType.CliffEdge: - return CreateCliffEdgeGroups(imageList); + return CreateGroupsFromConfig(ObjectType.CliffEdge, imageList); case ObjectType.Water: - return CreateWaterGroups(imageList); + return CreateGroupsFromConfig(ObjectType.Water, imageList); case ObjectType.Land: return [new("", [.. imageList])]; case ObjectType.TownNames: return [new("", [.. imageList])]; case ObjectType.Cargo: - return CreateCargoGroups(imageList); + return CreateGroupsFromConfig(ObjectType.Cargo, imageList); case ObjectType.Wall: return [new("", [.. imageList])]; case ObjectType.TrackSignal: @@ -61,7 +64,7 @@ private static IEnumerable CreateGroups(ILocoStruct obj, Object case ObjectType.Tunnel: return [new("", [.. imageList])]; case ObjectType.Bridge: - return CreateBridgeGroups(imageList); + return CreateGroupsFromConfig(ObjectType.Bridge, imageList); case ObjectType.TrackStation: return [new("", [.. imageList])]; case ObjectType.TrackExtra: @@ -99,12 +102,89 @@ private static IEnumerable CreateGroups(ILocoStruct obj, Object case ObjectType.ScenarioText: return [new("", [.. imageList])]; case ObjectType.Scaffolding: - return CreateScaffoldingGroups(imageList); + return CreateGroupsFromConfig(ObjectType.Scaffolding, imageList); default: return []; } } + private static IEnumerable CreateGroupsFromConfig(ObjectType objectType, List imageList) + { + if (TryGetGroupConfiguration(objectType, out var configuration)) + { + return CreateGroupsFromConfig(configuration, imageList); + } + + return [new("", [.. imageList])]; + } + + private static bool TryGetGroupConfiguration(ObjectType objectType, [NotNullWhen(true)] out ImageTableGroupConfiguration? configuration) + { + configuration = null; + return GroupConfigurations.TryGetValue(objectType, out configuration); + } + + private static IEnumerable CreateGroupsFromConfig(ImageTableGroupConfiguration configuration, List imageList) + { + var groups = configuration.Groups.OrderBy(group => group.Start).ToList(); + for (var index = 0; index < groups.Count; index++) + { + var current = groups[index]; + var nextStart = index + 1 < groups.Count + ? groups[index + 1].Start + : imageList.Count; + + if (current.Start < 0) + { + continue; + } + + if (current.Start >= imageList.Count) + { + break; // no images remain for this or later groups + } + + var actualEnd = Math.Min(nextStart, imageList.Count); + if (actualEnd <= current.Start) + { + continue; // no images for this group + } + + if (nextStart > imageList.Count) + { + yield return new("", imageList[current.Start..actualEnd]); + break; + } + + yield return new(current.Name, imageList[current.Start..actualEnd]); + } + } + + public static void LoadGroupConfigurationFile(string configFilePath) + { + if (string.IsNullOrEmpty(configFilePath) || !File.Exists(configFilePath)) + { + GroupConfigurations = new Dictionary(); + return; + } + + try + { + var json = File.ReadAllText(configFilePath); + var configurations = JsonSerializer.Deserialize>(json, JsonFile.DefaultSerializerOptions) ?? []; + GroupConfigurations = configurations + .Select(configuration => (configuration, success: Enum.TryParse(configuration.ObjectType, ignoreCase: true, out var objectType), objectType)) + .Where(pair => pair.success) + .ToDictionary(pair => pair.objectType, pair => pair.configuration); + } + catch (JsonException) + { + GroupConfigurations = new Dictionary(); + } + } + + private static IReadOnlyDictionary GroupConfigurations = new Dictionary(); + private static IEnumerable CreateAirportGroups(List imageList) { yield return new("preview", imageList[0..1]); @@ -118,34 +198,11 @@ private static IEnumerable CreateAirportGroups(List CreateBridgeGroups(List imageList) - { - yield return new("preview", imageList[0..1]); - yield return new("base plates", imageList[1..6]); - yield return new("unk", imageList[6..12]); - yield return new("", imageList[12..]); - } - private static IEnumerable CreateBuildingGroups(List imageList) => imageList .Chunk(4) .Select((x, i) => new ImageTableGroup($"Part {i}", [.. x])); - private static IEnumerable CreateCargoGroups(List imageList) - { - yield return new("preview", imageList[0..1]); - yield return new("station variations", imageList[1..]); - } - - private static IEnumerable CreateCliffEdgeGroups(List imageList) - { - yield return new("left west", imageList[0..16]); - yield return new("right east", imageList[16..32]); - yield return new("right west", imageList[32..48]); - yield return new("left east", imageList[48..64]); - yield return new("far-side slopes", imageList[64..]); - } - private static IEnumerable CreateCompetitorGroups(CompetitorObject model, List imageList) { var offset = 0; @@ -365,63 +422,6 @@ private static IEnumerable CreateDockGroups(List CreateInterfaceGroups(List imageList) - { - yield return new("preview", imageList[0..1]); - yield return new("toolbar", imageList[1..31]); - yield return new("build-vehicle", imageList[31..43]); - yield return new("toolbar", imageList[43..49]); - yield return new("paint", imageList[49..57]); - yield return new("population", imageList[57..65]); - yield return new("performance-index", imageList[65..73]); - yield return new("cargo-units", imageList[73..81]); - yield return new("cargo-distance", imageList[81..89]); - yield return new("production", imageList[89..97]); - yield return new("wrench", imageList[97..113]); - yield return new("finances", imageList[113..129]); - yield return new("cup", imageList[129..145]); - yield return new("ratings", imageList[145..161]); - yield return new("transported", imageList[161..168]); - yield return new("cogs", imageList[168..172]); - yield return new("toolbar", imageList[172..203]); - yield return new("tab-train", imageList[203..211]); - yield return new("tab-aircraft", imageList[211..219]); - yield return new("tab-bus", imageList[219..227]); - yield return new("tab-tram", imageList[227..235]); - yield return new("tab-truck", imageList[235..243]); - yield return new("tab-ship", imageList[243..251]); - yield return new("build-train", imageList[251..267]); - yield return new("build-aircraft", imageList[267..283]); - yield return new("build-bus", imageList[283..299]); - yield return new("build-tram", imageList[299..315]); - yield return new("build-truck", imageList[315..331]); - yield return new("build-ship", imageList[331..347]); - yield return new("build-industry", imageList[347..363]); - yield return new("build-town", imageList[363..379]); - yield return new("build-buildings", imageList[379..395]); - yield return new("build-misc-buildings", imageList[395..411]); - yield return new("build-extra", imageList[411..418]); - yield return new("train", imageList[418..426]); - yield return new("aircraft", imageList[426..434]); - yield return new("bus", imageList[434..442]); - yield return new("tram", imageList[442..450]); - yield return new("truck", imageList[450..458]); - yield return new("ship", imageList[458..466]); - yield return new("toolbar-map", imageList[466..470]); - - // custom images added by OG - yield return new("high-res-logo", imageList[470..471]); - yield return new("blueprints", imageList[471..490]); - yield return new("", imageList[490..]); - } - - private static IEnumerable CreateScaffoldingGroups(List imageList) - { - yield return new("type 0", imageList[0..10]); - yield return new("type 1", imageList[10..24]); - yield return new("type 2", imageList[24..36]); - } - private static IEnumerable CreateStreetLightGroups(List imageList) => imageList .Chunk(4) @@ -431,16 +431,4 @@ private static IEnumerable CreateTreeGroups(List imageList .Chunk(4) .Select((x, i) => new ImageTableGroup($"Variation {i}", [.. x])); - - private static IEnumerable CreateWaterGroups(List imageList) - { - yield return new("zoom 1", imageList[0..10]); - yield return new("zoom 2", imageList[10..20]); - yield return new("zoom 3", imageList[20..30]); - yield return new("zoom 4", imageList[30..40]); - yield return new("palettes", imageList[40..42]); - yield return new("icon-animation", imageList[42..58]); - yield return new("icon-interaction", imageList[58..60]); - yield return new("animation", imageList[60..76]); - } } diff --git a/Definitions/ObjectModels/Graphics/ImageTableGroups.json b/Definitions/ObjectModels/Graphics/ImageTableGroups.json new file mode 100644 index 00000000..79e32a8a --- /dev/null +++ b/Definitions/ObjectModels/Graphics/ImageTableGroups.json @@ -0,0 +1,100 @@ +[ + { + "objectType": "InterfaceSkin", + "groups": [ + { "name": "preview", "start": 0 }, + { "name": "toolbar", "start": 1 }, + { "name": "build-vehicle", "start": 31 }, + { "name": "toolbar", "start": 43 }, + { "name": "paint", "start": 49 }, + { "name": "population", "start": 57 }, + { "name": "performance-index", "start": 65 }, + { "name": "cargo-units", "start": 73 }, + { "name": "cargo-distance", "start": 81 }, + { "name": "production", "start": 89 }, + { "name": "wrench", "start": 97 }, + { "name": "finances", "start": 113 }, + { "name": "cup", "start": 129 }, + { "name": "ratings", "start": 145 }, + { "name": "transported", "start": 161 }, + { "name": "cogs", "start": 168 }, + { "name": "toolbar", "start": 172 }, + { "name": "tab-train", "start": 203 }, + { "name": "tab-aircraft", "start": 211 }, + { "name": "tab-bus", "start": 219 }, + { "name": "tab-tram", "start": 227 }, + { "name": "tab-truck", "start": 235 }, + { "name": "tab-ship", "start": 243 }, + { "name": "build-train", "start": 251 }, + { "name": "build-aircraft", "start": 267 }, + { "name": "build-bus", "start": 283 }, + { "name": "build-tram", "start": 299 }, + { "name": "build-truck", "start": 315 }, + { "name": "build-ship", "start": 331 }, + { "name": "build-industry", "start": 347 }, + { "name": "build-town", "start": 363 }, + { "name": "build-buildings", "start": 379 }, + { "name": "build-misc-buildings", "start": 395 }, + { "name": "build-extra", "start": 411 }, + { "name": "train", "start": 418 }, + { "name": "aircraft", "start": 426 }, + { "name": "bus", "start": 434 }, + { "name": "tram", "start": 442 }, + { "name": "truck", "start": 450 }, + { "name": "ship", "start": 458 }, + { "name": "toolbar-map", "start": 466 }, + { "name": "high-res-logo", "start": 470 }, + { "name": "blueprints", "start": 471 }, + { "name": "", "start": 490 } + ] + }, + { + "objectType": "Water", + "groups": [ + { "name": "zoom 1", "start": 0 }, + { "name": "zoom 2", "start": 10 }, + { "name": "zoom 3", "start": 20 }, + { "name": "zoom 4", "start": 30 }, + { "name": "palettes", "start": 40 }, + { "name": "icon-animation", "start": 42 }, + { "name": "icon-interaction", "start": 58 }, + { "name": "animation", "start": 60 }, + { "name": "", "start": 76 } + ] + }, + { + "objectType": "Bridge", + "groups": [ + { "name": "preview", "start": 0 }, + { "name": "base plates", "start": 1 }, + { "name": "unk", "start": 6 }, + { "name": "", "start": 12 } + ] + }, + { + "objectType": "Cargo", + "groups": [ + { "name": "preview", "start": 0 }, + { "name": "station variations", "start": 1 } + ] + }, + { + "objectType": "CliffEdge", + "groups": [ + { "name": "left west", "start": 0 }, + { "name": "right east", "start": 16 }, + { "name": "right west", "start": 32 }, + { "name": "left east", "start": 48 }, + { "name": "far-side slopes", "start": 64 } + ] + }, + { + "objectType": "Scaffolding", + "groups": [ + { "name": "type 0", "start": 0 }, + { "name": "type 1", "start": 10 }, + { "name": "type 2", "start": 24 }, + { "name": "", "start": 36 } + ] + } +] diff --git a/Gui/EditorSettings.cs b/Gui/EditorSettings.cs index d480a633..0bc0b873 100644 --- a/Gui/EditorSettings.cs +++ b/Gui/EditorSettings.cs @@ -43,6 +43,7 @@ public HashSet ObjDataDirectories public string ObjectIndicesFolder { get; set; } = string.Empty; public string DownloadFolder { get; set; } = string.Empty; public string CacheFolder { get; set; } = string.Empty; + public string ConfigFolder { get; set; } = string.Empty; public string LocomotionSteamObjDataFolder { get; set; } = string.Empty; public string LocomotionGoGObjDataFolder { get; set; } = string.Empty; @@ -151,6 +152,11 @@ public bool Validate(ILogger logger) logger.LogWarning("Invalid settings file: ObjData folder \"{ObjDataDirectory}\" does not exist", ObjDataDirectory); return false; } + if (!string.IsNullOrEmpty(ConfigFolder) && !Directory.Exists(ConfigFolder)) + { + logger.LogWarning("Invalid settings file: Config folder \"{ConfigFolder}\" does not exist", ConfigFolder); + return false; + } if (!string.IsNullOrEmpty(CacheFolder) && !Directory.Exists(CacheFolder)) { diff --git a/Gui/Gui.csproj b/Gui/Gui.csproj index 782b79ff..74430e17 100644 --- a/Gui/Gui.csproj +++ b/Gui/Gui.csproj @@ -43,6 +43,12 @@ + + + Gui.ImageTableGroups.json + + + diff --git a/Gui/Models/ObjectEditorContext.cs b/Gui/Models/ObjectEditorContext.cs index e9423f01..44b2afd9 100644 --- a/Gui/Models/ObjectEditorContext.cs +++ b/Gui/Models/ObjectEditorContext.cs @@ -6,6 +6,7 @@ using Dat.Types; using Definitions.DTO; using Definitions.ObjectModels; +using Definitions.ObjectModels.Graphics; using Definitions.ObjectModels.Types; using DynamicData; using Index; @@ -13,6 +14,7 @@ using SixLabors.ImageSharp; using System; using System.Collections.Concurrent; +using System.Reflection; using System.Collections.Generic; using System.Collections.ObjectModel; using System.IO; @@ -79,6 +81,10 @@ public ObjectEditorContext() Settings.ObjectIndicesFolder = InitialiseDirectory(Settings.ObjectIndicesFolder, "objectIndices"); Settings.CacheFolder = InitialiseDirectory(Settings.CacheFolder, "cache"); Settings.DownloadFolder = InitialiseDirectory(Settings.DownloadFolder, "downloads"); + Settings.ConfigFolder = InitialiseDirectory(Settings.ConfigFolder, "config"); + + EnsureDefaultImageTableGroupConfigExists(Settings.ConfigFolder); + ImageTableGrouper.LoadGroupConfigurationFile(Path.Combine(Settings.ConfigFolder, "ImageTableGroups.json")); ObjectServiceClient = new(Settings, Logger); ObjectServiceModel = new ObjectServiceModel(ObjectServiceClient, Logger); @@ -155,6 +161,34 @@ string InitialiseDirectory(string folder, string defaultName) return folder; } + void EnsureDefaultImageTableGroupConfigExists(string configFolder) + { + var configFilePath = Path.Combine(configFolder, "ImageTableGroups.json"); + if (File.Exists(configFilePath)) + { + return; + } + + try + { + using var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Gui.ImageTableGroups.json"); + if (stream == null) + { + Logger.LogError("Default image table group configuration resource not found."); + return; + } + + using var reader = new StreamReader(stream); + var text = reader.ReadToEnd(); + File.WriteAllText(configFilePath, text); + Logger.LogInformation("Copied default ImageTableGroups.json to {ConfigFilePath}", configFilePath); + } + catch (Exception ex) + { + Logger.LogError(ex, "Failed to create default ImageTableGroups.json at {ConfigFilePath}", configFilePath); + } + } + public bool TryLoadObject(FileSystemItem filesystemItem, out LocoUIObjectModel? uiLocoFile) { uiLocoFile = null; From 8bde79fe25d967eed2d8ec164d749b1bbbd3e522 Mon Sep 17 00:00:00 2001 From: Benjamin Sutas Date: Wed, 10 Jun 2026 18:09:40 +1000 Subject: [PATCH 3/5] update image table group configuration to include chunk size and add new object types --- .../Graphics/ImageTableGroupConfiguration.cs | 3 +- .../Graphics/ImageTableGrouper.cs | 85 ++++++++----------- .../Graphics/ImageTableGroups.json | 30 +++++++ 3 files changed, 68 insertions(+), 50 deletions(-) diff --git a/Definitions/ObjectModels/Graphics/ImageTableGroupConfiguration.cs b/Definitions/ObjectModels/Graphics/ImageTableGroupConfiguration.cs index 1c0207d8..256ea8ee 100644 --- a/Definitions/ObjectModels/Graphics/ImageTableGroupConfiguration.cs +++ b/Definitions/ObjectModels/Graphics/ImageTableGroupConfiguration.cs @@ -4,7 +4,8 @@ namespace Definitions.ObjectModels.Graphics; internal sealed record ImageTableGroupDefinition( [property: JsonPropertyName("name")] string Name, - [property: JsonPropertyName("start")] int Start + [property: JsonPropertyName("start")] int Start, + [property: JsonPropertyName("chunkSize")] int? ChunkSize = null ); internal sealed record ImageTableGroupConfiguration( diff --git a/Definitions/ObjectModels/Graphics/ImageTableGrouper.cs b/Definitions/ObjectModels/Graphics/ImageTableGrouper.cs index 6b36130d..c75f68f2 100644 --- a/Definitions/ObjectModels/Graphics/ImageTableGrouper.cs +++ b/Definitions/ObjectModels/Graphics/ImageTableGrouper.cs @@ -60,7 +60,7 @@ private static IEnumerable CreateGroups(ILocoStruct obj, Object case ObjectType.LevelCrossing: return [new("", [.. imageList])]; case ObjectType.StreetLight: - return CreateStreetLightGroups(imageList); + return CreateGroupsFromConfig(ObjectType.StreetLight, imageList); case ObjectType.Tunnel: return [new("", [.. imageList])]; case ObjectType.Bridge: @@ -78,13 +78,13 @@ private static IEnumerable CreateGroups(ILocoStruct obj, Object case ObjectType.Road: return [new("", [.. imageList])]; case ObjectType.Airport: - return CreateAirportGroups(imageList); + return CreateGroupsFromConfig(ObjectType.Airport, imageList); case ObjectType.Dock: - return CreateDockGroups(imageList); + return CreateGroupsFromConfig(ObjectType.Dock, imageList); case ObjectType.Vehicle: return CreateVehicleGroups((VehicleObject)obj, imageList); case ObjectType.Tree: - return CreateTreeGroups(imageList); + return CreateGroupsFromConfig(ObjectType.Tree, imageList); case ObjectType.Snow: return [new("", [.. imageList])]; case ObjectType.Climate: @@ -92,9 +92,9 @@ private static IEnumerable CreateGroups(ILocoStruct obj, Object case ObjectType.HillShapes: return [new("", [.. imageList])]; case ObjectType.Building: - return CreateBuildingGroups(imageList); + return CreateGroupsFromConfig(ObjectType.Building, imageList); case ObjectType.Industry: - return CreateBuildingGroups(imageList); + return CreateGroupsFromConfig(ObjectType.Industry, imageList); case ObjectType.Region: return [new("", [.. imageList])]; case ObjectType.Competitor: @@ -150,13 +150,40 @@ private static IEnumerable CreateGroupsFromConfig(ImageTableGro continue; // no images for this group } + if (current.ChunkSize is null) + { + if (nextStart > imageList.Count) + { + yield return new("", imageList[current.Start..actualEnd]); + break; + } + + yield return new(current.Name, imageList[current.Start..actualEnd]); + continue; + } + + if (current.ChunkSize <= 0) + { + continue; + } + + var actualChunkSize = current.ChunkSize.Value; + var chunkIndex = 0; + for (var chunkStart = current.Start; chunkStart < actualEnd; chunkStart += actualChunkSize) + { + var chunkEnd = Math.Min(chunkStart + actualChunkSize, actualEnd); + var chunkName = current.Name.Contains("{i}") + ? current.Name.Replace("{i}", chunkIndex.ToString()) + : current.Name; + + yield return new(chunkName, imageList[chunkStart..chunkEnd]); + chunkIndex++; + } + if (nextStart > imageList.Count) { - yield return new("", imageList[current.Start..actualEnd]); break; } - - yield return new(current.Name, imageList[current.Start..actualEnd]); } } @@ -185,24 +212,6 @@ public static void LoadGroupConfigurationFile(string configFilePath) private static IReadOnlyDictionary GroupConfigurations = new Dictionary(); - private static IEnumerable CreateAirportGroups(List imageList) - { - yield return new("preview", imageList[0..1]); - - foreach (var group in imageList - .Skip(1) - .Chunk(4) - .Select((x, i) => new ImageTableGroup($"Part {i}", [.. x]))) - { - yield return group; - } - } - - private static IEnumerable CreateBuildingGroups(List imageList) - => imageList - .Chunk(4) - .Select((x, i) => new ImageTableGroup($"Part {i}", [.. x])); - private static IEnumerable CreateCompetitorGroups(CompetitorObject model, List imageList) { var offset = 0; @@ -409,26 +418,4 @@ private static IEnumerable CreateVehicleGroups(VehicleObject mo } } - private static IEnumerable CreateDockGroups(List imageList) - { - yield return new("preview", [imageList[0]]); - - foreach (var group in imageList - .Skip(1) - .Chunk(4) - .Select((x, i) => new ImageTableGroup($"Part {i}", [.. x]))) - { - yield return group; - } - } - - private static IEnumerable CreateStreetLightGroups(List imageList) - => imageList - .Chunk(4) - .Select((x, i) => new ImageTableGroup($"Year group {i}", [.. x])); - - private static IEnumerable CreateTreeGroups(List imageList) - => imageList - .Chunk(4) - .Select((x, i) => new ImageTableGroup($"Variation {i}", [.. x])); } diff --git a/Definitions/ObjectModels/Graphics/ImageTableGroups.json b/Definitions/ObjectModels/Graphics/ImageTableGroups.json index 79e32a8a..81e57966 100644 --- a/Definitions/ObjectModels/Graphics/ImageTableGroups.json +++ b/Definitions/ObjectModels/Graphics/ImageTableGroups.json @@ -88,6 +88,36 @@ { "name": "far-side slopes", "start": 64 } ] }, + { + "objectType": "StreetLight", + "groups": [{ "name": "Year group {i}", "start": 0, "chunkSize": 4 }] + }, + { + "objectType": "Tree", + "groups": [{ "name": "Variation {i}", "start": 0, "chunkSize": 4 }] + }, + { + "objectType": "Dock", + "groups": [ + { "name": "preview", "start": 0 }, + { "name": "Part {i}", "start": 1, "chunkSize": 4 } + ] + }, + { + "objectType": "Airport", + "groups": [ + { "name": "preview", "start": 0 }, + { "name": "Part {i}", "start": 1, "chunkSize": 4 } + ] + }, + { + "objectType": "Building", + "groups": [{ "name": "Part {i}", "start": 0, "chunkSize": 4 }] + }, + { + "objectType": "Industry", + "groups": [{ "name": "Part {i}", "start": 0, "chunkSize": 4 }] + }, { "objectType": "Scaffolding", "groups": [ From 9cbf98b4d03e35a3a5bcf9ffc7b88437cb8af500 Mon Sep 17 00:00:00 2001 From: Benjamin Sutas Date: Wed, 10 Jun 2026 18:32:38 +1000 Subject: [PATCH 4/5] add reload functionality for image table grouping and update related configurations --- .../Graphics/ImageTableGrouper.cs | 10 ++++ Gui/Models/ObjectEditorContext.cs | 9 ++-- .../Graphics/ImageTableViewModel.cs | 49 ++++++++++++++++++- Gui/ViewModels/Graphics/ImageViewModel.cs | 3 +- Gui/ViewModels/Loco/ObjectEditorViewModel.cs | 3 +- Gui/Views/ImageTableView.axaml | 6 +++ 6 files changed, 73 insertions(+), 7 deletions(-) diff --git a/Definitions/ObjectModels/Graphics/ImageTableGrouper.cs b/Definitions/ObjectModels/Graphics/ImageTableGrouper.cs index c75f68f2..a2db98a6 100644 --- a/Definitions/ObjectModels/Graphics/ImageTableGrouper.cs +++ b/Definitions/ObjectModels/Graphics/ImageTableGrouper.cs @@ -31,6 +31,16 @@ public static ImageTable CreateImageTable(ILocoStruct obj, ObjectType objectType return imageTable; } +public static IEnumerable CreateGroupsForExistingImages(ILocoStruct obj, ObjectType objectType, List imageList) +{ + var originalCount = imageList.Count; + var groups = CreateGroups(obj, objectType, imageList).ToList(); + + Debug.Assert(groups.SelectMany(g => g.GraphicsElements).Count() == originalCount, "Image grouping lost or gained images"); + + return groups; +} + private static IEnumerable CreateGroups(ILocoStruct obj, ObjectType objectType, List imageList) { switch (objectType) diff --git a/Gui/Models/ObjectEditorContext.cs b/Gui/Models/ObjectEditorContext.cs index 44b2afd9..76dda925 100644 --- a/Gui/Models/ObjectEditorContext.cs +++ b/Gui/Models/ObjectEditorContext.cs @@ -52,6 +52,7 @@ public class ObjectEditorContext : IDisposable, IAsyncDisposable public const string ApplicationName = "OpenLoco Object Editor"; public const string LoggingFileName = "objectEditor.log"; + public const string ImageTableGroupsConfigFileName = "ImageTableGroups.json"; // stores settings.json, objectEditor.log, etc public static string ProgramDataPath => Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), ApplicationName); @@ -84,7 +85,7 @@ public ObjectEditorContext() Settings.ConfigFolder = InitialiseDirectory(Settings.ConfigFolder, "config"); EnsureDefaultImageTableGroupConfigExists(Settings.ConfigFolder); - ImageTableGrouper.LoadGroupConfigurationFile(Path.Combine(Settings.ConfigFolder, "ImageTableGroups.json")); + ImageTableGrouper.LoadGroupConfigurationFile(Path.Combine(Settings.ConfigFolder, ImageTableGroupsConfigFileName)); ObjectServiceClient = new(Settings, Logger); ObjectServiceModel = new ObjectServiceModel(ObjectServiceClient, Logger); @@ -163,7 +164,7 @@ string InitialiseDirectory(string folder, string defaultName) void EnsureDefaultImageTableGroupConfigExists(string configFolder) { - var configFilePath = Path.Combine(configFolder, "ImageTableGroups.json"); + var configFilePath = Path.Combine(configFolder, ImageTableGroupsConfigFileName); if (File.Exists(configFilePath)) { return; @@ -181,11 +182,11 @@ void EnsureDefaultImageTableGroupConfigExists(string configFolder) using var reader = new StreamReader(stream); var text = reader.ReadToEnd(); File.WriteAllText(configFilePath, text); - Logger.LogInformation("Copied default ImageTableGroups.json to {ConfigFilePath}", configFilePath); + Logger.LogInformation("Copied default {ImageTableGroupsConfigFileName} to {ConfigFilePath}", ImageTableGroupsConfigFileName, configFilePath); } catch (Exception ex) { - Logger.LogError(ex, "Failed to create default ImageTableGroups.json at {ConfigFilePath}", configFilePath); + Logger.LogError(ex, "Failed to create default {ImageTableGroupsConfigFileName} at {ConfigFilePath}", ImageTableGroupsConfigFileName, configFilePath); } } diff --git a/Gui/ViewModels/Graphics/ImageTableViewModel.cs b/Gui/ViewModels/Graphics/ImageTableViewModel.cs index ad05d6a2..2c0e217c 100644 --- a/Gui/ViewModels/Graphics/ImageTableViewModel.cs +++ b/Gui/ViewModels/Graphics/ImageTableViewModel.cs @@ -4,6 +4,7 @@ using Common.Json; using Definitions.ObjectModels; using Definitions.ObjectModels.Graphics; +using Definitions.ObjectModels.Types; using Microsoft.Extensions.Logging; using ReactiveUI; using ReactiveUI.Fody.Helpers; @@ -51,6 +52,9 @@ public string ImageCount [Reactive] public ICommand ExportImagesCommand { get; set; } + [Reactive] + public ICommand ReloadImageTableGroupingCommand { get; set; } + [Reactive] public ICommand ReplaceImageCommand { get; set; } [Reactive] @@ -97,14 +101,21 @@ public string ImageCount [Reactive] public ObservableCollection LayeredImages { get; set; } = []; + readonly ObjectType? objectType; + readonly ILocoStruct? objectModel; + readonly string? groupingConfigFilePath; + ImageTable Model { get; init; } - public ImageTableViewModel(ImageTable imageTable, ILogger logger) + public ImageTableViewModel(ImageTable imageTable, ILogger logger, ObjectType? objectType = null, ILocoStruct? objectModel = null, string? groupingConfigFilePath = null) { ArgumentNullException.ThrowIfNull(imageTable); Model = imageTable; Logger = logger; + this.objectType = objectType; + this.objectModel = objectModel; + this.groupingConfigFilePath = groupingConfigFilePath; RecreateViewModelGroupsFromImageTable(Model); // swatches/palettes @@ -160,6 +171,9 @@ public ImageTableViewModel(ImageTable imageTable, ILogger logger) } }); + var canReloadGrouping = objectType.HasValue && !string.IsNullOrEmpty(groupingConfigFilePath); + ReloadImageTableGroupingCommand = ReactiveCommand.CreateFromTask(ReloadImageTableGroupingAsync, Observable.Return(canReloadGrouping)); + TranslateXOffsetAllImagesCommand = ReactiveCommand.Create(amount => { if (short.TryParse(amount, out var result)) @@ -375,6 +389,39 @@ private async Task InsertImageAtAsync(bool insertBefore) } // model stuff + Task ReloadImageTableGroupingAsync() + { + if (!objectType.HasValue || objectModel == null) + { + Logger.LogWarning("Cannot reload image table grouping because object context is unavailable."); + return Task.CompletedTask; + } + + if (string.IsNullOrEmpty(groupingConfigFilePath)) + { + Logger.LogWarning("Cannot reload image table grouping because the grouping configuration file path is not configured."); + return Task.CompletedTask; + } + + ImageTableGrouper.LoadGroupConfigurationFile(groupingConfigFilePath); + + var imageList = Model.GraphicsElements.OrderBy(x => x.ImageTableIndex).ToList(); + + try + { + List groups = [.. ImageTableGrouper.CreateGroupsForExistingImages(objectModel, objectType.Value, imageList)]; + Model.Groups = groups; + RecreateViewModelGroupsFromImageTable(Model); + Logger.LogInformation("Reloaded image table grouping from {ConfigFilePath}", groupingConfigFilePath); + } + catch (Exception ex) + { + Logger.LogError(ex, "Failed to reload image table grouping from {ConfigFilePath}", groupingConfigFilePath); + } + + return Task.CompletedTask; + } + public void RecolourImages(ColourSwatch primary, ColourSwatch secondary) { foreach (var ivm in GroupedImageViewModels.SelectMany(x => x.Images)) diff --git a/Gui/ViewModels/Graphics/ImageViewModel.cs b/Gui/ViewModels/Graphics/ImageViewModel.cs index 1681f336..4b81b9b0 100644 --- a/Gui/ViewModels/Graphics/ImageViewModel.cs +++ b/Gui/ViewModels/Graphics/ImageViewModel.cs @@ -280,7 +280,8 @@ void Dispose(bool disposing) { subscriptions.Dispose(); DisplayedImage?.Dispose(); - Model.Image?.Dispose(); + // The underlying GraphicsElement image is owned by the model and may be shared across view models. + // Do not dispose it here during regrouping. } disposed = true; diff --git a/Gui/ViewModels/Loco/ObjectEditorViewModel.cs b/Gui/ViewModels/Loco/ObjectEditorViewModel.cs index b84df476..acb6879a 100644 --- a/Gui/ViewModels/Loco/ObjectEditorViewModel.cs +++ b/Gui/ViewModels/Loco/ObjectEditorViewModel.cs @@ -283,7 +283,8 @@ public override void Load() if (Model.LocoObject.ImageTable != null) { - AddViewModelToGroup(new ImageTableViewModel(Model.LocoObject.ImageTable, EditorContext.Logger), mediaGroup); + var configFilePath = Path.Combine(EditorContext.Settings.ConfigFolder, ObjectEditorContext.ImageTableGroupsConfigFileName); + AddViewModelToGroup(new ImageTableViewModel(Model.LocoObject.ImageTable, EditorContext.Logger, Model.LocoObject.ObjectType, Model.LocoObject.Object, configFilePath), mediaGroup); var bc = Model.LocoObject.ObjectType == ObjectType.Building ? (Model.LocoObject.Object as IHasBuildingComponents)?.BuildingComponents : null; if (bc != null) diff --git a/Gui/Views/ImageTableView.axaml b/Gui/Views/ImageTableView.axaml index d804cf24..6af42c73 100644 --- a/Gui/Views/ImageTableView.axaml +++ b/Gui/Views/ImageTableView.axaml @@ -50,6 +50,12 @@ x:DataType="vmg:ImageTableViewModel"> +