You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

77 lines
2.1 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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()