blob: 4ddfdb20b1884b76cb75de35b6a9ba0798caa64f [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.
/**
* @implements {UI.SoftDropDown.Delegate<!Protocol.WebAudio.BaseAudioContext>}
*/
export class AudioContextSelector extends Common.Object {
constructor() {
super();
/** @type {string} */
this._placeholderText = ls`(no recordings)`;
/** @type {!UI.ListModel<!Protocol.WebAudio.BaseAudioContext>} */
this._items = new UI.ListModel();
/** @type {!UI.SoftDropDown<!Protocol.WebAudio.BaseAudioContext>} */
this._dropDown = new UI.SoftDropDown(this._items, this);
this._dropDown.setPlaceholderText(this._placeholderText);
this._toolbarItem = new UI.ToolbarItem(this._dropDown.element);
this._toolbarItem.setEnabled(false);
this._toolbarItem.setTitle(ls`Audio context: ${this._placeholderText}`);
this._items.addEventListener(UI.ListModel.Events.ItemsReplaced, this._onListItemReplaced, this);
this._toolbarItem.element.classList.add('toolbar-has-dropdown');
/** @type {?Protocol.WebAudio.BaseAudioContext} */
this._selectedContext = null;
}
_onListItemReplaced() {
const hasItems = !!this._items.length;
this._toolbarItem.setEnabled(hasItems);
if (!hasItems) {
this._toolbarItem.setTitle(ls`Audio context: ${this._placeholderText}`);
}
}
/**
* @param {!Common.Event} event
*/
contextCreated(event) {
const context = /** @type {!Protocol.WebAudio.BaseAudioContext} */ (event.data);
this._items.insert(this._items.length, context);
// Select if this is the first item.
if (this._items.length === 1) {
this._dropDown.selectItem(context);
}
}
/**
* @param {!Common.Event} event
*/
contextDestroyed(event) {
const contextId = /** @type {!Protocol.WebAudio.GraphObjectId} */ (event.data);
const contextIndex = this._items.findIndex(context => context.contextId === contextId);
if (contextIndex > -1) {
this._items.remove(contextIndex);
}
}
/**
* @param {!Common.Event} event
*/
contextChanged(event) {
const changedContext = /** @type {!Protocol.WebAudio.BaseAudioContext} */ (event.data);
const contextIndex = this._items.findIndex(context => 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);
}
}
}
/**
* @override
* @param {!Protocol.WebAudio.BaseAudioContext} item
* @return {!Element}
*/
createElementForItem(item) {
const element = createElementWithClass('div');
const shadowRoot = UI.createShadowRootWithCoreStyles(element, 'web_audio/audioContextSelector.css');
const title = shadowRoot.createChild('div', 'title');
title.createTextChild(this.titleFor(item).trimEndWithMaxLength(100));
return element;
}
/**
* @return {?Protocol.WebAudio.BaseAudioContext}
*/
selectedContext() {
if (!this._selectedContext) {
return null;
}
return this._selectedContext;
}
/**
* @override
* @param {?Protocol.WebAudio.BaseAudioContext} from
* @param {?Protocol.WebAudio.BaseAudioContext} to
* @param {?Element} fromElement
* @param {?Element} toElement
*/
highlightedItemChanged(from, to, fromElement, toElement) {
if (fromElement) {
fromElement.classList.remove('highlighted');
}
if (toElement) {
toElement.classList.add('highlighted');
}
}
/**
* @override
* @param {!Protocol.WebAudio.BaseAudioContext} item
* @return {boolean}
*/
isItemSelectable(item) {
return true;
}
/**
* @override
* @param {?Protocol.WebAudio.BaseAudioContext} item
*/
itemSelected(item) {
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(ls`Audio context: ${this.titleFor(item)}`);
}
this.dispatchEventToListeners(WebAudio.AudioContextSelector.Events.ContextSelected, item);
}
reset() {
this._items.replaceAll([]);
}
/**
* @override
* @param {!Protocol.WebAudio.BaseAudioContext} context
* @return {string}
*/
titleFor(context) {
return `${context.contextType} (${context.contextId.substr(-6)})`;
}
/**
* @return {!UI.ToolbarItem}
*/
toolbarItem() {
return this._toolbarItem;
}
}
/** @enum {symbol} */
export const Events = {
ContextSelected: Symbol('ContextSelected')
};
/* Legacy exported object */
self.WebAudio = self.WebAudio || {};
/* Legacy exported object */
WebAudio = WebAudio || {};
/**
* @constructor
*/
WebAudio.AudioContextSelector = AudioContextSelector;
/** @enum {symbol} */
WebAudio.AudioContextSelector.Events = Events;