shithub: opossum

Download patch

ref: a5d269cda172e9612b99a5efca2e8d414dee3771
parent: f354673281df5b4e4aa397e7d914ea10f12223a7
author: Philip Silva <philip.silva@protonmail.com>
date: Wed Jan 27 15:47:40 EST 2021

func tlbr

--- a/browser/browser.go
+++ b/browser/browser.go
@@ -64,7 +64,6 @@
 }
 
 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.n.Map.Color()
 	i, ok := colorCache[c]
 	if !ok {
@@ -234,20 +233,27 @@
 		return nil, false
 	}
 
+	var err error
 	var i *draw.Image
+	var m, p duit.Space
+	zs := duit.Space{}
 	w := n.Width()
 	h := n.Height()
 
-	/*if w == 0 && h == 0 {
-		return nil, false
-	}*/
 	if bg, err := n.BoxBackground(); err == nil {
 		i = bg
 	} else {
 		log.Printf("box background: %f", err)
 	}
+	
+	if p, err = n.Tlbr("padding"); err != nil {
+		log.Errorf("padding: %v", err)
+	}
+	if m, err = n.Tlbr("margin"); err != nil {
+		log.Errorf("margin: %v", err)
+	}
 
-	if w == 0 && h == 0 && i == nil {
+	if w == 0 && h == 0 && i == nil && m == zs && p == zs {
 		return nil, false
 	}
 
@@ -256,7 +262,10 @@
 		Width:      w,
 		Height:     h,
 		Background: i,
+		Margin: m.Topleft(),
+		Padding: p,
 	}
+
 	return box, true
 }
 
@@ -264,6 +273,9 @@
 	if el == nil {
 		return
 	}
+	/*if self.Draw == duit.DirtyKid {
+		force = true
+	}*/
 	box, ok := el.UI.(*duit.Box)
 	if ok && box.Width > 0 && box.Height > 0 {
 		uiSize := image.Point{X: box.Width, Y: box.Height}
--- a/style/stylesheets.go
+++ b/style/stylesheets.go
@@ -491,10 +491,55 @@
 	return true // TODO: be more specific
 }
 
+// tlbr parses 4-tuple of top-right-bottom-left like in margin,
+// margin-top, ...-right, ...-bottom, ...-left.
+func (cs *Map) Tlbr(key string) (s duit.Space, err error) {
+	if all, ok := cs.Declarations[key]; ok {
+		parts := strings.Split(all.Value, " ")
+		nums := make([]int, len(parts))
+		for i, p := range parts {
+			if f, _, err := length(p); err == nil {
+				nums[i] = int(f)
+			} else {
+				return s, fmt.Errorf("length: %w", err)
+			}
+		}
+		s.Top = nums[0]
+		s.Right = s.Top
+		s.Bottom = s.Top
+		s.Left = s.Top
+		if len(nums) >= 2 {
+			s.Right = nums[1]
+			s.Left = s.Right
+		}
+		if len(nums) >= 3 {
+			s.Bottom = nums[2]
+		}
+		if len(nums) == 4 {
+			s.Left = nums[3]
+		}
+	}
+	
+	if t, err := cs.CssPx(key+"-top"); err == nil {
+		s.Top = t
+	}
+	if r, err := cs.CssPx(key+"-right"); err == nil {
+		s.Right = r
+	}
+	if b, err := cs.CssPx(key+"-bottom"); err == nil {
+		s.Bottom = b
+	}
+	if l, err := cs.CssPx(key+"-left"); err == nil {
+		s.Left = l
+	}
+
+	return
+}
+
 func length(l string) (f float64, unit string, err error) {
 	var s string
 
-	if l == "auto" || l == "inherit" {
+	if l == "auto" || l == "inherit" || l == "0" {
 		return 0, "px", nil
 	}
 
@@ -562,4 +607,17 @@
 		return ""
 	}
 	return d.Value
+}
+
+func (cs Map) CssPx(propName string) (l int, err error) {
+	d, ok := cs.Declarations[propName]
+	if !ok {
+		return 0, fmt.Errorf("property doesn't exist")
+	}
+	f, _, err := length(d.Value)
+	if err != nil {
+		return 0, err
+	}
+	l = int(f)
+	return
 }
--- a/style/stylesheets_test.go
+++ b/style/stylesheets_test.go
@@ -3,6 +3,7 @@
 import (
 	"github.com/chris-ramon/douceur/css"
 	"golang.org/x/net/html"
+	"github.com/mjl-/duit"
 	"github.com/psilva261/opossum/logger"
 	"strings"
 	"testing"
@@ -231,6 +232,31 @@
 		}
 		if f != px {
 			t.Fatalf("expected %v but got %v", px, f)
+		}
+	}
+}
+
+func TestTlbr(tt *testing.T) {
+	cases := map[string]duit.Space{
+		"1px 2px 3px 4px": duit.Space{1, 2, 3, 4},
+		"1px 2px 3px": duit.Space{1, 2, 3, 2},
+		"1px 2px": duit.Space{1, 2, 1, 2},
+		"1px": duit.Space{1, 1, 1, 1},
+	}
+	for v, exp := range cases {
+		m := Map{
+			Declarations: make(map[string]css.Declaration),
+		}
+		m.Declarations["margin"] = css.Declaration{
+			Property: "margin",
+			Value:    v,
+		}
+		s, err := m.Tlbr("margin")
+		if err != nil {
+			tt.Errorf("%v", s)
+		}
+		if s != exp {
+			tt.Errorf("%v: %v", s, exp)
 		}
 	}
 }