提交 fd187e94 编写于 作者: B Benjamin Pasero

grid - 💄 LongRunningOperation

上级 1506c5ee
......@@ -96,6 +96,12 @@ export interface IProgressService2 {
* A helper to show progress during a long running operation. If the operation
* is started multiple times, only the last invocation will drive the progress.
*/
export interface IOperation {
id: number;
isCurrent: () => boolean;
stop(): void;
}
export class LongRunningOperation {
private currentOperationId = 0;
private currentProgressRunner: IProgressRunner;
......@@ -103,10 +109,9 @@ export class LongRunningOperation {
constructor(
private progressService: IProgressService
) {
}
) { }
start(progressDelay: number): number {
start(progressDelay: number): IOperation {
// Clear previous
if (this.currentProgressTimeout) {
......@@ -121,10 +126,14 @@ export class LongRunningOperation {
}
}, progressDelay);
return newOperationId;
return {
id: newOperationId,
stop: () => this.stop(newOperationId),
isCurrent: () => this.currentOperationId === newOperationId
};
}
stop(operationId: number): void {
private stop(operationId: number): void {
if (this.currentOperationId === operationId) {
clearTimeout(this.currentProgressTimeout);
......@@ -133,8 +142,4 @@ export class LongRunningOperation {
}
}
}
isCurrent(operationId): boolean {
return this.currentOperationId === operationId;
}
}
\ No newline at end of file
......@@ -50,10 +50,8 @@ export class NextEditorControl extends Disposable {
const descriptor = Registry.as<IEditorRegistry>(EditorExtensions.Editors).getEditor(editor);
const control = this.doShowEditorControl(descriptor, options);
const willEditorChange = (!control.input || !control.input.matches(editor) || (options && options.forceOpen));
// Set input
return this.doSetInput(control, editor, options).then((() => (({ control, editorChanged: willEditorChange } as IOpenEditorResult))));
return this.doSetInput(control, editor, options).then((editorChanged => (({ control, editorChanged } as IOpenEditorResult))));
}
private doShowEditorControl(descriptor: IEditorDescriptor, options: EditorOptions): BaseEditor {
......@@ -116,29 +114,32 @@ export class NextEditorControl extends Disposable {
return control;
}
private doSetInput(control: BaseEditor, editor: EditorInput, options: EditorOptions): Thenable<void> {
private doSetInput(control: BaseEditor, editor: EditorInput, options: EditorOptions): Thenable<boolean> {
// Show progress while setting input after a certain timeout. If the workbench is opening
// be more relaxed about progress showing by increasing the delay a little bit to reduce flicker.
const operationId = this.editorOperation.start(this.partService.isCreated() ? 800 : 3200);
const operation = this.editorOperation.start(this.partService.isCreated() ? 800 : 3200);
// Call into editor control
const editorWillChange = (!control.input || !control.input.matches(editor) || (options && options.forceOpen));
return control.setInput(editor, options).then(() => {
// Operation done
this.editorOperation.stop(operationId);
operation.stop();
// Focus (unless prevented or another operation is running)
if (this.editorOperation.isCurrent(operationId)) {
if (operation.isCurrent()) {
const focus = !options || !options.preserveFocus;
if (focus) {
control.focus();
}
}
return editorWillChange;
}, e => {
// Operation done
this.editorOperation.stop(operationId);
operation.stop();
return TPromise.wrapError(e);
});
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册