Merge remote-tracking branch 'origin/master'

# Conflicts:
#	main.go
This commit is contained in:
anton.gurov 2019-10-25 11:41:28 +03:00
commit ad6fb0c03e
3 changed files with 110 additions and 57 deletions

View File

@ -4,5 +4,6 @@
"sizeX": 100,
"sizeY": 47,
"fpsLimit" : 60,
"font": "./resources/fonts-ttf/LiberationMono-Bold.ttf"
"font": "./resources/fonts-ttf/LiberationMono-Bold.ttf",
"verbosity": "debug"
}

111
main.go
View File

@ -1,7 +1,6 @@
package main
import (
"github.com/jcerise/gogue/screens"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"lab.zaar.be/thefish/alchemyst-go/ui"
@ -9,41 +8,82 @@ import (
"lab.zaar.be/thefish/alchemyst-go/util"
blt "lab.zaar.be/thefish/bearlibterminal"
"os"
"runtime"
"time"
)
// Рецепт чтобы убежать от [fatal] 'refresh' was not called from the main thread
// https://github.com/golang/go/wiki/LockOSThread
func init() {
runtime.LockOSThread()
}
type GameState struct {
mainfunc chan func()
exit chan struct{}
input chan string
}
var State = GameState{
mainfunc: make(chan func()),
exit: make(chan struct{}, 1),
input: make(chan string, 1),
}
func main() {
config := util.LoadConfig()
var logLevels = map[string]zerolog.Level{"debug": zerolog.DebugLevel, "info": zerolog.InfoLevel, "warn": zerolog.WarnLevel}
var logger = log.Output(zerolog.ConsoleWriter{Out: os.Stdout, TimeFormat: time.RFC3339}).Level(logLevels[config.Verbosity])
//var logLevels = map[string]zerolog.Level{"debug": zerolog.DebugLevel, "info": zerolog.InfoLevel, "warn": zerolog.WarnLevel}
//var logger = log.Output(zerolog.ConsoleWriter{Out: os.Stdout, TimeFormat: time.RFC3339}).Level(logLevels[opts.Verbosity])
var logger = log.Output(zerolog.ConsoleWriter{Out: os.Stdout, TimeFormat: time.RFC3339})
mainCtx := util.NewClientContext(config, &logger)
mw := mainwindow.Init(mainCtx)
defer mw.Close()
//we can run logic in separate goroutines
go mainLoop(mainCtx)
mainLoop(mainCtx)
//but every call to bearlibterminal must be wrapped to closure and passed to mainfunc
var exit = false
for !exit {
select {
case f := <-State.mainfunc:
f()
case <-State.exit:
mainCtx.Logger().Warn().Msg("quitting NOW")
exit = true
break
}
}
mainCtx.Logger().Info().Msg("pre-shutdown sequence")
}
// do runs f on the main thread.
func (*GameState) Do(f func()) {
done := make(chan struct{}, 1)
State.mainfunc <- func() {
f()
done <- struct{}{}
}
<-done
}
func mainLoop(ctx util.ClientCtx) {
var exit = false
baseLayer := mainwindow.AddLayer(0, "white")
upperBaseLayer := mainwindow.AddLayer(1, "red")
menuBgLayer := mainwindow.AddLayer(2,"white")
menuLayer := mainwindow.AddLayer(3, "white")
bgLayer := mainwindow.AddLayer(1, "white")
menuLayer := mainwindow.AddLayer(2, "white")
initRender := func() {
baseLayer.WithColor("white").NewRect(3, 0, 17, 6).Fill()
baseLayer.WithColor("grey").NewRect(22, 0, 38, 6).Splash()
baseLayer.WithColor("blue").NewRect(3, 8, 57, 6).Fill()
upperBaseLayer.WithColor("#99de7c26").NewRect(50, 1, 10, 10).Splash()
menuLayer.WithColor("#99de7c26").NewRect(50, 1, 10, 10).Splash()
menuLayer.WithColor("#aa26edca").DrawWindow("Testing with long title", 0, 5, 40, 20)
blt.PrintExt(1, 6, 40, 19, 1, `Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Odio morbi quis commodo odio aenean sed. Egestas sed sed risus pretium quam vulputate dignissim suspendisse in. Viverra nam libero justo laoreet sit amet cursus sit. Sed egestas egestas fringilla phasellus faucibus. Ultrices neque ornare aenean euismod elementum nisi quis eleifend. Eget lorem dolor sed viverra ipsum nunc aliquet bibendum. Egestas maecenas pharetra convallis posuere morbi. In hac habitasse platea dictumst quisque. Aenean vel elit scelerisque mauris pellentesque pulvinar.
@ -56,7 +96,7 @@ Cursus in hac habitasse platea. Aliquet risus feugiat in ante metus dictum. Maec
Sed euismod nisi porta lorem mollis aliquam ut porttitor leo. Ut tellus elementum sagittis vitae et leo duis ut diam. Elementum curabitur vitae nunc sed velit dignissim. Auctor elit sed vulputate mi sit. Consectetur adipiscing elit ut aliquam purus. Feugiat vivamus at augue eget arcu. Duis ut diam quam nulla porttitor massa id neque. Pharetra magna ac placerat vestibulum lectus mauris ultrices. Non sodales neque sodales ut etiam. Massa ultricies mi quis hendrerit dolor. Est sit amet facilisis magna etiam. Ornare suspendisse sed nisi lacus sed viverra tellus in.
`)
menuBgLayer.WithColor("#77cfcfcf").NewRect(45, 5, 40, 40).Splash()
bgLayer.WithColor("#77cfcfcf").NewRect(45, 5, 40, 40).Splash()
menuLayer.WithColor("#aaed26ca").DrawWindow("Transparent BG window test", 45, 5, 40, 40)
blt.PrintExt(46, 6, 40, 39, 1, `Lorem mollis aliquam ut porttitor leo a diam sollicitudin tempor. Convallis tellus id interdum velit. Enim nunc faucibus a pellentesque. Tincidunt augue interdum velit euismod in pellentesque massa placerat duis. Leo duis ut diam quam nulla porttitor massa id. Eu feugiat pretium nibh ipsum consequat nisl. Eget est lorem ipsum dolor sit amet. Et sollicitudin ac orci phasellus egestas. Donec adipiscing tristique risus nec. Et molestie ac feugiat sed. Ante in nibh mauris cursus mattis molestie a iaculis at. Neque laoreet suspendisse interdum consectetur. Vitae et leo duis ut diam quam nulla. Sed ullamcorper morbi tincidunt ornare massa eget egestas purus viverra. Ornare lectus sit amet est placerat in egestas erat.
@ -65,20 +105,21 @@ Cursus in hac habitasse platea. Aliquet risus feugiat in ante metus dictum. Maec
Sed euismod nisi porta lorem mollis aliquam ut porttitor leo. Ut tellus elementum sagittis vitae et leo duis ut diam. Elementum curabitur vitae nunc sed velit dignissim. Auctor elit sed vulputate mi sit. Consectetur adipiscing elit ut aliquam purus. Feugiat vivamus at augue eget arcu. Duis ut diam quam nulla porttitor massa id neque. Pharetra magna ac placerat vestibulum lectus mauris ultrices. Non sodales neque sodales ut etiam. Massa ultricies mi quis hendrerit dolor. Est sit amet facilisis magna etiam. Ornare suspendisse sed nisi lacus sed viverra tellus in.
`)
baseLayer.Print(1, 1, "Hello, [font=bold]world[/font]!")
baseLayer.Print(1, 4, "Testing line-[color=orange]spacing[/color]")
blt.Refresh()
}
mgr := screens.NewScreenManager()
_ = mgr
for !exit {
State.Do(initRender)
for {
//fresh inputs to chan
State.Do(func() {
var key, keycode = ui.ReadKey(ctx)
if key != "" {
blt.ClearArea(0, 3, 80, 1)
if keycode == blt.TK_CLOSE {
ctx.Logger().Warn().Msg("exiting on window close...")
State.exit <- struct{}{}
ctx.Logger().Warn().Msg("...done")
return
}
switch key {
case "F10":
@ -88,19 +129,29 @@ Sed euismod nisi porta lorem mollis aliquam ut porttitor leo. Ut tellus elementu
case "Ctrl+q":
fallthrough
case "Escape":
exit = true
ctx.Logger().Info().Msg("exiting on quit command...")
State.exit <- struct{}{}
ctx.Logger().Info().Msg("...done")
return
default:
//blt.Print(1, 3, "Key: "+key)
menuLayer.Print(1, 3, "Key: "+key)
baseLayer.Print(1,5, key)
State.input <- key
//baseLayer.Print(1, 4, "█")
}
if keycode == blt.TK_CLOSE {
exit = true
})
//read inputs, write to screen
State.Do(func() {
key := <-State.input
if key != "" {
blt.ClearArea(0, 3, 80, 1)
menuLayer.Print(1, 3, "Key: "+key)
baseLayer.Print(1, 5, key)
}
})
//update screen
State.Do(func(){
blt.Refresh()
})
}
ctx.Logger().Warn().Msg("and it continues")
}

View File

@ -14,6 +14,7 @@ type Config struct {
MainWindowSizeX int `json:"sizeX"`
MainWindowSizeY int `json:"sizeY"`
Font string `json:"font"`
Verbosity string `json:"verbosity"`
}
func LoadConfig() *Config {