This repository has been archived on 2024-01-06. You can view files and clone it, but cannot push or open issues or pull requests.
Files
srv/cui/main.go
2020-04-08 00:50:44 -04:00

154 lines
3.0 KiB
Go

package cui
import (
"fmt"
"log"
"os/exec"
"os/user"
"path"
"github.com/davegallant/srv/controller"
"github.com/jroimartin/gocui"
)
// Controller can access internal state
var Controller *controller.Controller
var (
viewArr = []string{"feeds", "Items"}
active = 0
)
// openFeed opens all items in the feed
func openFeed(g *gocui.Gui, v *gocui.View) error {
_, oy := v.Origin()
feed := Controller.Rss.Feeds[oy]
Controller.CurrentFeed = oy
ov, _ := g.View("Items")
ov.Clear()
if err := ov.SetOrigin(0, 0); err != nil {
log.Fatal(err)
}
for _, item := range feed.Items {
fmt.Fprintln(ov, "-", item.Title)
}
nextView(g, ov)
return nil
}
// openItem opens the feed in an external browser
func openItem(g *gocui.Gui, v *gocui.View) error {
_, oy := v.Origin()
item := Controller.Rss.Feeds[Controller.CurrentFeed].Items[oy]
err := exec.Command(
Controller.Config.ExternalViewer,
append(Controller.Config.ExternalViewerArgs, item.Link)...).Start()
if err != nil {
log.Fatal(err)
}
return nil
}
func refreshFeeds(g *gocui.Gui, v *gocui.View) error {
Controller.Rss.Update(Controller.Config.Feeds)
return nil
}
func setCurrentViewOnTop(g *gocui.Gui, name string) (*gocui.View, error) {
if _, err := g.SetCurrentView(name); err != nil {
return nil, err
}
return g.SetViewOnTop(name)
}
func nextView(g *gocui.Gui, v *gocui.View) error {
nextIndex := (active + 1) % len(viewArr)
name := viewArr[nextIndex]
_, err := g.View("Items")
if err != nil {
return err
}
if _, err := setCurrentViewOnTop(g, name); err != nil {
return err
}
if nextIndex == 0 || nextIndex == 3 {
g.Cursor = true
} else {
g.Cursor = false
}
active = nextIndex
return nil
}
func layout(g *gocui.Gui) error {
maxX, maxY := g.Size()
if v, err := g.SetView("feeds", 0, 0, maxX-1, maxY/4-1); err != nil {
if err != gocui.ErrUnknownView {
return err
}
v.Highlight = true
v.SelBgColor = selectionBgColor
v.SelFgColor = selectionFgColor
v.Title = "Feeds"
if _, err = setCurrentViewOnTop(g, "feeds"); err != nil {
return err
}
for _, f := range Controller.Rss.Feeds {
fmt.Fprintln(v, "-", f.Title)
}
}
if v, err := g.SetView("Items", 0, maxY/4, maxX-1, maxY-1); err != nil {
if err != gocui.ErrUnknownView {
return err
}
v.Highlight = true
v.SelBgColor = selectionBgColor
v.SelFgColor = selectionFgColor
v.Title = "Items"
}
return nil
}
func quit(g *gocui.Gui, v *gocui.View) error {
return gocui.ErrQuit
}
// Start initializes the application
func Start() {
usr, err := user.Current()
if err != nil {
log.Fatal(err)
}
configPath := path.Join(usr.HomeDir, ".config", "srv", "config.yaml")
Controller = &controller.Controller{}
Controller.Init(configPath)
g, err := gocui.NewGui(gocui.OutputNormal)
if err != nil {
log.Panicln(err)
}
defer g.Close()
g.SetManagerFunc(layout)
if err := keybindings(g); err != nil {
log.Panicln(err)
}
if err := g.MainLoop(); err != nil && err != gocui.ErrQuit {
log.Panicln(err)
}
}