mirror of
https://github.com/haven1433/HexManiacAdvance.git
synced 2026-05-20 20:28:05 -05:00
ImageEditor -> allow editing other pages of a sprite
This commit is contained in:
parent
86effe125f
commit
f8cdbce616
|
|
@ -18,7 +18,6 @@
|
|||
|
||||
public LzSpriteRun(SpriteFormat spriteFormat, IDataModel data, int start, SortedSpan<int> sources = null)
|
||||
: base(data, start, spriteFormat.AllowLengthErrors, sources) {
|
||||
if (start== 0xB9E8C4) { }
|
||||
SpriteFormat = spriteFormat;
|
||||
if (spriteFormat.ExpectedByteLength > DecompressedLength) InvalidateLength();
|
||||
var hintContent = string.Empty;
|
||||
|
|
|
|||
|
|
@ -71,6 +71,11 @@ namespace HavenSoft.HexManiac.Core.ViewModels {
|
|||
|
||||
#endregion
|
||||
|
||||
#region Pages
|
||||
private int spritePage;
|
||||
public int SpritePage { get => spritePage; set => Set(ref spritePage, value, _ => Refresh()); }
|
||||
#endregion
|
||||
|
||||
private IImageToolStrategy toolStrategy;
|
||||
private EyeDropperTool eyeDropperStrategy; // stored separately because of right-click
|
||||
private PanTool panStrategy; // stored separately because of center-click
|
||||
|
|
@ -242,7 +247,7 @@ namespace HavenSoft.HexManiac.Core.ViewModels {
|
|||
public void Refresh() {
|
||||
var spriteAddress = model.ReadPointer(SpritePointer);
|
||||
var spriteRun = (ISpriteRun)model.GetNextRun(spriteAddress);
|
||||
pixels = spriteRun.GetPixels(model, 0);
|
||||
pixels = spriteRun.GetPixels(model, SpritePage);
|
||||
Render();
|
||||
RefreshPaletteColors();
|
||||
}
|
||||
|
|
@ -299,7 +304,7 @@ namespace HavenSoft.HexManiac.Core.ViewModels {
|
|||
private void UpdateSpriteModel() {
|
||||
var spriteAddress = model.ReadPointer(SpritePointer);
|
||||
var spriteRun = (ISpriteRun)model.GetNextRun(spriteAddress);
|
||||
spriteRun.SetPixels(model, history.CurrentChange, 0, pixels);
|
||||
spriteRun.SetPixels(model, history.CurrentChange, SpritePage, pixels);
|
||||
}
|
||||
|
||||
private void UpdateSelectionFromPaletteHover(PaletteCollection sender, PropertyChangedEventArgs e) {
|
||||
|
|
|
|||
|
|
@ -384,7 +384,7 @@ namespace HavenSoft.HexManiac.Core.ViewModels.Tools {
|
|||
public ICommand NextPalettePage => nextPalPage;
|
||||
|
||||
private StubCommand openInImageTab;
|
||||
public ICommand OpenInImageTab => StubCommand(ref openInImageTab, () => viewPort.OpenImageEditorTab(spriteAddress), () => {
|
||||
public ICommand OpenInImageTab => StubCommand(ref openInImageTab, () => viewPort.OpenImageEditorTab(spriteAddress, spritePage, palPage), () => {
|
||||
if (model.GetNextRun(spriteAddress) is ISpriteRun spriteRun && !spriteRun.SupportsEdit) return false;
|
||||
return exportPair.CanExecute(null);
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1561,8 +1561,8 @@ namespace HavenSoft.HexManiac.Core.ViewModels {
|
|||
RequestTabChange(this, newTab);
|
||||
}
|
||||
|
||||
public void OpenImageEditorTab(int address) {
|
||||
var newTab = new ImageEditorViewModel(history, Model, address);
|
||||
public void OpenImageEditorTab(int address, int spritePage, int palettePage) {
|
||||
var newTab = new ImageEditorViewModel(history, Model, address) { SpritePage = spritePage };
|
||||
RequestTabChange(this, newTab);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -64,6 +64,23 @@ namespace HavenSoft.HexManiac.Tests {
|
|||
editor = new ImageEditorViewModel(history, model, 0);
|
||||
}
|
||||
|
||||
private void Create2PageCompressedSprite() {
|
||||
// header: 10 40 00 00
|
||||
// body: 0b00111000 00 00 1F0 1F0 1F0 00 00 00
|
||||
// 0x00 00 00 00 00 00
|
||||
|
||||
model.WriteValue(history.CurrentChange, 0, 0x4010);
|
||||
model[4] = 0b00111000;
|
||||
model.WriteMultiByteValue(7, 2, history.CurrentChange, 0x1F0);
|
||||
model.WriteMultiByteValue(9, 2, history.CurrentChange, 0x1F0);
|
||||
model.WriteMultiByteValue(11, 2, history.CurrentChange, 0x1F0);
|
||||
|
||||
var sprite = new LzSpriteRun(new SpriteFormat(4, 1, 1, "palette"), model, 0, new SortedSpan<int>(0x80));
|
||||
model.ObserveAnchorWritten(history.CurrentChange, "sprite", sprite);
|
||||
|
||||
editor.Refresh();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Palette_Default_NoColorsSelected() {
|
||||
Assert.Empty(editor.Palette.Elements.Where(sc => sc.Selected));
|
||||
|
|
@ -638,5 +655,18 @@ namespace HavenSoft.HexManiac.Tests {
|
|||
|
||||
Assert.True(editor.ShowSelectionRect(5, 5));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TwoPageSprite_RequestSecondPage_EditsSecondPage() {
|
||||
Create2PageCompressedSprite();
|
||||
editor.SpritePage = 1;
|
||||
editor.Palette.Elements[1].Color = White;
|
||||
editor.Palette.SelectionStart = 1;
|
||||
|
||||
ToolMove(new Point(-4, -4));
|
||||
|
||||
var decompress = LZRun.Decompress(model, 0);
|
||||
Assert.Equal(1, decompress[0x20] & 0xF);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user