mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-01 15:45:38 +00:00
cd2ade0583
This change adds focus and keyboard control to Clickable widgets. They now consider a press of the enter or return key equivalent to a click. To keep the change simple, the focus indication is the same as the hover indication. References: https://todo.sr.ht/~eliasnaur/gio/195 References: https://github.com/tailscale/tailscale/issues/1611 Signed-off-by: Elias Naur <mail@eliasnaur.com>
48 lines
1.3 KiB
Go
48 lines
1.3 KiB
Go
// SPDX-License-Identifier: Unlicense OR MIT
|
|
|
|
package material
|
|
|
|
import (
|
|
"gioui.org/io/semantic"
|
|
"gioui.org/layout"
|
|
"gioui.org/unit"
|
|
"gioui.org/widget"
|
|
)
|
|
|
|
type RadioButtonStyle struct {
|
|
checkable
|
|
Key string
|
|
Group *widget.Enum
|
|
}
|
|
|
|
// RadioButton returns a RadioButton with a label. The key specifies
|
|
// the value for the Enum.
|
|
func RadioButton(th *Theme, group *widget.Enum, key, label string) RadioButtonStyle {
|
|
return RadioButtonStyle{
|
|
Group: group,
|
|
checkable: checkable{
|
|
Label: label,
|
|
|
|
Color: th.Palette.Fg,
|
|
IconColor: th.Palette.ContrastBg,
|
|
TextSize: th.TextSize.Scale(14.0 / 16.0),
|
|
Size: unit.Dp(26),
|
|
shaper: th.Shaper,
|
|
checkedStateIcon: th.Icon.RadioChecked,
|
|
uncheckedStateIcon: th.Icon.RadioUnchecked,
|
|
},
|
|
Key: key,
|
|
}
|
|
}
|
|
|
|
// Layout updates enum and displays the radio button.
|
|
func (r RadioButtonStyle) Layout(gtx layout.Context) layout.Dimensions {
|
|
hovered, hovering := r.Group.Hovered()
|
|
focus, focused := r.Group.Focused()
|
|
return r.Group.Layout(gtx, r.Key, func(gtx layout.Context) layout.Dimensions {
|
|
semantic.RadioButton.Add(gtx.Ops)
|
|
highlight := hovering && hovered == r.Key || focused && focus == r.Key
|
|
return r.layout(gtx, r.Group.Value == r.Key, highlight)
|
|
})
|
|
}
|