shiny/widget: make Uniform a shell, not a leaf.

This lets us use a Uniform to fill a background color for other widgets.

Change-Id: I5f062296a0441ceb371d5ea94d6db7f4dab8f94c
Reviewed-on: https://go-review.googlesource.com/24872
Reviewed-by: David Crawshaw <crawshaw@golang.org>
diff --git a/shiny/example/basicgl/main.go b/shiny/example/basicgl/main.go
index 5a14887..0433dca 100644
--- a/shiny/example/basicgl/main.go
+++ b/shiny/example/basicgl/main.go
@@ -30,7 +30,7 @@
 )
 
 func colorPatch(c color.Color, w, h unit.Value) *widget.Sizer {
-	return widget.NewSizer(w, h, widget.NewUniform(c))
+	return widget.NewSizer(w, h, widget.NewUniform(c, nil))
 }
 
 func main() {
diff --git a/shiny/example/layout/main.go b/shiny/example/layout/main.go
index 6c5c03d..91032cb 100644
--- a/shiny/example/layout/main.go
+++ b/shiny/example/layout/main.go
@@ -34,7 +34,7 @@
 var px = unit.Pixels
 
 func colorPatch(c color.Color, w, h unit.Value) *widget.Sizer {
-	return widget.NewSizer(w, h, widget.NewUniform(c))
+	return widget.NewSizer(w, h, widget.NewUniform(c, nil))
 }
 
 func main() {
diff --git a/shiny/widget/uniform.go b/shiny/widget/uniform.go
index 9111f33..5597cde 100644
--- a/shiny/widget/uniform.go
+++ b/shiny/widget/uniform.go
@@ -13,26 +13,32 @@
 	"golang.org/x/exp/shiny/widget/theme"
 )
 
-// Uniform is a leaf widget that paints a uniform color, analogous to an
+// Uniform is a shell widget that paints a uniform color, analogous to an
 // image.Uniform.
 type Uniform struct {
-	node.LeafEmbed
+	node.ShellEmbed
 	Uniform image.Uniform
 }
 
 // NewUniform returns a new Uniform widget of the given color.
-func NewUniform(c color.Color) *Uniform {
+func NewUniform(c color.Color, inner node.Node) *Uniform {
 	w := &Uniform{
 		Uniform: image.Uniform{c},
 	}
 	w.Wrapper = w
+	if inner != nil {
+		w.Insert(inner, nil)
+	}
 	return w
 }
 
 func (w *Uniform) Paint(t *theme.Theme, dst *image.RGBA, origin image.Point) {
 	w.Marks.UnmarkNeedsPaint()
-	if w.Uniform.C == nil {
-		return
+	if w.Uniform.C != nil {
+		// TODO: should draw.Src be draw.Over?
+		draw.Draw(dst, w.Rect.Add(origin), &w.Uniform, image.Point{}, draw.Src)
 	}
-	draw.Draw(dst, w.Rect.Add(origin), &w.Uniform, image.Point{}, draw.Src)
+	if c := w.FirstChild; c != nil {
+		c.Wrapper.Paint(t, dst, origin.Add(w.Rect.Min))
+	}
 }