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) if barWidth == 0 { barWidth = 1 } bar := ebiten.NewImage(barWidth, tb.Height) bar.Fill(tb.fg) op := ebiten.DrawImageOptions{} img.DrawImage(bar, &op) return img }