summaryrefslogtreecommitdiff
path: root/size.go
blob: 651e773d6fd03a6f1d14c3914e7cd1b117837226 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package main

import (
	"go.wit.com/widget"
)

func (tk *guiWidget) Size() (int, int) {
	if tk == nil {
		return 0, 0
	}
	if me.treeRoot == nil {
		return 0, 0
	}

	// don't count hidden widgets in size calculations
	if tk.hidden {
		return 0, 0
	}

	switch tk.WidgetType {
	case widget.Window:
		var maxH int = 0
		var maxW int = 0
		for _, child := range tk.children {
			if tk.hidden {
				continue
			}
			sizeW, sizeH := child.Size()
			maxW += sizeW
			if sizeH > maxH {
				maxH = sizeH
			}

		}
		return maxW, maxH
	case widget.Grid:
		return tk.sizeGrid()
	case widget.Box:
		return tk.sizeBox()
	case widget.Group:
		// move the group to the parent's next location
		maxW := tk.gocuiSize.Width()
		maxH := tk.gocuiSize.Height()

		for _, child := range tk.children {
			if tk.hidden {
				continue
			}
			sizeW, sizeH := child.Size()

			// increment straight down
			maxH += sizeH
			if sizeW > maxW {
				maxW = sizeW
			}
		}
		return maxW + me.GroupPadW + 3, maxH
	}
	if tk.isFake {
		return 0, 0
	}
	return len(tk.String()), 3
}

func (w *guiWidget) sizeGrid() (int, int) {
	if w.hidden {
		return 0, 0
	}

	// first compute the max sizes of the rows and columns
	for _, child := range w.children {
		if w.hidden {
			continue
		}
		sizeW, sizeH := child.Size()

		// set the child's realWidth, and grid offset
		if w.widths[child.node.State.AtW] < sizeW {
			w.widths[child.node.State.AtW] = sizeW
		}
		if w.heights[child.node.State.AtH] < sizeH {
			w.heights[child.node.State.AtH] = sizeH
		}
	}

	// find the width and height offset of the grid for AtW,AtH
	var totalW int = 0
	var totalH int = 0
	for _, width := range w.widths {
		totalW += width
	}
	for _, h := range w.heights {
		totalH += h
	}
	return totalW + me.GridPadW, totalH
}

func (w *guiWidget) sizeBox() (int, int) {
	if w.WidgetType != widget.Box {
		return 0, 0
	}
	if w.hidden {
		return 0, 0
	}
	var maxW int = 0
	var maxH int = 0

	for _, child := range w.children {
		if w.hidden {
			continue
		}
		sizeW, sizeH := child.Size()
		if child.direction == widget.Horizontal {
			maxW += sizeW
			if sizeH > maxH {
				maxH = sizeH
			}
		} else {
			maxH += sizeH
			if sizeW > maxW {
				maxW = sizeW
			}
		}
	}
	return maxW + me.BoxPadW, maxH
}