mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-02 07:57:29 +00:00
widget: [API] separate Float state update; remove min, max, invert parameters
This change allows users of Float to determine its state before Layout by calling Update. While here, remove the value transformation represented by the min, max, invert parameters; they're too many arguments for a computation that may as well be done by the user. Remove Float.Pos; it is better to compute its value from the dimensions returned by Float.Layout. Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
+17
-20
@@ -16,10 +16,8 @@ import (
|
||||
)
|
||||
|
||||
// Slider is for selecting a value in a range.
|
||||
func Slider(th *Theme, float *widget.Float, min, max float32) SliderStyle {
|
||||
func Slider(th *Theme, float *widget.Float) SliderStyle {
|
||||
return SliderStyle{
|
||||
Min: min,
|
||||
Max: max,
|
||||
Color: th.Palette.ContrastBg,
|
||||
Float: float,
|
||||
FingerSize: th.FingerSize,
|
||||
@@ -27,35 +25,34 @@ func Slider(th *Theme, float *widget.Float, min, max float32) SliderStyle {
|
||||
}
|
||||
|
||||
type SliderStyle struct {
|
||||
Axis layout.Axis
|
||||
Min, Max float32
|
||||
Invert bool
|
||||
Color color.NRGBA
|
||||
Float *widget.Float
|
||||
Axis layout.Axis
|
||||
Color color.NRGBA
|
||||
Float *widget.Float
|
||||
|
||||
FingerSize unit.Dp
|
||||
}
|
||||
|
||||
func (s SliderStyle) Layout(gtx layout.Context) layout.Dimensions {
|
||||
thumbRadius := gtx.Dp(6)
|
||||
const thumbRadius unit.Dp = 6
|
||||
tr := gtx.Dp(thumbRadius)
|
||||
trackWidth := gtx.Dp(2)
|
||||
|
||||
axis := s.Axis
|
||||
// Keep a minimum length so that the track is always visible.
|
||||
minLength := thumbRadius + 3*thumbRadius + thumbRadius
|
||||
minLength := tr + 3*tr + tr
|
||||
// Try to expand to finger size, but only if the constraints
|
||||
// allow for it.
|
||||
touchSizePx := min(gtx.Dp(s.FingerSize), axis.Convert(gtx.Constraints.Max).Y)
|
||||
sizeMain := max(axis.Convert(gtx.Constraints.Min).X, minLength)
|
||||
sizeCross := max(2*thumbRadius, touchSizePx)
|
||||
sizeCross := max(2*tr, touchSizePx)
|
||||
size := axis.Convert(image.Pt(sizeMain, sizeCross))
|
||||
|
||||
o := axis.Convert(image.Pt(thumbRadius, 0))
|
||||
o := axis.Convert(image.Pt(tr, 0))
|
||||
trans := op.Offset(o).Push(gtx.Ops)
|
||||
gtx.Constraints.Min = axis.Convert(image.Pt(sizeMain-2*thumbRadius, sizeCross))
|
||||
s.Float.Layout(gtx, axis, s.Min, s.Max, s.Invert, thumbRadius)
|
||||
gtx.Constraints.Min = axis.Convert(image.Pt(sizeMain-2*tr, sizeCross))
|
||||
dims := s.Float.Layout(gtx, axis, thumbRadius)
|
||||
gtx.Constraints.Min = gtx.Constraints.Min.Add(axis.Convert(image.Pt(0, sizeCross)))
|
||||
thumbPos := thumbRadius + int(s.Float.Pos())
|
||||
thumbPos := tr + int(s.Float.Value*float32(axis.Convert(dims.Size).X))
|
||||
trans.Pop()
|
||||
|
||||
color := s.Color
|
||||
@@ -65,7 +62,7 @@ func (s SliderStyle) Layout(gtx layout.Context) layout.Dimensions {
|
||||
|
||||
rect := func(minx, miny, maxx, maxy int) image.Rectangle {
|
||||
r := image.Rect(minx, miny, maxx, maxy)
|
||||
if s.Invert != (axis == layout.Vertical) {
|
||||
if axis == layout.Vertical {
|
||||
r.Max.X, r.Min.X = sizeMain-r.Min.X, sizeMain-r.Max.X
|
||||
}
|
||||
r.Min = axis.Convert(r.Min)
|
||||
@@ -75,7 +72,7 @@ func (s SliderStyle) Layout(gtx layout.Context) layout.Dimensions {
|
||||
|
||||
// Draw track before thumb.
|
||||
track := rect(
|
||||
thumbRadius, sizeCross/2-trackWidth/2,
|
||||
tr, sizeCross/2-trackWidth/2,
|
||||
thumbPos, sizeCross/2+trackWidth/2,
|
||||
)
|
||||
paint.FillShape(gtx.Ops, color, clip.Rect(track).Op())
|
||||
@@ -83,15 +80,15 @@ func (s SliderStyle) Layout(gtx layout.Context) layout.Dimensions {
|
||||
// Draw track after thumb.
|
||||
track = rect(
|
||||
thumbPos, axis.Convert(track.Min).Y,
|
||||
sizeMain-thumbRadius, axis.Convert(track.Max).Y,
|
||||
sizeMain-tr, axis.Convert(track.Max).Y,
|
||||
)
|
||||
paint.FillShape(gtx.Ops, f32color.MulAlpha(color, 96), clip.Rect(track).Op())
|
||||
|
||||
// Draw thumb.
|
||||
pt := image.Pt(thumbPos, sizeCross/2)
|
||||
thumb := rect(
|
||||
pt.X-thumbRadius, pt.Y-thumbRadius,
|
||||
pt.X+thumbRadius, pt.Y+thumbRadius,
|
||||
pt.X-tr, pt.Y-tr,
|
||||
pt.X+tr, pt.Y+tr,
|
||||
)
|
||||
paint.FillShape(gtx.Ops, color, clip.Ellipse(thumb).Op(gtx.Ops))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user