shithub: xui

Download patch

ref: e83fc0ac32af17baeae1a29e23de8c0decea7154
parent: ecec95e7ba212a744f32dd47981f3187b3634a55
author: Philip Silva <philip.silva@protonmail.com>
date: Thu May 22 11:40:06 EDT 2025

inline elements

--- a/box/box.go
+++ b/box/box.go
@@ -108,7 +108,7 @@
 	ims := make([]*memdraw.Image, len(b.Elements))
 	wg := sync.WaitGroup{}
 	for i, el := range b.Elements {
-		if runtime.GOARCH != "arm64" {
+		if /* otherwise an error happens */false && runtime.GOARCH != "arm64" {
 			wg.Add(1)
 			go func(ii int) {
 				ims[ii] = el.Render() //b.boxImg, b.Rs[i].Min)
@@ -131,6 +131,10 @@
 	return b.boxImg
 }
 
+// Populate
+//
+// - b.Rs[i]
+// - b.boxImg
 func (b *Box) layoutBoxImg() {
 	// 0. Validations
 
@@ -140,8 +144,8 @@
 		rEl, marginEl := el.Geom()
 		b.Rs[i] = rEl.Add(dxy)
 		b.Rs[i] = b.Rs[i].Add(marginEl.TopLeft())
-		switch b.Dir {
-		case Horizontal:
+		switch {
+		case b.Dir == Horizontal || (b.Wrap && (b.Width == 0 || rEl.Dx()+dxy.X <= b.Width)):
 			//log.Printf("horiz.")
 			dxy = dxy.Add(image.Point{X: rEl.Dx()+marginEl.Left.Val})
 			if i > 0 {
@@ -148,7 +152,7 @@
 				_, marginLast := b.Elements[i-1].Geom()
 				dxy = dxy.Add(image.Point{X: marginLast.Right.Val})
 			}
-		case Vertical:
+		case b.Dir == Vertical:
 			//log.Printf("vert.")
 			fallthrough
 		default:
@@ -157,6 +161,7 @@
 				_, marginLast := b.Elements[i-1].Geom()
 				dxy = dxy.Add(image.Point{Y: marginLast.Bottom.Val})
 			}
+			dxy.X = 0
 		}
 	}
 
@@ -170,6 +175,17 @@
 				//Min: b.Rs[0].Min,
 				Max: b.Rs[len(b.Rs)-1].Max.Add(b.Rs[0].Min).
 				  Add(b.Padding.Size()),
+			}
+
+			// Expand outer rectangle if inner element rectangles don't fit
+			for _, el := range b.Elements {
+				rEl, _ := el.Geom()
+				if rEl.Dx() > r.Dx() {
+					r.Max.X += rEl.Dx()-r.Dx()
+				}
+				if rEl.Dy() > r.Dy() {
+					r.Max.X += rEl.Dy()-r.Dy()
+				}
 			}
 		}
 		// Allocate image
--- a/cmd/hello/hello.go
+++ b/cmd/hello/hello.go
@@ -33,6 +33,12 @@
 
 	l := label.New(image.Point{10, 5}, "Hello, world!!") //, c)
 	l.Margin = space.New(5, 10)
+	l2 := label.New(image.Point{10, 5}, "Additional text!!") //, c)
+	l2.Margin = space.New(5, 10)
+	l3 := label.New(image.Point{10, 5}, "A really long subsequent text to fill the horizontal space!") //, c)
+	l3.Margin = space.New(5, 10)
+	l4 := label.New(image.Point{10, 5}, "Wrap into the next line for sure!!!") //, c)
+	l4.Margin = space.New(5, 10)
 
 	f, err := os.Open("animated-computer-image-0064.gif")
 	//f, err := os.Open("g3Ys.gif")
@@ -76,9 +82,19 @@
 
 	fl := field.New(x, image.ZP, " ", x.Rect(0,0, 150, 50))
 	fl.Margin = x.Space(5, 10)
-
+	b2 := box.New([]element.Interface{
+		l,
+		l2,
+		l3,
+		l4,
+	})
+	b2.Wrap = true
+	log.Printf("xui screen image width: %v", x.R().Dx())
+	b2.Width = x.R().Dx()/2
 	b := box.New([]element.Interface{
-		a, l, btn, fl,
+		a,
+		b2,
+		btn, fl,
 	})
 	//b.Dir = box.Horizontal
 	x.SetRoot(b)
--