| Index: third_party/WebKit/Source/devtools/front_end/ui/CSSShadowEditor.js
|
| diff --git a/third_party/WebKit/Source/devtools/front_end/ui/CSSShadowEditor.js b/third_party/WebKit/Source/devtools/front_end/ui/CSSShadowEditor.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f6c52635affdea46b2c5758404ff54a8f943ac53
|
| --- /dev/null
|
| +++ b/third_party/WebKit/Source/devtools/front_end/ui/CSSShadowEditor.js
|
| @@ -0,0 +1,212 @@
|
| +// Copyright 2016 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +/**
|
| + * @constructor
|
| + * @extends {WebInspector.VBox}
|
| + */
|
| +WebInspector.CSSShadowEditor = function()
|
| +{
|
| + WebInspector.VBox.call(this, true);
|
| + this.registerRequiredCSS("ui/cssShadowEditor.css");
|
| + this.contentElement.tabIndex = 0;
|
| +
|
| + this._typeField = this.contentElement.createChild("div", "shadow-editor-field");
|
| + this._typeField.createChild("label", "shadow-editor-label").textContent = WebInspector.UIString("Type");
|
| + this._outsetButton = this._typeField.createChild("button", "shadow-editor-button-left");
|
| + this._outsetButton.textContent = WebInspector.UIString("Outset");
|
| + this._outsetButton.addEventListener("click", this._onButtonClick.bind(this), false);
|
| + this._insetButton = this._typeField.createChild("button", "shadow-editor-button-right");
|
| + this._insetButton.textContent = WebInspector.UIString("Inset");
|
| + this._insetButton.addEventListener("click", this._onButtonClick.bind(this), false);
|
| +
|
| + var inputs;
|
| + inputs = this._createSliderField(WebInspector.UIString("X offset"), true);
|
| + this._xInput = inputs.textInput;
|
| + this._xSlider = inputs.rangeInput;
|
| + inputs = this._createSliderField(WebInspector.UIString("Y offset"), true);
|
| + this._yInput = inputs.textInput;
|
| + this._ySlider = inputs.rangeInput;
|
| + inputs = this._createSliderField(WebInspector.UIString("Blur"), false);
|
| + this._blurInput = inputs.textInput;
|
| + this._blurSlider = inputs.rangeInput;
|
| + inputs = this._createSliderField(WebInspector.UIString("Spread"), false);
|
| + this._spreadInput = inputs.textInput;
|
| + this._spreadSlider = inputs.rangeInput;
|
| + this._spreadField = inputs.field;
|
| +}
|
| +
|
| +/** @enum {symbol} */
|
| +WebInspector.CSSShadowEditor.Events = {
|
| + ShadowChanged: Symbol("ShadowChanged")
|
| +}
|
| +
|
| +/** @type {number} */
|
| +WebInspector.CSSShadowEditor.maxRange = 40;
|
| +/** @type {string} */
|
| +WebInspector.CSSShadowEditor.defaultUnit = "px";
|
| +
|
| +WebInspector.CSSShadowEditor.prototype = {
|
| + /**
|
| + * @param {string} propertyName
|
| + * @param {boolean} negativeAllowed
|
| + * @return {{textInput: !Element, rangeInput: !Element, field: !Element}}
|
| + */
|
| + _createSliderField: function(propertyName, negativeAllowed)
|
| + {
|
| + var field = this.contentElement.createChild("div", "shadow-editor-field");
|
| + var label = field.createChild("label", "shadow-editor-label");
|
| + label.textContent = propertyName;
|
| + label.setAttribute("for", propertyName);
|
| + var textInput = field.createChild("input", "shadow-editor-text-input");
|
| + textInput.type = "text";
|
| + textInput.id = propertyName;
|
| + textInput.addEventListener("input", this._onTextInput.bind(this), false);
|
| + textInput.addEventListener("blur", this._onTextBlur.bind(this), false);
|
| + var halfRange = WebInspector.CSSShadowEditor.maxRange / 2;
|
| + var slider = negativeAllowed ? createSliderLabel(-halfRange, halfRange) : createSliderLabel(0, WebInspector.CSSShadowEditor.maxRange);
|
| + slider.addEventListener("input", this._onSliderInput.bind(this), false);
|
| + field.appendChild(slider);
|
| + return {field: field, textInput: textInput, rangeInput: slider};
|
| + },
|
| +
|
| + /**
|
| + * @override
|
| + */
|
| + wasShown: function()
|
| + {
|
| + this._updateUI();
|
| + },
|
| +
|
| + /**
|
| + * @param {!WebInspector.CSSShadowModel} model
|
| + */
|
| + setModel: function(model)
|
| + {
|
| + this._model = model;
|
| + this._typeField.hidden = !model.isBoxShadow();
|
| + this._spreadField.hidden = !model.isBoxShadow();
|
| + this._updateUI();
|
| + },
|
| +
|
| + _updateUI: function()
|
| + {
|
| + this._updateButtons();
|
| + this._xInput.value = this._model.offsetX().asCSSText();
|
| + this._yInput.value = this._model.offsetY().asCSSText();
|
| + this._blurInput.value = this._model.blurRadius().asCSSText();
|
| + this._spreadInput.value = this._model.spreadRadius().asCSSText();
|
| + this._xSlider.value = this._model.offsetX().amount;
|
| + this._ySlider.value = this._model.offsetY().amount;
|
| + this._blurSlider.value = this._model.blurRadius().amount;
|
| + this._spreadSlider.value = this._model.spreadRadius().amount;
|
| + },
|
| +
|
| + _updateButtons: function()
|
| + {
|
| + this._insetButton.classList.toggle("enabled", this._model.inset());
|
| + this._outsetButton.classList.toggle("enabled", !this._model.inset());
|
| + },
|
| +
|
| + /**
|
| + * @param {!Event} event
|
| + */
|
| + _onButtonClick: function(event)
|
| + {
|
| + var insetClicked = (event.currentTarget === this._insetButton);
|
| + if (insetClicked && this._model.inset() || !insetClicked && !this._model.inset())
|
| + return;
|
| + this._model.setInset(insetClicked);
|
| + this._updateButtons();
|
| + this.dispatchEventToListeners(WebInspector.CSSShadowEditor.Events.ShadowChanged, this._model);
|
| + },
|
| +
|
| + /**
|
| + * @param {!Event} event
|
| + */
|
| + _onTextInput: function(event)
|
| + {
|
| + this._changedElement = event.currentTarget;
|
| + this._changedElement.classList.toggle("invalid", false);
|
| + var length = WebInspector.CSSLength.parse(event.currentTarget.value);
|
| + if (!length || event.currentTarget === this._blurInput && length.amount < 0)
|
| + return;
|
| + if (event.currentTarget === this._xInput) {
|
| + this._model.setOffsetX(length);
|
| + this._xSlider.value = length.amount;
|
| + } else if (event.currentTarget === this._yInput) {
|
| + this._model.setOffsetY(length);
|
| + this._ySlider.value = length.amount;
|
| + } else if (event.currentTarget === this._blurInput) {
|
| + this._model.setBlurRadius(length);
|
| + this._blurSlider.value = length.amount;
|
| + } else if (event.currentTarget === this._spreadInput) {
|
| + this._model.setSpreadRadius(length);
|
| + this._spreadSlider.value = length.amount;
|
| + }
|
| + this.dispatchEventToListeners(WebInspector.CSSShadowEditor.Events.ShadowChanged, this._model);
|
| + },
|
| +
|
| + _onTextBlur: function()
|
| + {
|
| + if (!this._changedElement)
|
| + return;
|
| + var length = !this._changedElement.value ? WebInspector.CSSLength.zero() : WebInspector.CSSLength.parse(this._changedElement.value);
|
| + if (!length)
|
| + length = WebInspector.CSSLength.parse(this._changedElement.value + WebInspector.CSSShadowEditor.defaultUnit);
|
| + if (!length) {
|
| + this._changedElement.classList.add("invalid");
|
| + this._changedElement = null;
|
| + return;
|
| + }
|
| + if (this._changedElement === this._xInput) {
|
| + this._model.setOffsetX(length);
|
| + this._xInput.value = length.asCSSText();
|
| + this._xSlider.value = length.amount;
|
| + } else if (this._changedElement === this._yInput) {
|
| + this._model.setOffsetY(length);
|
| + this._yInput.value = length.asCSSText();
|
| + this._ySlider.value = length.amount;
|
| + } else if (this._changedElement === this._blurInput) {
|
| + if (length.amount < 0)
|
| + length = WebInspector.CSSLength.zero();
|
| + this._model.setBlurRadius(length);
|
| + this._blurInput.value = length.asCSSText();
|
| + this._blurSlider.value = length.amount;
|
| + } else if (this._changedElement === this._spreadInput) {
|
| + this._model.setSpreadRadius(length);
|
| + this._spreadInput.value = length.asCSSText();
|
| + this._spreadSlider.value = length.amount;
|
| + }
|
| + this._changedElement = null;
|
| + this.dispatchEventToListeners(WebInspector.CSSShadowEditor.Events.ShadowChanged, this._model);
|
| + },
|
| +
|
| + /**
|
| + * @param {!Event} event
|
| + */
|
| + _onSliderInput: function(event)
|
| + {
|
| + if (event.currentTarget === this._xSlider) {
|
| + this._model.setOffsetX(new WebInspector.CSSLength(this._xSlider.value, this._model.offsetX().unit || WebInspector.CSSShadowEditor.defaultUnit));
|
| + this._xInput.value = this._model.offsetX().asCSSText();
|
| + this._xInput.classList.toggle("invalid", false);
|
| + } else if (event.currentTarget === this._ySlider) {
|
| + this._model.setOffsetY(new WebInspector.CSSLength(this._ySlider.value, this._model.offsetY().unit || WebInspector.CSSShadowEditor.defaultUnit));
|
| + this._yInput.value = this._model.offsetY().asCSSText();
|
| + this._yInput.classList.toggle("invalid", false);
|
| + } else if (event.currentTarget === this._blurSlider) {
|
| + this._model.setBlurRadius(new WebInspector.CSSLength(this._blurSlider.value, this._model.blurRadius().unit || WebInspector.CSSShadowEditor.defaultUnit));
|
| + this._blurInput.value = this._model.blurRadius().asCSSText();
|
| + this._blurInput.classList.toggle("invalid", false);
|
| + } else if (event.currentTarget === this._spreadSlider) {
|
| + this._model.setSpreadRadius(new WebInspector.CSSLength(this._spreadSlider.value, this._model.spreadRadius().unit || WebInspector.CSSShadowEditor.defaultUnit));
|
| + this._spreadInput.value = this._model.spreadRadius().asCSSText();
|
| + this._spreadInput.classList.toggle("invalid", false);
|
| + }
|
| + this.dispatchEventToListeners(WebInspector.CSSShadowEditor.Events.ShadowChanged, this._model);
|
| + },
|
| +
|
| + __proto__: WebInspector.VBox.prototype
|
| +}
|
|
|