summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--newsizing103
1 files changed, 82 insertions, 21 deletions
diff --git a/newsizing b/newsizing
index 9d560af..add1186 100644
--- a/newsizing
+++ b/newsizing
@@ -1,14 +1,25 @@
type sysSizeData struct {
+ // for size calculations
+ // all platforms
+ margin int // windows: calculated
+ spacing int // gtk+, cocoa: constants
// windows
baseX int
baseY int
- // possibly also the HDWP
// gtk, mac os x: nothing
+
+ // for the actual resizing
+ // windows
+ // possibly also the HDWP
+ // gtk
+ shouldVAlignTop bool
+ // mac os x
+ // neighbor control alignment rect/baseline info
}
func (s *sysData) beginResize() *sysSizeData {
- // windows: get baseX/baseY for window
- // gtk, mac: return nothing
+ // windows: get baseX/baseY for window and compute margin and spacing
+ // gtk, mac: return zero
}
func (s *sysData) endResize(d *sysSizeData) {
@@ -27,35 +38,85 @@ type allocation struct {
func (s *sysData) translateAllocationCoords(allocations []*allocation, winwidth, winheight int) {
// windows, gtk: nothing
// mac
- for _, allocation := range allocations {
+ for _, a := range allocations {
// winheight - y because (0,0) is the bottom-left corner of the window and not the top-left corner
// (winheight - y) - height because (x, y) is the bottom-left corner of the control and not the top-left
- allocation.y = (winheight - allocation.y) - allocation.height
+ a.y = (winheight - a.y) - a.height
}
}
func (s *sysData) resizeWindow(width, height int) {
- d := s.startResize()
- allocations := s.resize(0, 0, width, height, d)
+ d := s.beginResize()
+ allocations := s.allocate(0, 0, width, height, d)
s.translateAllocationCoords(allocations, width, height)
for _, c := range s.allocations {
c.this.doResize(c, d)
}
- s.finishResize(d)
+ s.endResize(d)
}
-main widget sizing function
- get preferred size of all subwidgets
- windows: uses dialog base units
- produce map of which controls are next to which controls
- properly space controls
- windows: uses dialog base units
- return list of size allocations back to window sizer
+// setSize() becomes allocate()
+// each allocate on a non-layout control should just return a one-element slice
+// each doResize and getAuxResizeInfo on a control should just defer to sysData
+type Control interface {
+ // ...
+ allocate(x int, y int, width int, height int, d *sysSizeData) []*allocation
+ preferredSize(d *sysSizeData) (width, height int)
+ doResize(c *allocation, d *sysSizeData)
+ getAuxResizeInfo(d *sysSizeData)
+}
-each doResize on a control should just defer to sysData.doResize()
+// vertical stack: no concept of neighbor, but not too hard to add a vertical neighbor
+// horizontal stack:
+ var current *allocation
+ // ...
+ as := s.controls[i].allocate(...)
+ if current != nil {
+ current.neighbor = as[0].self
+ }
+ current = as[0]
+ // append all of as
+// grid:
+ // same as above, except current is set to nil on each new row
+ // adding a vertical neighbor would require storing an extra list
-each widget adjustment
- mac: neighboring control baselines are aligned for labels
- gtk: vertical alignment of text changed to top if neighboring control is multi-line
- TODO - should it be center-aligned vertically or not
- windows: none
+// windows
+func (s *sysData) doResize(c *allocation, d *sysSizeData) {
+ if s.ctype == c_label {
+ // add additional offset of 4 dialog units
+ }
+ // resize
+}
+func (s *sysData) getAuxResizeInfo(d *sysSizeData) {
+ // do nothing
+}
+
+// gtk+
+func (s *sysData) doResize(c *allocation, d *sysSizeData) {
+ if s.ctype == c_label && !s.alternate && c.neighbor != nil {
+ c.neighbor.getAuxResizeInfo(d)
+ if d.shouldVAlignTop {
+ // TODO should it be center-aligned to the first line or not
+ gtk_misc_set_align(s.widget, 0, 0)
+ } else {
+ gtk_misc_set_align(s.widget, 0, 0.5)
+ }
+ }
+ // resize
+}
+func (s *sysData) getAuxResizeInfo(d *sysSizeData) {
+ d.shouldVAlignTop = (s.ctype == c_listbox) || (s.ctype == c_area)
+}
+
+// cocoa
+func (s *sysData) doResize(c *allocation, d *sysSizeData) {
+ if s.ctype == c_label && !s.alternate && c.neighbor != nil {
+ c.neighbor.getAuxResizeInfo(d)
+ // get this control's alignment rect and baseline
+ // align
+ }
+ // resize
+}
+func (s *sysData) getAuxResizeInfo(d *sysSizeData) {
+ // get this control's alignment rect and baseline
+}