@@ -11,14 +11,17 @@ interface Props {
1111 language : string ;
1212 prev : string ;
1313 current : string ;
14+ folding : boolean ;
1415 inputDelay : number ;
1516 virtualScroll : boolean | VirtualScroll ;
1617}
1718
1819export const useRender = ( props : Props , viewer : Ref < null | HTMLElement > , scrollOptions : ComputedRef < false | VirtualScroll > ) => {
1920 const render = ref < Array < Lines > > ( [ ] )
2021 const meta = ref < Array < Meta > > ( [ ] )
21- const visible = computed ( ( ) => meta . value . filter ( item => item . visible ) )
22+ const list = computed ( ( ) => meta . value . filter ( item => {
23+ return props . folding ? ! item . foldable && item . visible : item . visible
24+ } ) )
2225
2326 const setRender = ( ) => {
2427 const result = renderLines ( props . mode , props . prev , props . current )
@@ -27,25 +30,29 @@ export const useRender = (props: Props, viewer: Ref<null|HTMLElement>, scrollOpt
2730
2831 render . value . map ( ( v , index : number ) => {
2932 const item = meta . value [ index ]
33+ const foldable = props . folding && v [ 0 ] . type === 'equal' && render . value [ index - 1 ] ?. [ 0 ] . type === 'equal'
34+
35+ const values = {
36+ index,
37+ foldable,
38+ visible : true
39+ }
3040
3141 if ( scrollOptions . value ) {
3242 meta . value [ index ] = {
33- index ,
43+ ... values ,
3444 visible : item ?. visible || false ,
3545 top : item ?. top || undefined ,
3646 height : item ?. height || scrollOptions . value . lineMinHeight
3747 }
3848 } else {
39- meta . value [ index ] = {
40- index,
41- visible : true
42- }
49+ meta . value [ index ] = { ...values }
4350 }
4451 } )
4552 }
4653
4754 debouncedWatch (
48- [ ( ) => props . mode , ( ) => props . prev , ( ) => props . current ] ,
55+ [ ( ) => props . mode , ( ) => props . prev , ( ) => props . current , ( ) => props . folding ] ,
4956 setRender ,
5057 {
5158 debounce : props . inputDelay ,
@@ -56,7 +63,7 @@ export const useRender = (props: Props, viewer: Ref<null|HTMLElement>, scrollOpt
5663 return {
5764 meta,
5865 render,
59- visible
66+ list
6067 }
6168}
6269
@@ -65,7 +72,7 @@ export const useVirtualScroll = (props: Props, viewer: Ref<null|HTMLElement>, sc
6572 if ( ! scrollOptions . value ) return undefined
6673 const reduce = meta . value . reduce ( ( acc , curr ) => {
6774 curr . top = acc
68- return acc + ( curr . height as number )
75+ return curr . foldable ? acc : acc + ( curr . height as number )
6976 } , 0 )
7077 return reduce + 'px'
7178 } )
@@ -85,22 +92,22 @@ export const useVirtualScroll = (props: Props, viewer: Ref<null|HTMLElement>, sc
8592 }
8693
8794 curr . top = acc
88- return acc + ( curr . height as number )
95+ return curr . foldable ? acc : acc + ( curr . height as number )
8996 } , 0 )
9097 }
9198
99+ debouncedWatch (
100+ [ ( ) => props . mode , ( ) => props . prev , ( ) => props . current , ( ) => props . folding ] ,
101+ ( ) => nextTick ( setMeta ) ,
102+ {
103+ debounce : props . inputDelay ,
104+ immediate : true
105+ }
106+ )
107+
92108 onMounted ( ( ) => {
93109 if ( ! scrollOptions . value ) return
94110 viewer . value ?. addEventListener ( 'scroll' , useThrottleFn ( setMeta , scrollOptions . value . delay ) )
95-
96- debouncedWatch (
97- [ ( ) => props . mode , ( ) => props . prev , ( ) => props . current ] ,
98- ( ) => nextTick ( setMeta ) ,
99- {
100- debounce : props . inputDelay ,
101- immediate : true
102- }
103- )
104111 } )
105112
106113 onBeforeUnmount ( ( ) => {
0 commit comments