Implemented TUI draft, testing stuff

pull/17/head
マリウス 2 years ago
parent e1dbc4ba2e
commit fdb98ee403
No known key found for this signature in database
GPG Key ID: 272ED814BF63261F

@ -1,5 +1,7 @@
![Superhighway84](superhighway84.png)
**Credits**
- Superhighway84 code & logo by [@mrusme](https://github.com/mrusme)
- Logo backdrop by [Swift 1 2](https://twitter.com/Swift_1_2/status/1114865117533888512)

@ -32,7 +32,9 @@ require (
github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect
github.com/dgraph-io/badger v1.6.2 // indirect
github.com/dgraph-io/ristretto v0.0.2 // indirect
github.com/disintegration/imaging v1.6.2 // indirect
github.com/dustin/go-humanize v1.0.0 // indirect
github.com/eliukblau/pixterm v1.3.1 // indirect
github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5 // indirect
github.com/flynn/noise v1.0.0 // indirect
github.com/francoispqt/gojay v1.2.13 // indirect
@ -206,6 +208,7 @@ require (
go.uber.org/zap v1.16.0 // indirect
go4.org v0.0.0-20200411211856-f5505b9728dd // indirect
golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf // indirect
golang.org/x/image v0.0.0-20191206065243-da761ea9ff43 // indirect
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781 // indirect
golang.org/x/sys v0.0.0-20210511113859-b0526f3d8744 // indirect
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d // indirect

@ -147,6 +147,8 @@ github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70d
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c=
github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4=
github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
@ -155,6 +157,8 @@ github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1
github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
github.com/elgris/jsondiff v0.0.0-20160530203242-765b5c24c302/go.mod h1:qBlWZqWeVx9BjvqBsnC/8RUlAYpIFmPvgROcw0n1scE=
github.com/eliukblau/pixterm v1.3.1 h1:XeouQViH+lmzCa7sMUoK2cd7qlgHYGLIjwRKaOdJbKA=
github.com/eliukblau/pixterm v1.3.1/go.mod h1:on5ueknFt+ZFVvIVVzQ7/JXwPjv5fJd8Q1Ybh7XixfU=
github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
@ -1303,6 +1307,7 @@ golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8U
golang.org/x/crypto v0.0.0-20190618222545-ea8f1a30c443/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200423211502-4bdfaf469ed5/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
@ -1324,6 +1329,9 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/image v0.0.0-20191206065243-da761ea9ff43 h1:gQ6GUSD102fPgli+Yb4cR/cGaHF7tNBt+GYoRCpGC7s=
golang.org/x/image v0.0.0-20191206065243-da761ea9ff43/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=

@ -1,20 +1,20 @@
package main
import (
"context"
"fmt"
"embed"
"log"
"os"
"github.com/mrusme/superhighway84/database"
"github.com/mrusme/superhighway84/models"
"go.uber.org/zap"
"github.com/mrusme/superhighway84/tui"
)
//go:embed superhighway84.png
var EMBEDFS embed.FS
func main() {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
// ctx, cancel := context.WithCancel(context.Background())
// defer cancel()
dbInit := false
dbInitValue := os.Getenv("SUPERHIGHWAY84_DB_INIT")
@ -32,55 +32,62 @@ func main() {
log.Panicln("SUPERHIGHWAY84_DB_CACHE missing!")
}
logger, err := zap.NewDevelopment()
if err != nil {
log.Panicln(err)
}
db, err := database.NewDatabase(ctx, dbURI, dbCache, dbInit, logger)
if err != nil {
log.Panicln(err)
}
defer db.Disconnect()
db.Connect()
var input string
for {
fmt.Scanln(&input)
switch input {
case "q":
return
case "g":
fmt.Scanln(&input)
article, err := db.GetArticleByID(input)
if err != nil {
log.Println(err)
} else {
log.Println(article)
}
case "p":
article := models.NewArticle()
article.From = "test@example.com"
article.Newsgroup = "comp.test"
article.Subject = "This is a test!"
article.Body = "Hey there, this is a test!"
TUI := tui.Init(&EMBEDFS)
err = db.SubmitArticle(article)
if err != nil {
log.Println(err)
} else {
log.Println(article)
}
case "l":
articles, err := db.ListArticles()
if err != nil {
log.Println(err)
} else {
log.Println(articles)
}
}
TUI.SetView("splashscreen")
if err := TUI.App.Run(); err != nil {
panic(err)
}
// logger, err := zap.NewDevelopment()
// if err != nil {
// log.Panicln(err)
// }
//
// db, err := database.NewDatabase(ctx, dbURI, dbCache, dbInit, logger)
// if err != nil {
// log.Panicln(err)
// }
// defer db.Disconnect()
// db.Connect()
//
// var input string
// for {
// fmt.Scanln(&input)
//
// switch input {
// case "q":
// return
// case "g":
// fmt.Scanln(&input)
// article, err := db.GetArticleByID(input)
// if err != nil {
// log.Println(err)
// } else {
// log.Println(article)
// }
// case "p":
// article := models.NewArticle()
// article.From = "test@example.com"
// article.Newsgroup = "comp.test"
// article.Subject = "This is a test!"
// article.Body = "Hey there, this is a test!"
//
// err = db.SubmitArticle(article)
// if err != nil {
// log.Println(err)
// } else {
// log.Println(article)
// }
// case "l":
// articles, err := db.ListArticles()
// if err != nil {
// log.Println(err)
// } else {
// log.Println(articles)
// }
// }
//
// }
}

@ -0,0 +1,50 @@
package tui
import (
"bytes"
"fmt"
"image/color"
"github.com/eliukblau/pixterm/pkg/ansimage"
"github.com/rivo/tview"
)
type Splashscreen struct {
Canvas *tview.TextView
View
ImageBytes []byte
}
func(t *TUI) NewSplashscreen(logo *[]byte) (*Splashscreen) {
splashscreen := new(Splashscreen)
canvas := tview.NewTextView().
SetDynamicColors(true).
SetRegions(true).
SetWrap(true)
canvas.SetBorder(false)
canvas.Clear()
splashscreen.ImageBytes = *logo
splashscreen.Canvas = canvas
return splashscreen
}
func (splashscreen *Splashscreen) GetCanvas() (tview.Primitive) {
return splashscreen.Canvas
}
func(splashscreen *Splashscreen) Draw() {
canvas := splashscreen.Canvas
_, _, w, h := canvas.Box.GetRect()
logoImage, err := ansimage.NewScaledFromReader(bytes.NewReader(splashscreen.ImageBytes), h, w, color.Black, ansimage.ScaleModeFill, ansimage.NoDithering)
if err != nil {
return
}
canvas.Clear()
fmt.Fprint(canvas, tview.TranslateANSI(logoImage.RenderExt(false, false)))
}

@ -0,0 +1,75 @@
package tui
import (
"embed"
"log"
"github.com/gdamore/tcell/v2"
"github.com/rivo/tview"
)
type TUI struct {
App *tview.Application
Views map[string]View
ActiveView string
}
type View interface {
GetCanvas() (tview.Primitive)
Draw()
}
func Init(embedfs *embed.FS) (*TUI) {
t := new(TUI)
tview.Styles = tview.Theme{
PrimitiveBackgroundColor: tcell.ColorDefault,
ContrastBackgroundColor: tcell.ColorTeal,
MoreContrastBackgroundColor: tcell.ColorTeal,
BorderColor: tcell.ColorWhite,
TitleColor: tcell.ColorWhite,
GraphicsColor: tcell.ColorWhite,
PrimaryTextColor: tcell.ColorDefault,
SecondaryTextColor: tcell.ColorBlue,
TertiaryTextColor: tcell.ColorGreen,
InverseTextColor: tcell.ColorBlack,
ContrastSecondaryTextColor: tcell.ColorDarkCyan,
}
t.App = tview.NewApplication()
logoBytes, err := embedfs.ReadFile("superhighway84.png")
if err != nil {
log.Panicln(err)
}
t.Views = make(map[string]View)
t.Views["splashscreen"] = t.NewSplashscreen(&logoBytes)
t.initInput()
return t
}
func (t *TUI) initInput() {
t.App.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey {
switch event.Key() {
case tcell.KeyCtrlR:
t.Draw()
return nil
case tcell.KeyCtrlQ:
t.App.Stop()
}
return event
})
}
func(t *TUI) SetView(name string) {
t.App.SetRoot(t.Views[name].GetCanvas(), true)
t.ActiveView = name
}
func (t *TUI) Draw() {
t.Views[t.ActiveView].Draw()
}
Loading…
Cancel
Save