diff --git a/src/vs/workbench/common/editor/editorStacksModel.ts b/src/vs/workbench/common/editor/editorStacksModel.ts index c21890e685a5db0615f153d47e44608f660b14c3..6b2cbb173f6a708b9a8f4bfb42602e708fd7bf74 100644 --- a/src/vs/workbench/common/editor/editorStacksModel.ts +++ b/src/vs/workbench/common/editor/editorStacksModel.ts @@ -48,6 +48,7 @@ export interface IEditorStacksModel { onGroupOpened: Event; onGroupClosed: Event; onGroupActivated: Event; + onGroupMoved: Event; groups: IEditorGroup[]; activeGroup: IEditorGroup; @@ -57,6 +58,8 @@ export interface IEditorStacksModel { closeGroup(group: IEditorGroup): void; closeAllGroups(): void; + moveGroup(group: IEditorGroup, toIndex: number); + setActive(group: IEditorGroup): void; } @@ -68,7 +71,6 @@ export interface IEditorOpenOptions { /// --- API-End ---- // Move Editor -// Move Group export enum Direction { LEFT, @@ -494,6 +496,7 @@ export class EditorStacksModel implements IEditorStacksModel { private _onGroupOpened: Emitter; private _onGroupClosed: Emitter; + private _onGroupMoved: Emitter; private _onGroupActivated: Emitter; constructor( @@ -508,10 +511,12 @@ export class EditorStacksModel implements IEditorStacksModel { this._onGroupOpened = new Emitter(); this._onGroupClosed = new Emitter(); this._onGroupActivated = new Emitter(); + this._onGroupMoved = new Emitter(); this.toDispose.push(this._onGroupOpened); this.toDispose.push(this._onGroupClosed); this.toDispose.push(this._onGroupActivated); + this.toDispose.push(this._onGroupMoved); this.load(); this.registerListeners(); @@ -533,6 +538,10 @@ export class EditorStacksModel implements IEditorStacksModel { return this._onGroupActivated.event; } + public get onGroupMoved(): Event { + return this._onGroupMoved.event; + } + public get groups(): EditorGroup[] { return this._groups.slice(0); } @@ -614,6 +623,20 @@ export class EditorStacksModel implements IEditorStacksModel { this._onGroupActivated.fire(this.active); } + public moveGroup(group: EditorGroup, toIndex: number): void { + const index = this.indexOf(group); + if (index < 0) { + return; + } + + // Move + this._groups.splice(index, 1); + this._groups.splice(toIndex, 0, group); + + // Event + this._onGroupMoved.fire(group); + } + private indexOf(group: EditorGroup): number { return this._groups.indexOf(group); } diff --git a/src/vs/workbench/test/common/editor/editorStacksModel.test.ts b/src/vs/workbench/test/common/editor/editorStacksModel.test.ts index 71ebe46d2a838b13d4bb326354e5984aa40175a0..237c9b757e20cd42830a52bcad5ca4c65e9d23a0 100644 --- a/src/vs/workbench/test/common/editor/editorStacksModel.test.ts +++ b/src/vs/workbench/test/common/editor/editorStacksModel.test.ts @@ -31,6 +31,7 @@ interface ModelEvents { opened: IEditorGroup[]; activated: IEditorGroup[]; closed: IEditorGroup[]; + moved: IEditorGroup[]; } interface GroupEvents { @@ -45,12 +46,14 @@ function modelListener(model: IEditorStacksModel): ModelEvents { const modelEvents = { opened: [], activated: [], - closed: [] + closed: [], + moved: [] }; model.onGroupOpened(g => modelEvents.opened.push(g)); model.onGroupActivated(g => modelEvents.activated.push(g)); model.onGroupClosed(g => modelEvents.closed.push(g)); + model.onGroupMoved(g => modelEvents.moved.push(g)); return modelEvents; } @@ -131,7 +134,7 @@ suite('Editor Stacks Model', () => { setOpenEditorDirection(Direction.RIGHT); }); - test('Groups', function () { + test('Groups - Basic', function () { const model = create(); const events = modelListener(model); @@ -193,6 +196,31 @@ suite('Editor Stacks Model', () => { assert.equal(model.groups.length, 0); }); + test('Groups - Move Groups', function () { + const model = create(); + const events = modelListener(model); + + const group1 = model.openGroup('first'); + const group2 = model.openGroup('second'); + + model.moveGroup(group1, 1); + assert.equal(events.moved[0], group1); + assert.equal(model.groups[0], group2); + assert.equal(model.groups[1], group1); + + model.moveGroup(group1, 0); + assert.equal(model.groups[0], group1); + assert.equal(model.groups[1], group2); + + const group3 = model.openGroup('third'); + + model.moveGroup(group1, 2); + + assert.equal(model.groups[0], group2); + assert.equal(model.groups[1], group3); + assert.equal(model.groups[2], group1); + }); + test('Stack - One Editor', function () { const model = create(); const group = model.openGroup('group');