1
0
mirror of https://github.com/mrusme/neonmodem.git synced 2024-11-03 04:27:16 -05:00

Implemented startup splashscreen

This commit is contained in:
マリウス 2023-01-06 19:41:28 -05:00
parent d83a88bf3d
commit 1e47aa4bce
No known key found for this signature in database
GPG Key ID: 272ED814BF63261F
6 changed files with 135 additions and 7 deletions

View File

@ -1,6 +1,7 @@
package cmd package cmd
import ( import (
"embed"
"net/url" "net/url"
"os" "os"
"runtime" "runtime"
@ -15,6 +16,7 @@ import (
"go.uber.org/zap" "go.uber.org/zap"
) )
var EMBEDFS *embed.FS
var LOG *zap.SugaredLogger var LOG *zap.SugaredLogger
var CFG config.Config var CFG config.Config
@ -109,7 +111,7 @@ var rootCmd = &cobra.Command{
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
var err error var err error
c := ctx.New(&CFG, LOG) c := ctx.New(EMBEDFS, &CFG, LOG)
_ = loadSystems(&c) // TODO: Handle errs _ = loadSystems(&c) // TODO: Handle errs
tui := tea.NewProgram(ui.NewModel(&c), tea.WithAltScreen()) tui := tea.NewProgram(ui.NewModel(&c), tea.WithAltScreen())
@ -120,7 +122,8 @@ var rootCmd = &cobra.Command{
}, },
} }
func Execute() { func Execute(efs *embed.FS) {
EMBEDFS = efs
if err := rootCmd.Execute(); err != nil { if err := rootCmd.Execute(); err != nil {
// LOG.Errorln(err) // LOG.Errorln(err)
} }

View File

@ -1,7 +1,14 @@
package main package main
import "github.com/mrusme/gobbs/cmd" import (
"embed"
"github.com/mrusme/gobbs/cmd"
)
//go:embed splashscreen.png
var EMBEDFS embed.FS
func main() { func main() {
cmd.Execute() cmd.Execute(&EMBEDFS)
} }

View File

@ -12,6 +12,7 @@ const (
WinRefreshData WinRefreshData
WinFreshData WinFreshData
ViewOpen
ViewFocus ViewFocus
ViewBlur ViewBlur
ViewRefreshData ViewRefreshData

View File

@ -1,6 +1,8 @@
package ctx package ctx
import ( import (
"embed"
"github.com/mrusme/gobbs/config" "github.com/mrusme/gobbs/config"
"github.com/mrusme/gobbs/models/forum" "github.com/mrusme/gobbs/models/forum"
"github.com/mrusme/gobbs/system" "github.com/mrusme/gobbs/system"
@ -12,6 +14,7 @@ type Ctx struct {
Screen [2]int Screen [2]int
Content [2]int Content [2]int
Config *config.Config Config *config.Config
EmbedFS *embed.FS
Systems []*system.System Systems []*system.System
Loading bool Loading bool
Logger *zap.SugaredLogger Logger *zap.SugaredLogger
@ -22,6 +25,7 @@ type Ctx struct {
} }
func New( func New(
efs *embed.FS,
cfg *config.Config, cfg *config.Config,
logger *zap.SugaredLogger, logger *zap.SugaredLogger,
) Ctx { ) Ctx {
@ -29,6 +33,7 @@ func New(
Screen: [2]int{0, 0}, Screen: [2]int{0, 0},
Content: [2]int{0, 0}, Content: [2]int{0, 0},
Config: cfg, Config: cfg,
EmbedFS: efs,
Loading: false, Loading: false,
Logger: logger, Logger: logger,
Theme: theme.New(cfg), Theme: theme.New(cfg),

View File

@ -12,6 +12,7 @@ import (
"github.com/mrusme/gobbs/ui/ctx" "github.com/mrusme/gobbs/ui/ctx"
"github.com/mrusme/gobbs/ui/header" "github.com/mrusme/gobbs/ui/header"
"github.com/mrusme/gobbs/ui/views/posts" "github.com/mrusme/gobbs/ui/views/posts"
"github.com/mrusme/gobbs/ui/views/splash"
"github.com/mrusme/gobbs/ui/windowmanager" "github.com/mrusme/gobbs/ui/windowmanager"
"github.com/mrusme/gobbs/ui/windows/msgerror" "github.com/mrusme/gobbs/ui/windows/msgerror"
"github.com/mrusme/gobbs/ui/windows/popuplist" "github.com/mrusme/gobbs/ui/windows/popuplist"
@ -74,6 +75,7 @@ func NewModel(c *ctx.Ctx) Model {
} }
m.header = header.NewModel(m.ctx) m.header = header.NewModel(m.ctx)
m.views = append(m.views, splash.NewModel(m.ctx))
m.views = append(m.views, posts.NewModel(m.ctx)) m.views = append(m.views, posts.NewModel(m.ctx))
m.a, _ = aggregator.New(m.ctx) m.a, _ = aggregator.New(m.ctx)
@ -84,8 +86,6 @@ func NewModel(c *ctx.Ctx) Model {
func (m Model) Init() tea.Cmd { func (m Model) Init() tea.Cmd {
return tea.Batch( return tea.Batch(
tea.EnterAltScreen, tea.EnterAltScreen,
cmd.New(cmd.ViewFocus, "*").Tea(),
cmd.New(cmd.ViewRefreshData, "*").Tea(),
) )
} }
@ -199,6 +199,19 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
switch msg.Call { switch msg.Call {
case cmd.ViewOpen:
m.ctx.Logger.Debug("got cmd.ViewOpen")
switch msg.Target {
case posts.VIEW_ID:
m.currentView = 1
m.viewcache = m.buildView(false)
ccmds = append(ccmds,
cmd.New(cmd.ViewFocus, "*").Tea(),
cmd.New(cmd.ViewRefreshData, "*").Tea(),
)
return m, tea.Batch(ccmds...)
}
case cmd.WinOpen: case cmd.WinOpen:
switch msg.Target { switch msg.Target {
case postshow.WIN_ID: case postshow.WIN_ID:
@ -314,7 +327,9 @@ func (m Model) buildView(cached bool) string {
} else { } else {
m.ctx.Logger.Debug("generating UI viewcache") m.ctx.Logger.Debug("generating UI viewcache")
m.renderOnlyFocused = false m.renderOnlyFocused = false
s.WriteString(m.header.View() + "\n") if m.currentView > 0 {
s.WriteString(m.header.View() + "\n")
}
s.WriteString(m.views[m.currentView].View()) s.WriteString(m.views[m.currentView].View())
tmp = s.String() tmp = s.String()
} }

97
ui/views/splash/splash.go Normal file
View File

@ -0,0 +1,97 @@
package splash
import (
"bytes"
"image/color"
"time"
tea "github.com/charmbracelet/bubbletea"
"github.com/eliukblau/pixterm/pkg/ansimage"
"github.com/mrusme/gobbs/ui/cmd"
"github.com/mrusme/gobbs/ui/ctx"
"github.com/mrusme/gobbs/ui/views/posts"
)
var (
VIEW_ID = "splash"
)
type Model struct {
ctx *ctx.Ctx
pix *ansimage.ANSImage
splashscreen []byte
}
func (m Model) Init() tea.Cmd {
return nil
}
func NewModel(c *ctx.Ctx) Model {
var err error
m := Model{
ctx: c,
pix: nil,
}
m.splashscreen, err = m.ctx.EmbedFS.ReadFile("splashscreen.png")
if err != nil {
m.ctx.Logger.Error(err)
}
m.ctx.Logger.Debugf("Screen W/H: %d %d\n", m.ctx.Screen[0], m.ctx.Screen[1])
return m
}
func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
var err error
// var lcmd tea.Cmd
// m.list, lcmd = m.list.Update(msg)
// cmds = append(cmds, lcmd)
switch msg := msg.(type) {
case tea.WindowSizeMsg:
m.ctx.Screen[0] = msg.Width
m.ctx.Screen[1] = msg.Height
m.pix, err = ansimage.NewScaledFromReader(
bytes.NewReader(m.splashscreen),
m.ctx.Screen[1],
m.ctx.Screen[0],
color.Transparent,
ansimage.ScaleModeResize,
ansimage.NoDithering,
)
if err != nil {
m.ctx.Logger.Error(err)
}
return m, m.sleep()
}
return m, nil
}
func (m *Model) sleep() tea.Cmd {
return func() tea.Msg {
time.Sleep(time.Second * 5)
c := cmd.New(
cmd.ViewOpen,
posts.VIEW_ID,
)
return *c
}
}
func (m Model) View() string {
return m.buildView(true)
}
func (m Model) buildView(cached bool) string {
if m.pix != nil {
return m.pix.RenderExt(false, false)
}
return ""
}