Sander Schobers
9d4b097352
Fixed ContentScrollbar. Added horizontal alignment to label. Removed some dimensional constants. Added several controls: - Margin; - Button; - Columns; - Scroll; - Wrapper (reusable layout control) that wraps around existing control.
115 lines
2.0 KiB
Go
115 lines
2.0 KiB
Go
package ui
|
|
|
|
import (
|
|
"math"
|
|
|
|
"opslag.de/schobers/geom"
|
|
)
|
|
|
|
type columns struct {
|
|
ContainerBase
|
|
cols []*column
|
|
col int
|
|
}
|
|
|
|
type column struct {
|
|
p DockPanel
|
|
}
|
|
|
|
func (c *column) Append(ctrl Control) {
|
|
c.p.Append(DockTop, ctrl)
|
|
}
|
|
|
|
func (c *column) AppendCreate(ctx Context, ctrl Control) {
|
|
c.p.AppendCreate(ctx, DockTop, ctrl)
|
|
}
|
|
|
|
type Columns interface {
|
|
Container
|
|
Columns() []Column
|
|
Append(Control)
|
|
AppendCreate(Context, Control)
|
|
}
|
|
|
|
type Column interface {
|
|
Append(Control)
|
|
AppendCreate(Context, Control)
|
|
}
|
|
|
|
func NewColumns(cols int, ctrls ...Control) Columns {
|
|
var c = &columns{}
|
|
for i := 0; i < cols; i++ {
|
|
c.addColumn()
|
|
}
|
|
for _, ctrl := range ctrls {
|
|
c.Append(ctrl)
|
|
}
|
|
return c
|
|
}
|
|
|
|
func (c *columns) addColumn() {
|
|
var p = NewDockPanel(c)
|
|
c.ContainerBase.Append(p)
|
|
c.cols = append(c.cols, &column{p})
|
|
}
|
|
|
|
func (c *columns) next() {
|
|
c.col = (c.col + 1) % len(c.cols)
|
|
}
|
|
|
|
func (c *columns) Columns() []Column {
|
|
var cols = make([]Column, len(c.cols))
|
|
for i, col := range c.cols {
|
|
cols[i] = col
|
|
}
|
|
return cols
|
|
}
|
|
|
|
func (c *columns) Append(ctrl Control) {
|
|
c.cols[c.col].Append(ctrl)
|
|
c.next()
|
|
}
|
|
|
|
func (c *columns) AppendCreate(ctx Context, ctrl Control) {
|
|
c.cols[c.col].AppendCreate(ctx, ctrl)
|
|
c.next()
|
|
}
|
|
|
|
func (c *columns) DesiredSize(ctx Context) geom.PointF {
|
|
var w float64
|
|
var h float64
|
|
for _, col := range c.cols {
|
|
var sz = col.p.DesiredSize(ctx)
|
|
if !math.IsNaN(w) {
|
|
if math.IsNaN(sz.X) {
|
|
w = sz.X
|
|
} else {
|
|
w += sz.X
|
|
}
|
|
}
|
|
if !math.IsNaN(h) {
|
|
if math.IsNaN(sz.Y) {
|
|
h = sz.Y
|
|
} else {
|
|
h = math.Max(h, sz.Y)
|
|
}
|
|
}
|
|
}
|
|
return geom.PtF(w, h)
|
|
}
|
|
|
|
func (c *columns) Arrange(ctx Context, rect geom.RectangleF) {
|
|
c.ContainerBase.SetRect(rect)
|
|
var w, h = rect.Dx(), rect.Dy()
|
|
var cols = float64(len(c.cols))
|
|
for i, col := range c.cols {
|
|
var ii = float64(i)
|
|
var colH = col.p.DesiredSize(ctx).Y
|
|
if colH > h {
|
|
colH = h
|
|
}
|
|
var colR = geom.RectF(rect.Min.X+ii*w/cols, rect.Min.Y, rect.Min.X+(ii+1)*w/cols, rect.Min.Y+colH)
|
|
Arrange(ctx, col.p, colR)
|
|
}
|
|
}
|