81 lines
2 KiB
Go
81 lines
2 KiB
Go
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)}
|
|
}
|