Select Git revision
-
Will Billingsley authoredWill Billingsley authored
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 {