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 +}