123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- /* 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);
- }
- }
- }
- };
|