99 lines
1.6 KiB
Go
99 lines
1.6 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"os"
|
|
"os/user"
|
|
"path/filepath"
|
|
|
|
"talc/pkg/menu"
|
|
"talc/pkg/tal"
|
|
|
|
"github.com/gdamore/tcell"
|
|
"github.com/gdamore/tcell/views"
|
|
)
|
|
|
|
var path = flag.String("path", ".", "library path")
|
|
|
|
func init() {
|
|
flag.Parse()
|
|
|
|
*path = filepath.FromSlash(*path)
|
|
if (*path)[0] == '~' {
|
|
user, err := user.Current()
|
|
if err != nil {
|
|
fmt.Fprintln(os.Stderr, err.Error())
|
|
os.Exit(10)
|
|
}
|
|
*path = filepath.Join(user.HomeDir, (*path)[1:])
|
|
}
|
|
*path, _ = filepath.Abs(*path)
|
|
}
|
|
|
|
type Talc struct {
|
|
views.BoxLayout
|
|
}
|
|
|
|
func (t *Talc) HandleEvent(ev tcell.Event) bool {
|
|
switch ev := ev.(type) {
|
|
case *tcell.EventKey:
|
|
switch ev.Key() {
|
|
case tcell.KeyEscape:
|
|
fallthrough
|
|
case tcell.KeyCtrlC:
|
|
app.Quit()
|
|
return true
|
|
case tcell.KeyRune:
|
|
switch ev.Rune() {
|
|
case 'q':
|
|
app.Quit()
|
|
return true
|
|
}
|
|
case tcell.KeyCtrlL:
|
|
app.Refresh()
|
|
return true
|
|
}
|
|
case *tcell.EventResize:
|
|
app.Refresh()
|
|
return true
|
|
}
|
|
return t.BoxLayout.HandleEvent(ev)
|
|
}
|
|
|
|
var app = &views.Application{}
|
|
var talc = &Talc{}
|
|
|
|
func main() {
|
|
alib := &tal.Repo{
|
|
Path: *path,
|
|
}
|
|
|
|
if err := alib.Scan(); err != nil {
|
|
fmt.Fprintln(os.Stderr, err.Error())
|
|
os.Exit(11)
|
|
}
|
|
|
|
books := make([]string, len(alib.Books))
|
|
for i, book := range alib.Books {
|
|
books[i] = book.String()
|
|
}
|
|
|
|
s := tcell.StyleDefault
|
|
ss := s.Foreground(tcell.ColorGreen)
|
|
|
|
m := menu.NewMenu()
|
|
m.SetStyle(s)
|
|
m.SetSelectedStyle(ss)
|
|
m.EnableCursor(true)
|
|
m.SetLines(books)
|
|
|
|
talc.AddWidget(m, 1)
|
|
|
|
app.SetRootWidget(talc)
|
|
if err := app.Run(); err != nil {
|
|
fmt.Fprintln(os.Stderr, err.Error())
|
|
os.Exit(1)
|
|
}
|
|
}
|