Skip to content
Snippets Groups Projects
tool-selection.js 2.77 KiB
Newer Older
  • Learn to ignore specific revisions
  • import * as HTML from "./elements.js"
    
    export const Tools = Object.freeze({
      PEN: Symbol("pen"),
      ERASER: Symbol("eraser"),
    })
    
    let tool = Tools.PEN
    let strokeColour = "#0000ff"
    let strokeRadius = 5
    // TODO: The erase radius should also be selectable.
    
    
    export const getTool = () => tool
    export const getStrokeColour = () => strokeColour
    export const getStrokeRadius = () => strokeRadius
    export const getEraseRadius = () => ERASE_RADIUS
    
    const showElement = (element) => {
      element.style.display = "block"
    }
    
    const hideElement = (element) => {
      element.style.display = "none"
    }
    
    HTML.penButton.addEventListener("click", () => {
      if (tool == Tools.PEN) {
        showElement(HTML.penProperties)
      } else {
        tool = Tools.PEN
        HTML.penButton.classList.add("selected")
        HTML.eraserButton.classList.remove("selected")
      }
    })
    
    HTML.eraserButton.addEventListener("click", () => {
      tool = Tools.ERASER
      HTML.penButton.classList.remove("selected")
      HTML.eraserButton.classList.add("selected")
    })
    
    HTML.picker.addEventListener("change", () => {
      const paletteColour = event.target.value
      HTML.rectangle.style.backgroundColor = paletteColour
      HTML.labelColours.style.backgroundColor = paletteColour
      strokeColour = paletteColour
    })
    
    HTML.slider.oninput = function() {
      HTML.output.innerHTML = this.value
    
      strokeRadius = this.value / 2
    
    }
    
    HTML.output.innerHTML = HTML.slider.value
    
    
    // If the page has been refreshed
    if (performance.navigation.type == 1) {
      const sliderValue = parseInt(HTML.output.innerHTML)
      HTML.slider.setAttribute("value", sliderValue)
      strokeRadius = sliderValue / 2
    }
    
    
    const x = window.matchMedia(
      "only screen and (orientation: landscape) and (max-width: 600px)",
    )
    x.addListener(() => {
      if (x.matches) {
        HTML.wheel.setAttribute("viewBox", "-50 10 200 100")
        HTML.palette.setAttribute("style", "padding-top: 50px")
      } else {
        HTML.wheel.setAttribute("viewBox", "0 10 100 100")
      }
    })
    
    HTML.closeButton.forEach((element) => {
      element.addEventListener("click", () => {
        hideElement(element.parentNode.parentNode.parentNode)
      })
    })
    
    window.addEventListener("click", (event) => {
      if (event.target == HTML.penProperties) {
        hideElement(HTML.penProperties)
      } else if (event.target == HTML.palette) {
        hideElement(HTML.palette)
        hideElement(HTML.penProperties)
      }
    })
    
    HTML.rectangle.addEventListener("click", () => {
      showElement(HTML.palette)
    })
    
    const svg = HTML.wheel.children
    for (let i = 1; i < svg.length; i++) {
      svg[i].addEventListener("click", (event) => {
        const paletteColour = event.target.getAttribute("fill")
        HTML.rectangle.style.backgroundColor = paletteColour
        HTML.picker.value = paletteColour
        HTML.labelColours.style.backgroundColor = paletteColour
        strokeColour = paletteColour
        hideElement(HTML.palette)
      })
    }