blob: 86d799f783e03e1423cf293fb526b600da366ec8 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/* eslint-disable rulesdir/no_underscored_properties */
import * as Common from '../../core/common/common.js';
import * as i18n from '../../core/i18n/i18n.js';
import * as Platform from '../../core/platform/platform.js';
import * as UI from '../../ui/legacy/legacy.js';
import type * as Protocol from '../../generated/protocol.js';
const UIStrings = {
/**
*@description Text that shows there is no recording
*/
noRecordings: '(no recordings)',
/**
*@description Label prefix for an audio context selection
*@example {realtime (1e03ec)} PH1
*/
audioContextS: 'Audio context: {PH1}',
};
const str_ = i18n.i18n.registerUIStrings('panels/web_audio/AudioContextSelector.ts', UIStrings);
const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
export class AudioContextSelector extends Common.ObjectWrapper.ObjectWrapper implements
UI.SoftDropDown.Delegate<Protocol.WebAudio.BaseAudioContext> {
_placeholderText: Platform.UIString.LocalizedString;
_items: UI.ListModel.ListModel<Protocol.WebAudio.BaseAudioContext>;
_dropDown: UI.SoftDropDown.SoftDropDown<Protocol.WebAudio.BaseAudioContext>;
_toolbarItem: UI.Toolbar.ToolbarItem;
_selectedContext: Protocol.WebAudio.BaseAudioContext|null;
constructor() {
super();
this._placeholderText = i18nString(UIStrings.noRecordings);
this._items = new UI.ListModel.ListModel();
this._dropDown = new UI.SoftDropDown.SoftDropDown(this._items, this);
this._dropDown.setPlaceholderText(this._placeholderText);
this._toolbarItem = new UI.Toolbar.ToolbarItem(this._dropDown.element);
this._toolbarItem.setEnabled(false);
this._toolbarItem.setTitle(i18nString(UIStrings.audioContextS, {PH1: this._placeholderText}));
this._items.addEventListener(UI.ListModel.Events.ItemsReplaced, this._onListItemReplaced, this);
this._toolbarItem.element.classList.add('toolbar-has-dropdown');
this._selectedContext = null;
}
_onListItemReplaced(): void {
const hasItems = Boolean(this._items.length);
this._toolbarItem.setEnabled(hasItems);
if (!hasItems) {
this._toolbarItem.setTitle(i18nString(UIStrings.audioContextS, {PH1: this._placeholderText}));
}
}
contextCreated(event: Common.EventTarget.EventTargetEvent): void {
const context = (event.data as Protocol.WebAudio.BaseAudioContext);
this._items.insert(this._items.length, context);
// Select if this is the first item.
if (this._items.length === 1) {
this._dropDown.selectItem(context);
}
}
contextDestroyed(event: Common.EventTarget.EventTargetEvent): void {
const contextId = (event.data as string);
const contextIndex = this._items.findIndex(
(context: Protocol.WebAudio.BaseAudioContext): boolean => context.contextId === contextId);
if (contextIndex > -1) {
this._items.remove(contextIndex);
}
}
contextChanged(event: Common.EventTarget.EventTargetEvent): void {
const changedContext = (event.data as Protocol.WebAudio.BaseAudioContext);
const contextIndex = this._items.findIndex(
(context: Protocol.WebAudio.BaseAudioContext): boolean => context.contextId === changedContext.contextId);
if (contextIndex > -1) {
this._items.replace(contextIndex, changedContext);
// If the changed context is currently selected by user. Re-select it
// because the actual element is replaced with a new one.
if (this._selectedContext && this._selectedContext.contextId === changedContext.contextId) {
this._dropDown.selectItem(changedContext);
}
}
}
createElementForItem(item: Protocol.WebAudio.BaseAudioContext): Element {
const element = document.createElement('div');
const shadowRoot = UI.Utils.createShadowRootWithCoreStyles(
element,
{cssFile: 'panels/web_audio/audioContextSelector.css', enableLegacyPatching: false, delegatesFocus: undefined});
const title = shadowRoot.createChild('div', 'title');
UI.UIUtils.createTextChild(title, Platform.StringUtilities.trimEndWithMaxLength(this.titleFor(item), 100));
return element;
}
selectedContext(): Protocol.WebAudio.BaseAudioContext|null {
if (!this._selectedContext) {
return null;
}
return this._selectedContext;
}
highlightedItemChanged(
from: Protocol.WebAudio.BaseAudioContext|null, to: Protocol.WebAudio.BaseAudioContext|null,
fromElement: Element|null, toElement: Element|null): void {
if (fromElement) {
fromElement.classList.remove('highlighted');
}
if (toElement) {
toElement.classList.add('highlighted');
}
}
isItemSelectable(_item: Protocol.WebAudio.BaseAudioContext): boolean {
return true;
}
itemSelected(item: Protocol.WebAudio.BaseAudioContext|null): void {
if (!item) {
return;
}
// It's possible that no context is selected yet.
if (!this._selectedContext || this._selectedContext.contextId !== item.contextId) {
this._selectedContext = item;
this._toolbarItem.setTitle(i18nString(UIStrings.audioContextS, {PH1: this.titleFor(item)}));
}
this.dispatchEventToListeners(Events.ContextSelected, item);
}
reset(): void {
this._items.replaceAll([]);
}
titleFor(context: Protocol.WebAudio.BaseAudioContext): string {
return `${context.contextType} (${context.contextId.substr(-6)})`;
}
toolbarItem(): UI.Toolbar.ToolbarItem {
return this._toolbarItem;
}
}
export const enum Events {
ContextSelected = 'ContextSelected',
}