diff --git a/go.mod b/go.mod index 7fb825f..7c5df2a 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,7 @@ require ( github.com/ebitengine/gomobile v0.0.0-20240518074828-e86332849895 // indirect github.com/ebitengine/hideconsole v1.0.0 // indirect github.com/ebitengine/purego v0.7.0 // indirect - github.com/ebitenui/ebitenui v0.5.8-0.20240608175527-424f62327b21 // indirect + github.com/ebitenui/ebitenui v0.5.8-0.20240608230235-27496c28f409 // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect github.com/jezek/xgb v1.1.1 // indirect github.com/tinne26/etxt v0.0.8 // indirect diff --git a/go.sum b/go.sum index 70129b4..91a4650 100644 --- a/go.sum +++ b/go.sum @@ -10,6 +10,8 @@ github.com/ebitenui/ebitenui v0.5.6 h1:qyJRU5j+lQo1lamxB48IBwMxMfz1xNb5iWUayCtA0 github.com/ebitenui/ebitenui v0.5.6/go.mod h1:I0rVbTOUi7gWKTPet2gzbvhOdkHp5pJXMM6c6b3dRoE= github.com/ebitenui/ebitenui v0.5.8-0.20240608175527-424f62327b21 h1:dElhYGyf+FYY+makAndUQNOSDwFSFYyFWziPwQrPObY= github.com/ebitenui/ebitenui v0.5.8-0.20240608175527-424f62327b21/go.mod h1:I0rVbTOUi7gWKTPet2gzbvhOdkHp5pJXMM6c6b3dRoE= +github.com/ebitenui/ebitenui v0.5.8-0.20240608230235-27496c28f409 h1:wsPobs+O3ZmZvhtNtmnMkaB1FRM7tuZ60P0/jegRQGg= +github.com/ebitenui/ebitenui v0.5.8-0.20240608230235-27496c28f409/go.mod h1:I0rVbTOUi7gWKTPet2gzbvhOdkHp5pJXMM6c6b3dRoE= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/hajimehoshi/ebiten/v2 v2.7.4 h1:X+heODRQ3Ie9F9QFjm24gEZqQd5FSfR9XuT2XfHwgf8= diff --git a/src/game.go b/src/game.go index e5b229f..ae10651 100644 --- a/src/game.go +++ b/src/game.go @@ -27,6 +27,7 @@ func NewGame(config *Config, startscene SceneName) *Game { game.Scenes[Menu] = NewMenuScene(game, config) game.Scenes[Options] = NewOptionsScene(game, config) game.Scenes[Keybindings] = NewKeybindingsScene(game, config) + game.Scenes[Toolbar] = NewToolbarScene(game, config) // setup environment ebiten.SetWindowSize(game.ScreenWidth, game.ScreenHeight) @@ -67,6 +68,7 @@ func (game *Game) Update() error { func (game *Game) Draw(screen *ebiten.Image) { // first draw primary scene[s], although there are only 1 + skip := false for current, scene := range game.Scenes { if scene.IsPrimary() { // primary scenes always draw @@ -74,11 +76,15 @@ func (game *Game) Draw(screen *ebiten.Image) { if current == game.CurrentScene { // avoid to redraw it in the next step - return + skip = true } } } + if skip { + return + } + scene := game.GetCurrentScene() scene.Draw(screen) } diff --git a/src/play.go b/src/play.go index 82d6257..0b12496 100644 --- a/src/play.go +++ b/src/play.go @@ -6,6 +6,7 @@ import ( "log" "unsafe" + uiinput "github.com/ebitenui/ebitenui/input" "github.com/hajimehoshi/ebiten/v2" "github.com/hajimehoshi/ebiten/v2/inpututil" "github.com/hajimehoshi/ebiten/v2/vector" @@ -424,11 +425,12 @@ func (scene *ScenePlay) Update() error { return quit } - scene.CheckInput() - scene.CheckDrawingInput() - scene.CheckDraggingInput() - scene.CheckMarkInput() - + if !uiinput.UIActive { + scene.CheckInput() + scene.CheckDrawingInput() + scene.CheckDraggingInput() + scene.CheckMarkInput() + } if !scene.Config.Paused || scene.RunOneStep { scene.UpdateCells() } diff --git a/src/scene.go b/src/scene.go index ac1818c..815c005 100644 --- a/src/scene.go +++ b/src/scene.go @@ -25,4 +25,5 @@ const ( Play // actual playing happens here Options Keybindings + Toolbar ) diff --git a/src/toolbar.go b/src/toolbar.go new file mode 100644 index 0000000..a8c05aa --- /dev/null +++ b/src/toolbar.go @@ -0,0 +1,94 @@ +package main + +import ( + "image/color" + "os" + + "github.com/ebitenui/ebitenui" + "github.com/ebitenui/ebitenui/widget" + "github.com/hajimehoshi/ebiten/v2" + "github.com/hajimehoshi/ebiten/v2/inpututil" +) + +type SceneToolbar struct { + Game *Game + Config *Config + Next SceneName + Prev SceneName + Whoami SceneName + Ui *ebitenui.UI + FontColor color.RGBA +} + +func NewToolbarScene(game *Game, config *Config) Scene { + scene := &SceneToolbar{ + Whoami: Toolbar, + Game: game, + Next: Toolbar, + Config: config, + FontColor: color.RGBA{255, 30, 30, 0xff}, + } + + scene.Init() + + return scene +} + +func (scene *SceneToolbar) GetNext() SceneName { + return scene.Next +} + +func (scene *SceneToolbar) SetPrevious(prev SceneName) { + scene.Prev = prev +} + +func (scene *SceneToolbar) ResetNext() { + scene.Next = scene.Whoami +} + +func (scene *SceneToolbar) SetNext(next SceneName) { + scene.Next = next +} + +func (scene *SceneToolbar) IsPrimary() bool { + return true +} + +func (scene *SceneToolbar) Update() error { + scene.Ui.Update() + + if inpututil.IsKeyJustPressed(ebiten.KeyEscape) || inpututil.IsKeyJustPressed(ebiten.KeyQ) { + scene.SetNext(Play) + } + + return nil + +} + +func (scene *SceneToolbar) Draw(screen *ebiten.Image) { + scene.Ui.Draw(screen) +} + +func (scene *SceneToolbar) SetInitialValue(w *widget.LabeledCheckbox, value bool) { + if value { + w.SetState( + widget.WidgetChecked, + ) + } +} + +func (scene *SceneToolbar) Init() { + rowContainer := NewTopRowContainer("Toolbar") + + cancel := NewMenuButton("Close", + func(args *widget.ButtonClickedEventArgs) { + os.Exit(0) + }) + + rowContainer.AddChild(cancel) + + scene.Ui = &ebitenui.UI{ + Container: rowContainer.Container(), + } + +} diff --git a/src/widgets.go b/src/widgets.go index e27a4c8..7c4ab37 100644 --- a/src/widgets.go +++ b/src/widgets.go @@ -215,6 +215,37 @@ func (container *RowContainer) Container() *widget.Container { return container.Root } +// setup a top level toolbar container +func NewTopRowContainer(title string) *RowContainer { + buttonImageHover := image.NewNineSlice(Assets["button-9slice3"], [3]int{3, 3, 3}, [3]int{3, 3, 3}) + + uiContainer := widget.NewContainer( + widget.ContainerOpts.Layout(widget.NewAnchorLayout()), + ) + + rowContainer := widget.NewContainer( + widget.ContainerOpts.WidgetOpts( + widget.WidgetOpts.LayoutData(widget.AnchorLayoutData{ + HorizontalPosition: widget.AnchorLayoutPositionStart, + VerticalPosition: widget.AnchorLayoutPositionStart, + }), + ), + widget.ContainerOpts.Layout(widget.NewRowLayout( + widget.RowLayoutOpts.Direction(widget.DirectionVertical), + widget.RowLayoutOpts.Padding(widget.NewInsetsSimple(8)), + widget.RowLayoutOpts.Spacing(0), + )), + widget.ContainerOpts.BackgroundImage(buttonImageHover), + ) + + uiContainer.AddChild(rowContainer) + + return &RowContainer{ + Root: uiContainer, + Row: rowContainer, + } +} + // set arg to false if no background needed func NewRowContainer(title string) *RowContainer { buttonImageHover := image.NewNineSlice(Assets["button-9slice3"], [3]int{3, 3, 3}, [3]int{3, 3, 3})