Make color picker work for both fill and stroke colors

This commit is contained in:
Skyler Lehmkuhl 2024-12-16 18:30:06 -05:00
parent 5a705a65b3
commit 555cf65a9a
2 changed files with 40 additions and 37 deletions

View File

@ -3153,30 +3153,29 @@ function toolbar() {
let strokeColor = document.createElement("div") let strokeColor = document.createElement("div")
fillColor.className = "color-field" fillColor.className = "color-field"
strokeColor.className = "color-field" strokeColor.className = "color-field"
fillColor.style.setProperty('--color', "#ff0000"); fillColor.setColor = (color) => {
strokeColor.style.setProperty('--color', "#000000"); fillColor.style.setProperty('--color', color)
fillColor.color = color
context.fillStyle = color
}
strokeColor.setColor = (color) => {
strokeColor.style.setProperty('--color', color)
strokeColor.color = color
context.strokeStyle = color
}
fillColor.setColor("#ff0000");
strokeColor.setColor("#000000");
fillColor.style.setProperty('--label-text', `"Fill color:"`)
strokeColor.style.setProperty('--label-text', `"Stroke color:"`)
fillColor.type="color" fillColor.type="color"
fillColor.value = "#ff0000" fillColor.value = "#ff0000"
strokeColor.value = "#000000" strokeColor.value = "#000000"
context.fillStyle = fillColor.value
context.strokeStyle = strokeColor.value
let evtListener; let evtListener;
let padding = 10 let padding = 10
let gradwidth = 25 let gradwidth = 25
let ccwidth = 300 let ccwidth = 300
let mainSize = ccwidth - (3*padding + gradwidth) let mainSize = ccwidth - (3*padding + gradwidth)
fillColor.addEventListener('click', e => { let colorClickHandler = (e) => {
// Coloris({
// el: ".color-field",
// selectInput: true,
// focusInput: true,
// theme: 'default',
// swatches: context.swatches,
// defaultColor: '#ff0000',
// onChange: (color) => {
// context.fillStyle = color;
// }
// })
let colorCvs = document.querySelector("#color-cvs") let colorCvs = document.querySelector("#color-cvs")
if (colorCvs==null) { if (colorCvs==null) {
console.log('creating new one') console.log('creating new one')
@ -3196,6 +3195,7 @@ function toolbar() {
colorCvs.draw = function() { colorCvs.draw = function() {
const darkMode = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches; const darkMode = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
let ctx = colorCvs.getContext('2d') let ctx = colorCvs.getContext('2d')
ctx.lineWidth = 2;
if (darkMode) { if (darkMode) {
ctx.fillStyle = "#333" ctx.fillStyle = "#333"
} else { } else {
@ -3205,7 +3205,7 @@ function toolbar() {
// draw current color // draw current color
drawCheckerboardBackground(ctx, padding, padding, colorCvs.width - 2*padding, 50, 10) drawCheckerboardBackground(ctx, padding, padding, colorCvs.width - 2*padding, 50, 10)
ctx.fillStyle = colorCvs.currentColor //TODO ctx.fillStyle = colorCvs.currentColor
ctx.fillRect(padding,padding,colorCvs.width-2*padding, 50) ctx.fillRect(padding,padding,colorCvs.width-2*padding, 50)
// Draw main gradient // Draw main gradient
@ -3223,6 +3223,7 @@ function toolbar() {
data[i+3] = 255; data[i+3] = 255;
} }
ctx.putImageData(mainGradient, padding, 2*padding + 50) ctx.putImageData(mainGradient, padding, 2*padding + 50)
// draw pointer
ctx.beginPath() ctx.beginPath()
ctx.arc(s*mainSize + padding, (1-v)*mainSize + 2*padding + 50, 3, 0, 2*Math.PI) ctx.arc(s*mainSize + padding, (1-v)*mainSize + 2*padding + 50, 3, 0, 2*Math.PI)
ctx.strokeStyle = "white" ctx.strokeStyle = "white"
@ -3241,12 +3242,24 @@ function toolbar() {
data[i+3] = 255; data[i+3] = 255;
} }
ctx.putImageData(hueGradient, padding, 3*padding + 50 + mainSize) ctx.putImageData(hueGradient, padding, 3*padding + 50 + mainSize)
// draw pointer
ctx.beginPath()
ctx.rect(h * mainSize + padding - 2, 3*padding + 50 + mainSize, 4, gradwidth)
ctx.strokeStyle = "white"
ctx.stroke()
drawCheckerboardBackground(ctx, colorCvs.width - (padding + gradwidth), 2*padding+50, gradwidth, mainSize, 10) drawCheckerboardBackground(ctx, colorCvs.width - (padding + gradwidth), 2*padding+50, gradwidth, mainSize, 10)
const gradient = ctx.createLinearGradient(0, 2*padding+50, 0, 2*padding+50+mainSize); // Vertical gradient const gradient = ctx.createLinearGradient(0, 2*padding+50, 0, 2*padding+50+mainSize); // Vertical gradient
gradient.addColorStop(0, `${colorCvs.currentColor.slice(0,7)}ff`); // Full color at the top gradient.addColorStop(0, `${colorCvs.currentColor.slice(0,7)}ff`); // Full color at the top
gradient.addColorStop(1, `${colorCvs.currentColor.slice(0,7)}00`) gradient.addColorStop(1, `${colorCvs.currentColor.slice(0,7)}00`)
ctx.fillStyle = gradient ctx.fillStyle = gradient
ctx.fillRect(colorCvs.width - (padding + gradwidth), 2*padding+50, gradwidth, mainSize) ctx.fillRect(colorCvs.width - (padding + gradwidth), 2*padding+50, gradwidth, mainSize)
let alpha = parseInt(colorCvs.currentColor.slice(7,9) || 'ff', 16) / 255;
// draw pointer
ctx.beginPath()
ctx.rect(colorCvs.width - (padding + gradwidth), 2*padding+50 + (1-alpha) * mainSize - 2, gradwidth, 4)
ctx.strokeStyle = "white"
ctx.stroke()
} }
colorCvs.addEventListener('mousedown', (e) => { colorCvs.addEventListener('mousedown', (e) => {
colorCvs.clickedMainGradient = false colorCvs.clickedMainGradient = false
@ -3281,7 +3294,7 @@ function toolbar() {
colorCvs.currentColor = `${colorCvs.currentColor.slice(0,7)}${alpha}` colorCvs.currentColor = `${colorCvs.currentColor.slice(0,7)}${alpha}`
colorCvs.clickedAlphaGradient = true colorCvs.clickedAlphaGradient = true
} }
fillColor.style.setProperty('--color', colorCvs.currentColor); colorCvs.colorEl.setColor(colorCvs.currentColor);
colorCvs.draw() colorCvs.draw()
}) })
@ -3321,7 +3334,7 @@ function toolbar() {
colorCvs.draw() colorCvs.draw()
} }
console.log(colorCvs.currentColor) console.log(colorCvs.currentColor)
fillColor.style.setProperty('--color', colorCvs.currentColor); colorCvs.colorEl.setColor(colorCvs.currentColor);
}) })
// Get mouse coordinates relative to the viewport // Get mouse coordinates relative to the viewport
const mouseX = e.clientX + window.scrollX; const mouseX = e.clientX + window.scrollX;
@ -3358,22 +3371,13 @@ function toolbar() {
colorCvs.style.left = `${left}px`; colorCvs.style.left = `${left}px`;
colorCvs.style.top = `${top}px`; colorCvs.style.top = `${top}px`;
colorCvs.colorEl = e.target
colorCvs.currentColor = e.target.color
colorCvs.draw() colorCvs.draw()
e.preventDefault() e.preventDefault()
}) }
strokeColor.addEventListener('click', e => { fillColor.addEventListener('click', colorClickHandler)
// Coloris({ strokeColor.addEventListener('click', colorClickHandler)
// el: ".color-field",
// selectInput: true,
// focusInput: true,
// theme: 'default',
// swatches: context.swatches,
// defaultColor: '#000000',
// onChange: (color) => {
// context.strokeStyle = color;
// }
// })
})
// Fill and stroke colors use the same set of swatches // Fill and stroke colors use the same set of swatches
fillColor.addEventListener("change", e => { fillColor.addEventListener("change", e => {
context.swatches.unshift(fillColor.value) context.swatches.unshift(fillColor.value)
@ -3548,7 +3552,6 @@ function splitPane(div, percent, horiz, newPane=undefined) {
event.currentTarget.setAttribute("dragging", false) event.currentTarget.setAttribute("dragging", false)
// event.currentTarget.style.userSelect = 'auto'; // event.currentTarget.style.userSelect = 'auto';
}) })
// Coloris({el: ".color-field"})
updateAll() updateAll()
updateUI() updateUI()
updateLayers() updateLayers()

View File

@ -286,10 +286,11 @@ button {
width: 100%; width: 100%;
height: calc(2 * var(--lineheight)); height: calc(2 * var(--lineheight));
--color: red; /* CSS variable for the pseudo-element color */ --color: red; /* CSS variable for the pseudo-element color */
--label-text: "Color:"; /* CSS variable for the label text */
} }
.color-field::before { .color-field::before {
content: "Color:"; content: var(--label-text);;
font-size: 16px; font-size: 16px;
color: black; color: black;
margin-right: 10px; margin-right: 10px;
@ -303,8 +304,7 @@ button {
background: background:
linear-gradient(to right, var(--color), var(--color)), linear-gradient(to right, var(--color), var(--color)),
repeating-conic-gradient(#B0B0B0 0% 25%, #E0E0E0 0% 50%) repeating-conic-gradient(#B0B0B0 0% 25%, #E0E0E0 0% 50%)
50% / 20px 20px, 50% / 20px 20px;
linear-gradient(to right, white, white);
} }
.clr-field button { .clr-field button {