|
|
import math
|
|
|
from abc import ABC, abstractmethod
|
|
|
from typing import TYPE_CHECKING, Tuple
|
|
|
|
|
|
if TYPE_CHECKING:
|
|
|
from FlowScroll.core.config import GlobalConfig
|
|
|
|
|
|
|
|
|
class ScrollStrategy(ABC):
|
|
|
@abstractmethod
|
|
|
def calculate_scroll_speed(
|
|
|
self,
|
|
|
dx: float,
|
|
|
dy: float,
|
|
|
distance: float,
|
|
|
config: "GlobalConfig",
|
|
|
platform_multiplier: float,
|
|
|
reverse_x: bool = False,
|
|
|
reverse_y: bool = False,
|
|
|
) -> Tuple[float, float]:
|
|
|
"""
|
|
|
计算滚动速度。
|
|
|
:param dx: X轴位移
|
|
|
:param dy: Y轴位移
|
|
|
:param distance: 距离原点的直线距离
|
|
|
:param config: 全局配置对象 (GlobalConfig)
|
|
|
:param platform_multiplier: 平台相关的滚动乘数 (来自 system_platform)
|
|
|
:param reverse_x: 是否反转横向滚动
|
|
|
:param reverse_y: 是否反转纵向滚动
|
|
|
:return: (scroll_x, scroll_y)
|
|
|
"""
|
|
|
pass
|
|
|
|
|
|
|
|
|
class PowerCurveStrategy(ScrollStrategy):
|
|
|
"""
|
|
|
幂函数曲线策略 (目前项目的默认行为)
|
|
|
公式: speed = (distance - dead_zone)^sensitivity * multiplier * speed_factor
|
|
|
"""
|
|
|
|
|
|
def calculate_scroll_speed(
|
|
|
self,
|
|
|
dx: float,
|
|
|
dy: float,
|
|
|
distance: float,
|
|
|
config: "GlobalConfig",
|
|
|
platform_multiplier: float,
|
|
|
reverse_x: bool = False,
|
|
|
reverse_y: bool = False,
|
|
|
) -> Tuple[float, float]:
|
|
|
if distance <= config.dead_zone:
|
|
|
return 0.0, 0.0
|
|
|
|
|
|
eff_dist = distance - config.dead_zone
|
|
|
speed_scalar = (
|
|
|
math.pow(eff_dist, config.sensitivity)
|
|
|
* platform_multiplier
|
|
|
* config.speed_factor
|
|
|
)
|
|
|
|
|
|
# 将标量速度按方向分配到 X 和 Y 轴
|
|
|
scroll_x = (dx / distance) * speed_scalar
|
|
|
scroll_y = (
|
|
|
(dy / distance) * speed_scalar * -1
|
|
|
) # 反转Y轴因为鼠标坐标向下为正,滚轮向上为正
|
|
|
|
|
|
if reverse_x:
|
|
|
scroll_x = -scroll_x
|
|
|
if reverse_y:
|
|
|
scroll_y = -scroll_y
|
|
|
|
|
|
return scroll_x, scroll_y
|
|
|
|
|
|
|
|
|
# 目前先使用原版算法
|
|
|
default_scroll_strategy: ScrollStrategy = PowerCurveStrategy()
|