Skip to content

Commit 1cc761e

Browse files
authored
New view models (#231)
* progress * viewmodel class cleanup * disable viewmodel loadsave tests for now as it isn't a 1-1 mapping with a file any more * split building components vm off imagetable * add viewmodel grouping * clean up grouped viewmodels a bit better * cleanup * string table writes back to model correctly now, and doesn't crash on save * string table writes back to model correctly now, and doesn't crash on save * clean up metadata viewmodel * misc copilot cleanup
1 parent 75a182d commit 1cc761e

102 files changed

Lines changed: 1647 additions & 1198 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Dat/FileParsing/SawyerStreamWriter.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
using Definitions.ObjectModels.Graphics;
99
using Definitions.ObjectModels.Objects.Sound;
1010
using Definitions.ObjectModels.Types;
11-
using System.Collections.Immutable;
1211
using System.ComponentModel.DataAnnotations;
1312
using System.Text;
1413

DataSanitiser/Program.cs

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,56 @@ static ObjectType TypeToStruct(Type type)
8585
_ => throw new ArgumentOutOfRangeException(nameof(type), $"unknown struct type {type.FullName}")
8686
};
8787

88+
static void QueryBuildingVar_AC()
89+
{
90+
var dir = "Q:\\Steam\\steamapps\\common\\Locomotion\\ObjData";
91+
var logger = new Logger();
92+
var index = ObjectIndex.LoadOrCreateIndex(dir, logger);
93+
94+
var results = new List<(ObjectIndexEntry Obj, int var_ac)>();
95+
96+
foreach (var obj in index.Objects.Where(x => x.ObjectType == ObjectType.Building))
97+
{
98+
try
99+
{
100+
var o = SawyerStreamReader.LoadFullObject(Path.Combine(dir, obj.FileName), logger);
101+
if (o.LocoObject != null)
102+
{
103+
var struc = (BuildingObject)o.LocoObject.Object;
104+
var header = o.DatFileInfo.S5Header;
105+
var source = OriginalObjectFiles.GetFileSource(header.Name, header.Checksum, header.ObjectSource);
106+
107+
if (source != ObjectSource.LocomotionSteam)
108+
{
109+
continue;
110+
}
111+
112+
results.Add((obj, struc.var_AC));
113+
}
114+
}
115+
catch (Exception ex)
116+
{
117+
Console.WriteLine($"{obj.FileName} - {ex.Message}");
118+
}
119+
}
120+
121+
Console.WriteLine(results.Count);
122+
123+
const string csvHeader = "DatName, Var_AC";
124+
var lines = results
125+
.OrderByDescending(x => x.var_ac)
126+
.Select(x => string.Join(',', x.Obj.DisplayName, x.var_ac));
127+
128+
File.WriteAllLines("building_var_ac.csv", [csvHeader, .. lines]);
129+
130+
//foreach (var line in lines)
131+
//{
132+
// Console.WriteLine(line);
133+
//}
134+
}
135+
136+
QueryBuildingVar_AC();
137+
88138
static void QueryBuildingProducedQuantity()
89139
{
90140
var dir = "Q:\\Steam\\steamapps\\common\\Locomotion\\ObjData";
@@ -130,7 +180,7 @@ static void QueryBuildingProducedQuantity()
130180
// Console.WriteLine(line);
131181
//}
132182
}
133-
QueryBuildingProducedQuantity();
183+
//QueryBuildingProducedQuantity();
134184

135185
static void QueryHeadquarters()
136186
{

Definitions/Migrations/20251228122835_AddTblObjectMissing.cs

Lines changed: 135 additions & 135 deletions
Original file line numberDiff line numberDiff line change
@@ -10,146 +10,146 @@ public partial class AddTblObjectMissing : Migration
1010
/// <inheritdoc />
1111
protected override void Up(MigrationBuilder migrationBuilder)
1212
{
13-
migrationBuilder.RenameColumn(
14-
name: "ShipWakeOffset",
15-
table: "ObjVehicle",
16-
newName: "ShipWakeSpacing");
17-
18-
migrationBuilder.RenameColumn(
19-
name: "Clearance",
20-
table: "ObjTree",
21-
newName: "var_05");
22-
23-
migrationBuilder.RenameColumn(
24-
name: "DisplayOffset",
25-
table: "ObjTrack",
26-
newName: "VehicleDisplayListVerticalOffset");
27-
28-
migrationBuilder.RenameColumn(
29-
name: "DisplayOffset",
30-
table: "ObjRoad",
31-
newName: "VehicleDisplayListVerticalOffset");
32-
33-
migrationBuilder.RenameColumn(
34-
name: "WindowPlayerColor",
35-
table: "ObjInterface",
36-
newName: "WindowPlayerColour");
37-
38-
migrationBuilder.RenameColumn(
39-
name: "Flags",
40-
table: "ObjHillShapes",
41-
newName: "IsHeightMap");
42-
43-
migrationBuilder.RenameColumn(
44-
name: "MaxPremiumRate",
45-
table: "ObjCargo",
46-
newName: "NonPremiumRate");
47-
48-
migrationBuilder.RenameColumn(
49-
name: "AllowedPlaneTypes",
50-
table: "ObjAirport",
51-
newName: "Flags");
52-
53-
migrationBuilder.AddColumn<byte>(
54-
name: "InitialHeight",
55-
table: "ObjTree",
56-
type: "INTEGER",
57-
nullable: false,
58-
defaultValue: (byte)0);
59-
60-
migrationBuilder.AddColumn<byte>(
61-
name: "SeasonalVariants",
62-
table: "ObjTree",
63-
type: "INTEGER",
64-
nullable: false,
65-
defaultValue: (byte)0);
66-
67-
migrationBuilder.AddColumn<byte>(
68-
name: "var_04",
69-
table: "ObjTree",
70-
type: "INTEGER",
71-
nullable: false,
72-
defaultValue: (byte)0);
73-
74-
migrationBuilder.CreateTable(
75-
name: "ObjectsMissing",
76-
columns: table => new
77-
{
78-
Id = table.Column<ulong>(type: "INTEGER", nullable: false)
79-
.Annotation("Sqlite:Autoincrement", true),
80-
DatName = table.Column<string>(type: "TEXT", nullable: false),
81-
DatChecksum = table.Column<uint>(type: "INTEGER", nullable: false),
82-
ObjectType = table.Column<byte>(type: "INTEGER", nullable: false)
83-
},
84-
constraints: table =>
85-
{
86-
table.PrimaryKey("PK_ObjectsMissing", x => x.Id);
87-
});
88-
89-
migrationBuilder.CreateIndex(
90-
name: "IX_ObjectsMissing_DatName_DatChecksum",
91-
table: "ObjectsMissing",
92-
columns: new[] { "DatName", "DatChecksum" },
93-
unique: true);
13+
_ = migrationBuilder.RenameColumn(
14+
name: "ShipWakeOffset",
15+
table: "ObjVehicle",
16+
newName: "ShipWakeSpacing");
17+
18+
_ = migrationBuilder.RenameColumn(
19+
name: "Clearance",
20+
table: "ObjTree",
21+
newName: "var_05");
22+
23+
_ = migrationBuilder.RenameColumn(
24+
name: "DisplayOffset",
25+
table: "ObjTrack",
26+
newName: "VehicleDisplayListVerticalOffset");
27+
28+
_ = migrationBuilder.RenameColumn(
29+
name: "DisplayOffset",
30+
table: "ObjRoad",
31+
newName: "VehicleDisplayListVerticalOffset");
32+
33+
_ = migrationBuilder.RenameColumn(
34+
name: "WindowPlayerColor",
35+
table: "ObjInterface",
36+
newName: "WindowPlayerColour");
37+
38+
_ = migrationBuilder.RenameColumn(
39+
name: "Flags",
40+
table: "ObjHillShapes",
41+
newName: "IsHeightMap");
42+
43+
_ = migrationBuilder.RenameColumn(
44+
name: "MaxPremiumRate",
45+
table: "ObjCargo",
46+
newName: "NonPremiumRate");
47+
48+
_ = migrationBuilder.RenameColumn(
49+
name: "AllowedPlaneTypes",
50+
table: "ObjAirport",
51+
newName: "Flags");
52+
53+
_ = migrationBuilder.AddColumn<byte>(
54+
name: "InitialHeight",
55+
table: "ObjTree",
56+
type: "INTEGER",
57+
nullable: false,
58+
defaultValue: (byte)0);
59+
60+
_ = migrationBuilder.AddColumn<byte>(
61+
name: "SeasonalVariants",
62+
table: "ObjTree",
63+
type: "INTEGER",
64+
nullable: false,
65+
defaultValue: (byte)0);
66+
67+
_ = migrationBuilder.AddColumn<byte>(
68+
name: "var_04",
69+
table: "ObjTree",
70+
type: "INTEGER",
71+
nullable: false,
72+
defaultValue: (byte)0);
73+
74+
_ = migrationBuilder.CreateTable(
75+
name: "ObjectsMissing",
76+
columns: table => new
77+
{
78+
Id = table.Column<ulong>(type: "INTEGER", nullable: false)
79+
.Annotation("Sqlite:Autoincrement", true),
80+
DatName = table.Column<string>(type: "TEXT", nullable: false),
81+
DatChecksum = table.Column<uint>(type: "INTEGER", nullable: false),
82+
ObjectType = table.Column<byte>(type: "INTEGER", nullable: false)
83+
},
84+
constraints: table =>
85+
{
86+
_ = table.PrimaryKey("PK_ObjectsMissing", x => x.Id);
87+
});
88+
89+
_ = migrationBuilder.CreateIndex(
90+
name: "IX_ObjectsMissing_DatName_DatChecksum",
91+
table: "ObjectsMissing",
92+
columns: new[] { "DatName", "DatChecksum" },
93+
unique: true);
9494
}
9595

9696
/// <inheritdoc />
9797
protected override void Down(MigrationBuilder migrationBuilder)
9898
{
99-
migrationBuilder.DropTable(
100-
name: "ObjectsMissing");
101-
102-
migrationBuilder.DropColumn(
103-
name: "InitialHeight",
104-
table: "ObjTree");
105-
106-
migrationBuilder.DropColumn(
107-
name: "SeasonalVariants",
108-
table: "ObjTree");
109-
110-
migrationBuilder.DropColumn(
111-
name: "var_04",
112-
table: "ObjTree");
113-
114-
migrationBuilder.RenameColumn(
115-
name: "ShipWakeSpacing",
116-
table: "ObjVehicle",
117-
newName: "ShipWakeOffset");
118-
119-
migrationBuilder.RenameColumn(
120-
name: "var_05",
121-
table: "ObjTree",
122-
newName: "Clearance");
123-
124-
migrationBuilder.RenameColumn(
125-
name: "VehicleDisplayListVerticalOffset",
126-
table: "ObjTrack",
127-
newName: "DisplayOffset");
128-
129-
migrationBuilder.RenameColumn(
130-
name: "VehicleDisplayListVerticalOffset",
131-
table: "ObjRoad",
132-
newName: "DisplayOffset");
133-
134-
migrationBuilder.RenameColumn(
135-
name: "WindowPlayerColour",
136-
table: "ObjInterface",
137-
newName: "WindowPlayerColor");
138-
139-
migrationBuilder.RenameColumn(
140-
name: "IsHeightMap",
141-
table: "ObjHillShapes",
142-
newName: "Flags");
143-
144-
migrationBuilder.RenameColumn(
145-
name: "NonPremiumRate",
146-
table: "ObjCargo",
147-
newName: "MaxPremiumRate");
148-
149-
migrationBuilder.RenameColumn(
150-
name: "Flags",
151-
table: "ObjAirport",
152-
newName: "AllowedPlaneTypes");
99+
_ = migrationBuilder.DropTable(
100+
name: "ObjectsMissing");
101+
102+
_ = migrationBuilder.DropColumn(
103+
name: "InitialHeight",
104+
table: "ObjTree");
105+
106+
_ = migrationBuilder.DropColumn(
107+
name: "SeasonalVariants",
108+
table: "ObjTree");
109+
110+
_ = migrationBuilder.DropColumn(
111+
name: "var_04",
112+
table: "ObjTree");
113+
114+
_ = migrationBuilder.RenameColumn(
115+
name: "ShipWakeSpacing",
116+
table: "ObjVehicle",
117+
newName: "ShipWakeOffset");
118+
119+
_ = migrationBuilder.RenameColumn(
120+
name: "var_05",
121+
table: "ObjTree",
122+
newName: "Clearance");
123+
124+
_ = migrationBuilder.RenameColumn(
125+
name: "VehicleDisplayListVerticalOffset",
126+
table: "ObjTrack",
127+
newName: "DisplayOffset");
128+
129+
_ = migrationBuilder.RenameColumn(
130+
name: "VehicleDisplayListVerticalOffset",
131+
table: "ObjRoad",
132+
newName: "DisplayOffset");
133+
134+
_ = migrationBuilder.RenameColumn(
135+
name: "WindowPlayerColour",
136+
table: "ObjInterface",
137+
newName: "WindowPlayerColor");
138+
139+
_ = migrationBuilder.RenameColumn(
140+
name: "IsHeightMap",
141+
table: "ObjHillShapes",
142+
newName: "Flags");
143+
144+
_ = migrationBuilder.RenameColumn(
145+
name: "NonPremiumRate",
146+
table: "ObjCargo",
147+
newName: "MaxPremiumRate");
148+
149+
_ = migrationBuilder.RenameColumn(
150+
name: "Flags",
151+
table: "ObjAirport",
152+
newName: "AllowedPlaneTypes");
153153
}
154154
}
155155
}

Definitions/ObjectModels/Graphics/ImageTable.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public PaletteMap PaletteMap
2323
{
2424
throw new Exception("Failed to convert image");
2525
}
26+
2627
ge.Image = image;
2728
}
2829
}

Definitions/ObjectModels/Graphics/ImageTableHelpers.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ private static Image<Rgba32> CreateErrorImage()
2121
img[x, y] = isRed ? Color.Magenta : Color.White;
2222
}
2323
}
24+
2425
return img;
2526
}
2627

Gui/App.axaml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,19 +108,22 @@
108108
<DataTemplate DataType="vm:ObjectMetadataViewModel">
109109
<vi:MetadataView />
110110
</DataTemplate>
111+
<DataTemplate DataType="vm:StringTableViewModel">
112+
<vi:StringTableView />
113+
</DataTemplate>
111114
<DataTemplate DataType="vm:ObjectEditorViewModel">
112115
<vi:ObjectEditorView />
113116
</DataTemplate>
114117
<DataTemplate DataType="vm:FolderTreeViewModel">
115118
<vi:FolderTreeView />
116119
</DataTemplate>
117-
<DataTemplate DataType="vm:LocoTypes.Objects.Building.BuildingComponentsViewModel">
120+
<DataTemplate DataType="vm:Loco.Objects.Building.BuildingComponentsViewModel">
118121
<vi:BuildingComponentsView />
119122
</DataTemplate>
120123
<DataTemplate DataType="vm:G1ViewModel">
121124
<ContentControl Content="{Binding ImageTableViewModel}" />
122125
</DataTemplate>
123-
<DataTemplate DataType="vm:IObjectViewModel">
126+
<DataTemplate DataType="vm:IViewModel">
124127
<ScrollViewer>
125128
<vi:ExtendedPropertyGrid Background="{DynamicResource ExpanderContentBackground}" IsHeaderVisible="True" IsCategoryVisible="False" IsAutoNameWidth="True" IsQuickFilterVisible="True" DataContext="{Binding}" />
126129
</ScrollViewer>

0 commit comments

Comments
 (0)