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)}
}
}
--
⑨