ref: f8c9bd648275f2b20c6b2656dfcc5a1800cde026
parent: 554ea7adc9d345f391bcf1a720939ecb6c262009
author: Philip Silva <philip.silva@protonmail.com>
date: Wed Feb 3 18:37:36 EST 2021
Remember scroll position after js click
--- a/browser/browser.go
+++ b/browser/browser.go
@@ -50,7 +50,7 @@
buf []byte
})
var log *logger.Logger
-var scroller *duit.Scroll
+var scroller *Scroll
var display *draw.Display
func SetLogger(l *logger.Logger) {
@@ -493,8 +493,10 @@
return
}
+ offset := scroller.Offset
browser.Website.html = res
browser.Website.layout(browser, ClickRelayout)
+ scroller.Offset = offset
dui.MarkLayout(dui.Top.UI)
dui.MarkDraw(dui.Top.UI)
dui.Render()
@@ -1054,7 +1056,7 @@
switch v := ui.(type) {
case nil:
panic("null")
- case *duit.Scroll:
+ case *Scroll:
traverseTree(r+1, v.Kid.UI, f)
case *duit.Box:
for _, kid := range v.Kids {
--- a/browser/scroll.go
+++ b/browser/scroll.go
@@ -37,7 +37,7 @@
barR image.Rectangle
barActiveR image.Rectangle
childR image.Rectangle
- offset int // current scroll offset in pixels
+ Offset int // current scroll offset in pixels
img *draw.Image // for child to draw on
scrollbarSize int
lastMouseUI duit.UI
@@ -113,7 +113,7 @@
barR := ui.barR.Add(orig)
img.Draw(barR, bg, nil, image.ZP)
barH := h * h / uih
- barY := ui.offset * h / uih
+ barY := ui.Offset * h / uih
ui.barActiveR = ui.barR
ui.barActiveR.Min.Y += barY
ui.barActiveR.Max.Y = ui.barActiveR.Min.Y + barH
@@ -143,7 +143,7 @@
} else if ui.Kid.Draw == duit.Dirty {
ui.img.Draw(ui.img.R, dui.Background, nil, image.ZP)
}
- m.Point = m.Point.Add(image.Pt(-ui.childR.Min.X, ui.offset))
+ m.Point = m.Point.Add(image.Pt(-ui.childR.Min.X, ui.Offset))
if ui.Kid.Draw != duit.Clean {
if force {
ui.Kid.Draw = duit.Dirty
@@ -151,15 +151,15 @@
ui.Kid.UI.Draw(dui, &ui.Kid, ui.img, image.ZP, m, ui.Kid.Draw == duit.Dirty)
ui.Kid.Draw = duit.Clean
}
- img.Draw(ui.childR.Add(orig), ui.img, nil, image.Pt(0, ui.offset))
+ img.Draw(ui.childR.Add(orig), ui.img, nil, image.Pt(0, ui.Offset))
}
func (ui *Scroll) scroll(delta int) bool {
- o := ui.offset
- ui.offset += delta
- ui.offset = maximum(0, ui.offset)
- ui.offset = minimum(ui.offset, maximum(0, ui.Kid.R.Dy()-ui.childR.Dy()))
- return o != ui.offset
+ o := ui.Offset
+ ui.Offset += delta
+ ui.Offset = maximum(0, ui.Offset)
+ ui.Offset = minimum(ui.Offset, maximum(0, ui.Kid.R.Dy()-ui.childR.Dy()))
+ return o != ui.Offset
}
func (ui *Scroll) scrollKey(k rune) (consumed bool) {
@@ -191,12 +191,12 @@
case duit.Button1:
return ui.scroll(-m.Y)
case duit.Button2:
- offset := m.Y * ui.Kid.R.Dy() / ui.barR.Dy()
- offsetMax := ui.Kid.R.Dy() - ui.childR.Dy()
- offset = maximum(0, minimum(offset, offsetMax))
- o := ui.offset
- ui.offset = offset
- return o != ui.offset
+ Offset := m.Y * ui.Kid.R.Dy() / ui.barR.Dy()
+ OffsetMax := ui.Kid.R.Dy() - ui.childR.Dy()
+ Offset = maximum(0, minimum(Offset, OffsetMax))
+ o := ui.Offset
+ ui.Offset = Offset
+ return o != ui.Offset
case duit.Button3:
return ui.scroll(m.Y)
}
@@ -223,9 +223,9 @@
}
if m.Point.In(ui.childR) {
nOrigM := origM
- nOrigM.Point = nOrigM.Point.Add(image.Pt(-ui.scrollbarSize, ui.offset))
+ nOrigM.Point = nOrigM.Point.Add(image.Pt(-ui.scrollbarSize, ui.Offset))
nm := m
- nm.Point = nm.Point.Add(image.Pt(-ui.scrollbarSize, ui.offset))
+ nm.Point = nm.Point.Add(image.Pt(-ui.scrollbarSize, ui.Offset))
r = ui.Kid.UI.Mouse(dui, &ui.Kid, nm, nOrigM, image.ZP)
ui.warpScroll(dui, self, r.Warp, orig)
scrolled := false
@@ -256,7 +256,7 @@
}
}
if m.Point.In(ui.childR) {
- m.Point = m.Point.Add(image.Pt(-ui.scrollbarSize, ui.offset))
+ m.Point = m.Point.Add(image.Pt(-ui.scrollbarSize, ui.Offset))
r = ui.Kid.UI.Key(dui, &ui.Kid, k, m, image.ZP)
ui.warpScroll(dui, self, r.Warp, orig)
scrolled := false
@@ -274,13 +274,13 @@
return
}
- offset := ui.offset
- if warp.Y < ui.offset {
- ui.offset = maximum(0, warp.Y-dui.Scale(40))
- } else if warp.Y > ui.offset+ui.r.Dy() {
- ui.offset = minimum(ui.Kid.R.Dy()-ui.r.Dy(), warp.Y+dui.Scale(40)-ui.r.Dy())
+ Offset := ui.Offset
+ if warp.Y < ui.Offset {
+ ui.Offset = maximum(0, warp.Y-dui.Scale(40))
+ } else if warp.Y > ui.Offset+ui.r.Dy() {
+ ui.Offset = minimum(ui.Kid.R.Dy()-ui.r.Dy(), warp.Y+dui.Scale(40)-ui.r.Dy())
}
- if offset != ui.offset {
+ if Offset != ui.Offset {
if self != nil {
self.Draw = duit.Dirty
} else {
@@ -287,7 +287,7 @@
dui.MarkDraw(ui)
}
}
- warp.Y -= ui.offset
+ warp.Y -= ui.Offset
warp.X += orig.X + ui.scrollbarSize
warp.Y += orig.Y
}
@@ -336,7 +336,7 @@
}
func (ui *Scroll) Print(self *duit.Kid, indent int) {
- what := fmt.Sprintf("Scroll offset=%d childR=%v", ui.offset, ui.childR)
+ what := fmt.Sprintf("Scroll Offset=%d childR=%v", ui.Offset, ui.childR)
duit.PrintUI(what, self, indent)
ui.Kid.UI.Print(&ui.Kid, indent+1)
}
--- a/browser/website.go
+++ b/browser/website.go
@@ -150,7 +150,7 @@
body := grep(doc, "body")
log.Printf("Layout website...")
- scroller = duit.NewScroll(
+ scroller = NewScroll(
NodeToBox(0, browser, nodes.NewNodeTree(body, style.Map{}, nodeMap, &nodes.Node{})),
)
numElements := 0
@@ -161,7 +161,7 @@
log.Printf("Layouting done (%v elements created)", numElements)
if numElements < 10 {
log.Errorf("Less than 10 elements layouted, seems css processing failed. Will layout without css")
- scroller = duit.NewScroll(
+ scroller = NewScroll(
NodeToBox(0, browser, nodes.NewNodeTree(body, style.Map{}, make(map[*html.Node]style.Map), nil)),
)
w.UI = scroller