const PaletteBlock = (() => { // HTML elements let coloursList = document.getElementById("palette-list"); // PaletteBlock-specific data let currentSquareSize = coloursList.children[0].clientWidth; let blockData = {blockWidth: 300, blockHeight: 320, squareSize: 40}; let currentSelection = {startIndex:0, endIndex:0, startCoords:[], endCoords: [], name: "", colour: "", label: null}; // Making the palette list sortable new Sortable(document.getElementById("palette-list"), { animation: 100, onEnd: updateRampSelection }); // Listening for the palette block resize new ResizeObserver(updateSizeData).observe(coloursList.parentElement); Events.on("click", "pb-addcolours", addColours); Events.on("click", "pb-removecolours", removeColours); /** Listens for the mouse wheel, used to change the size of the squares in the palette list * */ coloursList.parentElement.addEventListener("wheel", function (mouseEvent) { // Only resize when pressing alt, used to distinguish between scrolling through the palette and // resizing it if (mouseEvent.altKey) { resizeSquares(mouseEvent); } }); // Initializes the palette block function init() { let simplePalette = document.getElementById("colors-menu"); let childCount = coloursList.childElementCount; currentSquareSize = coloursList.children[0].clientWidth; coloursList = document.getElementById("palette-list"); // Remove all the colours for (let i=0; i endIndex) { let tmp = startIndex; startIndex = endIndex; endIndex = tmp; } // If there is only 1 color in palette and user wants to remove it, do nothing if(coloursList.childElementCount == 1) { return; } // If user wants to remove all colors of palette, remove all colors except last one if(coloursList.childElementCount == endIndex-startIndex+1) { endIndex--; } for (let i=startIndex; i<=endIndex; i++) { coloursList.removeChild(coloursList.children[startIndex]); } clearBorders(); } /** Starts selecting a ramp. Saves the data needed to draw the outline. * * @param {*} mouseEvent */ function startRampSelection(mouseEvent) { if (mouseEvent.which == 3) { let index = getElementIndex(mouseEvent.target); isRampSelecting = true; currentSelection.startIndex = index; currentSelection.endIndex = index; currentSelection.startCoords = getColourCoordinates(index); currentSelection.endCoords = getColourCoordinates(index); } else if (mouseEvent.which == 1) { endRampSelection(mouseEvent); } } /** Updates the outline for the current selection. * * @param {*} mouseEvent */ function updateRampSelection(mouseEvent) { if (mouseEvent != null && mouseEvent.buttons == 2) { currentSelection.endIndex = getElementIndex(mouseEvent.target); } if (mouseEvent == null || mouseEvent.buttons == 2) { let startCoords = getColourCoordinates(currentSelection.startIndex); let endCoords = getColourCoordinates(currentSelection.endIndex); let startIndex = currentSelection.startIndex; let endIndex = currentSelection.endIndex; if (currentSelection.startIndex > endIndex) { let tmp = startIndex; startIndex = endIndex; endIndex = tmp; tmp = startCoords; startCoords = endCoords; endCoords = tmp; } clearBorders(); for (let i=startIndex; i<=endIndex; i++) { let currentSquare = coloursList.children[i]; let currentCoords = getColourCoordinates(i); let borderStyle = "3px solid white"; let bordersToSet = []; // Deciding which borders to use to make the outline if (i == 0 || i == startIndex) { bordersToSet.push("border-left"); } if (currentCoords[1] == startCoords[1] || ((currentCoords[1] == startCoords[1] + 1)) && currentCoords[0] < startCoords[0]) { bordersToSet.push("border-top"); } if (currentCoords[1] == endCoords[1] || ((currentCoords[1] == endCoords[1] - 1)) && currentCoords[0] > endCoords[0]) { bordersToSet.push("border-bottom"); } if ((i == coloursList.childElementCount - 1) || (currentCoords[0] == Math.floor(blockData.blockWidth / blockData.squareSize) - 1) || i == endIndex) { bordersToSet.push("border-right"); } if (bordersToSet != []) { currentSquare.style["box-sizing"] = "border-box"; for (let i=0; i 0 ? -5 : 5; currentSquareSize += amount; for (let i=0; i