summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorLi Haoyi <haoyi@dropbox.com>2014-11-27 13:18:03 -0800
committerLi Haoyi <haoyi@dropbox.com>2014-11-27 13:18:03 -0800
commita99c43d2833de885815de1563a1b93c5f93a0d1f (patch)
tree24c54f3680f7575888560df159cd4a99e02e0cab /examples
parent08b64d368f0e7bea1298a8f6aed689b0d6804dec (diff)
downloadhands-on-scala-js-a99c43d2833de885815de1563a1b93c5f93a0d1f.tar.gz
hands-on-scala-js-a99c43d2833de885815de1563a1b93c5f93a0d1f.tar.bz2
hands-on-scala-js-a99c43d2833de885815de1563a1b93c5f93a0d1f.zip
fixed openable content bar
Diffstat (limited to 'examples')
-rw-r--r--examples/demos/src/main/scala/scrollmenu/Controller.scala4
-rw-r--r--examples/demos/src/main/scala/scrollmenu/ScrollMenu.scala56
2 files changed, 43 insertions, 17 deletions
diff --git a/examples/demos/src/main/scala/scrollmenu/Controller.scala b/examples/demos/src/main/scala/scrollmenu/Controller.scala
index 3e498c6..fe35be8 100644
--- a/examples/demos/src/main/scala/scrollmenu/Controller.scala
+++ b/examples/demos/src/main/scala/scrollmenu/Controller.scala
@@ -52,8 +52,8 @@ object Controller{
expandIcon.classList.toggle("fa-caret-up")
list.classList.toggle("collapsed")
list.classList.toggle("expanded")
- scrollSpy.clean = !scrollSpy.clean
- updateScroll()
+ scrollSpy.toggleOpen()
+// updateScroll()
}
).render
diff --git a/examples/demos/src/main/scala/scrollmenu/ScrollMenu.scala b/examples/demos/src/main/scala/scrollmenu/ScrollMenu.scala
index 83b5860..691122a 100644
--- a/examples/demos/src/main/scala/scrollmenu/ScrollMenu.scala
+++ b/examples/demos/src/main/scala/scrollmenu/ScrollMenu.scala
@@ -14,8 +14,7 @@ case class MenuNode(frag: dom.HTMLElement, id: String, start: Int, end: Int)
* Lots of sketchy imperative code in order to maximize performance.
*/
class ScrollSpy(structure: Tree[String],
- main: dom.HTMLElement,
- var clean: Boolean = false){
+ main: dom.HTMLElement){
val (headers, domTrees) = {
var i = -1
def recurse(t: Tree[String], depth: Int): Tree[MenuNode] = {
@@ -52,25 +51,48 @@ class ScrollSpy(structure: Tree[String],
}
rec(structure).tail
}
- menuItems.map(Controller.munge)
- .map(dom.document.getElementById)
- .map(offset(_, main))
- .toVector
+
+ js.Array(
+ menuItems.map(Controller.munge)
+ .map(dom.document.getElementById)
+ .map(offset(_, main)):_*
+ )
}
val domTrees = recurse(structure, 0)
(headers, domTrees)
}
+ var open = false
+ def toggleOpen() = {
+ open = !open
+ if (open){
+ def rec(tree: Tree[MenuNode])(f: MenuNode => Unit): Unit = {
+ f(tree.value)
+ tree.children.foreach(rec(_)(f))
+ }
+ rec(domTrees)(setFullHeight)
+ }else{
+ start(force = true)
+ }
+ }
+ def setFullHeight(mn: MenuNode) = {
+ mn.frag
+ .children(1)
+ .asInstanceOf[dom.HTMLElement]
+ .style
+ .maxHeight = (mn.end - mn.start + 1) * 44 + "px"
+ }
private[this] var scrolling = false
def apply() = {
if (!scrolling) {
+ println("Scroll...")
scrolling = true
- dom.requestAnimationFrame((d: Double) => start())
+ dom.setTimeout(() => start(), 200)
}
}
private[this] var previousWin: MenuNode = null
- private[this] def start() = {
+ private[this] def start(force: Boolean = false) = {
scrolling = false
def scroll(el: dom.Element) = {
val rect = el.getBoundingClientRect()
@@ -98,16 +120,20 @@ class ScrollSpy(structure: Tree[String],
val winPath = walkIndex(domTrees)
val winItem = winPath.last.value
def walkTree(tree: Tree[MenuNode], indices: List[Tree[MenuNode]]): Unit = {
- for(Tree(MenuNode(frag, _, start, end), children) <- indices){
- frag.classList.remove("hide")
- frag.classList.remove("selected")
- frag.children(1).asInstanceOf[dom.HTMLElement].style.maxHeight = (end - start + 1) * 44 + "px"
- frag.children(0).classList.add("pure-menu-selected")
+ println("WalkTree")
+ for(Tree(mn, children) <- indices){
+ mn.frag.classList.remove("hide")
+ mn.frag.classList.remove("selected")
+ setFullHeight(mn)
+ mn.frag.children(0).classList.add("pure-menu-selected")
for(child <- children if child.value.frag != indices(1).value.frag){
val childFrag = child.value.frag
+
childFrag.children(0).classList.remove("pure-menu-selected")
childFrag.classList.add("hide")
- childFrag.children(1).asInstanceOf[dom.HTMLElement].style.maxHeight = "0px"
+ if(!open)
+ childFrag.children(1).asInstanceOf[dom.HTMLElement].style.maxHeight = "0px"
+
if (child.value.start < winItem.start) childFrag.classList.add("selected")
else childFrag.classList.remove("selected")
}
@@ -115,7 +141,7 @@ class ScrollSpy(structure: Tree[String],
}
- if (winItem != previousWin){
+ if (winItem != previousWin || force){
scroll(winItem.frag.children(0))
dom.history.replaceState(null, null, "#" + winItem.id)
previousWin = winItem