66 lines
1.4 KiB
Go
66 lines
1.4 KiB
Go
|
package visualizer
|
||
|
|
||
|
import (
|
||
|
"image/color"
|
||
|
"maze-solver/io/writer"
|
||
|
"maze-solver/maze"
|
||
|
|
||
|
"fyne.io/fyne"
|
||
|
"fyne.io/fyne/app"
|
||
|
"fyne.io/fyne/canvas"
|
||
|
"fyne.io/fyne/dialog"
|
||
|
"github.com/mazznoer/colorgrad"
|
||
|
)
|
||
|
|
||
|
type WindowVisualizer struct {
|
||
|
app fyne.App
|
||
|
window fyne.Window
|
||
|
img_writer writer.ImageWriter
|
||
|
cimg *canvas.Image
|
||
|
}
|
||
|
|
||
|
func (v *WindowVisualizer) Init(m *maze.Maze) {
|
||
|
v.app = app.New()
|
||
|
v.window = v.app.NewWindow("maze-solver-go")
|
||
|
v.img_writer = writer.ImageWriter{
|
||
|
Filename: "",
|
||
|
Maze: &maze.SolvedMaze{
|
||
|
Maze: m,
|
||
|
Solution: []*maze.Node{},
|
||
|
},
|
||
|
CellWidth: 2,
|
||
|
CellHeight: 2,
|
||
|
WallColor: color.Black,
|
||
|
PathColor: color.White,
|
||
|
SolutionGradient: colorgrad.Warm(),
|
||
|
}
|
||
|
v.cimg = canvas.NewImageFromImage(v.img_writer.GenerateImage())
|
||
|
v.window.SetContent(v.cimg)
|
||
|
v.window.Resize(
|
||
|
fyne.NewSize(
|
||
|
m.Width*v.img_writer.CellWidth,
|
||
|
m.Height*v.img_writer.CellHeight,
|
||
|
),
|
||
|
)
|
||
|
v.window.Show()
|
||
|
}
|
||
|
|
||
|
func (v *WindowVisualizer) Visualize(solved_chan <-chan *maze.SolvedMaze) {
|
||
|
for solved := range solved_chan {
|
||
|
v.img_writer.Maze = solved
|
||
|
v.cimg.Image = v.img_writer.GenerateImage()
|
||
|
v.cimg.Refresh()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (v *WindowVisualizer) Run(lets_go chan<- bool) {
|
||
|
dial := dialog.NewConfirm("Start", "Let's go", func(ok bool) {
|
||
|
lets_go <- ok
|
||
|
if !ok {
|
||
|
v.window.Close()
|
||
|
}
|
||
|
}, v.window)
|
||
|
dial.Show()
|
||
|
v.window.ShowAndRun()
|
||
|
}
|