mirror of
https://github.com/microsoft/vscode.git
synced 2025-12-24 04:09:28 +00:00
editors - further improve isFirst and isLast and add test for sticky: true with index (#193760)
This commit is contained in:
@@ -174,14 +174,14 @@ export interface IReadonlyEditorGroupModel {
|
|||||||
readonly activeEditor: EditorInput | null;
|
readonly activeEditor: EditorInput | null;
|
||||||
readonly previewEditor: EditorInput | null;
|
readonly previewEditor: EditorInput | null;
|
||||||
|
|
||||||
getEditors(order: EditorsOrder, options?: { excludeSticky?: boolean }): readonly EditorInput[];
|
getEditors(order: EditorsOrder, options?: { excludeSticky?: boolean }): EditorInput[];
|
||||||
getEditorByIndex(index: number): EditorInput | undefined;
|
getEditorByIndex(index: number): EditorInput | undefined;
|
||||||
indexOf(editor: EditorInput | IUntypedEditorInput | null, editors?: EditorInput[], options?: IMatchEditorOptions): number;
|
indexOf(editor: EditorInput | IUntypedEditorInput | null, editors?: EditorInput[], options?: IMatchEditorOptions): number;
|
||||||
isActive(editor: EditorInput | IUntypedEditorInput): boolean;
|
isActive(editor: EditorInput | IUntypedEditorInput): boolean;
|
||||||
isPinned(editorOrIndex: EditorInput | number): boolean;
|
isPinned(editorOrIndex: EditorInput | number): boolean;
|
||||||
isSticky(editorOrIndex: EditorInput | number): boolean;
|
isSticky(editorOrIndex: EditorInput | number): boolean;
|
||||||
isFirst(editor: EditorInput): boolean;
|
isFirst(editor: EditorInput, editors?: EditorInput[]): boolean;
|
||||||
isLast(editor: EditorInput): boolean;
|
isLast(editor: EditorInput, editors?: EditorInput[]): boolean;
|
||||||
findEditor(editor: EditorInput | null, options?: IMatchEditorOptions): [EditorInput, number /* index */] | undefined;
|
findEditor(editor: EditorInput | null, options?: IMatchEditorOptions): [EditorInput, number /* index */] | undefined;
|
||||||
contains(editor: EditorInput | IUntypedEditorInput, options?: IMatchEditorOptions): boolean;
|
contains(editor: EditorInput | IUntypedEditorInput, options?: IMatchEditorOptions): boolean;
|
||||||
}
|
}
|
||||||
@@ -937,19 +937,19 @@ export class EditorGroupModel extends Disposable implements IEditorGroupModel {
|
|||||||
return [this.editors[index], index];
|
return [this.editors[index], index];
|
||||||
}
|
}
|
||||||
|
|
||||||
isFirst(candidate: EditorInput | null): boolean {
|
isFirst(candidate: EditorInput | null, editors = this.editors): boolean {
|
||||||
return this.matches(this.editors[0], candidate);
|
return this.matches(editors[0], candidate);
|
||||||
}
|
}
|
||||||
|
|
||||||
isLast(candidate: EditorInput | null): boolean {
|
isLast(candidate: EditorInput | null, editors = this.editors): boolean {
|
||||||
return this.matches(this.editors[this.editors.length - 1], candidate);
|
return this.matches(editors[editors.length - 1], candidate);
|
||||||
}
|
}
|
||||||
|
|
||||||
contains(candidate: EditorInput | IUntypedEditorInput, options?: IMatchEditorOptions): boolean {
|
contains(candidate: EditorInput | IUntypedEditorInput, options?: IMatchEditorOptions): boolean {
|
||||||
return this.indexOf(candidate, this.editors, options) !== -1;
|
return this.indexOf(candidate, this.editors, options) !== -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
private matches(editor: EditorInput | null, candidate: EditorInput | IUntypedEditorInput | null, options?: IMatchEditorOptions): boolean {
|
private matches(editor: EditorInput | null | undefined, candidate: EditorInput | IUntypedEditorInput | null, options?: IMatchEditorOptions): boolean {
|
||||||
if (!editor || !candidate) {
|
if (!editor || !candidate) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,7 +41,15 @@ abstract class FilteredEditorGroupModel extends Disposable implements IReadonlyE
|
|||||||
isSticky(editorOrIndex: EditorInput | number): boolean { return this.model.isSticky(editorOrIndex); }
|
isSticky(editorOrIndex: EditorInput | number): boolean { return this.model.isSticky(editorOrIndex); }
|
||||||
isActive(editor: EditorInput | IUntypedEditorInput): boolean { return this.model.isActive(editor); }
|
isActive(editor: EditorInput | IUntypedEditorInput): boolean { return this.model.isActive(editor); }
|
||||||
|
|
||||||
getEditors(order: EditorsOrder, options?: { excludeSticky?: boolean }): readonly EditorInput[] {
|
isFirst(editor: EditorInput): boolean {
|
||||||
|
return this.model.isFirst(editor, this.getEditors(EditorsOrder.SEQUENTIAL));
|
||||||
|
}
|
||||||
|
|
||||||
|
isLast(editor: EditorInput): boolean {
|
||||||
|
return this.model.isLast(editor, this.getEditors(EditorsOrder.SEQUENTIAL));
|
||||||
|
}
|
||||||
|
|
||||||
|
getEditors(order: EditorsOrder, options?: { excludeSticky?: boolean }): EditorInput[] {
|
||||||
const editors = this.model.getEditors(order, options);
|
const editors = this.model.getEditors(order, options);
|
||||||
return editors.filter(e => this.filter(e));
|
return editors.filter(e => this.filter(e));
|
||||||
}
|
}
|
||||||
@@ -56,8 +64,6 @@ abstract class FilteredEditorGroupModel extends Disposable implements IReadonlyE
|
|||||||
|
|
||||||
abstract get count(): number;
|
abstract get count(): number;
|
||||||
|
|
||||||
abstract isFirst(editor: EditorInput): boolean;
|
|
||||||
abstract isLast(editor: EditorInput): boolean;
|
|
||||||
abstract getEditorByIndex(index: number): EditorInput | undefined;
|
abstract getEditorByIndex(index: number): EditorInput | undefined;
|
||||||
abstract indexOf(editor: EditorInput | IUntypedEditorInput | null, editors?: EditorInput[], options?: IMatchEditorOptions): number;
|
abstract indexOf(editor: EditorInput | IUntypedEditorInput | null, editors?: EditorInput[], options?: IMatchEditorOptions): number;
|
||||||
abstract contains(editor: EditorInput | IUntypedEditorInput, options?: IMatchEditorOptions): boolean;
|
abstract contains(editor: EditorInput | IUntypedEditorInput, options?: IMatchEditorOptions): boolean;
|
||||||
@@ -68,7 +74,7 @@ abstract class FilteredEditorGroupModel extends Disposable implements IReadonlyE
|
|||||||
export class StickyEditorGroupModel extends FilteredEditorGroupModel {
|
export class StickyEditorGroupModel extends FilteredEditorGroupModel {
|
||||||
get count(): number { return this.model.stickyCount; }
|
get count(): number { return this.model.stickyCount; }
|
||||||
|
|
||||||
override getEditors(order: EditorsOrder, options?: { excludeSticky?: boolean }): readonly EditorInput[] {
|
override getEditors(order: EditorsOrder, options?: { excludeSticky?: boolean }): EditorInput[] {
|
||||||
if (options?.excludeSticky) {
|
if (options?.excludeSticky) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
@@ -82,14 +88,6 @@ export class StickyEditorGroupModel extends FilteredEditorGroupModel {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
isFirst(editor: EditorInput): boolean {
|
|
||||||
return this.model.isFirst(editor);
|
|
||||||
}
|
|
||||||
|
|
||||||
isLast(editor: EditorInput): boolean {
|
|
||||||
return this.model.indexOf(editor) === this.model.stickyCount - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
getEditorByIndex(index: number): EditorInput | undefined {
|
getEditorByIndex(index: number): EditorInput | undefined {
|
||||||
return index < this.count ? this.model.getEditorByIndex(index) : undefined;
|
return index < this.count ? this.model.getEditorByIndex(index) : undefined;
|
||||||
}
|
}
|
||||||
@@ -120,21 +118,13 @@ export class UnstickyEditorGroupModel extends FilteredEditorGroupModel {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
override getEditors(order: EditorsOrder, options?: { excludeSticky?: boolean }): readonly EditorInput[] {
|
override getEditors(order: EditorsOrder, options?: { excludeSticky?: boolean }): EditorInput[] {
|
||||||
if (order === EditorsOrder.SEQUENTIAL) {
|
if (order === EditorsOrder.SEQUENTIAL) {
|
||||||
return this.model.getEditors(EditorsOrder.SEQUENTIAL).slice(this.model.stickyCount);
|
return this.model.getEditors(EditorsOrder.SEQUENTIAL).slice(this.model.stickyCount);
|
||||||
}
|
}
|
||||||
return super.getEditors(order, options);
|
return super.getEditors(order, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
isFirst(editor: EditorInput): boolean {
|
|
||||||
return this.model.indexOf(editor) === this.model.stickyCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
isLast(editor: EditorInput): boolean {
|
|
||||||
return this.model.isLast(editor);
|
|
||||||
}
|
|
||||||
|
|
||||||
getEditorByIndex(index: number): EditorInput | undefined {
|
getEditorByIndex(index: number): EditorInput | undefined {
|
||||||
return index >= 0 ? this.model.getEditorByIndex(index + this.model.stickyCount) : undefined;
|
return index >= 0 ? this.model.getEditorByIndex(index + this.model.stickyCount) : undefined;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1455,6 +1455,28 @@ suite('EditorGroupsService', () => {
|
|||||||
editorGroupModelChangeListener.dispose();
|
editorGroupModelChangeListener.dispose();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('sticky: true wins over index', async () => {
|
||||||
|
const [part] = await createPart();
|
||||||
|
const group = part.activeGroup;
|
||||||
|
|
||||||
|
assert.strictEqual(group.stickyCount, 0);
|
||||||
|
|
||||||
|
const input = createTestFileEditorInput(URI.file('foo/bar'), TEST_EDITOR_INPUT_ID);
|
||||||
|
const inputInactive = createTestFileEditorInput(URI.file('foo/bar/inactive'), TEST_EDITOR_INPUT_ID);
|
||||||
|
const inputSticky = createTestFileEditorInput(URI.file('foo/bar/sticky'), TEST_EDITOR_INPUT_ID);
|
||||||
|
|
||||||
|
await group.openEditor(input, { pinned: true });
|
||||||
|
await group.openEditor(inputInactive, { inactive: true });
|
||||||
|
await group.openEditor(inputSticky, { sticky: true, index: 2 });
|
||||||
|
|
||||||
|
assert.strictEqual(group.stickyCount, 1);
|
||||||
|
assert.strictEqual(group.isSticky(inputSticky), true);
|
||||||
|
|
||||||
|
assert.strictEqual(group.getIndexOfEditor(input), 1);
|
||||||
|
assert.strictEqual(group.getIndexOfEditor(inputInactive), 2);
|
||||||
|
assert.strictEqual(group.getIndexOfEditor(inputSticky), 0);
|
||||||
|
});
|
||||||
|
|
||||||
test('moveEditor with context (across groups)', async () => {
|
test('moveEditor with context (across groups)', async () => {
|
||||||
const [part] = await createPart();
|
const [part] = await createPart();
|
||||||
const group = part.activeGroup;
|
const group = part.activeGroup;
|
||||||
|
|||||||
Reference in New Issue
Block a user