mirror of
https://github.com/vsariola/sointu.git
synced 2025-07-18 21:14:31 -04:00
refactor(gioui): update gioui to v0.5.0
This commit is contained in:
parent
267973e061
commit
1c020fffa3
@ -1,6 +1,7 @@
|
||||
package gioui
|
||||
|
||||
import (
|
||||
"gioui.org/io/event"
|
||||
"gioui.org/io/key"
|
||||
"gioui.org/layout"
|
||||
"gioui.org/op/paint"
|
||||
@ -11,10 +12,11 @@ import (
|
||||
)
|
||||
|
||||
type Dialog struct {
|
||||
BtnAlt *ActionClickable
|
||||
BtnOk *ActionClickable
|
||||
BtnCancel *ActionClickable
|
||||
tag bool
|
||||
BtnAlt *ActionClickable
|
||||
BtnOk *ActionClickable
|
||||
BtnCancel *ActionClickable
|
||||
tag bool
|
||||
keyFilters []event.Filter
|
||||
}
|
||||
|
||||
type DialogStyle struct {
|
||||
@ -30,45 +32,77 @@ type DialogStyle struct {
|
||||
}
|
||||
|
||||
func NewDialog(ok, alt, cancel tracker.Action) *Dialog {
|
||||
return &Dialog{
|
||||
ret := &Dialog{
|
||||
BtnOk: NewActionClickable(ok),
|
||||
BtnAlt: NewActionClickable(alt),
|
||||
BtnCancel: NewActionClickable(cancel),
|
||||
}
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
func ConfirmDialog(th *material.Theme, dialog *Dialog, title, text string) DialogStyle {
|
||||
func ConfirmDialog(gtx C, th *material.Theme, dialog *Dialog, title, text string) DialogStyle {
|
||||
ret := DialogStyle{
|
||||
dialog: dialog,
|
||||
Title: title,
|
||||
Text: text,
|
||||
Inset: layout.Inset{Top: unit.Dp(12), Bottom: unit.Dp(12), Left: unit.Dp(20), Right: unit.Dp(20)},
|
||||
TextInset: layout.Inset{Top: unit.Dp(12), Bottom: unit.Dp(12)},
|
||||
AltStyle: ActionButton(th, dialog.BtnAlt, "Alt"),
|
||||
OkStyle: ActionButton(th, dialog.BtnOk, "Ok"),
|
||||
CancelStyle: ActionButton(th, dialog.BtnCancel, "Cancel"),
|
||||
AltStyle: ActionButton(gtx, th, dialog.BtnAlt, "Alt"),
|
||||
OkStyle: ActionButton(gtx, th, dialog.BtnOk, "Ok"),
|
||||
CancelStyle: ActionButton(gtx, th, dialog.BtnCancel, "Cancel"),
|
||||
Shaper: th.Shaper,
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
func (d *DialogStyle) Layout(gtx C) D {
|
||||
if !d.dialog.BtnOk.Clickable.Focused() && !d.dialog.BtnCancel.Clickable.Focused() && !d.dialog.BtnAlt.Clickable.Focused() {
|
||||
d.dialog.BtnCancel.Clickable.Focus()
|
||||
func (d *Dialog) handleKeysForButton(gtx C, btn, next, prev *ActionClickable) {
|
||||
for {
|
||||
e, ok := gtx.Event(
|
||||
key.Filter{Focus: &btn.Clickable, Name: key.NameLeftArrow},
|
||||
key.Filter{Focus: &btn.Clickable, Name: key.NameRightArrow},
|
||||
key.Filter{Focus: &btn.Clickable, Name: key.NameEscape},
|
||||
key.Filter{Focus: &btn.Clickable, Name: key.NameTab, Optional: key.ModShift},
|
||||
)
|
||||
if !ok {
|
||||
break
|
||||
}
|
||||
if e, ok := e.(key.Event); ok && e.State == key.Press {
|
||||
switch {
|
||||
case e.Name == key.NameLeftArrow || (e.Name == key.NameTab && e.Modifiers.Contain(key.ModShift)):
|
||||
gtx.Execute(key.FocusCmd{Tag: &prev.Clickable})
|
||||
case e.Name == key.NameRightArrow || (e.Name == key.NameTab && !e.Modifiers.Contain(key.ModShift)):
|
||||
gtx.Execute(key.FocusCmd{Tag: &next.Clickable})
|
||||
case e.Name == key.NameEscape:
|
||||
d.BtnCancel.Action.Do()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (d *Dialog) handleKeys(gtx C) {
|
||||
if d.BtnAlt.Action.Allowed() {
|
||||
d.handleKeysForButton(gtx, d.BtnAlt, d.BtnCancel, d.BtnOk)
|
||||
d.handleKeysForButton(gtx, d.BtnCancel, d.BtnOk, d.BtnAlt)
|
||||
d.handleKeysForButton(gtx, d.BtnOk, d.BtnAlt, d.BtnCancel)
|
||||
} else {
|
||||
d.handleKeysForButton(gtx, d.BtnOk, d.BtnCancel, d.BtnCancel)
|
||||
d.handleKeysForButton(gtx, d.BtnCancel, d.BtnOk, d.BtnOk)
|
||||
}
|
||||
}
|
||||
|
||||
func (d *DialogStyle) Layout(gtx C) D {
|
||||
if !gtx.Source.Focused(&d.dialog.BtnOk.Clickable) && !gtx.Source.Focused(&d.dialog.BtnCancel.Clickable) && !gtx.Source.Focused(&d.dialog.BtnAlt.Clickable) {
|
||||
gtx.Execute(key.FocusCmd{Tag: &d.dialog.BtnCancel.Clickable})
|
||||
}
|
||||
d.dialog.handleKeys(gtx)
|
||||
paint.Fill(gtx.Ops, dialogBgColor)
|
||||
text := func(gtx C) D {
|
||||
return d.TextInset.Layout(gtx, LabelStyle{Text: d.Text, Color: highEmphasisTextColor, Font: labelDefaultFont, FontSize: unit.Sp(14), Shaper: d.Shaper}.Layout)
|
||||
}
|
||||
for _, e := range gtx.Events(&d.dialog.tag) {
|
||||
if e, ok := e.(key.Event); ok && e.State == key.Press {
|
||||
d.command(e)
|
||||
}
|
||||
}
|
||||
visible := true
|
||||
return layout.Center.Layout(gtx, func(gtx C) D {
|
||||
return Popup(&visible).Layout(gtx, func(gtx C) D {
|
||||
key.InputOp{Tag: &d.dialog.tag, Keys: "⎋|←|→|Tab"}.Add(gtx.Ops)
|
||||
return d.Inset.Layout(gtx, func(gtx C) D {
|
||||
return layout.Flex{Axis: layout.Vertical, Alignment: layout.Middle}.Layout(gtx,
|
||||
layout.Rigid(Label(d.Title, highEmphasisTextColor, d.Shaper)),
|
||||
@ -94,36 +128,3 @@ func (d *DialogStyle) Layout(gtx C) D {
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
func (d *DialogStyle) command(e key.Event) {
|
||||
switch e.Name {
|
||||
case key.NameEscape:
|
||||
d.dialog.BtnCancel.Action.Do()
|
||||
case key.NameLeftArrow:
|
||||
switch {
|
||||
case d.dialog.BtnOk.Clickable.Focused():
|
||||
d.dialog.BtnCancel.Clickable.Focus()
|
||||
case d.dialog.BtnCancel.Clickable.Focused():
|
||||
if d.dialog.BtnAlt.Action.Allowed() {
|
||||
d.dialog.BtnAlt.Clickable.Focus()
|
||||
} else {
|
||||
d.dialog.BtnOk.Clickable.Focus()
|
||||
}
|
||||
case d.dialog.BtnAlt.Clickable.Focused():
|
||||
d.dialog.BtnOk.Clickable.Focus()
|
||||
}
|
||||
case key.NameRightArrow, key.NameTab:
|
||||
switch {
|
||||
case d.dialog.BtnOk.Clickable.Focused():
|
||||
if d.dialog.BtnAlt.Action.Allowed() {
|
||||
d.dialog.BtnAlt.Clickable.Focus()
|
||||
} else {
|
||||
d.dialog.BtnCancel.Clickable.Focus()
|
||||
}
|
||||
case d.dialog.BtnCancel.Clickable.Focused():
|
||||
d.dialog.BtnOk.Clickable.Focus()
|
||||
case d.dialog.BtnAlt.Clickable.Focused():
|
||||
d.dialog.BtnCancel.Clickable.Focus()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user