From a73e5d8d59744f7e4eb9a3de3955331cbc88b291 Mon Sep 17 00:00:00 2001
From: TPAXcc <91980905+TPAXcc@users.noreply.github.com>
Date: Thu, 19 Sep 2024 19:58:01 +0800
Subject: [PATCH] =?UTF-8?q?=E5=B0=9D=E8=AF=95=E5=A2=9E=E5=8A=A0=E5=88=86?=
 =?UTF-8?q?=E6=A1=A3=E4=BD=8D=E5=BF=AB=E8=BF=9B=20(#810)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../PositionForwardPressShortcutFunction.cs   | 40 ++++++++++++++++---
 1 file changed, 34 insertions(+), 6 deletions(-)

diff --git a/src/BiliLite.UWP/Models/Functions/PositionForwardPressShortcutFunction.cs b/src/BiliLite.UWP/Models/Functions/PositionForwardPressShortcutFunction.cs
index 35b1d99d9..68fc4818f 100644
--- a/src/BiliLite.UWP/Models/Functions/PositionForwardPressShortcutFunction.cs
+++ b/src/BiliLite.UWP/Models/Functions/PositionForwardPressShortcutFunction.cs
@@ -1,4 +1,5 @@
-using BiliLite.Extensions;
+using System;
+using BiliLite.Extensions;
 using BiliLite.Pages;
 using System.Threading.Tasks;
 using System.Timers;
@@ -8,37 +9,64 @@ namespace BiliLite.Models.Functions
 {
     public class PositionForwardPressShortcutFunction : BaseShortcutFunction
     {
+        private const int DEFAULT_STEP_TIME_SECOND = 3; // 默认步进时间为1秒
+        private int m_currentStepTimeSecond = DEFAULT_STEP_TIME_SECOND;
+        private const int INTERVAL_TIME = 500;
+        private int m_stepPosition = 1; // 当前档位
+        private const int STEP_POSITION_UP_TIMES = 5; // 每5次步进,挡位提升1档
+        private static readonly int[] _stepTimesForPositions = { 3, 5, 10, 15, 30, 60, 600, 1800, 3600 };
+
         public override string Name { get; } = "持续快进";
 
         public override async Task Action(object param)
         {
             if (!(param is PlayPage page)) return;
             if (ControlsExtensions.CheckFocusTextBoxNow()) return;
-            var timer = new Timer(100);
+
+            var timer = new Timer(INTERVAL_TIME);
+            var elapsedTimes = 0;
             timer.Elapsed += (sender, e) =>
             {
                 page.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                 {
-                    page.PositionForward();
+                    // 根据档位设置步进时间
+                    SetStepTimeBasedOnPosition();
+                    page.PositionForward(m_currentStepTimeSecond);
                 });
+                elapsedTimes++;
+                if ((1f * elapsedTimes) % STEP_POSITION_UP_TIMES == 0)
+                {
+                    m_stepPosition += 1;
+                }
             };
             timer.AutoReset = true;
-            (ReleaseFunction as PositionForwardReleaseShortcutFunction).Timer = timer;
+            (ReleaseFunction as PositionForwardReleaseShortcutFunction).Excute = ()=>
+            {
+                timer.Stop();
+                m_stepPosition = 1;
+            };
             timer.Start();
         }
 
+        private void SetStepTimeBasedOnPosition()
+        {
+            m_currentStepTimeSecond = m_stepPosition > 0 && m_stepPosition <= _stepTimesForPositions.Length
+                ? _stepTimesForPositions[m_stepPosition - 1]
+                : _stepTimesForPositions[_stepTimesForPositions.Length - 1];
+        }
+
         public override IShortcutFunction ReleaseFunction { get; } = new PositionForwardReleaseShortcutFunction();
     }
 
     public class PositionForwardReleaseShortcutFunction : BaseShortcutFunction
     {
-        public Timer Timer { get; set; }
+        public Action Excute { get; set; }
 
         public override string Name { get; } = "停止持续快进";
 
         public override async Task Action(object param)
         {
-            Timer?.Stop();
+            Excute?.Invoke();
         }
     }
 }