random-apps/windowEnterTime.go

82 lines
2 KiB
Go
Raw Normal View History

2025-02-03 07:22:01 +00:00
package main
import (
"gioui.org/app"
"gioui.org/io/event"
"gioui.org/layout"
"gioui.org/op"
"gioui.org/widget"
"gioui.org/widget/material"
"git.mstar.dev/mstar/goutils/other"
"github.com/rs/zerolog/log"
)
type StateEnterTime struct {
initialSetupDone bool
editor *widget.Editor
inputField *material.EditorStyle
ops op.Ops
}
func (s *StateEnterTime) initialSetup(globalState *GlobalState) {
s.editor = &widget.Editor{
SingleLine: true,
Submit: true,
Filter: "01234567890TZ+-:",
}
field := material.Editor(globalState.Theme, s.editor, "timestamp")
s.inputField = &field
s.initialSetupDone = true
}
func (s *StateEnterTime) Run(globalState *GlobalState, event event.Event) NewState {
if !s.initialSetupDone {
s.initialSetup(globalState)
}
switch event := event.(type) {
case app.FrameEvent:
return s.handleFrameEvent(globalState, &event)
case app.DestroyEvent:
return s.handleQuitEvent()
case app.WaylandViewEvent, app.X11ViewEvent:
return EmptyEvent()
default:
log.Debug().Any("event", event).Type("type", event).Msg("Unknown event")
return NewState{}
}
}
func (s *StateEnterTime) handleFrameEvent(
globalState *GlobalState,
frameEvent *app.FrameEvent,
) NewState {
gtx := app.NewContext(&s.ops, *frameEvent)
for ev, ok := s.editor.Update(gtx); ok; ev, ok = s.editor.Update(gtx) {
log.Debug().Any("Editor event", ev).Send()
}
label := material.H3(globalState.Theme, "Enter timestamp")
hint := material.Subtitle1(
globalState.Theme,
"Format: <YYYY>-<MM>-<DD>T<hh>:<mm>:<ss>(Z|+<TZ>)",
)
list := layout.List{Axis: layout.Vertical}
list.Layout(gtx, 3, func(gtx layout.Context, index int) layout.Dimensions {
switch index {
case 0:
return label.Layout(gtx)
case 1:
return hint.Layout(gtx)
case 2:
return s.inputField.Layout(gtx)
default:
return hint.Layout(gtx)
}
})
frameEvent.Frame(&s.ops)
return NewState{}
}
func (s *StateEnterTime) handleQuitEvent() NewState {
return NewState{ExitCode: other.IntoPointer(0)}
}