package hud import ( "github.com/chompy/roguelike_rpg/internal/client/gfx" "github.com/chompy/roguelike_rpg/internal/util" "github.com/hajimehoshi/ebiten/v2" ) type MenuListStyle int const ( MenuListStyleNormal MenuListStyle = iota MenuListStyleButtons MenuListStyle2RowButtons ) type Menu struct { BaseElement Style MenuListStyle Active bool items []*ebiten.Image index int gfx *gfx.Context locale util.Locale } func NewMenuList(gfx *gfx.Context, locale util.Locale) (*Menu, error) { return &Menu{ Style: MenuListStyleNormal, Active: true, items: nil, index: 0, gfx: gfx, locale: locale, }, nil } func (m *Menu) Reset() { m.items = make([]*ebiten.Image, 0) m.index = 0 } func (m *Menu) Add(label string) error { translatedLabel := m.locale.Get(label) switch m.Style { case MenuListStyleButtons, MenuListStyle2RowButtons: image, err := RenderButton(m.gfx, translatedLabel) if err != nil { return err } m.items = append(m.items, image) default: sprite, _ := m.gfx.SpriteLibrary.GetOne("hud." + label) var icon *ebiten.Image = nil if sprite != nil { icon = sprite.GetAnimationFrame(0) } image, err := RenderLabelWithIcon(m.gfx, translatedLabel, icon) if err != nil { return err } m.items = append(m.items, image) } return nil } func (m *Menu) Index() int { return m.index } func (m *Menu) SetIndex(index int) { m.index = max(0, min(len(m.items)-1, index)) } func (m *Menu) Input(input HudInput) { switch input { case InputUp: m.SetIndex(m.index - 1) case InputDown: m.SetIndex(m.index + 1) } } func (m *Menu) Draw(time float32, screen *ebiten.Image) { if len(m.items) == 0 { return } y := 0 for i, image := range m.items { imageSize := image.Bounds().Size() op := &ebiten.DrawImageOptions{} op.GeoM.Translate(float64(m.X), float64(m.Y+y)) if !m.Active { op.ColorScale.ScaleAlpha(.25) } else if m.index != i { op.ColorScale.ScaleAlpha(.5) } screen.DrawImage(image, op) y += imageSize.Y } }