Skip to content

Instantly share code, notes, and snippets.

@Capital-EX
Created March 4, 2024 05:30
Show Gist options
  • Save Capital-EX/23d0780ab024dfabb37af9264206f257 to your computer and use it in GitHub Desktop.
Save Capital-EX/23d0780ab024dfabb37af9264206f257 to your computer and use it in GitHub Desktop.
package main
// An attempt to figure out the minimum boilplate needed for implementing a
// widget in Ebitenui
import (
"image"
"image/color"
"github.com/ebitenui/ebitenui/widget"
"github.com/hajimehoshi/ebiten/v2"
"github.com/hajimehoshi/ebiten/v2/vector"
)
type CustomWidget struct {
widget *widget.Widget
init *widget.MultiOnce
}
type CustomWidgetOpt func(o *CustomWidget)
type CustomWidgetOptions struct {
}
var CustomWidgetOpts CustomWidgetOptions
func (o *CustomWidget) createWidget() {
o.widget = widget.NewWidget()
}
func (o *CustomWidget) Render(screen *ebiten.Image, def widget.DeferredRenderFunc) {
vector.DrawFilledCircle(screen, 15+float32(o.widget.Rect.Min.X), 15+float32(o.widget.Rect.Min.Y), 5, color.White, false)
}
func NewCustomWidget(opts ...CustomWidgetOpt) *CustomWidget {
obj := &CustomWidget{
init: &widget.MultiOnce{},
}
obj.init.Append(obj.createWidget)
for _, opt := range opts {
opt(obj)
}
return obj
}
// GetWidget implements widget.PreferredSizeLocateableWidget.
func (o *CustomWidget) GetWidget() *widget.Widget {
o.init.Do()
return o.widget
}
// PreferredSize implements widget.PreferredSizeLocateableWidget.
func (o *CustomWidget) PreferredSize() (int, int) {
o.init.Do()
return ebiten.WindowSize()
}
// SetLocation implements widget.PreferredSizeLocateableWidget.
func (o *CustomWidget) SetLocation(rect image.Rectangle) {
o.init.Do()
o.widget.SetLocation(rect)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment