@@ -7,15 +7,14 @@ import './media/changesView.css';
77import * as dom from '../../../../base/browser/dom.js' ;
88import { renderLabelWithIcons } from '../../../../base/browser/ui/iconLabel/iconLabels.js' ;
99import { IListVirtualDelegate } from '../../../../base/browser/ui/list/list.js' ;
10- import { IObjectTreeElement } from '../../../../base/browser/ui/tree/tree.js' ;
10+ import { IObjectTreeElement , ITreeSorter } from '../../../../base/browser/ui/tree/tree.js' ;
1111import { ActionRunner , IAction } from '../../../../base/common/actions.js' ;
1212import { Codicon } from '../../../../base/common/codicons.js' ;
1313import { Disposable , DisposableStore , IDisposable } from '../../../../base/common/lifecycle.js' ;
1414import { Event } from '../../../../base/common/event.js' ;
1515import { autorun , derived , derivedOpts , IObservable } from '../../../../base/common/observable.js' ;
16- import { basename } from '../../../../base/common/path.js' ;
1716import { ProgressBar } from '../../../../base/browser/ui/progressbar/progressbar.js' ;
18- import { isEqual } from '../../../../base/common/resources.js' ;
17+ import { basename , isEqual } from '../../../../base/common/resources.js' ;
1918import { ThemeIcon } from '../../../../base/common/themables.js' ;
2019import { URI } from '../../../../base/common/uri.js' ;
2120import { localize , localize2 } from '../../../../nls.js' ;
@@ -70,6 +69,7 @@ import { buildTreeChildren, ChangesTreeElement, ChangesTreeRenderer, IChangesFil
7069import { ChangesViewModel } from './changesViewModel.js' ;
7170import { ResourceTree } from '../../../../base/common/resourceTree.js' ;
7271import { structuralEquals } from '../../../../base/common/equals.js' ;
72+ import { compareFileNames , comparePaths } from '../../../../base/common/comparers.js' ;
7373
7474const $ = dom . $ ;
7575
@@ -769,8 +769,8 @@ export class ChangesViewPane extends ViewPane {
769769 type : 'root' ,
770770 uri : workspaceFolderUri ,
771771 name : repository . workingDirectory
772- ? `${ basename ( repository . uri . fsPath ) } (${ branchName } )`
773- : basename ( repository . uri . fsPath ) ,
772+ ? `${ basename ( repository . uri ) } (${ branchName } )`
773+ : basename ( repository . uri ) ,
774774 } ,
775775 resourceTreeRootUri,
776776 } ;
@@ -889,7 +889,7 @@ export class ChangesViewPane extends ViewPane {
889889 {
890890 alwaysConsumeMouseWheel : false ,
891891 accessibilityProvider : {
892- getAriaLabel : ( element : ChangesTreeElement ) => isChangesFileItem ( element ) ? basename ( element . uri . path ) : element . name ,
892+ getAriaLabel : ( element : ChangesTreeElement ) => isChangesFileItem ( element ) ? basename ( element . uri ) : element . name ,
893893 getWidgetAriaLabel : ( ) => localize ( 'changesViewTree' , "Changes Tree" )
894894 } ,
895895 dnd : {
@@ -919,6 +919,7 @@ export class ChangesViewPane extends ViewPane {
919919 } ,
920920 indent : this . viewModel . viewModeObs . get ( ) === ChangesViewMode . List ? 0 : 8 ,
921921 compressionEnabled : true ,
922+ sorter : new ChangesTreeSorter ( ( ) => this . viewModel . viewModeObs . get ( ) ) ,
922923 twistieAdditionalCssClass : ( e : unknown ) => {
923924 return this . viewModel . viewModeObs . get ( ) === ChangesViewMode . List
924925 ? 'force-no-twistie'
@@ -991,7 +992,7 @@ class ChangesViewActionRunner extends ActionRunner {
991992 }
992993}
993994
994- // --- Tree Delegate
995+ // --- Tree Delegate and Sorter
995996
996997class ChangesTreeDelegate implements IListVirtualDelegate < ChangesTreeElement > {
997998 static readonly ROW_HEIGHT = 22 ;
@@ -1005,6 +1006,37 @@ class ChangesTreeDelegate implements IListVirtualDelegate<ChangesTreeElement> {
10051006 }
10061007}
10071008
1009+ class ChangesTreeSorter implements ITreeSorter < ChangesTreeElement > {
1010+ constructor ( private readonly viewMode : ( ) => ChangesViewMode ) { }
1011+
1012+ compare ( a : ChangesTreeElement , b : ChangesTreeElement ) : number {
1013+ if ( this . viewMode ( ) === ChangesViewMode . List ) {
1014+ // List
1015+ const aPath = ( a as IChangesFileItem ) . uri . fsPath ;
1016+ const bPath = ( b as IChangesFileItem ) . uri . fsPath ;
1017+
1018+ return comparePaths ( aPath , bPath ) ;
1019+ }
1020+
1021+ // Tree
1022+ const aIsDirectory = ResourceTree . isResourceNode ( a ) ;
1023+ const bIsDirectory = ResourceTree . isResourceNode ( b ) ;
1024+
1025+ if ( aIsDirectory !== bIsDirectory ) {
1026+ return aIsDirectory ? - 1 : 1 ;
1027+ }
1028+
1029+ const aName = ResourceTree . isResourceNode ( a )
1030+ ? a . name
1031+ : basename ( ( a as IChangesFileItem ) . uri ) ;
1032+ const bName = ResourceTree . isResourceNode ( b )
1033+ ? b . name
1034+ : basename ( ( b as IChangesFileItem ) . uri ) ;
1035+
1036+ return compareFileNames ( aName , bName ) ;
1037+ }
1038+ }
1039+
10081040// --- View Mode Actions
10091041
10101042class SetChangesListViewModeAction extends ViewAction < ChangesViewPane > {
0 commit comments