Skip to content
Snippets Groups Projects
Select Git revision
  • vue-solution
  • video
  • master
  • react-solution
4 results

.gitignore

Blame
  • DElement.scala 4.66 KiB
    package com.wbillingsley.veautiful
    
    import org.scalajs.dom
    import org.scalajs.dom.{Event, html}
    
    case class Lstnr(`type`:String, func:Event => _, usCapture:Boolean=true)
    case class AttrVal(name:String, value:String)
    case class InlineStyle(name:String, value:String)
    case class EvtListener[T](`type`:String, f:Function[T, _], capture:Boolean)
    
    case class DElement(name:String, uniqEl:Any = "") extends DiffNode {
    
      var children:Seq[VNode] = Seq.empty
    
      var attributes:Map[String, AttrVal] = Map.empty
    
      var listeners:Map[String, Lstnr] = Map.empty
    
      var styles:Seq[InlineStyle] = Seq.empty
    
      override var domNode:Option[dom.Element] = None
    
      def domEl = domNode.collect({ case e:dom.Element => e })
    
      val updateSelf = {
        case el:DElement =>
          removeAttrsFromNode(attributes.values)
          attributes = el.attributes
          applyAttrsToNode(attributes.values)
    
          removeStylesFromNode(styles)
          styles = el.styles
          applyStylesToNode(styles)
    
          removeLsntrsFromNode(listeners.values)
          listeners = el.listeners
          applyLsntrsToNode(listeners.values)
      }
    
      def applyAttrsToNode(as:Iterable[AttrVal]):Unit = {
        for { n <- domEl; a <- as } {
          n.setAttribute(a.name, a.value)
        }
      }
    
      def removeAttrsFromNode(as:Iterable[AttrVal]):Unit = {
        for { n <- domEl; a <- as } {
          n.removeAttribute(a.name)
        }
      }
    
      def applyLsntrsToNode(as:Iterable[Lstnr]):Unit = {
        for { n <- domEl; a <- as } {
          n.addEventListener(a.`type`, a.func, true)
        }
      }
    
      def removeLsntrsFromNode(as:Iterable[Lstnr]):Unit = {
        for { n <- domEl; a <- as } {
          n.removeEventListener(a.`type`, a.func, true)
        }
      }
    
      def style(s:InlineStyle*) = {
        styles ++= s
        this
      }
    
      def applyStylesToNode(as:Iterable[InlineStyle]):Unit = {
        domEl match {