Skip to content

Commit 963bc8f

Browse files
committed
Sessions - fix sorting of the files
1 parent d7b1858 commit 963bc8f

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 { DisposableStore, IDisposable } from '../../../../base/common/lifecycle.js';
1414
import { Event } from '../../../../base/common/event.js';
1515
import { autorun, derived, 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';
@@ -69,6 +68,7 @@ import { ActiveSessionContextKeys, CHANGES_VIEW_CONTAINER_ID, CHANGES_VIEW_ID, C
6968
import { buildTreeChildren, ChangesTreeElement, ChangesTreeRenderer, IChangesFileItem, IChangesTreeRootInfo, isChangesFileItem, toIChangesFileItem } from './changesViewRenderer.js';
7069
import { ChangesViewModel } from './changesViewModel.js';
7170
import { ResourceTree } from '../../../../base/common/resourceTree.js';
71+
import { compareFileNames, comparePaths } from '../../../../base/common/comparers.js';
7272

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

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

10041036
class SetChangesListViewModeAction extends ViewAction<ChangesViewPane> {

0 commit comments

Comments
 (0)