diff --git a/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx b/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx index 7db3661f..c844a263 100644 --- a/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx +++ b/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx @@ -22,7 +22,6 @@ import { OpenerService, Widget, StatusBar, - ShellLayoutRestorer, StatusBarAlignment, QuickOpenService, ApplicationShell, @@ -54,6 +53,7 @@ import { ProblemContribution } from '@theia/markers/lib/browser/problem/problem- import { ScmContribution } from '@theia/scm/lib/browser/scm-contribution'; import { SearchInWorkspaceFrontendContribution } from '@theia/search-in-workspace/lib/browser/search-in-workspace-frontend-contribution'; import { FileNavigatorCommands } from '@theia/navigator/lib/browser/navigator-contribution'; +import { ArduinoShellLayoutRestorer } from './shell/arduino-shell-layout-restorer'; export namespace ArduinoMenus { export const SKETCH = [...MAIN_MENU_BAR, '3_sketch']; @@ -141,8 +141,8 @@ export class ArduinoFrontendContribution implements FrontendApplicationContribut @inject(StatusBar) protected readonly statusBar: StatusBar; - @inject(ShellLayoutRestorer) - protected readonly layoutRestorer: ShellLayoutRestorer; + @inject(ArduinoShellLayoutRestorer) + protected readonly layoutRestorer: ArduinoShellLayoutRestorer; @inject(QuickOpenService) protected readonly quickOpenService: QuickOpenService; @@ -405,7 +405,7 @@ export class ArduinoFrontendContribution implements FrontendApplicationContribut // No `else`. We initialize the views (if required) in `this.onStart`. // `storeLayout` is not invoked in electron when refreshing the browser window: https://github.com/eclipse-theia/theia/issues/6530 // We store the state manually. - this.layoutRestorer.storeLayout(this.application); + await this.layoutRestorer.storeLayoutAsync(this.application); window.location.reload(true); }, isVisible: widget => ArduinoToolbar.is(widget) && widget.side === 'right', diff --git a/arduino-ide-extension/src/browser/arduino-frontend-module.ts b/arduino-ide-extension/src/browser/arduino-frontend-module.ts index e4b01449..efcd14b7 100644 --- a/arduino-ide-extension/src/browser/arduino-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-frontend-module.ts @@ -42,7 +42,7 @@ import { EditorContribution } from '@theia/editor/lib/browser/editor-contributio import { ArduinoEditorContribution } from './customization/arduino-editor-contribution'; import { MonacoStatusBarContribution } from '@theia/monaco/lib/browser/monaco-status-bar-contribution'; import { ArduinoMonacoStatusBarContribution } from './customization/arduino-monaco-status-bar-contribution'; -import { ApplicationShell } from '@theia/core/lib/browser'; +import { ApplicationShell, ShellLayoutRestorer } from '@theia/core/lib/browser'; import { ArduinoApplicationShell } from './customization/arduino-application-shell'; import { ArduinoFrontendApplication } from './customization/arduino-frontend-application'; import { BoardsConfigDialog, BoardsConfigDialogProps } from './boards/boards-config-dialog'; @@ -70,6 +70,7 @@ import { ArduinoProblemManager } from './markers/arduino-problem-manager'; import { BoardsAutoInstaller } from './boards/boards-auto-installer'; import { AboutDialog } from '@theia/core/lib/browser/about-dialog'; import { ArduinoAboutDialog } from './customization/arduino-about-dialog'; +import { ArduinoShellLayoutRestorer } from './shell/arduino-shell-layout-restorer'; const ElementQueries = require('css-element-queries/src/ElementQueries'); export default new ContainerModule((bind: interfaces.Bind, unbind: interfaces.Unbind, isBound: interfaces.IsBound, rebind: interfaces.Rebind) => { @@ -244,4 +245,9 @@ export default new ContainerModule((bind: interfaces.Bind, unbind: interfaces.Un unbind(AboutDialog); bind(ArduinoAboutDialog).toSelf().inSingletonScope(); bind(AboutDialog).toService(ArduinoAboutDialog); + + // Customized layout restorer that can restore the state in async way: https://github.com/eclipse-theia/theia/issues/6579 + unbind(ShellLayoutRestorer); + bind(ArduinoShellLayoutRestorer).toSelf().inSingletonScope(); + bind(ShellLayoutRestorer).toService(ArduinoShellLayoutRestorer); }); diff --git a/arduino-ide-extension/src/browser/shell/arduino-shell-layout-restorer.ts b/arduino-ide-extension/src/browser/shell/arduino-shell-layout-restorer.ts new file mode 100644 index 00000000..8f2fed01 --- /dev/null +++ b/arduino-ide-extension/src/browser/shell/arduino-shell-layout-restorer.ts @@ -0,0 +1,24 @@ +import { injectable } from 'inversify'; +import { FrontendApplication } from '@theia/core/lib/browser/frontend-application'; +import { ShellLayoutRestorer } from '@theia/core/lib/browser/shell/shell-layout-restorer'; + +@injectable() +export class ArduinoShellLayoutRestorer extends ShellLayoutRestorer { + + // Workaround for https://github.com/eclipse-theia/theia/issues/6579. + async storeLayoutAsync(app: FrontendApplication): Promise { + if (this.shouldStoreLayout) { + try { + this.logger.info('>>> Storing the layout...'); + const layoutData = app.shell.getLayoutData(); + const serializedLayoutData = this.deflate(layoutData); + await this.storageService.setData(this.storageKey, serializedLayoutData); + this.logger.info('<<< The layout has been successfully stored.'); + } catch (error) { + await this.storageService.setData(this.storageKey, undefined); + this.logger.error('Error during serialization of layout data', error); + } + } + } + +}