Index: Source/devtools/front_end/elements/Spectrum.js |
diff --git a/Source/devtools/front_end/elements/Spectrum.js b/Source/devtools/front_end/elements/Spectrum.js |
index f7bd36fb9fd6c50c45e9862cc53dcdb5357fe672..083c394c4d4038449fc0dd211fa986da395caf58 100644 |
--- a/Source/devtools/front_end/elements/Spectrum.js |
+++ b/Source/devtools/front_end/elements/Spectrum.js |
@@ -102,26 +102,27 @@ WebInspector.Spectrum = function() |
WebInspector.installDragHandle(this._alphaElement, dragStart.bind(this, positionAlpha.bind(this)), positionAlpha.bind(this), null, "default"); |
WebInspector.installDragHandle(this._colorElement, dragStart.bind(this, positionColor.bind(this)), positionColor.bind(this), null, "default"); |
- if (Runtime.experiments.isEnabled("colorPalettes")) { |
- this.element.classList.add("palettes-enabled"); |
- /** @type {!Map.<string, !WebInspector.Spectrum.Palette>} */ |
- this._palettes = new Map(); |
- this._palettePanel = this.contentElement.createChild("div", "palette-panel"); |
- this._palettePanelShowing = false; |
- this._paletteContainer = this.contentElement.createChild("div", "spectrum-palette"); |
- var paletteSwitcher = this.contentElement.createChild("div", "spectrum-palette-switcher spectrum-switcher"); |
- appendSwitcherIcon(paletteSwitcher); |
- paletteSwitcher.addEventListener("click", this._togglePalettePanel.bind(this, true)); |
- var overlay = this.contentElement.createChild("div", "spectrum-overlay fill"); |
- overlay.addEventListener("click", this._togglePalettePanel.bind(this, false)); |
- |
- this._addColorToolbar = new WebInspector.Toolbar(); |
- var addColorButton = new WebInspector.ToolbarButton(WebInspector.UIString("Add to palette"), "add-toolbar-item"); |
- addColorButton.addEventListener("click", this._addColorToCustomPalette.bind(this)); |
- this._addColorToolbar.appendToolbarItem(addColorButton); |
- |
- new WebInspector.Spectrum.PaletteGenerator(this._generatedPaletteLoaded.bind(this)); |
- } |
+ this.element.classList.add("palettes-enabled"); |
+ /** @type {!Map.<string, !WebInspector.Spectrum.Palette>} */ |
+ this._palettes = new Map(); |
+ this._palettePanel = this.contentElement.createChild("div", "palette-panel"); |
+ this._palettePanelShowing = false; |
+ this._paletteContainer = this.contentElement.createChild("div", "spectrum-palette"); |
+ this._paletteContainer.addEventListener("contextmenu", this._showPaletteColorContextMenu.bind(this, -1)); |
+ WebInspector.installDragHandle(this._paletteContainer, this._paletteDragStart.bind(this), this._paletteDrag.bind(this), this._paletteDragEnd.bind(this), "default"); |
+ var paletteSwitcher = this.contentElement.createChild("div", "spectrum-palette-switcher spectrum-switcher"); |
+ appendSwitcherIcon(paletteSwitcher); |
+ paletteSwitcher.addEventListener("click", this._togglePalettePanel.bind(this, true)); |
+ var overlay = this.contentElement.createChild("div", "spectrum-overlay fill"); |
+ overlay.addEventListener("click", this._togglePalettePanel.bind(this, false)); |
+ |
+ this._addColorToolbar = new WebInspector.Toolbar(); |
+ this._addColorToolbar.element.classList.add("add-color-toolbar"); |
+ var addColorButton = new WebInspector.ToolbarButton(WebInspector.UIString("Add to palette"), "add-toolbar-item"); |
+ addColorButton.addEventListener("click", this._addColorToCustomPalette.bind(this)); |
+ this._addColorToolbar.appendToolbarItem(addColorButton); |
+ |
+ new WebInspector.Spectrum.PaletteGenerator(this._generatedPaletteLoaded.bind(this)); |
/** |
* @param {function(!Event)} callback |
@@ -187,6 +188,9 @@ WebInspector.Spectrum.Events = { |
SizeChanged: "SizeChanged" |
}; |
+WebInspector.Spectrum._colorChipSize = 24; |
+WebInspector.Spectrum._itemsPerPaletteRow = 8; |
+ |
WebInspector.Spectrum.prototype = { |
_updatePalettePanel: function() |
{ |
@@ -240,20 +244,26 @@ WebInspector.Spectrum.prototype = { |
for (var i = 0; i < palette.colors.length; i++) { |
var animationDelay = animate ? i * 100 / palette.colors.length : 0; |
var colorElement = this._createPaletteColor(palette.colors[i], animationDelay); |
- colorElement.addEventListener("click", this._paletteColorSelected.bind(this, palette.colors[i])); |
- if (palette.mutable) |
+ colorElement.addEventListener("mousedown", this._paletteColorSelected.bind(this, palette.colors[i])); |
+ if (palette.mutable) { |
+ colorElement.__mutable = true; |
+ colorElement.__color = palette.colors[i]; |
colorElement.addEventListener("contextmenu", this._showPaletteColorContextMenu.bind(this, i)); |
+ } |
this._paletteContainer.appendChild(colorElement); |
} |
+ this._paletteContainerMutable = palette.mutable; |
var numItems = palette.colors.length; |
if (palette.mutable) |
numItems++; |
- var rowsNeeded = Math.max(1, Math.ceil(numItems / 8)); |
- for (var i = 0; palette.mutable && i < rowsNeeded * 8 - numItems; i++) |
+ var rowsNeeded = Math.max(1, Math.ceil(numItems / WebInspector.Spectrum._itemsPerPaletteRow)); |
+ for (var i = 0; palette.mutable && i < rowsNeeded * WebInspector.Spectrum._itemsPerPaletteRow - numItems; i++) |
this._paletteContainer.createChild("div", "spectrum-palette-color empty-color"); |
if (palette.mutable) |
- this._paletteContainer.appendChild(this._addColorToolbar.element); |
+ this.contentElement.appendChild(this._addColorToolbar.element); |
+ else |
+ this._addColorToolbar.element.remove(); |
this._togglePalettePanel(false); |
var paletteColorHeight = 12; |
@@ -263,6 +273,76 @@ WebInspector.Spectrum.prototype = { |
}, |
/** |
+ * @param {!Event} e |
+ * @return {number} |
+ */ |
+ _slotIndexForEvent: function(e) |
+ { |
+ var localX = e.pageX - this._paletteContainer.totalOffsetLeft(); |
+ var localY = e.pageY - this._paletteContainer.totalOffsetTop(); |
+ var col = Math.min(localX / WebInspector.Spectrum._colorChipSize | 0, WebInspector.Spectrum._itemsPerPaletteRow - 1); |
+ var row = (localY / WebInspector.Spectrum._colorChipSize) | 0; |
+ return Math.min(row * WebInspector.Spectrum._itemsPerPaletteRow + col, this._paletteContainer.children.length - 1); |
+ }, |
+ |
+ /** |
+ * @param {!Event} e |
+ * @return {boolean} |
+ */ |
+ _paletteDragStart: function(e) |
+ { |
+ var element = e.deepElementFromPoint(); |
+ if (!element.__mutable) |
+ return false; |
+ |
+ var index = this._slotIndexForEvent(e); |
+ this._dragElement = element; |
+ this._dragHotSpotX = e.pageX - (index % WebInspector.Spectrum._itemsPerPaletteRow) * WebInspector.Spectrum._colorChipSize; |
+ this._dragHotSpotY = e.pageY - (index / WebInspector.Spectrum._itemsPerPaletteRow | 0) * WebInspector.Spectrum._colorChipSize; |
+ return true; |
+ }, |
+ |
+ /** |
+ * @param {!Event} e |
+ */ |
+ _paletteDrag: function(e) |
+ { |
+ if (e.pageX < this._paletteContainer.totalOffsetLeft() || e.pageY < this._paletteContainer.totalOffsetTop()) |
+ return; |
+ var newIndex = this._slotIndexForEvent(e); |
+ var offsetX = e.pageX - (newIndex % WebInspector.Spectrum._itemsPerPaletteRow) * WebInspector.Spectrum._colorChipSize; |
+ var offsetY = e.pageY - (newIndex / WebInspector.Spectrum._itemsPerPaletteRow | 0) * WebInspector.Spectrum._colorChipSize; |
+ |
+ this._dragElement.style.position = "relative"; |
+ this._dragElement.style.left = (offsetX - this._dragHotSpotX) + "px"; |
+ this._dragElement.style.top = (offsetY - this._dragHotSpotY) + "px"; |
+ var children = Array.prototype.slice.call(this._paletteContainer.children); |
+ var index = children.indexOf(this._dragElement); |
+ if (index !== newIndex) |
+ this._paletteContainer.insertBefore(this._dragElement, children[newIndex > index ? newIndex + 1 : newIndex]); |
+ }, |
+ |
+ /** |
+ * @param {!Event} e |
+ */ |
+ _paletteDragEnd: function(e) |
+ { |
+ this._dragElement.style.removeProperty("position"); |
+ this._dragElement.style.removeProperty("left"); |
+ this._dragElement.style.removeProperty("top"); |
+ var children = this._paletteContainer.children; |
+ var colors = []; |
+ for (var i = 0; i < children.length; ++i) { |
+ if (children[i].__color) |
+ colors.push(children[i].__color); |
+ } |
+ var palette = this._customPaletteSetting.get(); |
+ palette.colors = colors; |
+ this._customPaletteSetting.set(palette); |
+ this._showPalette(this._customPaletteSetting.get(), false); |
+ }, |
+ |
+ /** |
* @param {!WebInspector.Spectrum.Palette} generatedPalette |
*/ |
_generatedPaletteLoaded: function(generatedPalette) |
@@ -334,22 +414,28 @@ WebInspector.Spectrum.prototype = { |
*/ |
_showPaletteColorContextMenu: function(colorIndex, event) |
{ |
+ if (!this._paletteContainerMutable) |
+ return; |
var contextMenu = new WebInspector.ContextMenu(event); |
- contextMenu.appendItem(WebInspector.UIString("Remove color"), this._deletePaletteColor.bind(this, colorIndex)); |
- contextMenu.appendItem(WebInspector.UIString("Clear palette"), this._deletePaletteColor.bind(this, undefined)); |
+ if (colorIndex !== -1) { |
+ contextMenu.appendItem(WebInspector.UIString("Remove color"), this._deletePaletteColors.bind(this, colorIndex, false)); |
+ contextMenu.appendItem(WebInspector.UIString("Remove all to the right"), this._deletePaletteColors.bind(this, colorIndex, true)); |
+ } |
+ contextMenu.appendItem(WebInspector.UIString("Clear palette"), this._deletePaletteColors.bind(this, -1, true)); |
contextMenu.show(); |
}, |
/** |
- * @param {number=} colorIndex |
+ * @param {number} colorIndex |
+ * @param {boolean} toRight |
*/ |
- _deletePaletteColor: function(colorIndex) |
+ _deletePaletteColors: function(colorIndex, toRight) |
{ |
var palette = this._customPaletteSetting.get(); |
- if (colorIndex !== undefined) |
- palette.colors.splice(colorIndex, 1); |
+ if (toRight) |
+ palette.colors.splice(colorIndex + 1, palette.colors.length - colorIndex - 1); |
else |
- palette.colors = []; |
+ palette.colors.splice(colorIndex, 1); |
this._customPaletteSetting.set(palette); |
this._showPalette(this._customPaletteSetting.get(), false); |
}, |