Skip to content

Commit 3f16e7f

Browse files
committed
pattern match image importing
1 parent 806b010 commit 3f16e7f

File tree

3 files changed

+42
-8
lines changed

3 files changed

+42
-8
lines changed

AvaGui/ViewModels/DatTypes/DatObjectEditorViewModel.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ public void LoadObject()
119119
StringTableViewModel = new(CurrentObject.LocoObject.StringTable);
120120
ExtraContentViewModel = CurrentObject.LocoObject.Object is SoundObject
121121
? new SoundViewModel(CurrentObject.LocoObject)
122-
: new ImageTableViewModel(CurrentObject.LocoObject, imageNameProvider, Model.PaletteMap, CurrentObject.Images);
122+
: new ImageTableViewModel(CurrentObject.LocoObject, imageNameProvider, Model.PaletteMap, CurrentObject.Images, Model.Logger);
123123

124124
var (treeView, annotationIdentifiers) = AnnotateFile(Path.Combine(Model.Settings.ObjDataDirectory, cf.Filename), false, null);
125125
CurrentHexAnnotations = new(treeView);

AvaGui/ViewModels/MainWindowViewModel.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ public async Task LoadG1()
158158
i++;
159159
}
160160

161-
CurrentEditorModel = new ImageTableViewModel(Model.G1, Model.G1, Model.PaletteMap, images);
161+
CurrentEditorModel = new ImageTableViewModel(Model.G1, Model.G1, Model.PaletteMap, images, Model.Logger);
162162
}
163163

164164
public async Task LoadSingleObjectToIndex()

AvaGui/ViewModels/SubObjectTypes/ImageTableViewModel.cs

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using Avalonia.Controls.Selection;
33
using Avalonia.Media.Imaging;
44
using Avalonia.Threading;
5+
using OpenLoco.Common.Logging;
56
using OpenLoco.Dat;
67
using OpenLoco.Dat.Types;
78
using ReactiveUI;
@@ -10,9 +11,11 @@
1011
using SixLabors.ImageSharp.PixelFormats;
1112
using System;
1213
using System.Collections.Generic;
14+
using System.Collections.Immutable;
1315
using System.IO;
1416
using System.Linq;
1517
using System.Reactive.Linq;
18+
using System.Text.RegularExpressions;
1619
using System.Threading.Tasks;
1720
using System.Windows.Input;
1821
using Image = SixLabors.ImageSharp.Image;
@@ -23,13 +26,15 @@ public class ImageTableViewModel : ReactiveObject, IExtraContentViewModel, ILoco
2326
{
2427
readonly IHasG1Elements G1Provider;
2528
readonly IImageTableNameProvider NameProvider;
29+
readonly ILogger Logger;
2630

27-
public ImageTableViewModel(IHasG1Elements g1ElementProvider, IImageTableNameProvider imageNameProvider, PaletteMap paletteMap, IList<Image<Rgba32>> images)
31+
public ImageTableViewModel(IHasG1Elements g1ElementProvider, IImageTableNameProvider imageNameProvider, PaletteMap paletteMap, IList<Image<Rgba32>> images, ILogger logger)
2832
{
2933
G1Provider = g1ElementProvider;
3034
NameProvider = imageNameProvider;
3135
PaletteMap = paletteMap;
3236
Images = images;
37+
Logger = logger;
3338

3439
_ = this.WhenAnyValue(o => o.G1Provider)
3540
.Subscribe(_ => this.RaisePropertyChanged(nameof(Images)));
@@ -60,6 +65,7 @@ public ImageTableViewModel(IHasG1Elements g1ElementProvider, IImageTableNameProv
6065
};
6166
animationTimer.Tick += AnimationTimer_Tick;
6267
animationTimer.Start();
68+
Logger = logger;
6369
}
6470

6571
readonly DispatcherTimer animationTimer;
@@ -172,6 +178,7 @@ public UIG1Element32? SelectedG1Element
172178
? null
173179
: new UIG1Element32(SelectedImageIndex, GetImageName(NameProvider, SelectedImageIndex), G1Provider.G1Elements[SelectedImageIndex]);
174180

181+
//todo: second half should be model
175182
public async Task ImportImages()
176183
{
177184
var folders = await PlatformSpecific.OpenFolderPicker();
@@ -182,10 +189,32 @@ public async Task ImportImages()
182189
}
183190

184191
var dirPath = dir.Path.LocalPath;
185-
if (Directory.Exists(dirPath) && Directory.EnumerateFiles(dirPath).Any())
192+
if (!Directory.Exists(dirPath))
186193
{
187-
var files = Directory.GetFiles(dirPath);
188-
var sorted = files.OrderBy(f => int.Parse(Path.GetFileNameWithoutExtension(f).Split('-')[0]));
194+
return;
195+
}
196+
197+
var files = Directory.GetFiles(dirPath);
198+
if (files.Length == 0)
199+
{
200+
return;
201+
}
202+
203+
try
204+
{
205+
var sorted = files.OrderBy(static f =>
206+
{
207+
var match = Regex.Match(Path.GetFileNameWithoutExtension(f), @".*?(\d+).*?");
208+
return match.Success
209+
? int.Parse(match.Groups[1].Value)
210+
: throw new InvalidDataException($"Directory contains file that doesn't contain a number={f}");
211+
});
212+
213+
var sortedH = sorted.ToImmutableHashSet();
214+
if (G1Provider.G1Elements.Count != sortedH.Count)
215+
{
216+
throw new ArgumentOutOfRangeException($"Directory doesn't contain the same number of images as expected Directory={sortedH.Count} Expected={G1Provider.G1Elements.Count}");
217+
}
189218

190219
var g1Elements = new List<G1Element32>();
191220
var i = 0;
@@ -196,11 +225,16 @@ public async Task ImportImages()
196225
var currG1 = G1Provider.G1Elements[i++];
197226
currG1.ImageData = PaletteMap.ConvertRgba32ImageToG1Data(img, currG1.Flags); // simply overwrite existing pixel data
198227
}
199-
}
200228

201-
this.RaisePropertyChanged(nameof(Bitmaps));
229+
this.RaisePropertyChanged(nameof(Bitmaps));
230+
}
231+
catch (Exception ex)
232+
{
233+
Logger.Error(ex);
234+
}
202235
}
203236

237+
// todo: second half should be in model
204238
public async Task ExportImages()
205239
{
206240
var folders = await PlatformSpecific.OpenFolderPicker();

0 commit comments

Comments
 (0)