mirror of
https://github.com/vsariola/sointu.git
synced 2025-07-19 13:34:34 -04:00
feat(tracker/gioui): switches just clickable & cycle between states
This commit is contained in:
parent
452a4cf04f
commit
8e5f3098a4
@ -164,29 +164,6 @@ func (p ParamWidget) Layout(gtx C) D {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *ParamState) update(gtx C, param tracker.Parameter, scroll bool) {
|
func (s *ParamState) update(gtx C, param tracker.Parameter, scroll bool) {
|
||||||
for {
|
|
||||||
p, ok := s.drag.Update(gtx.Metric, gtx.Source, gesture.Both)
|
|
||||||
if !ok {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
switch p.Kind {
|
|
||||||
case pointer.Press:
|
|
||||||
s.dragStartPt = p.Position
|
|
||||||
s.dragStartVal = param.Value()
|
|
||||||
case pointer.Drag:
|
|
||||||
// update the value based on the drag amount
|
|
||||||
m := param.Range()
|
|
||||||
d := p.Position.Sub(s.dragStartPt)
|
|
||||||
speed := gtx.Dp(512)
|
|
||||||
if p.Modifiers.Contain(key.ModCtrl) {
|
|
||||||
speed = gtx.Dp(128)
|
|
||||||
}
|
|
||||||
amount := float32(d.X-d.Y) / float32(speed)
|
|
||||||
newValue := int(float32(s.dragStartVal) + amount*float32(m.Max-m.Min))
|
|
||||||
param.SetValue(newValue)
|
|
||||||
s.tipArea.Appear(gtx.Now)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for scroll {
|
for scroll {
|
||||||
e, ok := gtx.Event(pointer.Filter{
|
e, ok := gtx.Event(pointer.Filter{
|
||||||
Target: s,
|
Target: s,
|
||||||
@ -223,6 +200,29 @@ func Knob(v tracker.Parameter, th *Theme, state *ParamState, hint string, scroll
|
|||||||
|
|
||||||
func (k *KnobWidget) Layout(gtx C) D {
|
func (k *KnobWidget) Layout(gtx C) D {
|
||||||
k.State.update(gtx, k.Value, k.Scroll)
|
k.State.update(gtx, k.Value, k.Scroll)
|
||||||
|
for {
|
||||||
|
p, ok := k.State.drag.Update(gtx.Metric, gtx.Source, gesture.Both)
|
||||||
|
if !ok {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
switch p.Kind {
|
||||||
|
case pointer.Press:
|
||||||
|
k.State.dragStartPt = p.Position
|
||||||
|
k.State.dragStartVal = k.Value.Value()
|
||||||
|
case pointer.Drag:
|
||||||
|
// update the value based on the drag amount
|
||||||
|
m := k.Value.Range()
|
||||||
|
d := p.Position.Sub(k.State.dragStartPt)
|
||||||
|
speed := gtx.Dp(512)
|
||||||
|
if p.Modifiers.Contain(key.ModCtrl) {
|
||||||
|
speed = gtx.Dp(128)
|
||||||
|
}
|
||||||
|
amount := float32(d.X-d.Y) / float32(speed)
|
||||||
|
newValue := int(float32(k.State.dragStartVal) + amount*float32(m.Max-m.Min))
|
||||||
|
k.Value.SetValue(newValue)
|
||||||
|
k.State.tipArea.Appear(gtx.Now)
|
||||||
|
}
|
||||||
|
}
|
||||||
for k.Scroll {
|
for k.Scroll {
|
||||||
ev, ok := gtx.Event(pointer.Filter{Target: k.State, Kinds: pointer.Press})
|
ev, ok := gtx.Event(pointer.Filter{Target: k.State, Kinds: pointer.Press})
|
||||||
if !ok {
|
if !ok {
|
||||||
@ -346,21 +346,19 @@ func (s *SwitchWidget) Layout(gtx C) D {
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
if pe, ok := ev.(pointer.Event); ok && pe.Kind == pointer.Press {
|
if pe, ok := ev.(pointer.Event); ok && pe.Kind == pointer.Press {
|
||||||
curVal := s.Value.Value()
|
delta := 0
|
||||||
if pe.Buttons == pointer.ButtonPrimary {
|
if pe.Buttons == pointer.ButtonPrimary {
|
||||||
if curVal >= 1 {
|
delta = 1
|
||||||
s.Value.SetValue(0)
|
|
||||||
} else {
|
|
||||||
s.Value.SetValue(curVal + 1)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if pe.Buttons == pointer.ButtonSecondary {
|
if pe.Buttons == pointer.ButtonSecondary {
|
||||||
if curVal <= -1 {
|
delta = -1
|
||||||
s.Value.SetValue(0)
|
|
||||||
} else {
|
|
||||||
s.Value.SetValue(curVal - 1)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
r := s.Value.Range()
|
||||||
|
if r.Max < r.Min {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
newVal := mod(s.Value.Value()+delta-r.Min, r.Max-r.Min+1) + r.Min
|
||||||
|
s.Value.SetValue(newVal)
|
||||||
s.State.tipArea.Appear(gtx.Now)
|
s.State.tipArea.Appear(gtx.Now)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user