mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-01 23:55:39 +00:00
b39d1bdac7
Before this change, a radio button with the empty key ("") would be
displayed as hovering if no other button were.
It's still not possible to have no radio buttons selected when one of
them is the empty key. If that's becomes necessary, Enum.Value can be
converted to a *string.
Signed-off-by: Elias Naur <mail@eliasnaur.com>
78 lines
1.5 KiB
Go
78 lines
1.5 KiB
Go
package widget
|
|
|
|
import (
|
|
"image"
|
|
|
|
"gioui.org/gesture"
|
|
"gioui.org/io/pointer"
|
|
"gioui.org/layout"
|
|
"gioui.org/op"
|
|
)
|
|
|
|
type Enum struct {
|
|
Value string
|
|
hovered string
|
|
hovering bool
|
|
|
|
changed bool
|
|
|
|
clicks []gesture.Click
|
|
values []string
|
|
}
|
|
|
|
func index(vs []string, t string) int {
|
|
for i, v := range vs {
|
|
if v == t {
|
|
return i
|
|
}
|
|
}
|
|
return -1
|
|
}
|
|
|
|
// Changed reports whether Value has changed by user interaction since the last
|
|
// call to Changed.
|
|
func (e *Enum) Changed() bool {
|
|
changed := e.changed
|
|
e.changed = false
|
|
return changed
|
|
}
|
|
|
|
// Hovered returns the key that is highlighted, or false if none are.
|
|
func (e *Enum) Hovered() (string, bool) {
|
|
return e.hovered, e.hovering
|
|
}
|
|
|
|
// Layout adds the event handler for key.
|
|
func (e *Enum) Layout(gtx layout.Context, key string) layout.Dimensions {
|
|
defer op.Save(gtx.Ops).Load()
|
|
pointer.Rect(image.Rectangle{Max: gtx.Constraints.Min}).Add(gtx.Ops)
|
|
|
|
if index(e.values, key) == -1 {
|
|
e.values = append(e.values, key)
|
|
e.clicks = append(e.clicks, gesture.Click{})
|
|
e.clicks[len(e.clicks)-1].Add(gtx.Ops)
|
|
} else {
|
|
idx := index(e.values, key)
|
|
clk := &e.clicks[idx]
|
|
for _, ev := range clk.Events(gtx) {
|
|
switch ev.Type {
|
|
case gesture.TypeClick:
|
|
if new := e.values[idx]; new != e.Value {
|
|
e.Value = new
|
|
e.changed = true
|
|
}
|
|
}
|
|
}
|
|
if e.hovering && e.hovered == key {
|
|
e.hovering = false
|
|
}
|
|
if clk.Hovered() {
|
|
e.hovered = key
|
|
e.hovering = true
|
|
}
|
|
clk.Add(gtx.Ops)
|
|
}
|
|
|
|
return layout.Dimensions{Size: gtx.Constraints.Min}
|
|
}
|