diff --git a/engine/src/tools/Cursor.js b/engine/src/tools/Cursor.js index 7114df12..a555fdf9 100644 --- a/engine/src/tools/Cursor.js +++ b/engine/src/tools/Cursor.js @@ -341,6 +341,12 @@ Wick.Tools.Cursor = class extends Wick.Tool { _getCursor() { if (!this.hitResult.item) { return this.CURSOR_DEFAULT; + } else if ( + (this.hitResult.item.data.parentItem + && this.hitResult.item.data.parentItem.data.handleType === 'gradient-stop') + || this.hitResult.item.data.handleType === 'gradient-point' + ) { + return this.CURSOR_GRAD; } else if (this.hitResult.item.data.isSelectionBoxGUI) { // Don't show any custom cursor if the mouse is over the border, the border does nothing if (this.hitResult.item.name === 'border') { diff --git a/src/Editor/Util/ColorPicker/ColorPicker.jsx b/src/Editor/Util/ColorPicker/ColorPicker.jsx index 28a5303a..9cb30d0e 100644 --- a/src/Editor/Util/ColorPicker/ColorPicker.jsx +++ b/src/Editor/Util/ColorPicker/ColorPicker.jsx @@ -87,29 +87,8 @@ export default function ColorPicker (props) { setLastObjects(props.selectedObjects); // Close pop-up if selection changed - if (open) toggle(); - } - - let color = props.color ? props.color : new window.Wick.Color("#FFFFFF") - let colorCSS = color; - let colorCSSOpaque = color; - if (color instanceof window.paper.Color) { - if (color.gradient) { - const sortedControlStops = color.gradient.stops.toSorted((objectA, objectB) => objectA.offset - objectB.offset); - - colorCSS = 'linear-gradient(to right'; - colorCSSOpaque = 'linear-gradient(to right'; - sortedControlStops.forEach(paperControlStop => { - colorCSS += `, ${paperControlStop.color.toCSS()} ${paperControlStop.offset * 100}%`; - let { red, green, blue } = paperControlStop.color; - colorCSSOpaque += `, rgb(${red*256},${green*256},${blue*256}) ${paperControlStop.offset * 100}%`; - }); - colorCSS += ')'; - colorCSSOpaque += ')'; - } - else { - colorCSS = color.toCSS(); - } + if (open) + toggle(); } let itemID = props.id; let popoverID = itemID+'-popover'; @@ -119,6 +98,7 @@ export default function ColorPicker (props) { setTimeout(selectPopover, 200); } if (!e || !data || !open) { + // Either `toggle()` was used, or no mouse-down data was needed setOpen(!open); return; } @@ -127,17 +107,37 @@ export default function ColorPicker (props) { // Don't close if clicked on selected objects let clickedCanvas = (e.touches ? e.target : data.downTarget) === props.targetCanvas; let selectionUnchanged = arraysEqual(props.selectedObjects, lastObjects); - if (!data.clickedPopover && !(clickedCanvas && selectionUnchanged)) { - setOpen(false) - } + if (!data.clickedPopover && !(clickedCanvas && selectionUnchanged)) + setOpen(false); } function selectPopover () { let ele = document.getElementById(popoverID); - if (ele) { + if (ele) ele.focus(); + } + + let color = props.color ? props.color : new window.Wick.Color("#FFFFFF") + let colorCSS = color; + let colorCSSOpaque = color; + if (color instanceof window.paper.Color) { + if (color.gradient) { + colorCSS = colorCSSOpaque = 'linear-gradient(to right'; + + const sortedControlStops = color.gradient.stops.toSorted((objectA, objectB) => objectA.offset - objectB.offset); + sortedControlStops.forEach(paperControlStop => { + colorCSS += `, ${paperControlStop.color.toCSS()} ${paperControlStop.offset * 100}%`; + let { red, green, blue } = paperControlStop.color; + colorCSSOpaque += `, rgb(${red*256},${green*256},${blue*256}) ${paperControlStop.offset * 100}%`; + }); + colorCSS += ')'; + colorCSSOpaque += ')'; } + else + colorCSS = color.toCSS(); } + // Bring desynced color state up, so if the solid-gradient state updates, the pop-up position updates + const [desyncedColor, setDesyncedColor] = useState(color); return (