mirror of
https://github.com/arduino/arduino-ide.git
synced 2025-11-06 17:08:32 +00:00
Use customized `PanelLayout#removeWidget` and `PanelLayout#insertWidget` logic for the layout updates. The customized functions ensure no side effect if adding/removing the widget to/from the layout but it's already present/absent. Unlike the default [`PanelLayout#removeWidget`](9f5e11025b/packages/widgets/src/panellayout.ts (L154-L156)) behavior, do not try to remove the widget if it's not present (has a negative index). Otherwise, required widgets might be removed based on the default [`ArrayExt#removeAt`](9f5e11025b/packages/algorithm/src/array.ts (L1075-L1077)) behavior. Closes: arduino/arduino-ide#2354 Signed-off-by: Akos Kitta <a.kitta@arduino.cc>
57 lines
1.9 KiB
TypeScript
57 lines
1.9 KiB
TypeScript
import { codicon } from '@theia/core/lib/browser/widgets/widget';
|
|
import { Widget } from '@theia/core/shared/@phosphor/widgets';
|
|
import {
|
|
inject,
|
|
injectable,
|
|
postConstruct,
|
|
} from '@theia/core/shared/inversify';
|
|
import { DebugWidget as TheiaDebugWidget } from '@theia/debug/lib/browser/view/debug-widget';
|
|
import { DebugDisabledStatusMessageSource } from '../../contributions/debug';
|
|
import {
|
|
removeWidgetIfPresent,
|
|
unshiftWidgetIfNotPresent,
|
|
} from '../dialogs/widgets';
|
|
|
|
@injectable()
|
|
export class DebugWidget extends TheiaDebugWidget {
|
|
@inject(DebugDisabledStatusMessageSource)
|
|
private readonly debugStatusMessageSource: DebugDisabledStatusMessageSource;
|
|
|
|
private readonly statusMessageWidget = new Widget();
|
|
private readonly messageNode = document.createElement('div');
|
|
|
|
@postConstruct()
|
|
protected override init(): void {
|
|
super.init();
|
|
this.messageNode.classList.add('status-message', 'noselect');
|
|
this.statusMessageWidget.node.appendChild(this.messageNode);
|
|
this.updateState();
|
|
this.toDisposeOnDetach.pushAll([
|
|
this.debugStatusMessageSource.onDidChangeMessage((message) =>
|
|
this.updateState(message)
|
|
),
|
|
this.statusMessageWidget,
|
|
]);
|
|
}
|
|
|
|
private updateState(message = this.debugStatusMessageSource.message): void {
|
|
requestAnimationFrame(() => {
|
|
this.messageNode.textContent = message ?? '';
|
|
const enabled = !message;
|
|
updateVisibility(enabled, this.toolbar, this.sessionWidget);
|
|
if (enabled) {
|
|
removeWidgetIfPresent(this.layout, this.statusMessageWidget);
|
|
} else {
|
|
unshiftWidgetIfNotPresent(this.layout, this.statusMessageWidget);
|
|
}
|
|
this.title.iconClass = enabled ? codicon('debug-alt') : 'fa fa-ban'; // TODO: find a better icon?
|
|
});
|
|
}
|
|
}
|
|
|
|
function updateVisibility(visible: boolean, ...widgets: Widget[]): void {
|
|
widgets.forEach((widget) =>
|
|
visible ? widget.removeClass('hidden') : widget.addClass('hidden')
|
|
);
|
|
}
|