190 lines
5.4 KiB
JavaScript
190 lines
5.4 KiB
JavaScript
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
"use strict";
|
|
|
|
/* import-globals-from ../includes.js */
|
|
|
|
const MIN_INSPECTOR_WIDTH = 300;
|
|
|
|
// Strings for rendering
|
|
const EXPAND_INSPECTOR_STRING = L10N.getStr("expandInspector");
|
|
const COLLAPSE_INSPECTOR_STRING = L10N.getStr("collapseInspector");
|
|
|
|
/**
|
|
* Functions handling the audio node inspector UI.
|
|
*/
|
|
|
|
var InspectorView = {
|
|
_currentNode: null,
|
|
|
|
// Set up config for view toggling
|
|
_collapseString: COLLAPSE_INSPECTOR_STRING,
|
|
_expandString: EXPAND_INSPECTOR_STRING,
|
|
_toggleEvent: EVENTS.UI_INSPECTOR_TOGGLED,
|
|
_animated: true,
|
|
_delayed: true,
|
|
|
|
/**
|
|
* Initialization function called when the tool starts up.
|
|
*/
|
|
initialize: function () {
|
|
// Set up view controller
|
|
this.el = $("#web-audio-inspector");
|
|
this.splitter = $("#inspector-splitter");
|
|
this.el.setAttribute("width", Services.prefs.getIntPref("devtools.webaudioeditor.inspectorWidth"));
|
|
this.button = $("#inspector-pane-toggle");
|
|
mixin(this, ToggleMixin);
|
|
this.bindToggle();
|
|
|
|
// Hide inspector view on startup
|
|
this.hideImmediately();
|
|
|
|
this._onNodeSelect = this._onNodeSelect.bind(this);
|
|
this._onDestroyNode = this._onDestroyNode.bind(this);
|
|
this._onResize = this._onResize.bind(this);
|
|
this._onCommandClick = this._onCommandClick.bind(this);
|
|
|
|
this.splitter.addEventListener("mouseup", this._onResize);
|
|
for (let $el of $$("#audio-node-toolbar toolbarbutton")) {
|
|
$el.addEventListener("command", this._onCommandClick);
|
|
}
|
|
window.on(EVENTS.UI_SELECT_NODE, this._onNodeSelect);
|
|
gAudioNodes.on("remove", this._onDestroyNode);
|
|
},
|
|
|
|
/**
|
|
* Destruction function called when the tool cleans up.
|
|
*/
|
|
destroy: function () {
|
|
this.unbindToggle();
|
|
this.splitter.removeEventListener("mouseup", this._onResize);
|
|
|
|
$("#audio-node-toolbar toolbarbutton").removeEventListener("command", this._onCommandClick);
|
|
for (let $el of $$("#audio-node-toolbar toolbarbutton")) {
|
|
$el.removeEventListener("command", this._onCommandClick);
|
|
}
|
|
window.off(EVENTS.UI_SELECT_NODE, this._onNodeSelect);
|
|
gAudioNodes.off("remove", this._onDestroyNode);
|
|
|
|
this.el = null;
|
|
this.button = null;
|
|
this.splitter = null;
|
|
},
|
|
|
|
/**
|
|
* Takes a AudioNodeView `node` and sets it as the current
|
|
* node and scaffolds the inspector view based off of the new node.
|
|
*/
|
|
setCurrentAudioNode: Task.async(function* (node) {
|
|
this._currentNode = node || null;
|
|
|
|
// If no node selected, set the inspector back to "no AudioNode selected"
|
|
// view.
|
|
if (!node) {
|
|
$("#web-audio-editor-details-pane-empty").removeAttribute("hidden");
|
|
$("#web-audio-editor-tabs").setAttribute("hidden", "true");
|
|
window.emit(EVENTS.UI_INSPECTOR_NODE_SET, null);
|
|
}
|
|
// Otherwise load up the tabs view and hide the empty placeholder
|
|
else {
|
|
$("#web-audio-editor-details-pane-empty").setAttribute("hidden", "true");
|
|
$("#web-audio-editor-tabs").removeAttribute("hidden");
|
|
this._buildToolbar();
|
|
window.emit(EVENTS.UI_INSPECTOR_NODE_SET, this._currentNode.id);
|
|
}
|
|
}),
|
|
|
|
/**
|
|
* Returns the current AudioNodeView.
|
|
*/
|
|
getCurrentAudioNode: function () {
|
|
return this._currentNode;
|
|
},
|
|
|
|
/**
|
|
* Empties out the props view.
|
|
*/
|
|
resetUI: function () {
|
|
// Set current node to empty to load empty view
|
|
this.setCurrentAudioNode();
|
|
|
|
// Reset AudioNode inspector and hide
|
|
this.hideImmediately();
|
|
},
|
|
|
|
_buildToolbar: function () {
|
|
let node = this.getCurrentAudioNode();
|
|
|
|
let bypassable = node.bypassable;
|
|
let bypassed = node.isBypassed();
|
|
let button = $("#audio-node-toolbar .bypass");
|
|
|
|
if (!bypassable) {
|
|
button.setAttribute("disabled", true);
|
|
} else {
|
|
button.removeAttribute("disabled");
|
|
}
|
|
|
|
if (!bypassable || bypassed) {
|
|
button.removeAttribute("checked");
|
|
} else {
|
|
button.setAttribute("checked", true);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Event handlers
|
|
*/
|
|
|
|
/**
|
|
* Called on EVENTS.UI_SELECT_NODE, and takes an actorID `id`
|
|
* and calls `setCurrentAudioNode` to scaffold the inspector view.
|
|
*/
|
|
_onNodeSelect: function (_, id) {
|
|
this.setCurrentAudioNode(gAudioNodes.get(id));
|
|
|
|
// Ensure inspector is visible when selecting a new node
|
|
this.show();
|
|
},
|
|
|
|
_onResize: function () {
|
|
if (this.el.getAttribute("width") < MIN_INSPECTOR_WIDTH) {
|
|
this.el.setAttribute("width", MIN_INSPECTOR_WIDTH);
|
|
}
|
|
Services.prefs.setIntPref("devtools.webaudioeditor.inspectorWidth", this.el.getAttribute("width"));
|
|
window.emit(EVENTS.UI_INSPECTOR_RESIZE);
|
|
},
|
|
|
|
/**
|
|
* Called when `DESTROY_NODE` is fired to remove the node from props view if
|
|
* it's currently selected.
|
|
*/
|
|
_onDestroyNode: function (node) {
|
|
if (this._currentNode && this._currentNode.id === node.id) {
|
|
this.setCurrentAudioNode(null);
|
|
}
|
|
},
|
|
|
|
_onCommandClick: function (e) {
|
|
let node = this.getCurrentAudioNode();
|
|
let button = e.target;
|
|
let command = button.getAttribute("data-command");
|
|
let checked = button.getAttribute("checked");
|
|
|
|
if (button.getAttribute("disabled")) {
|
|
return;
|
|
}
|
|
|
|
if (command === "bypass") {
|
|
if (checked) {
|
|
button.removeAttribute("checked");
|
|
node.bypass(true);
|
|
} else {
|
|
button.setAttribute("checked", true);
|
|
node.bypass(false);
|
|
}
|
|
}
|
|
}
|
|
};
|