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: --
T::(Z|+)", ) 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)} }