forked from joejulian/gio
4a4fe5a69b
Before this change, Clickable state updates would happen in Layout. However, that is too late in cases where clicks affects layout that contiains the Clickable. This change removes state changes from Layout and moves them to Clicks, to allow users pre-layout access. Note that Layout itself processes events, which means users can no longer access clicks after Layout. Signed-off-by: Elias Naur <mail@eliasnaur.com>
57 lines
1.1 KiB
Go
57 lines
1.1 KiB
Go
// SPDX-License-Identifier: Unlicense OR MIT
|
|
|
|
package widget
|
|
|
|
import (
|
|
"gioui.org/io/semantic"
|
|
"gioui.org/layout"
|
|
)
|
|
|
|
type Bool struct {
|
|
Value bool
|
|
|
|
clk Clickable
|
|
|
|
changed bool
|
|
}
|
|
|
|
// Changed reports whether Value has changed since the last
|
|
// call to Changed.
|
|
func (b *Bool) Changed() bool {
|
|
changed := b.changed
|
|
b.changed = false
|
|
return changed
|
|
}
|
|
|
|
// Hovered reports whether pointer is over the element.
|
|
func (b *Bool) Hovered() bool {
|
|
return b.clk.Hovered()
|
|
}
|
|
|
|
// Pressed reports whether pointer is pressing the element.
|
|
func (b *Bool) Pressed() bool {
|
|
return b.clk.Pressed()
|
|
}
|
|
|
|
// Focused reports whether b has focus.
|
|
func (b *Bool) Focused() bool {
|
|
return b.clk.Focused()
|
|
}
|
|
|
|
func (b *Bool) History() []Press {
|
|
return b.clk.History()
|
|
}
|
|
|
|
func (b *Bool) Layout(gtx layout.Context, w layout.Widget) layout.Dimensions {
|
|
for b.clk.Clicked(gtx) {
|
|
b.Value = !b.Value
|
|
b.changed = true
|
|
}
|
|
dims := b.clk.Layout(gtx, func(gtx layout.Context) layout.Dimensions {
|
|
semantic.SelectedOp(b.Value).Add(gtx.Ops)
|
|
semantic.EnabledOp(gtx.Queue != nil).Add(gtx.Ops)
|
|
return w(gtx)
|
|
})
|
|
return dims
|
|
}
|