104 lines
2.8 KiB
JavaScript
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() });
|
|
}
|
|
};
|