@@ -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 { DisposableStore , IDisposable } from '../../../../base/common/lifecycle.js' ;
1414import { Event } from '../../../../base/common/event.js' ;
1515import { autorun , derived , 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' ;
@@ -69,6 +68,7 @@ import { ActiveSessionContextKeys, CHANGES_VIEW_CONTAINER_ID, CHANGES_VIEW_ID, C
6968import { buildTreeChildren , ChangesTreeElement , ChangesTreeRenderer , IChangesFileItem , IChangesTreeRootInfo , isChangesFileItem , toIChangesFileItem } from './changesViewRenderer.js' ;
7069import { ChangesViewModel } from './changesViewModel.js' ;
7170import { ResourceTree } from '../../../../base/common/resourceTree.js' ;
71+ import { compareFileNames , comparePaths } from '../../../../base/common/comparers.js' ;
7272
7373const $ = dom . $ ;
7474
@@ -763,8 +763,8 @@ export class ChangesViewPane extends ViewPane {
763763 type : 'root' ,
764764 uri : workspaceFolderUri ,
765765 name : repository . workingDirectory
766- ? `${ basename ( repository . uri . fsPath ) } (${ branchName } )`
767- : basename ( repository . uri . fsPath ) ,
766+ ? `${ basename ( repository . uri ) } (${ branchName } )`
767+ : basename ( repository . uri ) ,
768768 } ,
769769 resourceTreeRootUri,
770770 } ;
@@ -883,7 +883,7 @@ export class ChangesViewPane extends ViewPane {
883883 {
884884 alwaysConsumeMouseWheel : false ,
885885 accessibilityProvider : {
886- getAriaLabel : ( element : ChangesTreeElement ) => isChangesFileItem ( element ) ? basename ( element . uri . path ) : element . name ,
886+ getAriaLabel : ( element : ChangesTreeElement ) => isChangesFileItem ( element ) ? basename ( element . uri ) : element . name ,
887887 getWidgetAriaLabel : ( ) => localize ( 'changesViewTree' , "Changes Tree" )
888888 } ,
889889 dnd : {
@@ -913,6 +913,7 @@ export class ChangesViewPane extends ViewPane {
913913 } ,
914914 indent : this . viewModel . viewModeObs . get ( ) === ChangesViewMode . List ? 0 : 8 ,
915915 compressionEnabled : true ,
916+ sorter : new ChangesTreeSorter ( ( ) => this . viewModel . viewModeObs . get ( ) ) ,
916917 twistieAdditionalCssClass : ( e : unknown ) => {
917918 return this . viewModel . viewModeObs . get ( ) === ChangesViewMode . List
918919 ? 'force-no-twistie'
@@ -985,7 +986,7 @@ class ChangesViewActionRunner extends ActionRunner {
985986 }
986987}
987988
988- // --- Tree Delegate
989+ // --- Tree Delegate and Sorter
989990
990991class ChangesTreeDelegate implements IListVirtualDelegate < ChangesTreeElement > {
991992 static readonly ROW_HEIGHT = 22 ;
@@ -999,6 +1000,37 @@ class ChangesTreeDelegate implements IListVirtualDelegate<ChangesTreeElement> {
9991000 }
10001001}
10011002
1003+ class ChangesTreeSorter implements ITreeSorter < ChangesTreeElement > {
1004+ constructor ( private readonly viewMode : ( ) => ChangesViewMode ) { }
1005+
1006+ compare ( a : ChangesTreeElement , b : ChangesTreeElement ) : number {
1007+ if ( this . viewMode ( ) === ChangesViewMode . List ) {
1008+ // List
1009+ const aPath = ( a as IChangesFileItem ) . uri . fsPath ;
1010+ const bPath = ( b as IChangesFileItem ) . uri . fsPath ;
1011+
1012+ return comparePaths ( aPath , bPath ) ;
1013+ }
1014+
1015+ // Tree
1016+ const aIsDirectory = ResourceTree . isResourceNode ( a ) ;
1017+ const bIsDirectory = ResourceTree . isResourceNode ( b ) ;
1018+
1019+ if ( aIsDirectory !== bIsDirectory ) {
1020+ return aIsDirectory ? - 1 : 1 ;
1021+ }
1022+
1023+ const aName = ResourceTree . isResourceNode ( a )
1024+ ? a . name
1025+ : basename ( ( a as IChangesFileItem ) . uri ) ;
1026+ const bName = ResourceTree . isResourceNode ( b )
1027+ ? b . name
1028+ : basename ( ( b as IChangesFileItem ) . uri ) ;
1029+
1030+ return compareFileNames ( aName , bName ) ;
1031+ }
1032+ }
1033+
10021034// --- View Mode Actions
10031035
10041036class SetChangesListViewModeAction extends ViewAction < ChangesViewPane > {
0 commit comments