summaryrefslogtreecommitdiff
path: root/Source/Core/DolphinWX/Frame.cpp
diff options
context:
space:
mode:
authorFog <christhecoolist@gmail.com>2015-07-05 12:20:42 -0400
committerFog <christhecoolist@gmail.com>2015-10-04 12:14:36 -0400
commit471c8355465524bd2b893f7be3db735f3c77b878 (patch)
tree66df794639868dbf293daede14cdbf23ff02fc59 /Source/Core/DolphinWX/Frame.cpp
parentc70f3f4b451948e62ca5006b2977b493daa3616e (diff)
Add Frame Advance Hold Hotkey Functionality
Diffstat (limited to 'Source/Core/DolphinWX/Frame.cpp')
-rw-r--r--Source/Core/DolphinWX/Frame.cpp61
1 files changed, 60 insertions, 1 deletions
diff --git a/Source/Core/DolphinWX/Frame.cpp b/Source/Core/DolphinWX/Frame.cpp
index 759c2bdc6e..bb856cefae 100644
--- a/Source/Core/DolphinWX/Frame.cpp
+++ b/Source/Core/DolphinWX/Frame.cpp
@@ -1269,7 +1269,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:
@@ -1311,6 +1310,8 @@ void CFrame::ParseHotkeys()
// Pause and Unpause
if (IsHotkey(HK_PLAY_PAUSE))
DoPause();
+ // Frame advance
+ HandleFrameSkipHotkeys();
// Stop
if (IsHotkey(HK_STOP))
DoStop();
@@ -1465,3 +1466,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;
+ }
+}
+