@@ -5,33 +5,83 @@ export function render({ model, el }) {
55 split_div . className = `split multi-split ${ model . orientation } `
66 split_div . classList . add ( "loading" )
77
8- const objects = model . objects ? model . get_child ( "objects" ) : [ ]
9- const split_items = [ ]
10- for ( let i = 0 ; i < objects . length ; i ++ ) {
11- const split_item = document . createElement ( "div" )
12- split_item . className = "split-panel"
13- split_div . append ( split_item )
14- split_items . push ( split_item )
15- split_item . append ( objects [ i ] )
8+ let split = null
9+
10+ function reconcileChildren ( parent , desiredChildren ) {
11+ // Ensure each desired child is at the correct index
12+ for ( let i = 0 ; i < desiredChildren . length ; i ++ ) {
13+ const child = desiredChildren [ i ]
14+ const current = parent . children [ i ]
15+ if ( current ?. id === child . id ) continue
16+ if ( current ) {
17+ parent . insertBefore ( child , current )
18+ } else {
19+ parent . append ( child )
20+ }
21+ }
22+
23+ // Remove any extra children that are no longer desired
24+ while ( parent . children . length > desiredChildren . length ) {
25+ parent . removeChild ( parent . lastElementChild )
26+ }
1627 }
1728
18- el . append ( split_div )
29+ const render_splits = ( ) => {
30+ if ( split != null ) {
31+ split . destroy ( )
32+ split = null
33+ }
34+
35+ const objects = model . objects ? model . get_child ( "objects" ) : [ ]
36+ const split_items = [ ]
37+
38+ for ( let i = 0 ; i < objects . length ; i ++ ) {
39+ const obj = objects [ i ]
40+ const id = `split-panel-${ model . objects [ i ] . id } `
1941
20- let sizes = model . sizes
21- const split = Split ( split_items , {
22- sizes : sizes ,
23- minSize : model . min_size || 0 ,
24- maxSize : model . max_size || Number ( "Infinity" ) ,
25- dragInterval : model . step_size || 1 ,
26- snapOffset : model . snap_size || 30 ,
27- gutterSize : 8 ,
28- direction : model . orientation ,
29- onDragEnd : ( new_sizes ) => {
30- sizes = new_sizes
31- this . model . sizes = sizes
42+ // Try to reuse an existing split_item
43+ let split_item = el . querySelector ( `#${ id } ` )
44+ if ( split_item == null ) {
45+ split_item = document . createElement ( "div" )
46+ split_item . className = "split-panel"
47+ split_item . id = id
48+ split_item . replaceChildren ( obj )
49+ }
50+
51+ split_items . push ( split_item )
3252 }
33- } )
3453
54+ // Incrementally reorder / trim children of split_div
55+ reconcileChildren ( split_div , split_items )
56+
57+ let sizes = model . sizes
58+ split = Split ( split_items , {
59+ sizes,
60+ minSize : model . min_size || 0 ,
61+ maxSize : model . max_size || Number ( "Infinity" ) ,
62+ dragInterval : model . step_size || 1 ,
63+ snapOffset : model . snap_size || 30 ,
64+ gutterSize : 8 ,
65+ gutter : ( index , direction ) => {
66+ const gutter = document . createElement ( 'div' )
67+ gutter . className = `gutter gutter-${ direction } `
68+ const divider = document . createElement ( 'div' )
69+ divider . className = "divider"
70+ gutter . append ( divider )
71+ return gutter
72+ } ,
73+ direction : model . orientation ,
74+ onDragEnd : ( new_sizes ) => {
75+ sizes = new_sizes
76+ this . model . sizes = sizes
77+ }
78+ } )
79+ }
80+
81+ render_splits ( )
82+ el . append ( split_div )
83+
84+ model . on ( "objects" , render_splits )
3585 model . on ( "sizes" , ( ) => {
3686 if ( sizes === model . sizes ) {
3787 return
0 commit comments