diff --git a/Source/Core/Core/HotkeyManager.cpp b/Source/Core/Core/HotkeyManager.cpp index 9a5af17c98..f992bef281 100644 --- a/Source/Core/Core/HotkeyManager.cpp +++ b/Source/Core/Core/HotkeyManager.cpp @@ -19,6 +19,9 @@ const std::string hotkey_labels[] = _trans("Stop"), _trans("Reset"), _trans("Frame Advance"), + _trans("Frame Advance Decrease Speed"), + _trans("Frame Advance Increase Speed"), + _trans("Frame Advance Reset Speed"), _trans("Start Recording"), _trans("Play Recording"), diff --git a/Source/Core/Core/HotkeyManager.h b/Source/Core/Core/HotkeyManager.h index 1d0f18132a..75da4450b9 100644 --- a/Source/Core/Core/HotkeyManager.h +++ b/Source/Core/Core/HotkeyManager.h @@ -17,6 +17,9 @@ enum Hotkey HK_STOP, HK_RESET, HK_FRAME_ADVANCE, + HK_FRAME_ADVANCE_DECREASE_SPEED, + HK_FRAME_ADVANCE_INCREASE_SPEED, + HK_FRAME_ADVANCE_RESET_SPEED, HK_START_RECORDING, HK_PLAY_RECORDING, diff --git a/Source/Core/DolphinWX/Frame.cpp b/Source/Core/DolphinWX/Frame.cpp index fef41bbce2..75a9de022e 100644 --- a/Source/Core/DolphinWX/Frame.cpp +++ b/Source/Core/DolphinWX/Frame.cpp @@ -1291,7 +1291,6 @@ void CFrame::ParseHotkeys() case HK_CHANGE_DISC: case HK_REFRESH_LIST: case HK_RESET: - case HK_FRAME_ADVANCE: case HK_START_RECORDING: case HK_PLAY_RECORDING: case HK_EXPORT_RECORDING: @@ -1333,6 +1332,8 @@ void CFrame::ParseHotkeys() // Pause and Unpause if (IsHotkey(HK_PLAY_PAUSE)) DoPause(); + // Frame advance + HandleFrameSkipHotkeys(); // Stop if (IsHotkey(HK_STOP)) DoStop(); @@ -1531,3 +1532,61 @@ void CFrame::ParseHotkeys() if (IsHotkey(HK_UNDO_SAVE_STATE)) State::UndoSaveState(); } + +void CFrame::HandleFrameSkipHotkeys() +{ + static const int MAX_FRAME_SKIP_DELAY = 60; + static int frameStepCount = 0; + static const int FRAME_STEP_DELAY = 30; + static int holdFrameStepDelay = 1; + static int holdFrameStepDelayCount = 0; + static bool holdFrameStep = false; + + if (IsHotkey(HK_FRAME_ADVANCE_DECREASE_SPEED)) + { + ++holdFrameStepDelay; + if (holdFrameStepDelay > MAX_FRAME_SKIP_DELAY) + holdFrameStepDelay = MAX_FRAME_SKIP_DELAY; + } + else if (IsHotkey(HK_FRAME_ADVANCE_INCREASE_SPEED)) + { + --holdFrameStepDelay; + if (holdFrameStepDelay < 0) + holdFrameStepDelay = 0; + } + else if (IsHotkey(HK_FRAME_ADVANCE_RESET_SPEED)) + { + holdFrameStepDelay = 1; + } + else if (IsHotkey(HK_FRAME_ADVANCE, true)) + { + if (holdFrameStepDelayCount < holdFrameStepDelay && holdFrameStep) + ++holdFrameStepDelayCount; + + if ((frameStepCount == 0 || frameStepCount == FRAME_STEP_DELAY) && !holdFrameStep) + { + wxCommandEvent evt; + evt.SetId(IDM_FRAMESTEP); + CFrame::OnFrameStep(evt); + if (holdFrameStepDelay > 0 && frameStepCount == 0) + holdFrameStep = true; + } + + if (frameStepCount < FRAME_STEP_DELAY) + ++frameStepCount; + + if (frameStepCount == FRAME_STEP_DELAY && holdFrameStep && holdFrameStepDelayCount >= holdFrameStepDelay) + { + holdFrameStep = false; + holdFrameStepDelayCount = 0; + } + } + else if (frameStepCount > 0) + { + // Reset values of frame advance to default + frameStepCount = 0; + holdFrameStep = false; + holdFrameStepDelayCount = 0; + } +} + diff --git a/Source/Core/DolphinWX/Frame.h b/Source/Core/DolphinWX/Frame.h index 1d3a377b05..4099ef7bf1 100644 --- a/Source/Core/DolphinWX/Frame.h +++ b/Source/Core/DolphinWX/Frame.h @@ -211,6 +211,7 @@ private: wxAuiNotebook * GetNotebookFromId(u32 NBId); int GetNotebookCount(); wxAuiNotebook *CreateEmptyNotebook(); + void HandleFrameSkipHotkeys(); // Perspectives void AddRemoveBlankPage();