Skip to content

Commit 6a956af

Browse files
committed
Added toolbar to top panel.
Signed-off-by: jbicker <jan.bicker@typefox.io>
1 parent 4c3becd commit 6a956af

File tree

5 files changed

+98
-12
lines changed

5 files changed

+98
-12
lines changed

arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx

+16-10
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ import { WorkspaceRootUriAwareCommandHandler } from '@theia/workspace/lib/browse
1919
import { SelectionService } from '@theia/core';
2020
import { WorkspaceService } from '@theia/workspace/lib/browser/workspace-service';
2121
import { SketchFactory } from './sketch-factory';
22+
import { ArduinoToolbar } from './toolbar/arduino-toolbar';
23+
import { EditorManager } from '@theia/editor/lib/browser';
2224

2325
@injectable()
2426
export class ArduinoFrontendContribution extends DefaultFrontendApplicationContribution implements TabBarToolbarContribution, CommandContribution {
@@ -56,6 +58,8 @@ export class ArduinoFrontendContribution extends DefaultFrontendApplicationContr
5658
@inject(SketchFactory)
5759
protected readonly sketchFactory: SketchFactory;
5860

61+
@inject(EditorManager)
62+
protected readonly editorManager: EditorManager;
5963

6064
@postConstruct()
6165
protected async init(): Promise<void> {
@@ -86,15 +90,16 @@ export class ArduinoFrontendContribution extends DefaultFrontendApplicationContr
8690
quickPickService={this.quickPickService}
8791
onNoBoardsInstalled={this.onNoBoardsInstalled.bind(this)}
8892
onUnknownBoard={this.onUnknownBoard.bind(this)} />,
89-
isVisible: widget => this.isArduinoEditor(widget)
93+
isVisible: widget => this.isArduinoToolbar(widget)
9094
})
9195
}
9296

9397
registerCommands(registry: CommandRegistry): void {
9498
registry.registerCommand(ArduinoCommands.VERIFY, {
95-
isVisible: widget => this.isArduinoEditor(widget),
96-
isEnabled: widget => this.isArduinoEditor(widget),
97-
execute: async widget => {
99+
isVisible: widget => this.isArduinoToolbar(widget),
100+
isEnabled: widget => this.isArduinoToolbar(widget),
101+
execute: async () => {
102+
const widget = this.editorManager.currentEditor;
98103
if (widget instanceof EditorWidget) {
99104
await widget.saveable.save();
100105
}
@@ -112,9 +117,10 @@ export class ArduinoFrontendContribution extends DefaultFrontendApplicationContr
112117
}
113118
});
114119
registry.registerCommand(ArduinoCommands.UPLOAD, {
115-
isVisible: widget => this.isArduinoEditor(widget),
116-
isEnabled: widget => this.isArduinoEditor(widget),
117-
execute: async widget => {
120+
isVisible: widget => this.isArduinoToolbar(widget),
121+
isEnabled: widget => this.isArduinoToolbar(widget),
122+
execute: async () => {
123+
const widget = this.editorManager.currentEditor;
118124
if (widget instanceof EditorWidget) {
119125
await widget.saveable.save();
120126
}
@@ -170,9 +176,9 @@ export class ArduinoFrontendContribution extends DefaultFrontendApplicationContr
170176
this.boardsListWidgetFrontendContribution.openView({reveal: true});
171177
}
172178

173-
private isArduinoEditor(maybeEditorWidget: any): boolean {
174-
if (maybeEditorWidget instanceof EditorWidget) {
175-
return maybeEditorWidget.editor.uri.toString().endsWith('.ino');
179+
private isArduinoToolbar(maybeToolbarWidget: any): boolean {
180+
if (maybeToolbarWidget instanceof ArduinoToolbar) {
181+
return true;
176182
}
177183
return false;
178184
}

arduino-ide-extension/src/browser/arduino-frontend-module.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ import { SilentOutlineViewContribution } from './customization/silent-outline-co
3434
import { ProblemContribution } from '@theia/markers/lib/browser/problem/problem-contribution';
3535
import { SilentProblemContribution } from './customization/silent-problem-contribution';
3636
import { SilentNavigatorContribution } from './customization/silent-navigator-contribution';
37-
import {FileNavigatorContribution} from '@theia/navigator/lib/browser/navigator-contribution';
37+
import { FileNavigatorContribution } from '@theia/navigator/lib/browser/navigator-contribution';
38+
import { ArduinoToolbarContribution } from './toolbar/arduino-toolbar-contribution';
3839

3940
export default new ContainerModule((bind: interfaces.Bind, unbind: interfaces.Unbind, isBound: interfaces.IsBound, rebind: interfaces.Rebind) => {
4041
// Commands and toolbar items
@@ -43,6 +44,9 @@ export default new ContainerModule((bind: interfaces.Bind, unbind: interfaces.Un
4344
bind(TabBarToolbarContribution).toService(ArduinoFrontendContribution);
4445
bind(MenuContribution).to(ArduinoFileMenuContribution).inSingletonScope();
4546

47+
bind(ArduinoToolbarContribution).toSelf().inSingletonScope();
48+
bind(FrontendApplicationContribution).toService(ArduinoToolbarContribution);
49+
4650
// `ino` TextMate grammar
4751
bind(LanguageGrammarDefinitionContribution).to(ArduinoLanguageGrammarContribution).inSingletonScope();
4852

arduino-ide-extension/src/browser/style/main.css

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@
88

99
#outputView {
1010
color: var(--theia-ui-font-color3);
11-
}
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { FrontendApplicationContribution, FrontendApplication } from "@theia/core/lib/browser";
2+
import { injectable, inject } from "inversify";
3+
import { ArduinoToolbar } from "./arduino-toolbar";
4+
import { TabBarToolbarRegistry, TabBarToolbarFactory, TabBarToolbar } from "@theia/core/lib/browser/shell/tab-bar-toolbar";
5+
6+
@injectable()
7+
export class ArduinoToolbarContribution implements FrontendApplicationContribution {
8+
9+
protected toolbarWidget: ArduinoToolbar;
10+
11+
constructor(
12+
@inject(TabBarToolbarRegistry) protected tabBarToolBarRegistry: TabBarToolbarRegistry,
13+
@inject(TabBarToolbarFactory) protected tabBarToolBarFactory: () => TabBarToolbar) {
14+
this.toolbarWidget = new ArduinoToolbar(this.tabBarToolBarRegistry, this.tabBarToolBarFactory);
15+
}
16+
17+
onStart(app: FrontendApplication) {
18+
app.shell.addWidget(this.toolbarWidget, {
19+
area: 'top'
20+
})
21+
}
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { Widget } from '@phosphor/widgets';
2+
import { Message } from '@phosphor/messaging';
3+
import { TabBarToolbar, TabBarToolbarRegistry } from '@theia/core/lib/browser/shell/tab-bar-toolbar';
4+
5+
export class ArduinoToolbar extends Widget {
6+
7+
protected toolbar: TabBarToolbar | undefined;
8+
9+
constructor(
10+
protected readonly tabBarToolbarRegistry: TabBarToolbarRegistry,
11+
protected readonly tabBarToolbarFactory: () => TabBarToolbar
12+
) {
13+
super();
14+
this.id = 'arduino-toolbar';
15+
this.init();
16+
this.tabBarToolbarRegistry.onDidChange(() => this.update());
17+
}
18+
19+
protected onAfterAttach(msg: Message): void {
20+
if (this.toolbar) {
21+
if (this.toolbar.isAttached) {
22+
Widget.detach(this.toolbar);
23+
}
24+
Widget.attach(this.toolbar, this.node);
25+
}
26+
super.onAfterAttach(msg);
27+
}
28+
29+
protected onBeforeDetach(msg: Message): void {
30+
if (this.toolbar && this.toolbar.isAttached) {
31+
Widget.detach(this.toolbar);
32+
}
33+
super.onBeforeDetach(msg);
34+
}
35+
36+
protected onUpdateRequest(msg: Message): void {
37+
super.onUpdateRequest(msg);
38+
this.updateToolbar();
39+
}
40+
41+
protected updateToolbar(): void {
42+
if (!this.toolbar) {
43+
return;
44+
}
45+
const items = this ? this.tabBarToolbarRegistry.visibleItems(this) : [];
46+
this.toolbar.updateItems(items, this);
47+
}
48+
49+
protected init(): void {
50+
this.node.classList.add('theia-arduino-toolbar');
51+
this.toolbar = this.tabBarToolbarFactory();
52+
this.update();
53+
}
54+
}

0 commit comments

Comments
 (0)