@@ -23,6 +23,7 @@ import { hotkeysMap } from './hotkeys';
2323import { zoom } from './zoom' ;
2424import { closeScrollLock , turnPage } from './turnPage' ;
2525import {
26+ constantScroll ,
2627 scrollLength ,
2728 scrollProgress ,
2829 scrollTo ,
@@ -47,12 +48,9 @@ export const handleMouseDown: EventHandler['on:mousedown'] = (e) => {
4748} ;
4849
4950/** 卷轴模式下的页面滚动 */
50- const scrollModeScrollPage = ( dir : 'next' | 'prev' ) => {
51+ const scrollModeScrollPage = ( x : number ) => {
5152 if ( ! store . show . endPage ) {
52- scrollTo (
53- scrollTop ( ) + store . rootSize . height * 0.8 * ( dir === 'next' ? 1 : - 1 ) ,
54- true ,
55- ) ;
53+ scrollTo ( scrollTop ( ) + x , true ) ;
5654 _setState ( 'scrollLock' , true ) ;
5755 }
5856 closeScrollLock ( ) ;
@@ -64,6 +62,33 @@ const handleSwapPageTurnKey = (nextPage: boolean) => {
6462 return next ? 'next' : 'prev' ;
6563} ;
6664
65+ /** 处理快捷键长按的情况 */
66+ export const handleHoldKey = new ( class {
67+ holdKeys = new Map < string , ( ) => void > ( ) ;
68+
69+ linsten ( code : string , holdFn : ( ) => void , upFn : ( ) => void ) {
70+ if ( this . holdKeys . has ( code ) ) return ;
71+ holdFn ( ) ;
72+ this . holdKeys . set ( code , upFn ) ;
73+ }
74+
75+ onKeyUp = ( e : KeyboardEvent ) => {
76+ const code = getKeyboardCode ( e ) ;
77+ if ( ! this . holdKeys . has ( code ) ) return ;
78+ this . holdKeys . get ( code ) ! ( ) ;
79+ this . holdKeys . delete ( code ) ;
80+ } ;
81+ } ) ( ) ;
82+
83+ /** 处理长按滚动 */
84+ const handleHoldScroll = ( code : string , speed : number ) => {
85+ handleHoldKey . linsten (
86+ code ,
87+ ( ) => constantScroll . start ( speed ) ,
88+ ( ) => constantScroll . cancel ( ) ,
89+ ) ;
90+ } ;
91+
6792export const handleKeyDown = ( e : KeyboardEvent ) => {
6893 switch ( ( e . target as HTMLElement ) . tagName ) {
6994 case 'INPUT' :
@@ -128,29 +153,31 @@ export const handleKeyDown = (e: KeyboardEvent) => {
128153 e . preventDefault ( ) ;
129154 } else return ;
130155
156+ const hotkey = hotkeysMap ( ) [ code ] ;
157+
131158 // 并排卷轴模式下的快捷键
132159 if ( isAbreastMode ( ) ) {
133- switch ( hotkeysMap ( ) [ code ] ) {
160+ switch ( hotkey ) {
134161 case 'scroll_up' :
135- setAbreastScrollFill (
136- abreastScrollFill ( ) - store . rootSize . height * 0.02 ,
137- ) ;
162+ setAbreastScrollFill ( abreastScrollFill ( ) - 20 ) ;
138163 return ;
139164 case 'scroll_down' :
140- setAbreastScrollFill (
141- abreastScrollFill ( ) + store . rootSize . height * 0.02 ,
142- ) ;
165+ setAbreastScrollFill ( abreastScrollFill ( ) + 20 ) ;
143166 return ;
144167
145168 case 'scroll_left' :
146- return scrollTo ( scrollProgress ( ) + abreastColumnWidth ( ) ) ;
169+ return scrollTo (
170+ scrollProgress ( ) - ( store . option . dir === 'rtl' ? 20 : - 20 ) ,
171+ ) ;
147172 case 'scroll_right' :
148- return scrollTo ( scrollProgress ( ) - abreastColumnWidth ( ) ) ;
173+ return scrollTo (
174+ scrollProgress ( ) + ( store . option . dir === 'rtl' ? 20 : - 20 ) ,
175+ ) ;
149176
150177 case 'page_up' :
151- return scrollTo ( scrollProgress ( ) - store . rootSize . width * 0.8 ) ;
178+ return scrollTo ( scrollProgress ( ) - abreastColumnWidth ( ) ) ;
152179 case 'page_down' :
153- return scrollTo ( scrollProgress ( ) + store . rootSize . width * 0.8 ) ;
180+ return scrollTo ( scrollProgress ( ) + abreastColumnWidth ( ) ) ;
154181
155182 case 'jump_to_home' :
156183 return scrollTo ( 0 ) ;
@@ -159,18 +186,31 @@ export const handleKeyDown = (e: KeyboardEvent) => {
159186 }
160187 }
161188
162- switch ( hotkeysMap ( ) [ code ] ) {
189+ // 普通卷轴模式下的快捷键
190+ if ( isScrollMode ( ) ) {
191+ switch ( hotkey ) {
192+ case 'page_up' :
193+ return scrollModeScrollPage ( - store . rootSize . height * 0.8 ) ;
194+ case 'page_down' :
195+ return scrollModeScrollPage ( store . rootSize . height * 0.8 ) ;
196+
197+ case 'scroll_up' :
198+ if ( e . repeat ) return handleHoldScroll ( code , - 1 ) ;
199+ return scrollModeScrollPage ( - 20 ) ;
200+ case 'scroll_down' :
201+ if ( e . repeat ) return handleHoldScroll ( code , 1 ) ;
202+ return scrollModeScrollPage ( 20 ) ;
203+ }
204+ }
205+
206+ switch ( hotkey ) {
163207 case 'page_up' :
164- case 'scroll_up' : {
165- if ( isScrollMode ( ) ) scrollModeScrollPage ( 'prev' ) ;
208+ case 'scroll_up' :
166209 return turnPage ( 'prev' ) ;
167- }
168210
169211 case 'page_down' :
170- case 'scroll_down' : {
171- if ( isScrollMode ( ) ) scrollModeScrollPage ( 'next' ) ;
212+ case 'scroll_down' :
172213 return turnPage ( 'next' ) ;
173- }
174214
175215 case 'scroll_left' :
176216 return turnPage ( handleSwapPageTurnKey ( store . option . dir === 'rtl' ) ) ;
0 commit comments