mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-01 15:45:38 +00:00
2782436ffc
Almost every layout and widget need the ui.Config for its environment, an ui.Ops to store operations. Stateful widgets need an input.Queue for events. Add all these common objects to Context, greatly simplifying the function signatures for Gio programs. Fixes gio#33 Signed-off-by: Elias Naur <mail@eliasnaur.com>
55 lines
1.3 KiB
Go
55 lines
1.3 KiB
Go
// SPDX-License-Identifier: Unlicense OR MIT
|
|
|
|
// Package widget implements common widgets.
|
|
package widget
|
|
|
|
import (
|
|
"image"
|
|
|
|
"gioui.org/ui"
|
|
"gioui.org/ui/f32"
|
|
"gioui.org/ui/layout"
|
|
"gioui.org/ui/paint"
|
|
)
|
|
|
|
// Image is a widget that displays an image.
|
|
type Image struct {
|
|
// Src is the image to display.
|
|
Src image.Image
|
|
// Rect is the source rectangle.
|
|
Rect image.Rectangle
|
|
// Scale is the ratio of image pixels to
|
|
// device pixels. If zero, a scale that
|
|
// makes the image appear at approximately
|
|
// 72 DPI is used.
|
|
Scale float32
|
|
}
|
|
|
|
func (im Image) Layout(c *layout.Context) {
|
|
size := im.Src.Bounds()
|
|
wf, hf := float32(size.Dx()), float32(size.Dy())
|
|
var w, h int
|
|
if im.Scale == 0 {
|
|
const dpPrPx = 160 / 72
|
|
w, h = c.Px(ui.Dp(wf*dpPrPx)), c.Px(ui.Dp(hf*dpPrPx))
|
|
} else {
|
|
w, h = int(wf*im.Scale+.5), int(hf*im.Scale+.5)
|
|
}
|
|
cs := c.Constraints
|
|
d := image.Point{X: cs.Width.Constrain(w), Y: cs.Height.Constrain(h)}
|
|
aspect := float32(w) / float32(h)
|
|
dw, dh := float32(d.X), float32(d.Y)
|
|
dAspect := dw / dh
|
|
if aspect < dAspect {
|
|
d.X = int(dh*aspect + 0.5)
|
|
} else {
|
|
d.Y = int(dw/aspect + 0.5)
|
|
}
|
|
dr := f32.Rectangle{
|
|
Max: f32.Point{X: float32(d.X), Y: float32(d.Y)},
|
|
}
|
|
paint.ImageOp{Src: im.Src, Rect: im.Rect}.Add(c.Ops)
|
|
paint.PaintOp{Rect: dr}.Add(c.Ops)
|
|
c.Dimensions = layout.Dimensions{Size: d, Baseline: d.Y}
|
|
}
|