Ejemplo n.º 1
0
        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());
        }
Ejemplo n.º 2
0
        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();
            });
        }