mirror of
https://github.com/arduino/arduino-ide.git
synced 2025-07-14 14:56:33 +00:00
Made the editor mode dynamic.Signed-off-by: Akos Kitta <kittaakos@typefox.io>
This commit is contained in:
parent
c2008460b0
commit
840cde872c
20
.vscode/settings.json
vendored
20
.vscode/settings.json
vendored
@ -1,3 +1,21 @@
|
|||||||
{
|
{
|
||||||
"typescript.tsdk": "node_modules/typescript/lib"
|
"tslint.enable": true,
|
||||||
|
"tslint.configFile": "./tslint.json",
|
||||||
|
"editor.formatOnSave": true,
|
||||||
|
"files.exclude": {
|
||||||
|
"**/lib": false
|
||||||
|
},
|
||||||
|
"editor.insertSpaces": true,
|
||||||
|
"editor.detectIndentation": false,
|
||||||
|
"[typescript]": {
|
||||||
|
"editor.tabSize": 4
|
||||||
|
},
|
||||||
|
"[json]": {
|
||||||
|
"editor.tabSize": 2
|
||||||
|
},
|
||||||
|
"[jsonc]": {
|
||||||
|
"editor.tabSize": 2
|
||||||
|
},
|
||||||
|
"files.insertFinalNewline": true,
|
||||||
|
"typescript.tsdk": "node_modules/typescript/lib"
|
||||||
}
|
}
|
@ -46,7 +46,6 @@ import { ConfigService } from '../common/protocol/config-service';
|
|||||||
import { MonitorConnection } from './monitor/monitor-connection';
|
import { MonitorConnection } from './monitor/monitor-connection';
|
||||||
import { MonitorViewContribution } from './monitor/monitor-view-contribution';
|
import { MonitorViewContribution } from './monitor/monitor-view-contribution';
|
||||||
import { ArduinoWorkspaceService } from './arduino-workspace-service';
|
import { ArduinoWorkspaceService } from './arduino-workspace-service';
|
||||||
import { OutputWidget } from '@theia/output/lib/browser/output-widget';
|
|
||||||
import { FileNavigatorContribution } from '@theia/navigator/lib/browser/navigator-contribution';
|
import { FileNavigatorContribution } from '@theia/navigator/lib/browser/navigator-contribution';
|
||||||
import { OutlineViewContribution } from '@theia/outline-view/lib/browser/outline-view-contribution';
|
import { OutlineViewContribution } from '@theia/outline-view/lib/browser/outline-view-contribution';
|
||||||
import { ProblemContribution } from '@theia/markers/lib/browser/problem/problem-contribution';
|
import { ProblemContribution } from '@theia/markers/lib/browser/problem/problem-contribution';
|
||||||
@ -54,6 +53,7 @@ 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';
|
import { ArduinoShellLayoutRestorer } from './shell/arduino-shell-layout-restorer';
|
||||||
|
import { EditorMode } from './editor-mode';
|
||||||
|
|
||||||
export namespace ArduinoMenus {
|
export namespace ArduinoMenus {
|
||||||
export const SKETCH = [...MAIN_MENU_BAR, '3_sketch'];
|
export const SKETCH = [...MAIN_MENU_BAR, '3_sketch'];
|
||||||
@ -67,14 +67,6 @@ export namespace ArduinoToolbarContextMenu {
|
|||||||
export const EXAMPLE_SKETCHES_GROUP: MenuPath = [...OPEN_SKETCH_PATH, '3_examples'];
|
export const EXAMPLE_SKETCHES_GROUP: MenuPath = [...OPEN_SKETCH_PATH, '3_examples'];
|
||||||
}
|
}
|
||||||
|
|
||||||
export namespace EditorMode {
|
|
||||||
export const PRO_MODE_KEY = 'arduino-advanced-mode';
|
|
||||||
export const IN_PRO_MODE: boolean = (() => {
|
|
||||||
const value = window.localStorage.getItem(PRO_MODE_KEY);
|
|
||||||
return value === 'true';
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
|
|
||||||
@injectable()
|
@injectable()
|
||||||
export class ArduinoFrontendContribution implements FrontendApplicationContribution, TabBarToolbarContribution, CommandContribution, MenuContribution {
|
export class ArduinoFrontendContribution implements FrontendApplicationContribution, TabBarToolbarContribution, CommandContribution, MenuContribution {
|
||||||
|
|
||||||
@ -174,6 +166,9 @@ export class ArduinoFrontendContribution implements FrontendApplicationContribut
|
|||||||
@inject(SearchInWorkspaceFrontendContribution)
|
@inject(SearchInWorkspaceFrontendContribution)
|
||||||
protected readonly siwContribution: SearchInWorkspaceFrontendContribution;
|
protected readonly siwContribution: SearchInWorkspaceFrontendContribution;
|
||||||
|
|
||||||
|
@inject(EditorMode)
|
||||||
|
protected readonly editorMode: EditorMode;
|
||||||
|
|
||||||
protected application: FrontendApplication;
|
protected application: FrontendApplication;
|
||||||
protected wsSketchCount: number = 0; // TODO: this does not belong here, does it?
|
protected wsSketchCount: number = 0; // TODO: this does not belong here, does it?
|
||||||
|
|
||||||
@ -182,13 +177,6 @@ export class ArduinoFrontendContribution implements FrontendApplicationContribut
|
|||||||
// This is a hack. Otherwise, the backend services won't bind.
|
// This is a hack. Otherwise, the backend services won't bind.
|
||||||
await this.workspaceServiceExt.roots();
|
await this.workspaceServiceExt.roots();
|
||||||
|
|
||||||
if (!EditorMode.IN_PRO_MODE) {
|
|
||||||
const { ADD_FOLDER, REMOVE_FOLDER, SAVE_WORKSPACE_AS } = WorkspaceCommands;
|
|
||||||
for (const command of [ADD_FOLDER, REMOVE_FOLDER, SAVE_WORKSPACE_AS]) {
|
|
||||||
this.commandRegistry.unregisterCommand(command);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const updateStatusBar = (config: BoardsConfig.Config) => {
|
const updateStatusBar = (config: BoardsConfig.Config) => {
|
||||||
this.statusBar.setElement('arduino-selected-board', {
|
this.statusBar.setElement('arduino-selected-board', {
|
||||||
alignment: StatusBarAlignment.RIGHT,
|
alignment: StatusBarAlignment.RIGHT,
|
||||||
@ -263,7 +251,7 @@ export class ArduinoFrontendContribution implements FrontendApplicationContribut
|
|||||||
id: ArduinoCommands.TOGGLE_ADVANCED_MODE.id,
|
id: ArduinoCommands.TOGGLE_ADVANCED_MODE.id,
|
||||||
command: ArduinoCommands.TOGGLE_ADVANCED_MODE.id,
|
command: ArduinoCommands.TOGGLE_ADVANCED_MODE.id,
|
||||||
tooltip: 'Toggle Advanced Mode',
|
tooltip: 'Toggle Advanced Mode',
|
||||||
text: (EditorMode.IN_PRO_MODE ? '$(toggle-on)' : '$(toggle-off)'),
|
text: (this.editorMode.proMode ? '$(toggle-on)' : '$(toggle-off)'),
|
||||||
isVisible: widget => ArduinoToolbar.is(widget) && widget.side === 'right'
|
isVisible: widget => ArduinoToolbar.is(widget) && widget.side === 'right'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -392,29 +380,14 @@ export class ArduinoFrontendContribution implements FrontendApplicationContribut
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
registry.registerCommand(ArduinoCommands.TOGGLE_ADVANCED_MODE, {
|
registry.registerCommand(ArduinoCommands.TOGGLE_ADVANCED_MODE, {
|
||||||
execute: async () => {
|
execute: () => this.editorMode.toggle(),
|
||||||
const oldState = EditorMode.IN_PRO_MODE;
|
|
||||||
const inAdvancedMode = !oldState;
|
|
||||||
window.localStorage.setItem(EditorMode.PRO_MODE_KEY, String(inAdvancedMode));
|
|
||||||
if (!inAdvancedMode) {
|
|
||||||
// Close all widget that is neither editor nor `Output`.
|
|
||||||
for (const area of ['left', 'right', 'bottom', 'main'] as Array<ApplicationShell.Area>) {
|
|
||||||
this.shell.closeTabs(area, ({ owner }) => !(owner instanceof EditorWidget || owner instanceof OutputWidget));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 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.
|
|
||||||
await this.layoutRestorer.storeLayoutAsync(this.application);
|
|
||||||
window.location.reload(true);
|
|
||||||
},
|
|
||||||
isVisible: widget => ArduinoToolbar.is(widget) && widget.side === 'right',
|
isVisible: widget => ArduinoToolbar.is(widget) && widget.side === 'right',
|
||||||
isToggled: () => EditorMode.IN_PRO_MODE
|
isToggled: () => this.editorMode.proMode
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
registerMenus(registry: MenuModelRegistry) {
|
registerMenus(registry: MenuModelRegistry) {
|
||||||
if (!EditorMode.IN_PRO_MODE) {
|
if (!this.editorMode.proMode) {
|
||||||
// If are not in pro-mode, we have to disable the context menu for the tabs.
|
// If are not in pro-mode, we have to disable the context menu for the tabs.
|
||||||
// Such as `Close`, `Close All`, etc.
|
// Such as `Close`, `Close All`, etc.
|
||||||
for (const command of [
|
for (const command of [
|
||||||
|
@ -10,7 +10,7 @@ import { LanguageGrammarDefinitionContribution } from '@theia/monaco/lib/browser
|
|||||||
import { LanguageClientContribution } from '@theia/languages/lib/browser';
|
import { LanguageClientContribution } from '@theia/languages/lib/browser';
|
||||||
import { ArduinoLanguageClientContribution } from './language/arduino-language-client-contribution';
|
import { ArduinoLanguageClientContribution } from './language/arduino-language-client-contribution';
|
||||||
import { LibraryListWidget } from './library/library-list-widget';
|
import { LibraryListWidget } from './library/library-list-widget';
|
||||||
import { ArduinoFrontendContribution, EditorMode } from './arduino-frontend-contribution';
|
import { ArduinoFrontendContribution } from './arduino-frontend-contribution';
|
||||||
import { ArduinoLanguageGrammarContribution } from './language/arduino-language-grammar-contribution';
|
import { ArduinoLanguageGrammarContribution } from './language/arduino-language-grammar-contribution';
|
||||||
import { LibraryService, LibraryServicePath } from '../common/protocol/library-service';
|
import { LibraryService, LibraryServicePath } from '../common/protocol/library-service';
|
||||||
import { BoardsService, BoardsServicePath, BoardsServiceClient } from '../common/protocol/boards-service';
|
import { BoardsService, BoardsServicePath, BoardsServiceClient } from '../common/protocol/boards-service';
|
||||||
@ -30,14 +30,14 @@ import { ThemeService } from '@theia/core/lib/browser/theming';
|
|||||||
import { ArduinoTheme } from './arduino-theme';
|
import { ArduinoTheme } from './arduino-theme';
|
||||||
import { MenuContribution } from '@theia/core';
|
import { MenuContribution } from '@theia/core';
|
||||||
import { OutlineViewContribution } from '@theia/outline-view/lib/browser/outline-view-contribution';
|
import { OutlineViewContribution } from '@theia/outline-view/lib/browser/outline-view-contribution';
|
||||||
import { SilentOutlineViewContribution } from './customization/silent-outline-contribution';
|
import { ArduinoOutlineViewContribution } from './customization/arduino-outline-contribution';
|
||||||
import { ProblemContribution } from '@theia/markers/lib/browser/problem/problem-contribution';
|
import { ProblemContribution } from '@theia/markers/lib/browser/problem/problem-contribution';
|
||||||
import { SilentProblemContribution } from './customization/silent-problem-contribution';
|
import { ArduinoProblemContribution } from './customization/arduino-problem-contribution';
|
||||||
import { SilentNavigatorContribution } from './customization/silent-navigator-contribution';
|
import { ArduinoNavigatorContribution } from './customization/arduino-navigator-contribution';
|
||||||
import { FileNavigatorContribution } from '@theia/navigator/lib/browser/navigator-contribution';
|
import { FileNavigatorContribution } from '@theia/navigator/lib/browser/navigator-contribution';
|
||||||
import { ArduinoToolbarContribution } from './toolbar/arduino-toolbar-contribution';
|
import { ArduinoToolbarContribution } from './toolbar/arduino-toolbar-contribution';
|
||||||
import { OutputToolbarContribution } from '@theia/output/lib/browser/output-toolbar-contribution';
|
import { OutputToolbarContribution } from '@theia/output/lib/browser/output-toolbar-contribution';
|
||||||
import { ArduinoOutputToolContribution } from './customization/silent-output-tool-contribution';
|
import { ArduinoOutputToolContribution } from './customization/arduino-output-tool-contribution';
|
||||||
import { EditorContribution } from '@theia/editor/lib/browser/editor-contribution';
|
import { EditorContribution } from '@theia/editor/lib/browser/editor-contribution';
|
||||||
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';
|
||||||
@ -48,9 +48,9 @@ import { ArduinoFrontendApplication } from './customization/arduino-frontend-app
|
|||||||
import { BoardsConfigDialog, BoardsConfigDialogProps } from './boards/boards-config-dialog';
|
import { BoardsConfigDialog, BoardsConfigDialogProps } from './boards/boards-config-dialog';
|
||||||
import { BoardsConfigDialogWidget } from './boards/boards-config-dialog-widget';
|
import { BoardsConfigDialogWidget } from './boards/boards-config-dialog-widget';
|
||||||
import { ScmContribution } from '@theia/scm/lib/browser/scm-contribution';
|
import { ScmContribution } from '@theia/scm/lib/browser/scm-contribution';
|
||||||
import { SilentScmContribution } from './customization/silent-scm-contribution';
|
import { ArduinoScmContribution } from './customization/arduino-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 { SilentSearchInWorkspaceContribution } from './customization/silent-search-in-workspace-contribution';
|
import { ArduinoSearchInWorkspaceContribution } from './customization/arduino-search-in-workspace-contribution';
|
||||||
import { LibraryListWidgetFrontendContribution } from './library/library-widget-frontend-contribution';
|
import { LibraryListWidgetFrontendContribution } from './library/library-widget-frontend-contribution';
|
||||||
import { LibraryItemRenderer } from './library/library-item-renderer';
|
import { LibraryItemRenderer } from './library/library-item-renderer';
|
||||||
import { BoardItemRenderer } from './boards/boards-item-renderer';
|
import { BoardItemRenderer } from './boards/boards-item-renderer';
|
||||||
@ -71,6 +71,7 @@ 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';
|
import { ArduinoShellLayoutRestorer } from './shell/arduino-shell-layout-restorer';
|
||||||
|
import { EditorMode } from './editor-mode';
|
||||||
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) => {
|
||||||
@ -199,55 +200,37 @@ export default new ContainerModule((bind: interfaces.Bind, unbind: interfaces.Un
|
|||||||
const themeService = ThemeService.get();
|
const themeService = ThemeService.get();
|
||||||
themeService.register(...ArduinoTheme.themes);
|
themeService.register(...ArduinoTheme.themes);
|
||||||
|
|
||||||
// Customizing default Theia layout
|
// Customizing default Theia layout based on the editor mode: `pro-mode` or `classic`.
|
||||||
if (!EditorMode.IN_PRO_MODE) {
|
bind(EditorMode).toSelf().inSingletonScope();
|
||||||
unbind(OutlineViewContribution);
|
bind(FrontendApplicationContribution).toService(EditorMode);
|
||||||
bind(OutlineViewContribution).to(SilentOutlineViewContribution).inSingletonScope();
|
rebind(OutlineViewContribution).to(ArduinoOutlineViewContribution).inSingletonScope();
|
||||||
unbind(ProblemContribution);
|
rebind(ProblemContribution).to(ArduinoProblemContribution).inSingletonScope();
|
||||||
bind(ProblemContribution).to(SilentProblemContribution).inSingletonScope();
|
rebind(FileNavigatorContribution).to(ArduinoNavigatorContribution).inSingletonScope();
|
||||||
unbind(FileNavigatorContribution);
|
rebind(OutputToolbarContribution).to(ArduinoOutputToolContribution).inSingletonScope();
|
||||||
bind(FileNavigatorContribution).to(SilentNavigatorContribution).inSingletonScope();
|
rebind(EditorContribution).to(ArduinoEditorContribution).inSingletonScope();
|
||||||
unbind(OutputToolbarContribution);
|
rebind(MonacoStatusBarContribution).to(ArduinoMonacoStatusBarContribution).inSingletonScope();
|
||||||
bind(OutputToolbarContribution).to(ArduinoOutputToolContribution).inSingletonScope();
|
rebind(ApplicationShell).to(ArduinoApplicationShell).inSingletonScope();
|
||||||
unbind(EditorContribution);
|
rebind(ScmContribution).to(ArduinoScmContribution).inSingletonScope();
|
||||||
bind(EditorContribution).to(ArduinoEditorContribution).inSingletonScope();
|
rebind(SearchInWorkspaceFrontendContribution).to(ArduinoSearchInWorkspaceContribution).inSingletonScope();
|
||||||
unbind(MonacoStatusBarContribution);
|
rebind(FrontendApplication).to(ArduinoFrontendApplication).inSingletonScope();
|
||||||
bind(MonacoStatusBarContribution).to(ArduinoMonacoStatusBarContribution).inSingletonScope();
|
|
||||||
unbind(ApplicationShell);
|
|
||||||
bind(ApplicationShell).to(ArduinoApplicationShell).inSingletonScope();
|
|
||||||
unbind(ScmContribution);
|
|
||||||
bind(ScmContribution).to(SilentScmContribution).inSingletonScope();
|
|
||||||
unbind(SearchInWorkspaceFrontendContribution);
|
|
||||||
bind(SearchInWorkspaceFrontendContribution).to(SilentSearchInWorkspaceContribution).inSingletonScope();
|
|
||||||
} else {
|
|
||||||
// We use this CSS class on the body to modify the visibility of the close button for the editors and views.
|
|
||||||
document.body.classList.add(EditorMode.PRO_MODE_KEY);
|
|
||||||
}
|
|
||||||
unbind(FrontendApplication);
|
|
||||||
bind(FrontendApplication).to(ArduinoFrontendApplication).inSingletonScope();
|
|
||||||
|
|
||||||
// Monaco customizations
|
// Monaco customizations
|
||||||
unbind(MonacoEditorProvider);
|
|
||||||
bind(ArduinoMonacoEditorProvider).toSelf().inSingletonScope();
|
bind(ArduinoMonacoEditorProvider).toSelf().inSingletonScope();
|
||||||
bind(MonacoEditorProvider).toService(ArduinoMonacoEditorProvider);
|
rebind(MonacoEditorProvider).toService(ArduinoMonacoEditorProvider);
|
||||||
|
|
||||||
// Decorator customizations
|
// Decorator customizations
|
||||||
unbind(TabBarDecoratorService);
|
|
||||||
bind(ArduinoTabBarDecoratorService).toSelf().inSingletonScope();
|
bind(ArduinoTabBarDecoratorService).toSelf().inSingletonScope();
|
||||||
bind(TabBarDecoratorService).toService(ArduinoTabBarDecoratorService);
|
rebind(TabBarDecoratorService).toService(ArduinoTabBarDecoratorService);
|
||||||
|
|
||||||
// Problem markers
|
// Problem markers
|
||||||
unbind(ProblemManager);
|
|
||||||
bind(ArduinoProblemManager).toSelf().inSingletonScope();
|
bind(ArduinoProblemManager).toSelf().inSingletonScope();
|
||||||
bind(ProblemManager).toService(ArduinoProblemManager);
|
rebind(ProblemManager).toService(ArduinoProblemManager);
|
||||||
|
|
||||||
// About dialog to show the CLI version
|
// About dialog to show the CLI version
|
||||||
unbind(AboutDialog);
|
|
||||||
bind(ArduinoAboutDialog).toSelf().inSingletonScope();
|
bind(ArduinoAboutDialog).toSelf().inSingletonScope();
|
||||||
bind(AboutDialog).toService(ArduinoAboutDialog);
|
rebind(AboutDialog).toService(ArduinoAboutDialog);
|
||||||
|
|
||||||
// Customized layout restorer that can restore the state in async way: https://github.com/eclipse-theia/theia/issues/6579
|
// 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(ArduinoShellLayoutRestorer).toSelf().inSingletonScope();
|
||||||
bind(ShellLayoutRestorer).toService(ArduinoShellLayoutRestorer);
|
rebind(ShellLayoutRestorer).toService(ArduinoShellLayoutRestorer);
|
||||||
});
|
});
|
||||||
|
@ -4,7 +4,7 @@ import { WorkspaceService } from '@theia/workspace/lib/browser/workspace-service
|
|||||||
import { ConfigService } from '../common/protocol/config-service';
|
import { ConfigService } from '../common/protocol/config-service';
|
||||||
import { SketchesService } from '../common/protocol/sketches-service';
|
import { SketchesService } from '../common/protocol/sketches-service';
|
||||||
import { ArduinoWorkspaceRootResolver } from './arduino-workspace-resolver';
|
import { ArduinoWorkspaceRootResolver } from './arduino-workspace-resolver';
|
||||||
import { EditorMode as EditorMode } from './arduino-frontend-contribution';
|
import { EditorMode } from './editor-mode';
|
||||||
|
|
||||||
@injectable()
|
@injectable()
|
||||||
export class ArduinoWorkspaceService extends WorkspaceService {
|
export class ArduinoWorkspaceService extends WorkspaceService {
|
||||||
@ -18,6 +18,9 @@ export class ArduinoWorkspaceService extends WorkspaceService {
|
|||||||
@inject(LabelProvider)
|
@inject(LabelProvider)
|
||||||
protected readonly labelProvider: LabelProvider;
|
protected readonly labelProvider: LabelProvider;
|
||||||
|
|
||||||
|
@inject(EditorMode)
|
||||||
|
protected readonly editorMode: EditorMode;
|
||||||
|
|
||||||
async getDefaultWorkspaceUri(): Promise<string | undefined> {
|
async getDefaultWorkspaceUri(): Promise<string | undefined> {
|
||||||
const [hash, recentWorkspaces, recentSketches] = await Promise.all([
|
const [hash, recentWorkspaces, recentSketches] = await Promise.all([
|
||||||
window.location.hash,
|
window.location.hash,
|
||||||
@ -47,7 +50,7 @@ export class ArduinoWorkspaceService extends WorkspaceService {
|
|||||||
}
|
}
|
||||||
// The workspace root location must exist. However, when opening a workspace root in pro-mode,
|
// The workspace root location must exist. However, when opening a workspace root in pro-mode,
|
||||||
// the workspace root must not be a sketch folder. It can be the default sketch directory, or any other directories, for instance.
|
// the workspace root must not be a sketch folder. It can be the default sketch directory, or any other directories, for instance.
|
||||||
if (EditorMode.IN_PRO_MODE) {
|
if (this.editorMode.proMode) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
const sketchFolder = await this.sketchService.isSketchFolder(uri);
|
const sketchFolder = await this.sketchService.isSketchFolder(uri);
|
||||||
|
@ -2,7 +2,8 @@ import { injectable, inject } from 'inversify';
|
|||||||
import { FileSystem } from '@theia/filesystem/lib/common/filesystem';
|
import { FileSystem } from '@theia/filesystem/lib/common/filesystem';
|
||||||
import { WorkspaceService } from '@theia/workspace/lib/browser/workspace-service';
|
import { WorkspaceService } from '@theia/workspace/lib/browser/workspace-service';
|
||||||
import { FrontendApplication } from '@theia/core/lib/browser/frontend-application';
|
import { FrontendApplication } from '@theia/core/lib/browser/frontend-application';
|
||||||
import { ArduinoFrontendContribution, EditorMode } from '../arduino-frontend-contribution';
|
import { EditorMode } from '../editor-mode';
|
||||||
|
import { ArduinoFrontendContribution } from '../arduino-frontend-contribution';
|
||||||
|
|
||||||
@injectable()
|
@injectable()
|
||||||
export class ArduinoFrontendApplication extends FrontendApplication {
|
export class ArduinoFrontendApplication extends FrontendApplication {
|
||||||
@ -16,12 +17,15 @@ export class ArduinoFrontendApplication extends FrontendApplication {
|
|||||||
@inject(ArduinoFrontendContribution)
|
@inject(ArduinoFrontendContribution)
|
||||||
protected readonly frontendContribution: ArduinoFrontendContribution;
|
protected readonly frontendContribution: ArduinoFrontendContribution;
|
||||||
|
|
||||||
|
@inject(EditorMode)
|
||||||
|
protected readonly editorMode: EditorMode;
|
||||||
|
|
||||||
protected async initializeLayout(): Promise<void> {
|
protected async initializeLayout(): Promise<void> {
|
||||||
super.initializeLayout().then(() => {
|
super.initializeLayout().then(() => {
|
||||||
// If not in PRO mode, we open the sketch file with all the related files.
|
// If not in PRO mode, we open the sketch file with all the related files.
|
||||||
// Otherwise, we reuse the workbench's restore functionality and we do not open anything at all.
|
// Otherwise, we reuse the workbench's restore functionality and we do not open anything at all.
|
||||||
// TODO: check `otherwise`. Also, what if we check for opened editors, instead of blindly opening them?
|
// TODO: check `otherwise`. Also, what if we check for opened editors, instead of blindly opening them?
|
||||||
if (!EditorMode.IN_PRO_MODE) {
|
if (!this.editorMode.proMode) {
|
||||||
this.workspaceService.roots.then(roots => {
|
this.workspaceService.roots.then(roots => {
|
||||||
for (const root of roots) {
|
for (const root of roots) {
|
||||||
this.fileSystem.exists(root.uri).then(exists => {
|
this.fileSystem.exists(root.uri).then(exists => {
|
||||||
|
@ -0,0 +1,18 @@
|
|||||||
|
import { injectable, inject } from 'inversify';
|
||||||
|
import { FrontendApplication } from '@theia/core/lib/browser/frontend-application';
|
||||||
|
import { FileNavigatorContribution } from '@theia/navigator/lib/browser/navigator-contribution';
|
||||||
|
import { EditorMode } from '../editor-mode';
|
||||||
|
|
||||||
|
@injectable()
|
||||||
|
export class ArduinoNavigatorContribution extends FileNavigatorContribution {
|
||||||
|
|
||||||
|
@inject(EditorMode)
|
||||||
|
protected readonly editorMode: EditorMode;
|
||||||
|
|
||||||
|
async initializeLayout(app: FrontendApplication): Promise<void> {
|
||||||
|
if (this.editorMode.proMode) {
|
||||||
|
return super.initializeLayout(app);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
import { injectable, inject } from 'inversify';
|
||||||
|
import { FrontendApplication } from '@theia/core/lib/browser/frontend-application';
|
||||||
|
import { OutlineViewContribution } from '@theia/outline-view/lib/browser/outline-view-contribution';
|
||||||
|
import { EditorMode } from '../editor-mode';
|
||||||
|
|
||||||
|
@injectable()
|
||||||
|
export class ArduinoOutlineViewContribution extends OutlineViewContribution {
|
||||||
|
|
||||||
|
@inject(EditorMode)
|
||||||
|
protected readonly editorMode: EditorMode;
|
||||||
|
|
||||||
|
async initializeLayout(app: FrontendApplication): Promise<void> {
|
||||||
|
if (this.editorMode.proMode) {
|
||||||
|
return super.initializeLayout(app);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -1,11 +1,18 @@
|
|||||||
import { OutputToolbarContribution } from '@theia/output/lib/browser/output-toolbar-contribution';
|
import { inject, injectable } from 'inversify';
|
||||||
import { TabBarToolbarRegistry } from '@theia/core/lib/browser/shell/tab-bar-toolbar';
|
import { TabBarToolbarRegistry } from '@theia/core/lib/browser/shell/tab-bar-toolbar';
|
||||||
import { injectable } from 'inversify';
|
import { OutputToolbarContribution } from '@theia/output/lib/browser/output-toolbar-contribution';
|
||||||
|
import { EditorMode } from '../editor-mode';
|
||||||
|
|
||||||
@injectable()
|
@injectable()
|
||||||
export class ArduinoOutputToolContribution extends OutputToolbarContribution {
|
export class ArduinoOutputToolContribution extends OutputToolbarContribution {
|
||||||
|
|
||||||
|
@inject(EditorMode)
|
||||||
|
protected readonly editorMode: EditorMode;
|
||||||
|
|
||||||
async registerToolbarItems(toolbarRegistry: TabBarToolbarRegistry): Promise<void> {
|
async registerToolbarItems(toolbarRegistry: TabBarToolbarRegistry): Promise<void> {
|
||||||
|
if (this.editorMode.proMode) {
|
||||||
|
super.registerToolbarItems(toolbarRegistry);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
import { inject, injectable } from 'inversify';
|
||||||
|
import { ProblemStat } from '@theia/markers/lib/browser/problem/problem-manager';
|
||||||
|
import { FrontendApplication } from '@theia/core/lib/browser/frontend-application';
|
||||||
|
import { ProblemContribution } from '@theia/markers/lib/browser/problem/problem-contribution';
|
||||||
|
import { EditorMode } from '../editor-mode';
|
||||||
|
|
||||||
|
@injectable()
|
||||||
|
export class ArduinoProblemContribution extends ProblemContribution {
|
||||||
|
|
||||||
|
@inject(EditorMode)
|
||||||
|
protected readonly editorMode: EditorMode;
|
||||||
|
|
||||||
|
async initializeLayout(app: FrontendApplication): Promise<void> {
|
||||||
|
if (this.editorMode.proMode) {
|
||||||
|
return super.initializeLayout(app);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected setStatusBarElement(problemStat: ProblemStat): void {
|
||||||
|
if (this.editorMode.proMode) {
|
||||||
|
super.setStatusBarElement(problemStat);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
import { inject, injectable } from 'inversify';
|
||||||
|
import { ScmContribution } from '@theia/scm/lib/browser/scm-contribution';
|
||||||
|
import { StatusBarEntry } from '@theia/core/lib/browser/status-bar/status-bar';
|
||||||
|
import { EditorMode } from '../editor-mode';
|
||||||
|
|
||||||
|
@injectable()
|
||||||
|
export class ArduinoScmContribution extends ScmContribution {
|
||||||
|
|
||||||
|
@inject(EditorMode)
|
||||||
|
protected readonly editorMode: EditorMode;
|
||||||
|
|
||||||
|
async initializeLayout(): Promise<void> {
|
||||||
|
if (this.editorMode.proMode) {
|
||||||
|
return super.initializeLayout();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected setStatusBarEntry(id: string, entry: StatusBarEntry): void {
|
||||||
|
if (this.editorMode.proMode) {
|
||||||
|
super.setStatusBarEntry(id, entry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
import { inject, injectable } from 'inversify';
|
||||||
|
import { FrontendApplication } from '@theia/core/lib/browser/frontend-application';
|
||||||
|
import { SearchInWorkspaceFrontendContribution } from '@theia/search-in-workspace/lib/browser/search-in-workspace-frontend-contribution';
|
||||||
|
import { EditorMode } from '../editor-mode';
|
||||||
|
|
||||||
|
@injectable()
|
||||||
|
export class ArduinoSearchInWorkspaceContribution extends SearchInWorkspaceFrontendContribution {
|
||||||
|
|
||||||
|
@inject(EditorMode)
|
||||||
|
protected readonly editorMode: EditorMode;
|
||||||
|
|
||||||
|
async initializeLayout(app: FrontendApplication): Promise<void> {
|
||||||
|
if (this.editorMode.proMode) {
|
||||||
|
return super.initializeLayout(app);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,18 +0,0 @@
|
|||||||
import { injectable, postConstruct } from 'inversify';
|
|
||||||
import { FileNavigatorContribution } from '@theia/navigator/lib/browser/navigator-contribution';
|
|
||||||
import { FrontendApplication } from '@theia/core/lib/browser';
|
|
||||||
|
|
||||||
@injectable()
|
|
||||||
export class SilentNavigatorContribution extends FileNavigatorContribution {
|
|
||||||
|
|
||||||
@postConstruct()
|
|
||||||
protected async init(): Promise<void> {
|
|
||||||
// @ts-ignore
|
|
||||||
delete this.toggleCommand; // The `Explorer` should not be accessible via command or keybinding.
|
|
||||||
return super.init();
|
|
||||||
}
|
|
||||||
|
|
||||||
async initializeLayout(app: FrontendApplication): Promise<void> {
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,12 +0,0 @@
|
|||||||
import { injectable } from 'inversify';
|
|
||||||
import { OutlineViewContribution } from '@theia/outline-view/lib/browser/outline-view-contribution';
|
|
||||||
import { FrontendApplication } from '@theia/core/lib/browser';
|
|
||||||
|
|
||||||
@injectable()
|
|
||||||
export class SilentOutlineViewContribution extends OutlineViewContribution {
|
|
||||||
|
|
||||||
async initializeLayout(app: FrontendApplication): Promise<void> {
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,15 +0,0 @@
|
|||||||
import { injectable } from 'inversify';
|
|
||||||
import { ProblemContribution } from '@theia/markers/lib/browser/problem/problem-contribution';
|
|
||||||
import { ProblemStat } from '@theia/markers/lib/browser/problem/problem-manager';
|
|
||||||
import { FrontendApplication } from '@theia/core/lib/browser';
|
|
||||||
|
|
||||||
@injectable()
|
|
||||||
export class SilentProblemContribution extends ProblemContribution {
|
|
||||||
|
|
||||||
async initializeLayout(app: FrontendApplication): Promise<void> {
|
|
||||||
}
|
|
||||||
|
|
||||||
protected setStatusBarElement(problemStat: ProblemStat) {
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,14 +0,0 @@
|
|||||||
import { injectable } from 'inversify';
|
|
||||||
import { ScmContribution } from '@theia/scm/lib/browser/scm-contribution';
|
|
||||||
import { StatusBarEntry } from '@theia/core/lib/browser';
|
|
||||||
|
|
||||||
@injectable()
|
|
||||||
export class SilentScmContribution extends ScmContribution {
|
|
||||||
|
|
||||||
async initializeLayout(): Promise<void> {
|
|
||||||
}
|
|
||||||
|
|
||||||
protected setStatusBarEntry(id: string, entry: StatusBarEntry): void {
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,11 +0,0 @@
|
|||||||
import { injectable } from 'inversify';
|
|
||||||
import { SearchInWorkspaceFrontendContribution } from '@theia/search-in-workspace/lib/browser/search-in-workspace-frontend-contribution';
|
|
||||||
import { FrontendApplication } from '@theia/core/lib/browser';
|
|
||||||
|
|
||||||
@injectable()
|
|
||||||
export class SilentSearchInWorkspaceContribution extends SearchInWorkspaceFrontendContribution {
|
|
||||||
|
|
||||||
async initializeLayout(app: FrontendApplication): Promise<void> {
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
50
arduino-ide-extension/src/browser/editor-mode.ts
Normal file
50
arduino-ide-extension/src/browser/editor-mode.ts
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
import { injectable } from 'inversify';
|
||||||
|
import { ApplicationShell, FrontendApplicationContribution, FrontendApplication } from '@theia/core/lib/browser';
|
||||||
|
import { ArduinoShellLayoutRestorer } from './shell/arduino-shell-layout-restorer';
|
||||||
|
import { OutputWidget } from '@theia/output/lib/browser/output-widget';
|
||||||
|
import { EditorWidget } from '@theia/editor/lib/browser';
|
||||||
|
|
||||||
|
@injectable()
|
||||||
|
export class EditorMode implements FrontendApplicationContribution {
|
||||||
|
|
||||||
|
protected app: FrontendApplication;
|
||||||
|
|
||||||
|
onStart(app: FrontendApplication): void {
|
||||||
|
this.app = app;
|
||||||
|
if (this.proMode) {
|
||||||
|
// We use this CSS class on the body to modify the visibility of the close button for the editors and views.
|
||||||
|
document.body.classList.add(EditorMode.PRO_MODE_KEY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
get proMode(): boolean {
|
||||||
|
const value = window.localStorage.getItem(EditorMode.PRO_MODE_KEY);
|
||||||
|
return value === 'true';
|
||||||
|
}
|
||||||
|
|
||||||
|
async toggle(): Promise<void> {
|
||||||
|
const oldState = this.proMode;
|
||||||
|
const inAdvancedMode = !oldState;
|
||||||
|
window.localStorage.setItem(EditorMode.PRO_MODE_KEY, String(inAdvancedMode));
|
||||||
|
if (!inAdvancedMode) {
|
||||||
|
const { shell } = this.app;
|
||||||
|
// Close all widget that is neither editor nor `Output`.
|
||||||
|
for (const area of ['left', 'right', 'bottom', 'main'] as Array<ApplicationShell.Area>) {
|
||||||
|
shell.closeTabs(area, ({ owner }) => !(owner instanceof EditorWidget || owner instanceof OutputWidget));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 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.
|
||||||
|
// XXX: hack instead of injecting the `ArduinoShellLayoutRestorer` we have to retrieve it from the
|
||||||
|
// application to avoid DI cycle.
|
||||||
|
const layoutRestorer = (this.app as any).layoutRestorer as ArduinoShellLayoutRestorer
|
||||||
|
await layoutRestorer.storeLayoutAsync(this.app);
|
||||||
|
window.location.reload(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
export namespace EditorMode {
|
||||||
|
export const PRO_MODE_KEY = 'arduino-advanced-mode';
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user