generalized which widgets are closeable.

instead of a whitelisting, we blacklist the files those belong to sketch

Signed-off-by: Akos Kitta <kittaakos@typefox.io>
This commit is contained in:
Akos Kitta 2020-08-01 16:05:32 +02:00
parent fc866464ad
commit 3d55aaa875
2 changed files with 31 additions and 21 deletions

View File

@ -2,10 +2,11 @@
import { injectable, inject } from 'inversify'; import { injectable, inject } from 'inversify';
import { EditorWidget } from '@theia/editor/lib/browser'; import { EditorWidget } from '@theia/editor/lib/browser';
import { CommandService } from '@theia/core/lib/common/command'; import { CommandService } from '@theia/core/lib/common/command';
import { PreferencesWidget } from '@theia/preferences/lib/browser/views/preference-widget';
import { ApplicationShell as TheiaApplicationShell, Widget } from '@theia/core/lib/browser'; import { ApplicationShell as TheiaApplicationShell, Widget } from '@theia/core/lib/browser';
import { Sketch } from '../../../common/protocol';
import { EditorMode } from '../../editor-mode'; import { EditorMode } from '../../editor-mode';
import { SaveAsSketch } from '../../contributions/save-as-sketch'; import { SaveAsSketch } from '../../contributions/save-as-sketch';
import { SketchesServiceClientImpl } from '../../../common/protocol/sketches-service-client-impl';
@injectable() @injectable()
export class ApplicationShell extends TheiaApplicationShell { export class ApplicationShell extends TheiaApplicationShell {
@ -16,25 +17,32 @@ export class ApplicationShell extends TheiaApplicationShell {
@inject(CommandService) @inject(CommandService)
protected readonly commandService: CommandService; protected readonly commandService: CommandService;
protected track(widget: Widget): void { @inject(SketchesServiceClientImpl)
super.track(widget); protected readonly sketchesServiceClient: SketchesServiceClientImpl;
if (!this.editorMode.proMode) {
if (widget instanceof EditorWidget) { protected sketch?: Sketch;
// Always allow closing the whitelisted files.
// TODO: It would be better to blacklist the sketch files only. async addWidget(widget: Widget, options: Readonly<TheiaApplicationShell.WidgetOptions> = {}): Promise<void> {
if (['tasks.json', // Get the current sketch before adding a widget. This wil trigger an update.
'launch.json', this.sketch = await this.sketchesServiceClient.currentSketch();
'settings.json', super.addWidget(widget, options);
'arduino-cli.yaml'].some(fileName => widget.editor.uri.toString().endsWith(fileName))) {
return;
} }
async setLayoutData(layoutData: TheiaApplicationShell.LayoutData): Promise<void> {
// I could not find other ways to get sketch in async fashion for sync `track`.
this.sketch = await this.sketchesServiceClient.currentSketch();
super.setLayoutData(layoutData);
} }
if (widget instanceof PreferencesWidget) {
return; track(widget: Widget): void {
} if (!this.editorMode.proMode && this.sketch && widget instanceof EditorWidget) {
if (Sketch.isInSketch(widget.editor.uri, this.sketch)) {
widget.title.closable = false; widget.title.closable = false;
} }
} }
super.track(widget);
}
async saveAll(): Promise<void> { async saveAll(): Promise<void> {
await super.saveAll(); await super.saveAll();

View File

@ -1,3 +1,5 @@
import URI from '@theia/core/lib/common/uri';
export const SketchesServicePath = '/services/sketches-service'; export const SketchesServicePath = '/services/sketches-service';
export const SketchesService = Symbol('SketchesService'); export const SketchesService = Symbol('SketchesService');
export interface SketchesService { export interface SketchesService {
@ -60,9 +62,9 @@ export namespace Sketch {
export const ADDITIONAL = ['.h', '.c', '.hpp', '.hh', '.cpp', '.s']; export const ADDITIONAL = ['.h', '.c', '.hpp', '.hh', '.cpp', '.s'];
export const ALL = Array.from(new Set([...MAIN, ...SOURCE, ...ADDITIONAL])); export const ALL = Array.from(new Set([...MAIN, ...SOURCE, ...ADDITIONAL]));
} }
export function isInSketch(uri: string, sketch: Sketch): boolean { export function isInSketch(uri: string | URI, sketch: Sketch): boolean {
const { mainFileUri, otherSketchFileUris, additionalFileUris } = sketch; const { mainFileUri, otherSketchFileUris, additionalFileUris } = sketch;
return [mainFileUri, ...otherSketchFileUris, additionalFileUris].indexOf(uri) !== -1; return [mainFileUri, ...otherSketchFileUris, additionalFileUris].indexOf(uri.toString()) !== -1;
} }
} }