Example #1
0
        private void RegisterEditorHotkeys()
        {
            InputUtils.RegisterHotkey(Hotkey.EditorPencilTool, () => !Track.Playing, () =>
            {
                CurrentTools.SetTool(CurrentTools.PencilTool);
            });
            InputUtils.RegisterHotkey(Hotkey.EditorLineTool, () => !Track.Playing, () =>
            {
                CurrentTools.SetTool(CurrentTools.LineTool);
            });
            InputUtils.RegisterHotkey(Hotkey.EditorEraserTool, () => !Track.Playing, () =>
            {
                CurrentTools.SetTool(CurrentTools.EraserTool);
            });
            InputUtils.RegisterHotkey(Hotkey.EditorSelectTool, () => !Track.Playing, () =>
            {
                CurrentTools.SetTool(CurrentTools.MoveTool);
            });
            InputUtils.RegisterHotkey(Hotkey.EditorPanTool, () => !Track.Playing, () =>
            {
                CurrentTools.SetTool(CurrentTools.HandTool);
            });
            InputUtils.RegisterHotkey(Hotkey.EditorQuickPan, () => !Track.Playing && !Canvas.IsModalOpen, () =>
            {
                CurrentTools.QuickPan = true;
                Invalidate();
                UpdateCursor();
            },
                                      () =>
            {
                CurrentTools.QuickPan = false;
                Invalidate();
                UpdateCursor();
            });
            InputUtils.RegisterHotkey(Hotkey.EditorDragCanvas, () => !Track.Playing && !Canvas.IsModalOpen, () =>
            {
                var mouse             = InputUtils.GetMouse();
                CurrentTools.QuickPan = true;
                CurrentTools.HandTool.OnMouseDown(new Vector2d(mouse.X, mouse.Y));
            },
                                      () =>
            {
                if (CurrentTools.QuickPan)
                {
                    var mouse = InputUtils.GetMouse();
                    CurrentTools.HandTool.OnMouseUp(new Vector2d(mouse.X, mouse.Y));
                    CurrentTools.QuickPan = false;
                }
            });

            InputUtils.RegisterHotkey(Hotkey.EditorUndo, () => !Track.Playing, () =>
            {
                CurrentTools.SelectedTool.Cancel();
                var hint = Track.UndoManager.Undo();
                CurrentTools.SelectedTool.OnUndoRedo(true, hint);
                Invalidate();
            },
                                      null,
                                      repeat: true);
            InputUtils.RegisterHotkey(Hotkey.EditorRedo, () => !Track.Playing, () =>
            {
                CurrentTools.SelectedTool.Cancel();
                var hint = Track.UndoManager.Redo();
                CurrentTools.SelectedTool.OnUndoRedo(false, hint);
                Invalidate();
            },
                                      null,
                                      repeat: true);
            InputUtils.RegisterHotkey(Hotkey.EditorRemoveLatestLine, () => !Track.Playing, () =>
            {
                if (!Track.Playing)
                {
                    StopTools();
                    using (var trk = Track.CreateTrackWriter())
                    {
                        CurrentTools.SelectedTool.Stop();
                        var l = trk.GetNewestLine();
                        if (l != null)
                        {
                            Track.UndoManager.BeginAction();
                            trk.RemoveLine(l);
                            Track.UndoManager.EndAction();
                        }

                        Track.NotifyTrackChanged();
                        Invalidate();
                    }
                }
            },
                                      null,
                                      repeat: true);
            InputUtils.RegisterHotkey(Hotkey.EditorFocusStart, () => !Track.Playing, () =>
            {
                using (var trk = Track.CreateTrackReader())
                {
                    var l = trk.GetOldestLine();
                    if (l != null)
                    {
                        Track.Camera.SetFrameCenter(l.Position);
                        Invalidate();
                    }
                }
            });
            InputUtils.RegisterHotkey(Hotkey.EditorFocusLastLine, () => !Track.Playing, () =>
            {
                using (var trk = Track.CreateTrackReader())
                {
                    var l = trk.GetNewestLine();
                    if (l != null)
                    {
                        Track.Camera.SetFrameCenter(l.Position);
                        Invalidate();
                    }
                }
            });
            InputUtils.RegisterHotkey(Hotkey.EditorCycleToolSetting, () => !Track.Playing, () =>
            {
                if (CurrentTools.SelectedTool.ShowSwatch)
                {
                    CurrentTools.SelectedTool.Swatch.IncrementSelectedMultiplier();
                    Invalidate();
                }
            });
            InputUtils.RegisterHotkey(Hotkey.ToolToggleOverlay, () => !Track.Playing, () =>
            {
                Settings.Local.TrackOverlay = !Settings.Local.TrackOverlay;
            });
            InputUtils.RegisterHotkey(Hotkey.EditorToolColor1, () => !Track.Playing, () =>
            {
                var swatch = CurrentTools.SelectedTool.Swatch;
                if (swatch != null)
                {
                    swatch.Selected = LineType.Blue;
                }
                Invalidate();
            });
            InputUtils.RegisterHotkey(Hotkey.EditorToolColor2, () => !Track.Playing, () =>
            {
                var swatch = CurrentTools.SelectedTool.Swatch;
                if (swatch != null)
                {
                    swatch.Selected = LineType.Red;
                }
                Invalidate();
            });
            InputUtils.RegisterHotkey(Hotkey.EditorToolColor3, () => !Track.Playing, () =>
            {
                var swatch = CurrentTools.SelectedTool.Swatch;
                if (swatch != null)
                {
                    swatch.Selected = LineType.Scenery;
                }
                Invalidate();
            });
            InputUtils.RegisterHotkey(Hotkey.EditorFocusFlag, () => !Track.Playing, () =>
            {
                var flag = Track.GetFlag();
                if (flag != null)
                {
                    Track.Camera.SetFrameCenter(flag.State.CalculateCenter());
                    Invalidate();
                }
            });
            InputUtils.RegisterHotkey(Hotkey.EditorFocusRider, () => !Track.Playing, () =>
            {
                Track.Camera.SetFrameCenter(Track.RenderRider.CalculateCenter());
                Invalidate();
            });
            InputUtils.RegisterHotkey(Hotkey.EditorCancelTool,
                                      () => CurrentTools.SelectedTool.Active,
                                      () =>
            {
                var tool       = CurrentTools.SelectedTool;
                var selecttool = CurrentTools.SelectTool;
                if (tool == selecttool)
                {
                    selecttool.CancelSelection();
                }
                else
                {
                    tool.Cancel();
                }
                Invalidate();
            });
            InputUtils.RegisterHotkey(Hotkey.ToolCopy, () => !Track.Playing &&
                                      CurrentTools.SelectedTool == CurrentTools.SelectTool, () =>
            {
                CurrentTools.SelectTool.Copy();
                Invalidate();
            },
                                      null,
                                      repeat: false);
            InputUtils.RegisterHotkey(Hotkey.ToolCut, () => !Track.Playing &&
                                      CurrentTools.SelectedTool == CurrentTools.SelectTool, () =>
            {
                CurrentTools.SelectTool.Cut();
                Invalidate();
            },
                                      null,
                                      repeat: false);
            InputUtils.RegisterHotkey(Hotkey.ToolPaste, () => !Track.Playing &&
                                      (CurrentTools.SelectedTool == CurrentTools.SelectTool ||
                                       CurrentTools.SelectedTool == CurrentTools.MoveTool), () =>
            {
                CurrentTools.SelectTool.Paste();
                Invalidate();
            },
                                      null,
                                      repeat: false);
            InputUtils.RegisterHotkey(Hotkey.ToolDelete, () => !Track.Playing &&
                                      CurrentTools.SelectedTool == CurrentTools.SelectTool, () =>
            {
                CurrentTools.SelectTool.Delete();
                Invalidate();
            },
                                      null,
                                      repeat: false);
        }
Example #2
0
        public void Render(float blend = 1)
        {
            bool shouldrender = _invalidated ||
                                Canvas.NeedsRedraw ||
                                (Track.Playing) ||
                                Canvas.Loading ||
                                Track.NeedsDraw ||
                                CurrentTools.SelectedTool.NeedsRender;

            if (shouldrender)
            {
                _invalidated = false;
                BeginOrtho();
                if (blend == 1 && Settings.SmoothPlayback && Track.Playing && !Canvas.Scrubbing)
                {
                    blend = Math.Min(1, (float)Track.Scheduler.ElapsedPercent);
                    if (ReversePlayback)
                    {
                        blend = 1 - blend;
                    }
                    Track.Camera.BeginFrame(blend, Track.Zoom);
                }
                else
                {
                    Track.Camera.BeginFrame(blend, Track.Zoom);
                }
                if (Track.Playing && CurrentTools.PencilTool.Active)
                {
                    CurrentTools.PencilTool.OnMouseMoved(InputUtils.GetMouse());
                }
                GL.ClearColor(Settings.NightMode
                   ? Constants.ColorNightMode
                   : (Settings.WhiteBG ? Constants.ColorWhite : Constants.ColorOffwhite));
                MSAABuffer.Use(RenderSize.Width, RenderSize.Height);
                GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha);
                GL.Clear(ClearBufferMask.ColorBufferBit);
                GL.Enable(EnableCap.Blend);

#if debuggrid
                if (this.Keyboard.GetState().IsKeyDown(Key.C))
                {
                    GameRenderer.DbgDrawGrid();
                }
#endif
                Track.Render(blend);
#if debugcamera
                if (this.Keyboard.GetState().IsKeyDown(Key.C))
                {
                    GameRenderer.DbgDrawCamera();
                }
#endif
                Canvas.RenderCanvas();
                MSAABuffer.End();

                if (Settings.NightMode)
                {
                    StaticRenderer.RenderRect(new FloatRect(0, 0, RenderSize.Width, RenderSize.Height), Color.FromArgb(40, 0, 0, 0));
                }
                SwapBuffers();
                //there are machines and cases where a refresh may not hit the screen without calling glfinish...
                GL.Finish();
                var seconds = Track.FramerateWatch.Elapsed.TotalSeconds;
                Track.FramerateCounter.AddFrame(seconds);
                Track.FramerateWatch.Restart();
            }
            if (!Focused && !TrackRecorder.Recording)
            {
                Thread.Sleep(16);
            }
            else
            if (!Track.Playing &&
                !Canvas.NeedsRedraw &&
                !Track.NeedsDraw &&
                !CurrentTools.SelectedTool.Active)
            {
                Thread.Sleep(10);
            }
        }
Example #3
0
 private void RegisterPlaybackHotkeys()
 {
     InputUtils.RegisterHotkey(Hotkey.PlaybackStartSlowmo, () => true, () =>
     {
         StopTools();
         Track.StartFromFlag();
         Track.Scheduler.UpdatesPerSecond = Settings.SlowmoSpeed;
     });
     InputUtils.RegisterHotkey(Hotkey.PlaybackStartIgnoreFlag, () => true, () =>
     {
         StopTools();
         Track.StartIgnoreFlag();
         Track.ResetSpeedDefault();
     });
     // InputUtils.RegisterHotkey(Hotkey.PlaybackStartGhostFlag, () => true, () =>
     // {
     //     StopTools();
     //     Track.ResumeFromFlag();
     //     Track.ResetSpeedDefault();
     // });
     InputUtils.RegisterHotkey(Hotkey.PlaybackStart, () => true, () =>
     {
         StopTools();
         Track.StartFromFlag();
         Track.ResetSpeedDefault();
     });
     InputUtils.RegisterHotkey(Hotkey.PlaybackStop, () => true, () =>
     {
         StopTools();
         Track.Stop();
     });
     InputUtils.RegisterHotkey(Hotkey.PlaybackFlag, () => true, () =>
     {
         Track.Flag(Track.Offset);
     });
     InputUtils.RegisterHotkey(Hotkey.PlaybackForward, () => true, () =>
     {
         StopTools();
         if (Track.Paused)
         {
             Track.TogglePause();
         }
         ReversePlayback = false;
         UpdateCursor();
     },
                               () =>
     {
         if (!Track.Paused)
         {
             Track.TogglePause();
         }
         ReversePlayback = false;
         Track.UpdateCamera();
         UpdateCursor();
     });
     InputUtils.RegisterHotkey(Hotkey.PlaybackBackward, () => true, () =>
     {
         StopTools();
         if (Track.Paused)
         {
             Track.TogglePause();
         }
         ReversePlayback = true;
         UpdateCursor();
     },
                               () =>
     {
         if (!Track.Paused)
         {
             Track.TogglePause();
         }
         ReversePlayback = false;
         Track.UpdateCamera();
         UpdateCursor();
     });
     InputUtils.RegisterHotkey(Hotkey.PlaybackFrameNext, () => true, () =>
     {
         StopHandTool();
         if (!Track.Paused)
         {
             Track.TogglePause();
         }
         Track.NextFrame();
         Invalidate();
         Track.UpdateCamera();
         if (CurrentTools.SelectedTool.IsMouseButtonDown)
         {
             CurrentTools.SelectedTool.OnMouseMoved(InputUtils.GetMouse());
         }
     },
                               null,
                               repeat: true);
     InputUtils.RegisterHotkey(Hotkey.PlaybackFramePrev, () => true, () =>
     {
         StopHandTool();
         if (!Track.Paused)
         {
             Track.TogglePause();
         }
         Track.PreviousFrame();
         Invalidate();
         Track.UpdateCamera(true);
         if (CurrentTools.SelectedTool.IsMouseButtonDown)
         {
             CurrentTools.SelectedTool.OnMouseMoved(InputUtils.GetMouse());
         }
     },
                               null,
                               repeat: true);
     InputUtils.RegisterHotkey(Hotkey.PlaybackSpeedUp, () => true, () =>
     {
         Track.PlaybackSpeedUp();
     });
     InputUtils.RegisterHotkey(Hotkey.PlaybackSpeedDown, () => true, () =>
     {
         Track.PlaybackSpeedDown();
     });
     InputUtils.RegisterHotkey(Hotkey.PlaybackSlowmo, () => true, () =>
     {
         if (Track.Scheduler.UpdatesPerSecond !=
             Settings.SlowmoSpeed)
         {
             Track.Scheduler.UpdatesPerSecond = Settings.SlowmoSpeed;
         }
         else
         {
             Track.ResetSpeedDefault(false);
         }
     });
     InputUtils.RegisterHotkey(Hotkey.PlaybackTogglePause, () => true, () =>
     {
         StopTools();
         Track.TogglePause();
     },
                               null,
                               repeat: false);
     InputUtils.RegisterHotkey(Hotkey.PlaybackIterationNext, () => !Track.Playing, () =>
     {
         StopTools();
         if (!Track.Paused)
         {
             Track.TogglePause();
         }
         if (Track.IterationsOffset != 6)
         {
             Track.IterationsOffset++;
         }
         else
         {
             Track.NextFrame();
             Track.IterationsOffset = 0;
             Track.UpdateCamera();
         }
         Track.InvalidateRenderRider();
     },
                               null,
                               repeat: true);
     InputUtils.RegisterHotkey(Hotkey.PlaybackIterationPrev, () => !Track.Playing, () =>
     {
         if (Track.Offset != 0)
         {
             StopTools();
             if (Track.IterationsOffset > 0)
             {
                 Track.IterationsOffset--;
             }
             else
             {
                 Track.PreviousFrame();
                 Track.IterationsOffset = 6;
                 Invalidate();
                 Track.UpdateCamera();
             }
             Track.InvalidateRenderRider();
         }
     },
                               null,
                               repeat: true);
     InputUtils.RegisterHotkey(Hotkey.PlaybackResetCamera, () => true, () =>
     {
         Track.Zoom        = Track.Timeline.GetFrameZoom(Track.Offset);
         Track.UseUserZoom = false;
         Track.UpdateCamera();
     });
 }
Example #4
0
        private void RegisterEditorHotkeys()
        {
            InputUtils.RegisterHotkey(Hotkey.ToggleAll, () => !Track.Playing, () =>
            {
                if (Settings.ToggleConfig)
                {
                    if (Settings.ConfigTContactPoints)
                    {
                        Settings.Editor.DrawContactPoints = true;
                    }
                    if (Settings.ConfigTGravityWells)
                    {
                        Settings.Editor.RenderGravityWells = true;
                    }
                    if (Settings.ConfigTHitTest)
                    {
                        Settings.Editor.HitTest = true;
                    }
                    if (Settings.ConfigTMomentumVectors)
                    {
                        Settings.Editor.MomentumVectors = true;
                    }
                    if (Settings.ConfigTOnionSkinning)
                    {
                        Settings.OnionSkinning = true;
                    }
                    Settings.ToggleConfig = false;
                }
                else
                {
                    if (Settings.ConfigTContactPoints)
                    {
                        Settings.Editor.DrawContactPoints = false;
                    }
                    if (Settings.ConfigTGravityWells)
                    {
                        Settings.Editor.RenderGravityWells = false;
                    }
                    if (Settings.ConfigTHitTest)
                    {
                        Settings.Editor.HitTest = false;
                    }
                    if (Settings.ConfigTMomentumVectors)
                    {
                        Settings.Editor.MomentumVectors = false;
                    }
                    if (Settings.ConfigTOnionSkinning)
                    {
                        Settings.OnionSkinning = false;
                    }
                    Settings.ToggleConfig = true;
                }
            });

            InputUtils.RegisterHotkey(Hotkey.ScenerySetSmall, () => !Track.Playing, () =>
            {
                var toolswatch             = CurrentTools.SelectedTool.Swatch;
                toolswatch.GreenMultiplier = 0.1f;
            });
            InputUtils.RegisterHotkey(Hotkey.SceneryIncreaseBig, () => !Track.Playing, () =>
            {
                var toolswatch             = CurrentTools.SelectedTool.Swatch;
                toolswatch.GreenMultiplier = (float)Math.Round(Math.Min(25.5f, toolswatch.GreenMultiplier + 0.10f), 2);
            });
            InputUtils.RegisterHotkey(Hotkey.SceneryDecreaseBig, () => !Track.Playing, () =>
            {
                var toolswatch             = CurrentTools.SelectedTool.Swatch;
                toolswatch.GreenMultiplier = (float)Math.Round(Math.Max(0.1f, toolswatch.GreenMultiplier - 0.10f), 2);
            });

            InputUtils.RegisterHotkey(Hotkey.AccelerationSetSmall, () => !Track.Playing, () =>
            {
                var toolswatch           = CurrentTools.SelectedTool.Swatch;
                toolswatch.RedMultiplier = 1;
            });
            InputUtils.RegisterHotkey(Hotkey.AccelerationSetMedium, () => !Track.Playing, () =>
            {
                var toolswatch           = CurrentTools.SelectedTool.Swatch;
                toolswatch.RedMultiplier = 100;
            });
            InputUtils.RegisterHotkey(Hotkey.AccelerationSetLarge, () => !Track.Playing, () =>
            {
                var toolswatch           = CurrentTools.SelectedTool.Swatch;
                toolswatch.RedMultiplier = 200;
            });
            InputUtils.RegisterHotkey(Hotkey.AccelerationSetMax, () => !Track.Playing, () =>
            {
                var toolswatch           = CurrentTools.SelectedTool.Swatch;
                toolswatch.RedMultiplier = 255;
            });

            InputUtils.RegisterHotkey(Hotkey.EditorPencilTool, () => !Track.Playing, () =>
            {
                CurrentTools.SetTool(CurrentTools.PencilTool);
            });
            InputUtils.RegisterHotkey(Hotkey.EditorLineTool, () => !Track.Playing, () =>
            {
                CurrentTools.SetTool(CurrentTools.LineTool);
            });
            InputUtils.RegisterHotkey(Hotkey.EditorEraserTool, () => !Track.Playing, () =>
            {
                CurrentTools.SetTool(CurrentTools.EraserTool);
            });
            InputUtils.RegisterHotkey(Hotkey.EditorSelectTool, () => !Track.Playing, () =>
            {
                CurrentTools.SetTool(CurrentTools.MoveTool);
            });
            InputUtils.RegisterHotkey(Hotkey.EditorPanTool, () => !Track.Playing, () =>
            {
                CurrentTools.SetTool(CurrentTools.HandTool);
            });
            InputUtils.RegisterHotkey(Hotkey.EditorQuickPan, () => !Track.Playing && !Canvas.IsModalOpen, () =>
            {
                CurrentTools.QuickPan = true;
                Invalidate();
                UpdateCursor();
            },
                                      () =>
            {
                CurrentTools.QuickPan = false;
                Invalidate();
                UpdateCursor();
            });
            InputUtils.RegisterHotkey(Hotkey.EditorDragCanvas, () => !Track.Playing && !Canvas.IsModalOpen, () =>
            {
                var mouse             = InputUtils.GetMouse();
                CurrentTools.QuickPan = true;
                CurrentTools.HandTool.OnMouseDown(new Vector2d(mouse.X, mouse.Y));
            },
                                      () =>
            {
                if (CurrentTools.QuickPan)
                {
                    var mouse = InputUtils.GetMouse();
                    CurrentTools.HandTool.OnMouseUp(new Vector2d(mouse.X, mouse.Y));
                    CurrentTools.QuickPan = false;
                }
            });

            InputUtils.RegisterHotkey(Hotkey.EditorUndo, () => !Track.Playing, () =>
            {
                CurrentTools.SelectedTool.Cancel();
                var hint = Track.UndoManager.Undo();
                CurrentTools.SelectedTool.OnUndoRedo(true, hint);
                Invalidate();
            },
                                      null,
                                      repeat: true);
            InputUtils.RegisterHotkey(Hotkey.EditorRedo, () => !Track.Playing, () =>
            {
                CurrentTools.SelectedTool.Cancel();
                var hint = Track.UndoManager.Redo();
                CurrentTools.SelectedTool.OnUndoRedo(false, hint);
                Invalidate();
            },
                                      null,
                                      repeat: true);
            InputUtils.RegisterHotkey(Hotkey.EditorRemoveLatestLine, () => !Track.Playing, () =>
            {
                if (!Track.Playing)
                {
                    StopTools();
                    using (var trk = Track.CreateTrackWriter())
                    {
                        CurrentTools.SelectedTool.Stop();
                        var l = trk.GetNewestLine();
                        if (l != null)
                        {
                            Track.UndoManager.BeginAction();
                            trk.RemoveLine(l);
                            Track.UndoManager.EndAction();
                        }

                        Track.NotifyTrackChanged();
                        Invalidate();
                    }
                }
            },
                                      null,
                                      repeat: true);
            InputUtils.RegisterHotkey(Hotkey.EditorFocusStart, () => !Track.Playing, () =>
            {
                using (var trk = Track.CreateTrackReader())
                {
                    var l = trk.GetOldestLine();
                    if (l != null)
                    {
                        Track.Camera.SetFrameCenter(l.Position);
                        Invalidate();
                    }
                }
            });
            InputUtils.RegisterHotkey(Hotkey.EditorFocusLastLine, () => !Track.Playing, () =>
            {
                using (var trk = Track.CreateTrackReader())
                {
                    var l = trk.GetNewestLine();
                    if (l != null)
                    {
                        Track.Camera.SetFrameCenter(l.Position);
                        Invalidate();
                    }
                }
            });
            InputUtils.RegisterHotkey(Hotkey.EditorCycleToolSetting, () => !Track.Playing, () =>
            {
                if (CurrentTools.SelectedTool.ShowSwatch)
                {
                    CurrentTools.SelectedTool.Swatch.IncrementSelectedMultiplier();
                    Invalidate();
                }
            });
            InputUtils.RegisterHotkey(Hotkey.ToolToggleOverlay, () => !Track.Playing, () =>
            {
                Settings.Local.TrackOverlay = !Settings.Local.TrackOverlay;
            });
            InputUtils.RegisterHotkey(Hotkey.EditorToolColor1, () => !Track.Playing, () =>
            {
                var swatch = CurrentTools.SelectedTool.Swatch;
                if (swatch != null)
                {
                    swatch.Selected = LineType.Blue;
                }
                Invalidate();
            });
            InputUtils.RegisterHotkey(Hotkey.EditorToolColor2, () => !Track.Playing, () =>
            {
                var swatch = CurrentTools.SelectedTool.Swatch;
                if (swatch != null)
                {
                    swatch.Selected = LineType.Red;
                }
                Invalidate();
            });
            InputUtils.RegisterHotkey(Hotkey.EditorToolColor3, () => !Track.Playing, () =>
            {
                var swatch = CurrentTools.SelectedTool.Swatch;
                if (swatch != null)
                {
                    swatch.Selected = LineType.Scenery;
                }
                Invalidate();
            });
            InputUtils.RegisterHotkey(Hotkey.EditorFocusFlag, () => !Track.Playing, () =>
            {
                var flag = Track.GetFlag();
                if (flag != null)
                {
                    Track.Camera.SetFrameCenter(flag.State.CalculateCenter());
                    Invalidate();
                }
            });
            InputUtils.RegisterHotkey(Hotkey.EditorFocusRider, () => !Track.Playing, () =>
            {
                Track.Camera.SetFrameCenter(Track.RenderRider.CalculateCenter());
                Invalidate();
            });
            InputUtils.RegisterHotkey(Hotkey.EditorCancelTool,
                                      () => CurrentTools.SelectedTool.Active,
                                      () =>
            {
                var tool       = CurrentTools.SelectedTool;
                var selecttool = CurrentTools.SelectTool;
                if (tool == selecttool)
                {
                    selecttool.CancelSelection();
                }
                else
                {
                    tool.Cancel();
                }
                Invalidate();
            });
            InputUtils.RegisterHotkey(Hotkey.ToolCopy, () => !Track.Playing &&
                                      CurrentTools.SelectedTool == CurrentTools.SelectTool, () =>
            {
                CurrentTools.SelectTool.Copy();
                Invalidate();
            },
                                      null,
                                      repeat: false);
            InputUtils.RegisterHotkey(Hotkey.ToolCut, () => !Track.Playing &&
                                      CurrentTools.SelectedTool == CurrentTools.SelectTool, () =>
            {
                CurrentTools.SelectTool.Cut();
                Invalidate();
            },
                                      null,
                                      repeat: false);
            InputUtils.RegisterHotkey(Hotkey.ToolPaste, () => !Track.Playing &&
                                      (CurrentTools.SelectedTool == CurrentTools.SelectTool ||
                                       CurrentTools.SelectedTool == CurrentTools.MoveTool), () =>
            {
                CurrentTools.SelectTool.Paste();
                Invalidate();
            },
                                      null,
                                      repeat: false);
            InputUtils.RegisterHotkey(Hotkey.ToolDelete, () => !Track.Playing &&
                                      CurrentTools.SelectedTool == CurrentTools.SelectTool, () =>
            {
                CurrentTools.SelectTool.Delete();
                Invalidate();
            },
                                      null,
                                      repeat: false);
        }