summaryrefslogtreecommitdiffstats
path: root/devtools/client/shared/widgets/tooltip/SwatchLinearEasingFunctionTooltip.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/shared/widgets/tooltip/SwatchLinearEasingFunctionTooltip.js')
-rw-r--r--devtools/client/shared/widgets/tooltip/SwatchLinearEasingFunctionTooltip.js97
1 files changed, 97 insertions, 0 deletions
diff --git a/devtools/client/shared/widgets/tooltip/SwatchLinearEasingFunctionTooltip.js b/devtools/client/shared/widgets/tooltip/SwatchLinearEasingFunctionTooltip.js
new file mode 100644
index 0000000000..371bbd79fc
--- /dev/null
+++ b/devtools/client/shared/widgets/tooltip/SwatchLinearEasingFunctionTooltip.js
@@ -0,0 +1,97 @@
+/* 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";
+
+const {
+ LinearEasingFunctionWidget,
+} = require("devtools/client/shared/widgets/LinearEasingFunctionWidget");
+const SwatchBasedEditorTooltip = require("devtools/client/shared/widgets/tooltip/SwatchBasedEditorTooltip");
+
+const XHTML_NS = "http://www.w3.org/1999/xhtml";
+
+/**
+ * The swatch linear-easing-function tooltip class is a specific class meant to be used
+ * along with rule-view's generated linear-easing-function swatches.
+ * It extends the parent SwatchBasedEditorTooltip class.
+ * It just wraps a standard Tooltip and sets its content with an instance of a
+ * LinearEasingFunctionWidget.
+ *
+ * @param {Document} document
+ * The document to attach the SwatchLinearEasingFunctionTooltip. This is either the toolbox
+ * document if the tooltip is a popup tooltip or the panel's document if it is an
+ * inline editor.
+ */
+
+class SwatchLinearEasingFunctionTooltip extends SwatchBasedEditorTooltip {
+ constructor(document) {
+ super(document);
+
+ this.onWidgetUpdated = this.onWidgetUpdated.bind(this);
+
+ // Creating a linear-easing-function instance.
+ // this.widget will always be a promise that resolves to the widget instance
+ this.widget = this.createWidget();
+ }
+
+ /**
+ * Fill the tooltip with a new instance of the linear-easing-function widget
+ * initialized with the given value, and return a promise that resolves to
+ * the instance of the widget
+ */
+
+ async createWidget() {
+ const { doc } = this.tooltip;
+ this.tooltip.panel.innerHTML = "";
+
+ const container = doc.createElementNS(XHTML_NS, "div");
+ container.className = "linear-easing-function-container";
+
+ this.tooltip.panel.appendChild(container);
+ this.tooltip.setContentSize({ width: 400, height: 400 });
+
+ await this.tooltip.once("shown");
+ return new LinearEasingFunctionWidget(container);
+ }
+
+ /**
+ * Overriding the SwatchBasedEditorTooltip.show function to set the linear function line
+ * in the widget
+ */
+ async show() {
+ // Call the parent class' show function
+ await super.show();
+ // Then set the line and listen to changes to preview them
+ if (this.activeSwatch) {
+ this.ruleViewCurrentLinearValueElement = this.activeSwatch.nextSibling;
+ this.widget.then(widget => {
+ widget.off("updated", this.onWidgetUpdated);
+ widget.setCssLinearValue(this.activeSwatch.getAttribute("data-linear"));
+ widget.on("updated", this.onWidgetUpdated);
+ this.emit("ready");
+ });
+ }
+ }
+
+ onWidgetUpdated(newValue) {
+ if (!this.activeSwatch) {
+ return;
+ }
+
+ this.ruleViewCurrentLinearValueElement.textContent = newValue;
+ this.activeSwatch.setAttribute("data-linear", newValue);
+ this.preview(newValue);
+ }
+
+ destroy() {
+ super.destroy();
+ this.currentFunctionText = null;
+ this.widget.then(widget => {
+ widget.off("updated", this.onWidgetUpdated);
+ widget.destroy();
+ });
+ }
+}
+
+module.exports = SwatchLinearEasingFunctionTooltip;