+package fynepatch
+
+import "fyne.io/fyne/v2"
+
+type KeyValueLayout struct {
+}
+
+// Places children in a two column table with
+// row major order. The first column will
+// be as wide as the widest child in that column,
+// the second will fill the remaining space.
+func NewKeyValueLayout() fyne.Layout {
+ return &KeyValueLayout{}
+}
+
+func (kv *KeyValueLayout) Layout(objects []fyne.CanvasObject, totalSize fyne.Size) {
+ var keyWidth float32 = 0
+ for i := 0; i < len(objects); i += 2 {
+ kWidth := objects[i].MinSize().Width
+ if kWidth > keyWidth {
+ keyWidth = kWidth
+ }
+ }
+
+ var h float32 = 0
+ var k fyne.CanvasObject
+ for i := 0; i < len(objects); i += 2 {
+ k = objects[i]
+ // row height
+ dh := k.MinSize().Height
+ if i+1 < len(objects) {
+ valueHeight := objects[i+1].MinSize().Height
+ if valueHeight > dh {
+ dh = valueHeight
+ }
+ }
+ // place key
+ k.Resize(fyne.Size{keyWidth, dh})
+ k.Move(fyne.Position{0, h})
+
+ // place value
+ if i+1 < len(objects) {
+ value := objects[i+1]
+ value.Resize(fyne.Size{totalSize.Width - keyWidth, dh})
+ value.Move(fyne.Position{keyWidth, h})
+ }
+ // calculate height offset
+ h += dh
+ }
+}
+
+func (kv *KeyValueLayout) MinSize(objects []fyne.CanvasObject) fyne.Size {
+ minsize := fyne.Size{0, 0}
+ for i := 0; i < len(objects); i += 2 {
+ key := objects[i]
+ rowSize := key.MinSize()
+ if i+1 < len(objects) {
+ valueHeight := objects[i+1].MinSize().Height
+ if valueHeight > rowSize.Height {
+ rowSize.Height = valueHeight
+ }
+ }
+ minsize = minsize.Add(rowSize)
+ }
+ return minsize
+}