@@ -343,6 +343,12 @@ export type DistributeSizing = { type: 'distribute' };
343343 */
344344export type SplitSizing = { type : 'split' ; index : number } ;
345345
346+ /**
347+ * When adding a view, use DistributeSizing when all pre-existing views are
348+ * distributed evenly, otherwise use SplitSizing.
349+ */
350+ export type AutoSizing = { type : 'auto' ; index : number } ;
351+
346352/**
347353 * When adding or removing views, assume the view is invisible.
348354 */
@@ -352,7 +358,7 @@ export type InvisibleSizing = { type: 'invisible'; cachedVisibleSize: number };
352358 * When adding or removing views, the sizing provides fine grained
353359 * control over how other views get resized.
354360 */
355- export type Sizing = DistributeSizing | SplitSizing | InvisibleSizing ;
361+ export type Sizing = DistributeSizing | SplitSizing | AutoSizing | InvisibleSizing ;
356362
357363export namespace Sizing {
358364
@@ -368,6 +374,12 @@ export namespace Sizing {
368374 */
369375 export function Split ( index : number ) : SplitSizing { return { type : 'split' , index } ; }
370376
377+ /**
378+ * When adding a view, use DistributeSizing when all pre-existing views are
379+ * distributed evenly, otherwise use SplitSizing.
380+ */
381+ export function Auto ( index : number ) : AutoSizing { return { type : 'auto' , index } ; }
382+
371383 /**
372384 * When adding or removing views, assume the view is invisible.
373385 */
@@ -646,6 +658,14 @@ export class SplitView<TLayoutContext = undefined> extends Disposable {
646658 throw new Error ( 'Index out of bounds' ) ;
647659 }
648660
661+ if ( sizing ?. type === 'auto' ) {
662+ if ( this . areViewsDistributed ( ) ) {
663+ sizing = { type : 'distribute' } ;
664+ } else {
665+ sizing = undefined ;
666+ }
667+ }
668+
649669 // Remove view
650670 const viewItem = this . viewItems . splice ( index , 1 ) [ 0 ] ;
651671 const view = viewItem . dispose ( ) ;
@@ -1054,12 +1074,22 @@ export class SplitView<TLayoutContext = undefined> extends Disposable {
10541074
10551075 if ( typeof size === 'number' ) {
10561076 viewSize = size ;
1057- } else if ( size . type === 'split' ) {
1058- viewSize = this . getViewSize ( size . index ) / 2 ;
1059- } else if ( size . type === 'invisible' ) {
1060- viewSize = { cachedVisibleSize : size . cachedVisibleSize } ;
10611077 } else {
1062- viewSize = view . minimumSize ;
1078+ if ( size . type === 'auto' ) {
1079+ if ( this . areViewsDistributed ( ) ) {
1080+ size = { type : 'distribute' } ;
1081+ } else {
1082+ size = { type : 'split' , index : size . index } ;
1083+ }
1084+ }
1085+
1086+ if ( size . type === 'split' ) {
1087+ viewSize = this . getViewSize ( size . index ) / 2 ;
1088+ } else if ( size . type === 'invisible' ) {
1089+ viewSize = { cachedVisibleSize : size . cachedVisibleSize } ;
1090+ } else {
1091+ viewSize = view . minimumSize ;
1092+ }
10631093 }
10641094
10651095 const item = this . orientation === Orientation . VERTICAL
@@ -1382,6 +1412,21 @@ export class SplitView<TLayoutContext = undefined> extends Disposable {
13821412 return undefined ;
13831413 }
13841414
1415+ private areViewsDistributed ( ) {
1416+ let min = undefined , max = undefined ;
1417+
1418+ for ( const view of this . viewItems ) {
1419+ min = min === undefined ? view . size : Math . min ( min , view . size ) ;
1420+ max = max === undefined ? view . size : Math . max ( max , view . size ) ;
1421+
1422+ if ( max - min > 2 ) {
1423+ return false ;
1424+ }
1425+ }
1426+
1427+ return true ;
1428+ }
1429+
13851430 override dispose ( ) : void {
13861431 this . sashDragState ?. disposable . dispose ( ) ;
13871432
0 commit comments