aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--go/ui/timerBar.go61
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
+}