Skip to content

Commit 89c8087

Browse files
author
Jackson Kearl
committed
Persist search editor viewstate
1 parent 0621245 commit 89c8087

2 files changed

Lines changed: 41 additions & 9 deletions

File tree

src/vs/workbench/contrib/search/browser/searchEditor.ts

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import * as DOM from 'vs/base/browser/dom';
77
import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent';
88
import { CancellationToken } from 'vs/base/common/cancellation';
99
import { KeyCode, KeyMod } from 'vs/base/common/keyCodes';
10-
import { assertIsDefined } from 'vs/base/common/types';
10+
import { assertIsDefined, withNullAsUndefined } from 'vs/base/common/types';
1111
import { URI } from 'vs/base/common/uri';
1212
import 'vs/css!./media/searchEditor';
1313
import { CodeEditorWidget, ICodeEditorWidgetOptions } from 'vs/editor/browser/widget/codeEditorWidget';
@@ -169,7 +169,7 @@ export class SearchEditor extends BaseEditor {
169169
}
170170
});
171171

172-
172+
this._register(this.onDidBlur(() => this.saveViewState()));
173173

174174
this._register(this.searchResultEditor.onKeyDown(e => e.keyCode === KeyCode.Escape && this.queryEditorWidget.searchInput.focus()));
175175

@@ -183,6 +183,10 @@ export class SearchEditor extends BaseEditor {
183183
});
184184
}
185185

186+
focus() {
187+
this.restoreViewState();
188+
}
189+
186190
focusNextInput() {
187191
if (this.queryEditorWidget.searchInputHasFocus()) {
188192
if (this.showingIncludesExcludes) {
@@ -334,10 +338,6 @@ export class SearchEditor extends BaseEditor {
334338
this.reLayout();
335339
}
336340

337-
focusInput() {
338-
this.queryEditorWidget.focus();
339-
}
340-
341341
getSelected() {
342342
const selection = this.searchResultEditor.getSelection();
343343
if (selection) {
@@ -360,6 +360,8 @@ export class SearchEditor extends BaseEditor {
360360
}
361361

362362
async setInput(newInput: SearchEditorInput, options: EditorOptions | undefined, token: CancellationToken): Promise<void> {
363+
this.saveViewState();
364+
363365
await super.setInput(newInput, options, token);
364366
this.inSearchEditorContextKey.set(true);
365367

@@ -379,7 +381,7 @@ export class SearchEditor extends BaseEditor {
379381
this.inputPatternExcludes.setUseExcludesAndIgnoreFiles(query.useIgnores);
380382
this.toggleIncludesExcludes(query.showIncludesExcludes);
381383

382-
this.focusInput();
384+
this.restoreViewState();
383385
this.pauseSearching = false;
384386
}
385387

@@ -404,7 +406,30 @@ export class SearchEditor extends BaseEditor {
404406
return this.searchResultEditor.getModel();
405407
}
406408

409+
private saveViewState() {
410+
const input = this.getInput();
411+
if (!input) { return; }
412+
413+
if (this.searchResultEditor.hasWidgetFocus()) {
414+
const viewState = this.searchResultEditor.saveViewState();
415+
input.viewState = { focused: 'editor', state: assertIsDefined(withNullAsUndefined(viewState)) };
416+
} else {
417+
input.viewState = { focused: 'input' };
418+
}
419+
}
420+
421+
private restoreViewState() {
422+
const input = this.getInput();
423+
if (input && input.viewState && input.viewState.focused === 'editor') {
424+
this.searchResultEditor.restoreViewState(input.viewState.state);
425+
this.searchResultEditor.focus();
426+
} else {
427+
this.queryEditorWidget.focus();
428+
}
429+
}
430+
407431
clearInput() {
432+
this.saveViewState();
408433
super.clearInput();
409434
this.inSearchEditorContextKey.set(false);
410435
}

src/vs/workbench/contrib/search/browser/searchEditorInput.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import { IWorkingCopyService, WorkingCopyCapabilities, IWorkingCopy, IWorkingCop
2727
import { IBackupFileService } from 'vs/workbench/services/backup/common/backup';
2828
import { assertIsDefined } from 'vs/base/common/types';
2929
import { extractSearchQuery, serializeSearchConfiguration } from 'vs/workbench/contrib/search/browser/searchEditorSerialization';
30+
import type { ICodeEditorViewState } from 'vs/editor/common/editorCommon';
3031

3132
export type SearchConfiguration = {
3233
query: string,
@@ -40,12 +41,17 @@ export type SearchConfiguration = {
4041
showIncludesExcludes: boolean,
4142
};
4243

44+
type SearchEditorViewState =
45+
| { focused: 'input' }
46+
| { focused: 'editor', state: ICodeEditorViewState };
47+
4348
export class SearchEditorInput extends EditorInput {
4449
static readonly ID: string = 'workbench.editorinputs.searchEditorInput';
4550

4651
private dirty: boolean = false;
4752
private readonly model: Promise<ITextModel>;
4853
private resolvedModel?: { model: ITextModel, query: SearchConfiguration };
54+
viewState: SearchEditorViewState = { focused: 'input' };
4955

5056
constructor(
5157
public readonly resource: URI,
@@ -249,13 +255,14 @@ export class SearchEditorInputFactory implements IEditorInputFactory {
249255

250256
const config = input.getConfigSync();
251257

252-
return JSON.stringify({ resource, dirty: input.isDirty(), config });
258+
return JSON.stringify({ resource, dirty: input.isDirty(), config, viewState: input.viewState });
253259
}
254260

255261
deserialize(instantiationService: IInstantiationService, serializedEditorInput: string): SearchEditorInput | undefined {
256-
const { resource, dirty, config } = JSON.parse(serializedEditorInput);
262+
const { resource, dirty, config, viewState } = JSON.parse(serializedEditorInput);
257263
if (config && (config.query !== undefined)) {
258264
const input = instantiationService.invokeFunction(getOrMakeSearchEditorInput, { text: serializeSearchConfiguration(config), uri: URI.parse(resource) });
265+
input.viewState = viewState;
259266
input.setDirty(dirty);
260267
return input;
261268
}

0 commit comments

Comments
 (0)