Mypal/devtools/client/webaudioeditor/views/utils.js
2019-03-11 13:26:37 +03:00

104 lines
2.8 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";
/**
* Takes an element in an SVG graph and iterates over
* ancestors until it finds the graph node container. If not found,
* returns null.
*/
function findGraphNodeParent(el) {
// Some targets may not contain `classList` property
if (!el.classList)
return null;
while (!el.classList.contains("nodes")) {
if (el.classList.contains("audionode"))
return el;
else
el = el.parentNode;
}
return null;
}
/**
* Object for use with `mix` into a view.
* Must have the following properties defined on the view:
* - `el`
* - `button`
* - `_collapseString`
* - `_expandString`
* - `_toggleEvent`
*
* Optional properties on the view can be defined to specify default
* visibility options.
* - `_animated`
* - `_delayed`
*/
var ToggleMixin = {
bindToggle: function () {
this._onToggle = this._onToggle.bind(this);
this.button.addEventListener("mousedown", this._onToggle, false);
},
unbindToggle: function () {
this.button.removeEventListener("mousedown", this._onToggle);
},
show: function () {
this._viewController({ visible: true });
},
hide: function () {
this._viewController({ visible: false });
},
hideImmediately: function () {
this._viewController({ visible: false, delayed: false, animated: false });
},
/**
* Returns a boolean indicating whether or not the view.
* is currently being shown.
*/
isVisible: function () {
return !this.el.classList.contains("pane-collapsed");
},
/**
* Toggles the visibility of the view.
*
* @param object visible
* - visible: boolean indicating whether the panel should be shown or not
* - animated: boolean indiciating whether the pane should be animated
* - delayed: boolean indicating whether the pane's opening should wait
* a few cycles or not
*/
_viewController: function ({ visible, animated, delayed }) {
let flags = {
visible: visible,
animated: animated != null ? animated : !!this._animated,
delayed: delayed != null ? delayed : !!this._delayed,
callback: () => window.emit(this._toggleEvent, visible)
};
ViewHelpers.togglePane(flags, this.el);
if (flags.visible) {
this.button.classList.remove("pane-collapsed");
this.button.setAttribute("tooltiptext", this._collapseString);
}
else {
this.button.classList.add("pane-collapsed");
this.button.setAttribute("tooltiptext", this._expandString);
}
},
_onToggle: function () {
this._viewController({ visible: !this.isVisible() });
}
};