Fixed storeLayout when toggling the editor mode.

Workaround for eclipse-theia/theia#6579.

Signed-off-by: Akos Kitta <kittaakos@typefox.io>
This commit is contained in:
Akos Kitta 2019-11-19 10:47:21 +01:00
parent 435fdcdf7f
commit c2008460b0
3 changed files with 35 additions and 5 deletions

View File

@ -22,7 +22,6 @@ import {
OpenerService, OpenerService,
Widget, Widget,
StatusBar, StatusBar,
ShellLayoutRestorer,
StatusBarAlignment, StatusBarAlignment,
QuickOpenService, QuickOpenService,
ApplicationShell, ApplicationShell,
@ -54,6 +53,7 @@ import { ProblemContribution } from '@theia/markers/lib/browser/problem/problem-
import { ScmContribution } from '@theia/scm/lib/browser/scm-contribution'; import { ScmContribution } from '@theia/scm/lib/browser/scm-contribution';
import { SearchInWorkspaceFrontendContribution } from '@theia/search-in-workspace/lib/browser/search-in-workspace-frontend-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 { FileNavigatorCommands } from '@theia/navigator/lib/browser/navigator-contribution';
import { ArduinoShellLayoutRestorer } from './shell/arduino-shell-layout-restorer';
export namespace ArduinoMenus { export namespace ArduinoMenus {
export const SKETCH = [...MAIN_MENU_BAR, '3_sketch']; export const SKETCH = [...MAIN_MENU_BAR, '3_sketch'];
@ -141,8 +141,8 @@ export class ArduinoFrontendContribution implements FrontendApplicationContribut
@inject(StatusBar) @inject(StatusBar)
protected readonly statusBar: StatusBar; protected readonly statusBar: StatusBar;
@inject(ShellLayoutRestorer) @inject(ArduinoShellLayoutRestorer)
protected readonly layoutRestorer: ShellLayoutRestorer; protected readonly layoutRestorer: ArduinoShellLayoutRestorer;
@inject(QuickOpenService) @inject(QuickOpenService)
protected readonly quickOpenService: 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`. // 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 // `storeLayout` is not invoked in electron when refreshing the browser window: https://github.com/eclipse-theia/theia/issues/6530
// We store the state manually. // We store the state manually.
this.layoutRestorer.storeLayout(this.application); await this.layoutRestorer.storeLayoutAsync(this.application);
window.location.reload(true); window.location.reload(true);
}, },
isVisible: widget => ArduinoToolbar.is(widget) && widget.side === 'right', isVisible: widget => ArduinoToolbar.is(widget) && widget.side === 'right',

View File

@ -42,7 +42,7 @@ import { EditorContribution } from '@theia/editor/lib/browser/editor-contributio
import { ArduinoEditorContribution } from './customization/arduino-editor-contribution'; import { ArduinoEditorContribution } from './customization/arduino-editor-contribution';
import { MonacoStatusBarContribution } from '@theia/monaco/lib/browser/monaco-status-bar-contribution'; import { MonacoStatusBarContribution } from '@theia/monaco/lib/browser/monaco-status-bar-contribution';
import { ArduinoMonacoStatusBarContribution } from './customization/arduino-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 { ArduinoApplicationShell } from './customization/arduino-application-shell';
import { ArduinoFrontendApplication } from './customization/arduino-frontend-application'; import { ArduinoFrontendApplication } from './customization/arduino-frontend-application';
import { BoardsConfigDialog, BoardsConfigDialogProps } from './boards/boards-config-dialog'; 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 { BoardsAutoInstaller } from './boards/boards-auto-installer';
import { AboutDialog } from '@theia/core/lib/browser/about-dialog'; import { AboutDialog } from '@theia/core/lib/browser/about-dialog';
import { ArduinoAboutDialog } from './customization/arduino-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'); const ElementQueries = require('css-element-queries/src/ElementQueries');
export default new ContainerModule((bind: interfaces.Bind, unbind: interfaces.Unbind, isBound: interfaces.IsBound, rebind: interfaces.Rebind) => { 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); unbind(AboutDialog);
bind(ArduinoAboutDialog).toSelf().inSingletonScope(); bind(ArduinoAboutDialog).toSelf().inSingletonScope();
bind(AboutDialog).toService(ArduinoAboutDialog); 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);
}); });

View File

@ -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<void> {
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);
}
}
}
}