Skip to content

Commit cf91b8f

Browse files
authored
Sessions - fix sorting of the files (#307915)
1 parent 6c8fcf1 commit cf91b8f

1 file changed

Lines changed: 39 additions & 7 deletions

File tree

src/vs/sessions/contrib/changes/browser/changesView.ts

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,14 @@ import './media/changesView.css';
77
import * as dom from '../../../../base/browser/dom.js';
88
import { renderLabelWithIcons } from '../../../../base/browser/ui/iconLabel/iconLabels.js';
99
import { 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';
1111
import { ActionRunner, IAction } from '../../../../base/common/actions.js';
1212
import { Codicon } from '../../../../base/common/codicons.js';
1313
import { Disposable, DisposableStore, IDisposable } from '../../../../base/common/lifecycle.js';
1414
import { Event } from '../../../../base/common/event.js';
1515
import { autorun, derived, derivedOpts, IObservable } from '../../../../base/common/observable.js';
16-
import { basename } from '../../../../base/common/path.js';
1716
import { 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';
1918
import { ThemeIcon } from '../../../../base/common/themables.js';
2019
import { URI } from '../../../../base/common/uri.js';
2120
import { localize, localize2 } from '../../../../nls.js';
@@ -70,6 +69,7 @@ import { buildTreeChildren, ChangesTreeElement, ChangesTreeRenderer, IChangesFil
7069
import { ChangesViewModel } from './changesViewModel.js';
7170
import { ResourceTree } from '../../../../base/common/resourceTree.js';
7271
import { structuralEquals } from '../../../../base/common/equals.js';
72+
import { compareFileNames, comparePaths } from '../../../../base/common/comparers.js';
7373

7474
const $ = 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

996997
class 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

10101042
class SetChangesListViewModeAction extends ViewAction<ChangesViewPane> {

0 commit comments

Comments
 (0)