summaryrefslogtreecommitdiff
path: root/examples/demos/ScrollMenu.scala
diff options
context:
space:
mode:
authorLi Haoyi <haoyi@dropbox.com>2014-11-14 15:44:54 -0800
committerLi Haoyi <haoyi@dropbox.com>2014-11-14 15:44:54 -0800
commit64b283eb61f2c20e39e4c55e8696522569420028 (patch)
tree875fdb95af7991717c63cb45be3f00eb70d7408d /examples/demos/ScrollMenu.scala
parentac06ede92a8be7a064e30364161d2610e547e988 (diff)
downloadhands-on-scala-js-64b283eb61f2c20e39e4c55e8696522569420028.tar.gz
hands-on-scala-js-64b283eb61f2c20e39e4c55e8696522569420028.tar.bz2
hands-on-scala-js-64b283eb61f2c20e39e4c55e8696522569420028.zip
lots of cleanip
Diffstat (limited to 'examples/demos/ScrollMenu.scala')
-rw-r--r--examples/demos/ScrollMenu.scala50
1 files changed, 50 insertions, 0 deletions
diff --git a/examples/demos/ScrollMenu.scala b/examples/demos/ScrollMenu.scala
new file mode 100644
index 0000000..ccab4e9
--- /dev/null
+++ b/examples/demos/ScrollMenu.scala
@@ -0,0 +1,50 @@
+import acyclic.file
+import org.scalajs.dom
+
+case class Tree[T](value: T, children: Vector[Tree[T]])
+
+case class MenuNode(frag: dom.HTMLElement, start: Int, end: Int)
+
+/**
+ * High performance scrollspy to
+ */
+class ScrollSpy(headers: Vector[Double], domTrees: Seq[Tree[MenuNode]]){
+ var scrolling = false
+ var lastSelected: dom.HTMLElement = null
+ def apply(threshold: Double) = if (!scrolling){
+ scrolling = true
+ dom.requestAnimationFrame((d: Double) => start(threshold))
+ }
+ def start(threshold: Double) = {
+ scrolling = false
+ def walkTree(tree: Tree[MenuNode]): Boolean = {
+ val Tree(MenuNode(menuItem, index, next), children) = tree
+ val before = headers(index) < threshold
+ val after = (next >= headers.length) || headers(next) > threshold
+ val win = before && after
+ if (win){
+ menuItem.classList.remove("hide")
+ var winFound = false
+
+ for(c <- tree.children){
+ val newWinFound = walkTree(c)
+ if (!winFound) c.value.frag.classList.add("selected")
+ else c.value.frag.classList.remove("selected")
+ winFound = winFound | newWinFound
+ }
+ if (!winFound) {
+ tree.children.foreach(_.value.frag.classList.remove("selected"))
+ if (lastSelected != null)
+ lastSelected.children(0).classList.remove("pure-menu-selected")
+ menuItem.children(0).classList.add("pure-menu-selected")
+ lastSelected = menuItem
+ }
+ }else{
+ menuItem.classList.add("hide")
+ menuItem.classList.remove("selected")
+ }
+ win
+ }
+ domTrees.map(walkTree)
+ }
+} \ No newline at end of file