shiny-pancake/internal/gui/gui.go
2020-11-08 07:33:07 -06:00

121 lines
2.0 KiB
Go

package gui
import (
"fmt"
"github.com/sirupsen/logrus"
"shiny-pancake/internal/model"
"shiny-pancake/logger"
"shiny-pancake/internal/database"
"strings"
"github.com/rivo/tview"
)
type resources struct {
ActSess []*model.Session
}
type panels struct {
currentPanel int
panel []panel
}
type state struct {
panels panels
tabBar *tview.TextView
resources resources
stopChans map[string]chan int
}
func newState() *state {
return &state{
stopChans: make(map[string]chan int),
}
}
type Gui struct {
app *tview.Application
pages *tview.Pages
state *state
db *database.Database
}
func New(db *database.Database) *Gui {
return &Gui{
app: tview.NewApplication(),
pages: tview.NewPages(),
state: newState(),
db: db,
}
}
func (g *Gui) sessionPanel() *activeSessions {
for _, panel := range g.state.panels.panel {
if panel.name() == `activeSessions` {
return panel.(*activeSessions)
}
}
return nil
}
// Start start application
func (g *Gui) Start() error {
g.initPanels()
g.startMonitoring()
var l logger.Log
l = logger.Log{"info", logrus.Fields{"init" : "ran"}, "got this far"}
logger.Lgr(&l)
if err := g.app.Run(); err != nil {
g.app.Stop()
return err
}
return nil
}
func (g *Gui) Stop() {
g.stopMonitoring()
g.app.Stop()
}
// Page "definitions"
func (g *Gui) initPanels() {
g.state.tabBar = newTabBar()
// Page definitions
s := newSessions(g)
var l logger.Log
l = logger.Log{"info", logrus.Fields{"initPanels" : "ran"}, "got this far"}
logger.Lgr(&l)
g.pages.AddPage(`activeSessions`, s, true, true)
fmt.Fprintf(g.state.tabBar, ` ["%d"]%d %s[""] `, 0, 1, strings.Title(s.name()))
g.state.tabBar.Highlight("0")
// Panels
g.state.panels.panel = append(g.state.panels.panel, s)
layout := tview.NewFlex().SetDirection(tview.FlexRow).
AddItem(g.state.tabBar, 1, 1, false).
AddItem(g.pages, 0, 16, true)
g.app.SetRoot(layout, true)
g.goTo(`activeSessions`)
}
func (g *Gui) goTo(page string) {
g.pages.SwitchToPage(page)
}