shithub: mycel

Download patch

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)