private void ChangeFrameSize(int dw, int dh) { if (dw == 0 && dh == 0) { return; } Sequences.ForAll(s => s.ChangeFrameSize(dw, dh)); if (dw != 0) { NotifyPropertyChanged(nameof(FrameWidth)); NotifyPropertyChanged(nameof(SpriteSheetWidth)); } if (dh != 0) { NotifyPropertyChanged(nameof(FrameHeight)); NotifyPropertyChanged(nameof(SpriteSheetHeight)); } FrameSizesUpdated?.Invoke(this, new FrameSizesUpdatedEventArgs()); }
public Homm3HdSpriteSheetViewModel(Action <IEnumerable, object> registerCollectionSynchronization) : base(registerCollectionSynchronization) { Sequences = new ObservableCollection <SpriteFrameSequenceViewModel>(); RegisterCollectionSynchronization(Sequences); ChangeFrameWidth = new Command <string>((arg) => { var dw = Convert.ToInt32(arg); Sequences.ForAll(s => s.ChangeFrameSize(dw, 0)); NotifyPropertyChanged(nameof(FrameWidth)); FrameSizesUpdated?.Invoke(this, new FrameSizesUpdatedEventArgs()); }); ChangeFrameHeight = new Command <string>((arg) => { var dh = Convert.ToInt32(arg); Sequences.ForAll(s => s.ChangeFrameSize(0, dh)); NotifyPropertyChanged(nameof(FrameHeight)); FrameSizesUpdated?.Invoke(this, new FrameSizesUpdatedEventArgs()); }); ChangeScaling = new Command <string>((arg) => { var ds = Convert.ToDouble(arg); Sequences.ForAll(s => s.Data.ForAll(d => d.FramedImage.Scale += ds)); NotifyPropertyChanged(nameof(Scaling)); }); ResetSizing = new Command(() => { Sequences.ForAll(s => s.ResetSizeAndScaling(OriginalFrameWidth, OriginalFrameHeight, OriginalScale)); NotifyPropertyChanged(nameof(FrameWidth)); NotifyPropertyChanged(nameof(FrameHeight)); NotifyPropertyChanged(nameof(Scaling)); FrameSizesUpdated?.Invoke(this, new FrameSizesUpdatedEventArgs()); }); RecalculateFrameSize = new Command(() => { int leftest = int.MaxValue; int rightest = int.MinValue; int topest = int.MaxValue; int bottomest = int.MinValue; foreach (var sequence in Sequences) { foreach (var data in sequence.Data) { var left = (int)(data.FramedImage.OffsetX - data.FramedImage.Width / 2 * data.FramedImage.Scale); var right = (int)(data.FramedImage.OffsetX + data.FramedImage.Width / 2 * data.FramedImage.Scale); var bottom = (int)(data.FramedImage.OffsetY + data.FramedImage.Height * data.FramedImage.Scale); var top = (int)(data.FramedImage.OffsetY); leftest = leftest < left ? leftest : left; rightest = rightest > right ? rightest : right; bottomest = bottomest > bottom ? bottomest : bottom; topest = topest < top ? topest : top; } } var maxWidth = rightest - leftest; var maxHeight = bottomest - topest; Sequences.ForAll(s => s.Data.ForAll(d => d.FramedImage.FrameWidth = maxWidth)); Sequences.ForAll(s => s.Data.ForAll(d => d.FramedImage.FrameHeight = maxHeight)); NotifyPropertyChanged(nameof(FrameWidth)); NotifyPropertyChanged(nameof(FrameHeight)); FrameSizesUpdated?.Invoke(this, new FrameSizesUpdatedEventArgs()); }); Initialize(); Unload = new Command(() => { SequencesLoaded = false; Clear(); }); }