ref: 6f582efbd405ad095635ff0f6991d857e665fc35
parent: a4b877ac03af623e1a6721465cab6be654b8225f
author: Philip Silva <philip.silva@protonmail.com>
date: Fri Dec 25 10:24:03 EST 2020
node references in Elements
--- a/browser/browser.go
+++ b/browser/browser.go
@@ -56,12 +56,12 @@
type ColoredLabel struct {*duit.Label
- Map style.Map
+ n *nodes.Node
}
func (ui *ColoredLabel) Draw(dui *duit.DUI, self *duit.Kid, img *draw.Image, orig image.Point, m draw.Mouse, force bool) {// TODO: hacky function, might lead to crashes and memory leaks
- c := ui.Map.Color()
+ c := ui.n.Map.Color()
i, ok := colorCache[c]
if !ok {var err error
@@ -121,7 +121,7 @@
src string
}
-func NewImage(n nodes.Node) duit.UI {+func NewImage(n *nodes.Node) duit.UI {img, err := newImage(n)
if err != nil { log.Errorf("could not load image: %v", err)@@ -130,7 +130,7 @@
return img
}
-func newImage(n nodes.Node) (ui duit.UI, err error) {+func newImage(n *nodes.Node) (ui duit.UI, err error) { if display == nil {// probably called from a unit test
return nil, fmt.Errorf("display nil")@@ -156,65 +156,68 @@
imageCache[src] = i
}
- return &Element{- UI: &Image{+ return NewElement(
+ &Image{ Image: &duit.Image{Image: i,
},
src: src,
},
- }, nil
+ n,
+ ), nil
}
type Element struct {duit.UI
- CS style.Map
+ n *nodes.Node
IsLink bool
Click func() duit.Event
}
-func NewElement(ui duit.UI, cs style.Map) *Element {+func NewElement(ui duit.UI, n *nodes.Node) *Element { if ui == nil {return nil
}
- if cs.IsDisplayNone() {+ if n == nil {+ log.Errorf("NewElement: n is nil")return nil
}
+ if n.IsDisplayNone() {+ return nil
+ }
if stashElements {existingEl, ok := ui.(*Element)
if ok && existingEl != nil {- // TODO: check is cs and existingEl shouldn't be vice-versa
- ccs := cs.ApplyChildStyle(existingEl.CS)
return &Element{UI: existingEl.UI,
- CS: ccs,
+ n: existingEl.n,
}
}
}
return &Element{UI: ui,
- CS: cs,
+ n: n,
}
}
-func NewBoxElement(ui duit.UI, cs style.Map) *Element {+func NewBoxElement(ui duit.UI, n *nodes.Node) *Element { if ui == nil {return nil
}
- if cs.IsDisplayNone() {+ if n.IsDisplayNone() {return nil
}
var i *draw.Image
var err error
- w := cs.Width()
- h := cs.Height()
+ w := n.Width()
+ h := n.Height()
if w == 0 && h == 0 {- return NewElement(ui, cs)
+ return NewElement(ui, n)
}
- if i, err = cs.BoxBackground(); err != nil {+ if i, err = n.BoxBackground(); err != nil { log.Printf("box background: %f", err)}
box := &duit.Box{@@ -223,7 +226,7 @@
Height: h,
Background: i,
}
- el := NewElement(box, cs)
+ el := NewElement(box, n)
return el
}
@@ -290,16 +293,13 @@
}
},
}
- return &Element{- UI: btn,
- CS: n.Map,
- }
+ return NewElement(btn, n)
}
func NewInputField(n *nodes.Node) *Element {t := attr(*n.DomSubtree, "type")
- return &Element{- UI: &duit.Box{+ return NewElement(
+ &duit.Box{ Kids: duit.NewKids(&duit.Field{Font: n.Font(),
Placeholder: attr(*n.DomSubtree, "placeholder"),
@@ -324,8 +324,8 @@
}),
MaxWidth: 200,
},
- CS: n.Map,
- }
+ n,
+ )
}
func (el *Element) Mouse(dui *duit.DUI, self *duit.Kid, m draw.Mouse, origM draw.Mouse, orig image.Point) (r duit.Result) {@@ -413,12 +413,12 @@
n.Attr = append(n.Attr, newAttr)
}
-func Arrange(cs style.Map, elements ...*Element) *Element {- if cs.IsFlex() {- if cs.IsFlexDirectionRow() {- return NewElement(horizontalSequenceOf(true, elements), cs)
+func Arrange(n *nodes.Node, elements ...*Element) *Element {+ if n.IsFlex() {+ if n.IsFlexDirectionRow() {+ return NewElement(horizontalSequenceOf(true, elements), n)
} else {- return NewElement(verticalSequenceOf(elements), cs)
+ return NewElement(verticalSequenceOf(elements), n)
}
}
@@ -432,11 +432,12 @@
}
for _, e := range elements {- if !e.CS.IsInline() {+ isInline := e.n.IsInline() || e.n.Type() == html.TextNode
+ if !isInline {flushCurrentRow()
}
currentRow = append(currentRow, e)
- if !e.CS.IsInline() {+ if !isInline {flushCurrentRow()
}
}
@@ -451,16 +452,16 @@
return rows[0][0]
}
numElements++
- return NewElement(horizontalSequenceOf(true, rows[0]), cs)
+ return NewElement(horizontalSequenceOf(true, rows[0]), n)
} else {seqs := make([]*Element, 0, len(rows))
for _, row := range rows {seq := horizontalSequenceOf(true, row)
numElements++
- seqs = append(seqs, NewElement(seq, cs))
+ seqs = append(seqs, NewElement(seq, n))
}
numElements++
- return NewElement(verticalSequenceOf(seqs), cs)
+ return NewElement(verticalSequenceOf(seqs), n)
}
}
@@ -499,7 +500,7 @@
finalUis = append(finalUis, NewElement(&duit.Label{Text: t,
Font: label.Font,
- }, el.CS))
+ }, el.n))
}
} else {finalUis = append(finalUis, ui)
@@ -558,7 +559,7 @@
tmp := NodeToBox(r+1, b, c)
if tmp != nil {numElements++
- el := NewElement(tmp, c.Map.ApplyChildStyle(style.TextNode))
+ el := NewElement(tmp, c)
childrenAsEls = append(childrenAsEls, el)
}
}
@@ -567,7 +568,7 @@
} else if len(childrenAsEls) == 1 {return childrenAsEls[0]
}
- res := Arrange(n.Map, childrenAsEls...)
+ res := Arrange(n, childrenAsEls...)
return res
}
@@ -630,7 +631,7 @@
return
}
-func (t *Table) Element(r int, b *Browser, cs style.Map) *Element {+func (t *Table) Element(r int, b *Browser, n *nodes.Node) *Element {numRows := len(t.rows)
numCols := t.numColsMax()
useOneGrid := t.numColsMin() == t.numColsMax()
@@ -660,7 +661,7 @@
Valign: valign,
Kids: duit.NewKids(uis...),
},
- cs,
+ n,
)
} else { log.Printf("combine")@@ -671,7 +672,7 @@
for _, col := range row.columns {ui := NodeToBox(r+1, b, col)
if ui != nil {- el := NewElement(ui, col.Map)
+ el := NewElement(ui, col)
rowEls = append(rowEls, el)
}
}
@@ -680,20 +681,22 @@
if len(rowEls) > 0 {seq := horizontalSequenceOf(false, rowEls)
numElements++
- seqs = append(seqs, NewElement(seq, cs))
+ seqs = append(seqs, NewElement(seq, row.n))
}
}
numElements++
- return NewElement(verticalSequenceOf(seqs), cs)
+ return NewElement(verticalSequenceOf(seqs), n)
}
}
type TableRow struct {+ n *nodes.Node
columns []*nodes.Node
}
func NewTableRow(n *nodes.Node) (tr *TableRow) { tr = &TableRow{+ n: n,
columns: make([]*nodes.Node, 0, 5),
}
@@ -768,12 +771,12 @@
}
return NewElement(
btn,
- n.Map,
+ n,
)
}
case "table":
numElements++
- return NewTable(n).Element(r+1, b, n.Map)
+ return NewTable(n).Element(r+1, b, n)
case "noscript":
if *ExperimentalJsInsecure || !*EnableNoScriptTag {return nil
@@ -788,7 +791,7 @@
Text: t,
Font: n.Font(),
},
- Map: n.Map.ApplyChildStyle(style.TextNode),
+ n: n,
}
} else {innerContent = RichInnerContentFrom(r+1, b, n)
@@ -797,19 +800,19 @@
numElements++
return NewBoxElement(
innerContent,
- n.Map.ApplyChildStyle(style.TextNode),
+ n,
)
case "img":
numElements++
return NewElement(
- NewImage(*n),
- n.Map,
+ NewImage(n),
+ n,
)
case "pre":
numElements++
return NewElement(
NewCodeView(nodes.ContentFrom(*n), n.Map),
- n.Map,
+ n,
)
case "li":
var innerContent duit.UI
@@ -823,7 +826,7 @@
Text: t,
Font: n.Font(),
},
- Map: n.Map,
+ n: n,
}
} else {innerContent = RichInnerContentFrom(r+1, b, n)
@@ -832,7 +835,7 @@
numElements++
return NewElement(
innerContent,
- n.Map,
+ n,
)
case "a":
var href string
@@ -849,7 +852,7 @@
Font: n.Font(),
Click: browser.SetAndLoadUrl(href),
},
- Map: n.Map, //.ApplyIsLink(),
+ n: n,
}
} else {// TODO: make blue borders and different
@@ -862,7 +865,7 @@
}
el := NewElement(
innerContent,
- n.Map,
+ n,
)
// also a way to bubble up
// will be needed eventually
@@ -886,7 +889,7 @@
for _, e := range els {_ = e
}
- return Arrange(n.Map, els...)
+ return Arrange(n, els...)
}
}
} else if n.Type() == html.TextNode {@@ -910,7 +913,7 @@
numElements++
return NewElement(
ui,
- style.TextNode,
+ n,
)
} else {return nil
--- a/browser/website.go
+++ b/browser/website.go
@@ -138,7 +138,7 @@
log.Printf("Layout website...")numElements = 0
scroller = duit.NewScroll(
- NodeToBox(0, browser, nodes.NewNodeTree(body, style.Map{}, nodeMap, nil)),+ NodeToBox(0, browser, nodes.NewNodeTree(body, style.Map{}, nodeMap, &nodes.Node{})),)
w.UI = scroller
log.Printf("Layouting done (%v elements created)", numElements)--
⑨