예제 #1
0
        public void RemoveFrames(ICollection <int> frames)
        {
            if (frames.Any())
            {
                var invalidateAfter = frames.Min();

                bool endBatch = ChangeLog.BeginNewBatch("Remove Multiple Frames", true);
                ChangeLog.AddGeneralUndo(invalidateAfter, InputLogLength - 1);

                foreach (var frame in frames.OrderByDescending(f => f))                 // Removing them in reverse order allows us to remove by index;
                {
                    if (frame < Log.Count)
                    {
                        Log.RemoveAt(frame);
                    }

                    if (BindMarkersToInput)                     // TODO: This is slow, is there a better way to do it?
                    {
                        bool wasRecording = ChangeLog.IsRecording;
                        ChangeLog.IsRecording = false;
                        int firstIndex = Markers.FindIndex(m => m.Frame >= frame);
                        if (firstIndex != -1)
                        {
                            for (int i = firstIndex; i < Markers.Count; i++)
                            {
                                TasMovieMarker m = Markers[i];
                                if (m.Frame == frame)
                                {
                                    Markers.Remove(m);
                                }
                                else
                                {
                                    Markers.Move(m.Frame, m.Frame - 1);
                                }
                            }
                        }

                        ChangeLog.IsRecording = wasRecording;
                    }
                }

                Changes = true;
                InvalidateAfter(invalidateAfter);

                ChangeLog.SetGeneralRedo();
                if (endBatch)
                {
                    ChangeLog.EndBatch();
                }
            }
        }
예제 #2
0
 public MovieActionMarker(TasMovieMarker marker, int oldPosition = -1, string oldMessage = "")
 {
     FirstFrame = oldPosition;
     if (marker == null)
     {
         LastFrame   = -1;
         _oldMessage = oldMessage;
     }
     else
     {
         LastFrame   = marker.Frame;
         _oldMessage = oldMessage == "" ? marker.Message : oldMessage;
         _newMessage = marker.Message;
     }
 }
예제 #3
0
        public void AddMarkerChange(TasMovieMarker newMarker, int oldPosition = -1, string oldMessage = "", string name = "", bool force = false)
        {
            if (IsRecording || force)
            {
                if (oldPosition == -1)
                {
                    name = $"Set Marker at frame {newMarker.Frame}";
                }
                else
                {
                    name = $"Remove Marker at frame {oldPosition}";
                }

                AddMovieAction(name);
                _history.Last().Add(new MovieActionMarker(newMarker, oldPosition, oldMessage));
            }
        }
예제 #4
0
        public void InsertEmptyFrame(int frame, int count = 1)
        {
            bool endBatch = ChangeLog.BeginNewBatch("Insert Empty Frame: " + frame, true);

            ChangeLog.AddGeneralUndo(frame, InputLogLength + count - 1);

            var lg = LogGeneratorInstance();

            lg.SetSource(Global.MovieSession.MovieControllerInstance());

            for (int i = 0; i < count; i++)
            {
                _log.Insert(frame, lg.EmptyEntry);
            }

            if (BindMarkersToInput)
            {
                bool wasRecording = ChangeLog.IsRecording;
                ChangeLog.IsRecording = false;
                int firstIndex = Markers.FindIndex(m => m.Frame >= frame);
                if (firstIndex != -1)
                {
                    for (int i = firstIndex; i < Markers.Count; i++)
                    {
                        TasMovieMarker m = Markers.ElementAt(i);
                        Markers.Move(m.Frame, m.Frame + count);
                    }
                }
                ChangeLog.IsRecording = wasRecording;
            }


            Changes = true;
            InvalidateAfter(frame - 1);

            ChangeLog.SetGeneralRedo();
            if (endBatch)
            {
                ChangeLog.EndBatch();
            }

            if (Global.Emulator.Frame < _log.Count)             // Don't stay in recording mode? Fixes TAStudio recording after paint inserting.
            {
                this.SwitchToPlay();
            }
        }
예제 #5
0
        public void InsertEmptyFrame(int frame, int count = 1, bool fromHistory = false)
        {
            bool endBatch = ChangeLog.BeginNewBatch($"Insert Empty Frame: {frame}", true);

            ChangeLog.AddGeneralUndo(frame, InputLogLength + count - 1);

            var lg = LogGeneratorInstance();

            lg.SetSource(Global.MovieSession.MovieControllerInstance());

            if (frame > Log.Count())
            {
                frame = Log.Count();
            }

            for (int i = 0; i < count; i++)
            {
                Log.Insert(frame, lg.EmptyEntry);
            }

            if (BindMarkersToInput)
            {
                bool wasRecording = ChangeLog.IsRecording;
                ChangeLog.IsRecording = false;
                int firstIndex = Markers.FindIndex(m => m.Frame >= frame);
                if (firstIndex != -1)
                {
                    for (int i = firstIndex; i < Markers.Count; i++)
                    {
                        TasMovieMarker m = Markers[i];
                        Markers.Move(m.Frame, m.Frame + count, fromHistory);
                    }
                }

                ChangeLog.IsRecording = wasRecording;
            }

            Changes = true;
            InvalidateAfter(frame);

            ChangeLog.SetGeneralRedo();
            if (endBatch)
            {
                ChangeLog.EndBatch();
            }
        }
예제 #6
0
        public void RemoveFrames(int removeStart, int removeUpTo, bool fromHistory = false)
        {
            bool endBatch = ChangeLog.BeginNewBatch("Remove Frames: " + removeStart + "-" + removeUpTo, true);

            ChangeLog.AddGeneralUndo(removeStart, InputLogLength - 1);

            for (int i = removeUpTo - 1; i >= removeStart; i--)
            {
                Log.RemoveAt(i);
            }

            if (BindMarkersToInput)
            {
                bool wasRecording = ChangeLog.IsRecording;
                ChangeLog.IsRecording = false;
                int firstIndex = Markers.FindIndex(m => m.Frame >= removeStart);
                if (firstIndex != -1)
                {
                    for (int i = firstIndex; i < Markers.Count; i++)
                    {
                        TasMovieMarker m = Markers.ElementAt(i);
                        if (m.Frame < removeUpTo)
                        {
                            Markers.Remove(m);
                        }
                        else
                        {
                            Markers.Move(m.Frame, m.Frame - (removeUpTo - removeStart), fromHistory);
                        }
                    }
                }

                ChangeLog.IsRecording = wasRecording;
            }

            Changes = true;
            InvalidateAfter(removeStart);

            ChangeLog.SetGeneralRedo();
            if (endBatch)
            {
                ChangeLog.EndBatch();
            }
        }
예제 #7
0
        public void RemoveFrame(int frame)
        {
            bool endBatch = ChangeLog.BeginNewBatch("Remove Frame: " + frame, true);

            ChangeLog.AddGeneralUndo(frame, InputLogLength - 1);

            Log.RemoveAt(frame);
            if (BindMarkersToInput)
            {
                bool wasRecording = ChangeLog.IsRecording;
                ChangeLog.IsRecording = false;
                int firstIndex = Markers.FindIndex(m => m.Frame >= frame);
                if (firstIndex != -1)
                {
                    for (int i = firstIndex; i < Markers.Count; i++)
                    {
                        TasMovieMarker m = Markers.ElementAt(i);
                        if (m.Frame == frame)
                        {
                            Markers.Remove(m);
                        }
                        else
                        {
                            Markers.Move(m.Frame, m.Frame - 1);
                        }
                    }
                }

                ChangeLog.IsRecording = wasRecording;
            }

            Changes = true;
            InvalidateAfter(frame);

            ChangeLog.SetGeneralRedo();
            if (endBatch)
            {
                ChangeLog.EndBatch();
            }
        }