Skip to content

Commit 552e33a

Browse files
committed
export image table on object save
1 parent adf525e commit 552e33a

File tree

7 files changed

+58
-28
lines changed

7 files changed

+58
-28
lines changed

Gui/ViewModels/DatTypes/ObjectEditorViewModel.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,11 @@ void SaveCore(string filename, SawyerEncoding? encodingToUse = null)
274274

275275
CurrentObject.LocoObject.Object = CurrentObjectViewModel.GetAsModel();
276276

277+
if (ExtraContentViewModel is ImageTableViewModel itvm)
278+
{
279+
CurrentObject.LocoObject.GraphicsElements = itvm.ImageViewModels.Select(x => x.ToGraphicsElement()).ToList();
280+
}
281+
277282
// this is hacky but it should work
278283
if (ExtraContentViewModel is AudioViewModel avm && CurrentObject.LocoObject.Object is SoundObject so)
279284
{

Gui/ViewModels/DatTypes/ObjectModelHeaderViewModel.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ public ObjectModelHeaderViewModel(ObjectModelHeader header)
3737
[Reactive, MaxLength(8)]
3838
public string Name { get; set; }
3939

40-
[Reactive]
4140
public uint32_t Checksum { get; set; }
4241

4342
public string ChecksumHex

Gui/ViewModels/SubObjectTypes/ImageTableViewModel.cs

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,16 @@ public class ImageTableViewModel : ReactiveObject, IExtraContentViewModel
3333
[Reactive]
3434
public ColourRemapSwatch SelectedSecondarySwatch { get; set; } = ColourRemapSwatch.SecondaryRemap;
3535

36-
[Reactive]
37-
public ICommand ReplaceImageCommand { get; set; }
38-
3936
[Reactive]
4037
public ICommand ImportImagesCommand { get; set; }
4138

4239
[Reactive]
4340
public ICommand ExportImagesCommand { get; set; }
41+
[Reactive]
42+
public ICommand ReplaceImageCommand { get; set; }
43+
44+
[Reactive]
45+
public ICommand CropImageCommand { get; set; }
4446

4547
[Reactive]
4648
public ICommand CropAllImagesCommand { get; set; }
@@ -81,7 +83,7 @@ public ImageTableViewModel(IList<GraphicsElement> graphicsElements, IImageTableN
8183
foreach (var ge in graphicsElements)
8284
{
8385
var success = imageNameProvider.TryGetImageName(index, out var imageName);
84-
ImageViewModels.Add(new ImageViewModel(index, success ? imageName! : "failed to get image name", ge, paletteMap));
86+
ImageViewModels.Add(new ImageViewModel(index, success ? imageName! : $"{index}-unnamed", ge, paletteMap));
8587
index++;
8688
}
8789

@@ -103,9 +105,9 @@ public ImageTableViewModel(IList<GraphicsElement> graphicsElements, IImageTableN
103105
_ = this.WhenAnyValue(o => o.SelectedImageIndex)
104106
.Subscribe(index =>
105107
{
106-
SelectedImage = index < 0 || index >= ImageViewModels.Count
107-
? null
108-
: ImageViewModels[SelectedImageIndex];
108+
SelectedImage = SelectedImageIndexIsValid()
109+
? ImageViewModels[SelectedImageIndex]
110+
: null;
109111
});
110112

111113
_ = this.WhenAnyValue(o => o.AnimationSpeed)
@@ -115,6 +117,7 @@ public ImageTableViewModel(IList<GraphicsElement> graphicsElements, IImageTableN
115117
ImportImagesCommand = ReactiveCommand.CreateFromTask(ImportImages);
116118
ExportImagesCommand = ReactiveCommand.CreateFromTask(ExportImages);
117119
ReplaceImageCommand = ReactiveCommand.CreateFromTask(ReplaceImage);
120+
CropImageCommand = ReactiveCommand.Create(CropImage);
118121
CropAllImagesCommand = ReactiveCommand.Create(CropAllImages);
119122

120123
ZeroOffsetAllImagesCommand = ReactiveCommand.Create(() =>
@@ -144,6 +147,9 @@ public ImageTableViewModel(IList<GraphicsElement> graphicsElements, IImageTableN
144147
animationTimer.Start();
145148
}
146149

150+
bool SelectedImageIndexIsValid()
151+
=> SelectedImageIndex >= 0 && SelectedImageIndex < ImageViewModels.Count;
152+
147153
void SelectionChanged(object sender, SelectionModelSelectionChangedEventArgs e)
148154
{
149155
var sm = (SelectionModel<ImageViewModel>)sender;
@@ -241,12 +247,27 @@ public async Task ReplaceImage()
241247
// model stuff
242248
public void RecolourImages(ColourRemapSwatch primary, ColourRemapSwatch secondary)
243249
{
250+
if (SelectedImageIndexIsValid())
251+
{
252+
return;
253+
}
254+
244255
foreach (var ivm in ImageViewModels)
245256
{
246257
ivm.RecolourImage(primary, secondary);
247258
}
248259
}
249260

261+
public void CropImage()
262+
{
263+
if (!SelectedImageIndexIsValid())
264+
{
265+
return;
266+
}
267+
268+
ImageViewModels[SelectedImageIndex].CropImage();
269+
}
270+
250271
public void CropAllImages()
251272
{
252273
foreach (var ivm in ImageViewModels)

Gui/ViewModels/SubObjectTypes/ImageViewModel.cs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,20 @@ public class ImageViewModel : ReactiveObject
2626
public short ZoomOffset { get; set; }
2727

2828
[Reactive, Browsable(false)]
29-
public Bitmap Image { get; set; }
29+
public Bitmap DisplayedImage { get; private set; }
3030

3131
[Reactive, Browsable(false)]
3232
public Image<Rgba32> UnderlyingImage { get; set; }
3333

34+
[Browsable(false)]
3435
public Avalonia.Rect SelectedBitmapPreviewBorder
35-
=> Image == null
36+
=> DisplayedImage == null
3637
? new Avalonia.Rect()
3738
: new Avalonia.Rect(
3839
XOffset - 1,
3940
YOffset - 1,
40-
Image.Size.Width + 2,
41-
Image.Size.Height + 2);
41+
DisplayedImage.Size.Width + 2,
42+
DisplayedImage.Size.Height + 2);
4243

4344
readonly PaletteMap PaletteMap;
4445

@@ -56,7 +57,7 @@ public ImageViewModel(int imageIndex, string imageName, GraphicsElement graphics
5657
.Where(x => x != null)
5758
.Subscribe(_ => UnderlyingImageChanged());
5859

59-
_ = this.WhenAnyValue(o => o.Image)
60+
_ = this.WhenAnyValue(o => o.DisplayedImage)
6061
.Subscribe(_ => this.RaisePropertyChanged(nameof(SelectedBitmapPreviewBorder)));
6162

6263
if (!PaletteMap.TryConvertG1ToRgba32Bitmap(graphicsElement, ColourRemapSwatch.PrimaryRemap, ColourRemapSwatch.SecondaryRemap, out var image))
@@ -89,11 +90,11 @@ public void RecolourImage(ColourRemapSwatch primary, ColourRemapSwatch secondary
8990
}
9091

9192
// only update the UI image - don't update the underlying image as we want to keep the original
92-
Image = image!.ToAvaloniaBitmap();
93+
DisplayedImage = image!.ToAvaloniaBitmap();
9394
}
9495

9596
void UnderlyingImageChanged()
96-
=> Image = UnderlyingImage!.ToAvaloniaBitmap();
97+
=> DisplayedImage = UnderlyingImage!.ToAvaloniaBitmap();
9798

9899
public void CropImage()
99100
{

Gui/ViewModels/SubObjectTypes/StringTableViewModel.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,4 +53,18 @@ public void WriteTableBackToObject() // potentially could be done when SelectedI
5353
}
5454
}
5555
}
56+
57+
//public StringTable ToStringTable()
58+
//{
59+
// var st = new StringTable();
60+
// foreach (var key in TableView)
61+
// {
62+
// foreach (var t in key.Value)
63+
// {
64+
// st[key.Key][t.Language] = t.Translation;
65+
// }
66+
// }
67+
68+
// return st;
69+
//}
5670
}

Gui/Views/ImageTableView.axaml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,11 @@
7979
</ListBox.ItemsPanel>
8080
<ListBox.ItemTemplate>
8181
<DataTemplate>
82-
<Image Source="{Binding Image}" Stretch="None" Margin="0">
82+
<Image Source="{Binding DisplayedImage}" Stretch="None" Margin="0">
8383
<Image.ContextMenu>
8484
<ContextMenu>
8585
<MenuItem Header="Replace image" Command="{Binding $parent[ListBox].((vm:ImageTableViewModel)DataContext).ReplaceImageCommand}"/>
86+
<MenuItem Header="Crop image" Command="{Binding $parent[ListBox].((vm:ImageTableViewModel)DataContext).CropImageCommand}"/>
8687
</ContextMenu>
8788
</Image.ContextMenu>
8889
</Image>
@@ -136,7 +137,7 @@
136137
<!--Bounding box-->
137138
<Rectangle Canvas.Left="{Binding SelectedImage.SelectedBitmapPreviewBorder.X}" Canvas.Top="{Binding SelectedImage.SelectedBitmapPreviewBorder.Y}" StrokeThickness="1.0" Width="{Binding SelectedImage.SelectedBitmapPreviewBorder.Width}" Height="{Binding SelectedImage.SelectedBitmapPreviewBorder.Height}" Opacity="1.0" Fill="{Binding #ImageColorViewPreviewBackground.Color, ConverterParameter={x:Static Brushes.Transparent}, Converter={StaticResource ColorToBrushConverter}}" Stroke="{Binding #ImageColorViewBorder.Color, ConverterParameter={x:Static Brushes.Transparent}, Converter={StaticResource ColorToBrushConverter}}" />
138139
<!--Image-->
139-
<Image Canvas.Left="{Binding SelectedImage.XOffset}" Canvas.Top="{Binding SelectedImage.YOffset}" Source="{Binding SelectedImage.Image}" RenderOptions.BitmapInterpolationMode="None" Stretch="None"/>
140+
<Image Canvas.Left="{Binding SelectedImage.XOffset}" Canvas.Top="{Binding SelectedImage.YOffset}" Source="{Binding SelectedImage.DisplayedImage}" RenderOptions.BitmapInterpolationMode="None" Stretch="None"/>
140141
<!--Origin point-->
141142
<Rectangle Canvas.Left="0" Canvas.Top="0" Width="1" Height="1" Opacity="1.0" Fill="{Binding #ImageColorViewOriginPoint.Color, ConverterParameter={x:Static Brushes.Transparent}, Converter={StaticResource ColorToBrushConverter}}" />
142143
</Canvas>

Gui/Views/ImageTableView.axaml.cs

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ public ImageTableView()
1313
if (ZoomBorder != null)
1414
{
1515
ZoomBorder.KeyDown += ZoomBorder_KeyDown;
16-
ZoomBorder.PointerWheelChanged += ZoomBorder_PointerWheelChanged;
1716
}
1817
}
1918

@@ -31,14 +30,4 @@ void ZoomBorder_KeyDown(object? sender, KeyEventArgs e)
3130
}
3231
#pragma warning restore IDE0010 // Add missing cases
3332
}
34-
35-
void ZoomBorder_PointerWheelChanged(object? sender, PointerWheelEventArgs e)
36-
{
37-
// Capture the scroll event when the mouse is over the ZoomBorder
38-
if (ZoomBorder != null && ZoomBorder.IsPointerOver)
39-
{
40-
// Handle the zoom functionality here (if needed)
41-
e.Handled = true; // Prevent the event from propagating to the ScrollViewer
42-
}
43-
}
4433
}

0 commit comments

Comments
 (0)