Files
arduino-ide/arduino-ide-extension/src/browser/theia/debug/debug-widget.ts
Akos Kitta ca779e5cf2 fix: debug widget layout updates
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>
2024-02-08 14:17:10 +01:00

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')
);
}