diff options
| -rw-r--r-- | go/ui/timerBar.go | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/go/ui/timerBar.go b/go/ui/timerBar.go new file mode 100644 index 00000000..2549f863 --- /dev/null +++ b/go/ui/timerBar.go @@ -0,0 +1,61 @@ +package ui + +import ( + "image/color" + "time" + + "github.com/hajimehoshi/ebiten/v2" +) + +var ( + TIMERBAR_DEFAULT_BACKGROUND = color.Black + TIMERBAR_DEFAULT_FOREGROUND = color.White +) + +type TimerBar struct { + WidgetBase + fg color.Color + bg color.Color + start time.Time + deadline time.Time +} + +func NewTimerBar(x, y int, width, height int, timer time.Duration) *TimerBar { + tb := &TimerBar{ + WidgetBase: NewWidgetBase(x, y, width, height), + bg: TEXTBOX_DEFAULT_BACKGROUND, + fg: TEXTBOX_DEFAULT_FOREGROUND, + start: time.Now(), + deadline: time.Now().Add(timer), + } + tb.renderImpl = func() *ebiten.Image { return tb.render() } + tb.EventHandlersMap["update"] = func() error { + if time.Now().Before(tb.deadline) { + tb.ForceRedraw() + } + return nil + } + return tb +} + +func (tb *TimerBar) Bg(bg color.Color) *TimerBar { + tb.bg = bg + return tb +} + +func (tb *TimerBar) Fg(fg color.Color) *TimerBar { + tb.fg = fg + return tb +} + +func (tb *TimerBar) render() *ebiten.Image { + img := ebiten.NewImage(tb.Width, tb.Height) + img.Fill(tb.bg) + fraction := float64(time.Since(tb.start)) / float64(tb.deadline.Sub(tb.start)) + barWidth := int(float64(tb.Width) * fraction) + bar := ebiten.NewImage(barWidth, tb.Height) + bar.Fill(tb.fg) + op := ebiten.DrawImageOptions{} + img.DrawImage(bar, &op) + return img +} |
