forked from joejulian/gio
a63e0cb44a
op.Offset is a convenience function most often used by layouts. Layouts usually operate in integer coordinates, and the float32 version of op.Offset needlessly force conversions from int to float32. This change makes op.Offset take integer coordinates, to better match its intended use. Signed-off-by: Elias Naur <mail@eliasnaur.com>
98 lines
2.2 KiB
Go
98 lines
2.2 KiB
Go
// SPDX-License-Identifier: Unlicense OR MIT
|
|
|
|
package layout
|
|
|
|
import (
|
|
"image"
|
|
"time"
|
|
|
|
"gioui.org/io/event"
|
|
"gioui.org/io/system"
|
|
"gioui.org/op"
|
|
"gioui.org/unit"
|
|
)
|
|
|
|
// Context carries the state needed by almost all layouts and widgets.
|
|
// A zero value Context never returns events, map units to pixels
|
|
// with a scale of 1.0, and returns the zero time from Now.
|
|
type Context struct {
|
|
// Constraints track the constraints for the active widget or
|
|
// layout.
|
|
Constraints Constraints
|
|
|
|
Metric unit.Metric
|
|
// By convention, a nil Queue is a signal to widgets to draw themselves
|
|
// in a disabled state.
|
|
Queue event.Queue
|
|
// Now is the animation time.
|
|
Now time.Time
|
|
|
|
// Locale provides information on the system's language preferences.
|
|
// BUG(whereswaldon): this field is not currently populated automatically.
|
|
// Interested users must look up and populate these values manually.
|
|
Locale system.Locale
|
|
|
|
*op.Ops
|
|
}
|
|
|
|
// NewContext is a shorthand for
|
|
//
|
|
// Context{
|
|
// Ops: ops,
|
|
// Now: e.Now,
|
|
// Queue: e.Queue,
|
|
// Config: e.Config,
|
|
// Constraints: Exact(e.Size),
|
|
// }
|
|
//
|
|
// NewContext calls ops.Reset and adjusts ops for e.Insets.
|
|
func NewContext(ops *op.Ops, e system.FrameEvent) Context {
|
|
ops.Reset()
|
|
|
|
size := e.Size
|
|
|
|
if e.Insets != (system.Insets{}) {
|
|
left := e.Metric.Px(e.Insets.Left)
|
|
top := e.Metric.Px(e.Insets.Top)
|
|
op.Offset(image.Point{
|
|
X: left,
|
|
Y: top,
|
|
}).Add(ops)
|
|
|
|
size.X -= left + e.Metric.Px(e.Insets.Right)
|
|
size.Y -= top + e.Metric.Px(e.Insets.Bottom)
|
|
}
|
|
|
|
return Context{
|
|
Ops: ops,
|
|
Now: e.Now,
|
|
Queue: e.Queue,
|
|
Metric: e.Metric,
|
|
Constraints: Exact(size),
|
|
}
|
|
}
|
|
|
|
// Px maps the value to pixels.
|
|
func (c Context) Px(v unit.Value) int {
|
|
return c.Metric.Px(v)
|
|
}
|
|
|
|
// Events returns the events available for the key. If no
|
|
// queue is configured, Events returns nil.
|
|
func (c Context) Events(k event.Tag) []event.Event {
|
|
if c.Queue == nil {
|
|
return nil
|
|
}
|
|
return c.Queue.Events(k)
|
|
}
|
|
|
|
// Disabled returns a copy of this context with a nil Queue,
|
|
// blocking events to widgets using it.
|
|
//
|
|
// By convention, a nil Queue is a signal to widgets to draw themselves
|
|
// in a disabled state.
|
|
func (c Context) Disabled() Context {
|
|
c.Queue = nil
|
|
return c
|
|
}
|