Just commitin'
This commit is contained in:
parent
0f40569150
commit
6ad1fb38b9
Binary file not shown.
@ -2,52 +2,79 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"gogs.bullercodeworks.com/brian/gotime"
|
termbox "github.com/nsf/termbox-go"
|
||||||
|
"gogs.bullercodeworks.com/brian/user-config"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const AppName = "gotime"
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
/*
|
cfg, err := userConfig.NewConfig(AppName)
|
||||||
err := termbox.Init()
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
defer termbox.Close()
|
|
||||||
*/
|
|
||||||
dir := "/home/brbuller/.timewarrior/"
|
|
||||||
|
|
||||||
op := os.Args[1]
|
if cfg.Get("dir") != "" {
|
||||||
var id int
|
var dir string
|
||||||
var err error
|
fmt.Print("Timewarrior Data Directory: ")
|
||||||
|
fmt.Scanln(&dir)
|
||||||
if len(os.Args) > 2 {
|
|
||||||
id, err = strconv.Atoi(os.Args[2])
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
got := gotime.Create(dir)
|
err = termbox.Init()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
defer termbox.Close()
|
||||||
|
termbox.SetOutputMode(termbox.Output256)
|
||||||
|
|
||||||
switch op {
|
style := defaultStyle()
|
||||||
case "ls":
|
mainLoop(style)
|
||||||
tmrs := got.GetAllTimers()
|
|
||||||
for i := range tmrs {
|
/*
|
||||||
fmt.Println("@" + strconv.Itoa(tmrs[i].Id) + ": " + tmrs[i].ToString())
|
dir := "/home/brbuller/.timewarrior/"
|
||||||
|
|
||||||
|
op := os.Args[1]
|
||||||
|
var id int
|
||||||
|
var err error
|
||||||
|
|
||||||
|
if len(os.Args) > 2 {
|
||||||
|
id, err = strconv.Atoi(os.Args[2])
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
case "tag":
|
|
||||||
if _, err := got.AddTagsToTimer(id, os.Args[3:]); err != nil {
|
got := gotime.Create(dir)
|
||||||
panic(err)
|
|
||||||
|
switch op {
|
||||||
|
case "ls":
|
||||||
|
tmrs := got.GetAllTimers()
|
||||||
|
for i := range tmrs {
|
||||||
|
fmt.Println("@" + strconv.Itoa(tmrs[i].Id) + ": " + tmrs[i].ToString())
|
||||||
|
}
|
||||||
|
case "tag":
|
||||||
|
if _, err := got.AddTagsToTimer(id, os.Args[3:]); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
case "untag":
|
||||||
|
if _, err := got.RemoveTagsFromTimer(id, os.Args[3:]); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
case "start":
|
||||||
|
got.StartTimer()
|
||||||
|
case "stop":
|
||||||
|
got.StopTimer()
|
||||||
}
|
}
|
||||||
case "untag":
|
*/
|
||||||
if _, err := got.RemoveTagsFromTimer(id, os.Args[3:]); err != nil {
|
}
|
||||||
panic(err)
|
|
||||||
}
|
const (
|
||||||
case "start":
|
MainScreenIndex = iota
|
||||||
got.StartTimer()
|
AboutScreenIndex
|
||||||
case "stop":
|
ExitScreenIndex
|
||||||
got.StopTimer()
|
)
|
||||||
|
|
||||||
|
func createScreens() []Screen {
|
||||||
|
return []Screen{
|
||||||
|
CreateMainScreen(),
|
||||||
|
AboutScreen(0),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
37
cmd/gotime-cui/mainloop.go
Normal file
37
cmd/gotime-cui/mainloop.go
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
// +build !windows
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"syscall"
|
||||||
|
|
||||||
|
"github.com/nsf/termbox-go"
|
||||||
|
)
|
||||||
|
|
||||||
|
func mainLoop(style Style) {
|
||||||
|
screens := createScreens()
|
||||||
|
displayScreen := screens[MainScreenIndex]
|
||||||
|
layoutAndDrawScreen(displayScreen, style)
|
||||||
|
for {
|
||||||
|
event := termbox.PollEvent()
|
||||||
|
if event.Type == termbox.EventKey {
|
||||||
|
if event.Key == termbox.KeyCtrlZ {
|
||||||
|
process, _ := os.FindProcess(os.Getpid())
|
||||||
|
termbox.Close()
|
||||||
|
process.Signal(syscall.SIGSTOP)
|
||||||
|
termbox.Init()
|
||||||
|
}
|
||||||
|
newScreenIndex := displayScreen.handleKeyEvent(event)
|
||||||
|
if newScreenIndex < len(screens) {
|
||||||
|
displayScreen = screens[newScreenIndex]
|
||||||
|
layoutAndDrawScreen(displayScreen, style)
|
||||||
|
} else {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if event.Type == termbox.EventResize {
|
||||||
|
layoutAndDrawScreen(displayScreen, style)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
20
cmd/gotime-cui/screen.go
Normal file
20
cmd/gotime-cui/screen.go
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import termbox "github.com/nsf/termbox-go"
|
||||||
|
|
||||||
|
type Screen interface {
|
||||||
|
handleKeyEvent(event termbox.Event) int
|
||||||
|
performLayout()
|
||||||
|
drawScreen(style Style)
|
||||||
|
}
|
||||||
|
|
||||||
|
func drawBackground(bg termbox.Attribute) {
|
||||||
|
termbox.Clear(0, bg)
|
||||||
|
}
|
||||||
|
|
||||||
|
func layoutAndDrawScreen(screen Screen, style Style) {
|
||||||
|
screen.performLayout()
|
||||||
|
drawBackground(style.defaultBg)
|
||||||
|
screen.drawScreen(style)
|
||||||
|
termbox.Flush()
|
||||||
|
}
|
142
cmd/gotime-cui/screen_about.go
Normal file
142
cmd/gotime-cui/screen_about.go
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/br0xen/termbox-util"
|
||||||
|
"github.com/nsf/termbox-go"
|
||||||
|
)
|
||||||
|
|
||||||
|
/*
|
||||||
|
Command is a struct for associating descriptions to keys
|
||||||
|
*/
|
||||||
|
type Command struct {
|
||||||
|
key string
|
||||||
|
description string
|
||||||
|
}
|
||||||
|
|
||||||
|
// AboutScreen is just a basic 'int' type that we can extend to make this screen
|
||||||
|
type AboutScreen struct {
|
||||||
|
titleArt []string
|
||||||
|
commands [][]Command
|
||||||
|
}
|
||||||
|
|
||||||
|
func CreateAboutScreen() *AboutScreen {
|
||||||
|
var err error
|
||||||
|
s := new(AboutScreen)
|
||||||
|
s.titleArt = []string{
|
||||||
|
" __ _ ",
|
||||||
|
" ___ ____ / /_(_)_ _ ___ ",
|
||||||
|
" / _ `/ _ \\/ __/ / ' \\/ -_)",
|
||||||
|
" \\_, /\\___/\\__/_/_/_/_/\\__/ ",
|
||||||
|
"/___/ ",
|
||||||
|
}
|
||||||
|
s.commands = append(s.commands, []Command{
|
||||||
|
{"h,←", "close parent"},
|
||||||
|
{"j,↓", "down"},
|
||||||
|
{"k,↑", "up"},
|
||||||
|
{"l,→", "open item"},
|
||||||
|
|
||||||
|
{"g", "goto top"},
|
||||||
|
{"G", "goto bottom"},
|
||||||
|
{"ctrl+f", "jump down"},
|
||||||
|
{"ctrl+b", "jump up"},
|
||||||
|
})
|
||||||
|
s.commands = append(s.commands, []Command{
|
||||||
|
{"p,P", "create pair/at parent"},
|
||||||
|
{"b,B", "create bucket/at parent"},
|
||||||
|
{"e", "edit value of pair"},
|
||||||
|
{"r", "rename pair/bucket"},
|
||||||
|
{"D", "delete item"},
|
||||||
|
{"x,X", "export as string/json to file"},
|
||||||
|
{"?", "this screen"},
|
||||||
|
{"q", "quit program"},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (screen *AboutScreen) drawCommandsAtPoint(x int, y int, style Style) {
|
||||||
|
xPos, yPos := x, y
|
||||||
|
for _, cmds := range screen.commands {
|
||||||
|
for index, cmd := range commands {
|
||||||
|
termboxUtil.DrawStringAtPoint(fmt.Sprintf("%6s", cmd.key), xPos, yPos, style.defaultFg, style.defaultBg)
|
||||||
|
termboxUtil.DrawStringAtPoint(cmd.description, xPos+8, yPos, style.defaultFg, style.defaultBg)
|
||||||
|
yPos++
|
||||||
|
if index > 2 && index%2 == 1 {
|
||||||
|
yPos++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (screen *AboutScreen) handleKeyEvent(event termbox.Event) int {
|
||||||
|
return MainScreenIndex
|
||||||
|
}
|
||||||
|
|
||||||
|
func (screen *AboutScreen) performLayout() {}
|
||||||
|
|
||||||
|
func (screen *AboutScreen) drawScreen(style Style) {
|
||||||
|
defaultFg := style.defaultFg
|
||||||
|
defaultBg := style.defaultBg
|
||||||
|
width, height := termbox.Size()
|
||||||
|
|
||||||
|
firstLine := screen.titleArt[0]
|
||||||
|
startX := (width - len(firstLine)) / 2
|
||||||
|
startY := ((height - 2*len(template)) / 2) - 2
|
||||||
|
xPos := startX
|
||||||
|
yPos := startY
|
||||||
|
if height <= 20 {
|
||||||
|
title := AppName
|
||||||
|
startY = 0
|
||||||
|
yPos = 0
|
||||||
|
termboxUtil.DrawStringAtPoint(title, (width-len(title))/2, startY, style.titleFg, style.titleBg)
|
||||||
|
} else {
|
||||||
|
if height < 25 {
|
||||||
|
startY = 0
|
||||||
|
yPos = 0
|
||||||
|
}
|
||||||
|
for _, line := range template {
|
||||||
|
xPos = startX
|
||||||
|
for _, runeValue := range line {
|
||||||
|
bg := defaultBg
|
||||||
|
displayRune := ' '
|
||||||
|
if runeValue != ' ' {
|
||||||
|
displayRune = runeValue
|
||||||
|
termbox.SetCell(xPos, yPos, displayRune, defaultFg, bg)
|
||||||
|
}
|
||||||
|
xPos++
|
||||||
|
}
|
||||||
|
yPos++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
commands1 := [...]Command{
|
||||||
|
{"h,←", "close parent"},
|
||||||
|
{"j,↓", "down"},
|
||||||
|
{"k,↑", "up"},
|
||||||
|
{"l,→", "open item"},
|
||||||
|
|
||||||
|
{"g", "goto top"},
|
||||||
|
{"G", "goto bottom"},
|
||||||
|
{"ctrl+f", "jump down"},
|
||||||
|
{"ctrl+b", "jump up"},
|
||||||
|
}
|
||||||
|
|
||||||
|
commands2 := [...]Command{
|
||||||
|
{"p,P", "create pair/at parent"},
|
||||||
|
{"b,B", "create bucket/at parent"},
|
||||||
|
{"e", "edit value of pair"},
|
||||||
|
{"r", "rename pair/bucket"},
|
||||||
|
{"D", "delete item"},
|
||||||
|
{"x,X", "export as string/json to file"},
|
||||||
|
|
||||||
|
{"?", "this screen"},
|
||||||
|
{"q", "quit program"},
|
||||||
|
}
|
||||||
|
xPos = startX // + 20
|
||||||
|
yPos++
|
||||||
|
|
||||||
|
drawCommandsAtPoint(commands1[:], xPos, yPos+1, style)
|
||||||
|
drawCommandsAtPoint(commands2[:], xPos+20, yPos+1, style)
|
||||||
|
exitTxt := "Press any key to return to browser"
|
||||||
|
termboxUtil.DrawStringAtPoint(exitTxt, (width-len(exitTxt))/2, height-1, style.titleFg, style.titleBg)
|
||||||
|
}
|
40
cmd/gotime-cui/screen_main.go
Normal file
40
cmd/gotime-cui/screen_main.go
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
termbox "github.com/nsf/termbox-go"
|
||||||
|
"gogs.bullercodeworks.com/brian/gotime"
|
||||||
|
"gogs.bullercodeworks.com/brian/user-config"
|
||||||
|
)
|
||||||
|
|
||||||
|
type MainScreen struct {
|
||||||
|
config *userConfig.Config
|
||||||
|
got *gotime.GoTime
|
||||||
|
}
|
||||||
|
|
||||||
|
func CreateMainScreen() *MainScreen {
|
||||||
|
var err error
|
||||||
|
m := new(MainScreen)
|
||||||
|
|
||||||
|
m.config, err = userConfig.NewConfig(AppName)
|
||||||
|
|
||||||
|
if m.config.Get("dir") != "" {
|
||||||
|
m.got = gotime.Create(dir)
|
||||||
|
}
|
||||||
|
|
||||||
|
return *m
|
||||||
|
}
|
||||||
|
|
||||||
|
func (screen *MainScreen) handleKeyEvent(event termbox.Event) int {
|
||||||
|
if event.Ch == '?' {
|
||||||
|
return AboutScreenIndex
|
||||||
|
}
|
||||||
|
return MainScreenIndex
|
||||||
|
}
|
||||||
|
|
||||||
|
func (screen *MainScreen) performLayout() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (screen *MainScreen) drawScreen(style Style) {
|
||||||
|
|
||||||
|
}
|
27
cmd/gotime-cui/style.go
Normal file
27
cmd/gotime-cui/style.go
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import termbox "github.com/nsf/termbox-go"
|
||||||
|
|
||||||
|
/*
|
||||||
|
Style Defines the colors for the terminal display, basically
|
||||||
|
*/
|
||||||
|
type Style struct {
|
||||||
|
defaultBg termbox.Attribute
|
||||||
|
defaultFg termbox.Attribute
|
||||||
|
titleFg termbox.Attribute
|
||||||
|
titleBg termbox.Attribute
|
||||||
|
cursorFg termbox.Attribute
|
||||||
|
cursorBg termbox.Attribute
|
||||||
|
}
|
||||||
|
|
||||||
|
func defaultStyle() Style {
|
||||||
|
var style Style
|
||||||
|
style.defaultBg = termbox.ColorBlack
|
||||||
|
style.defaultFg = termbox.ColorWhite
|
||||||
|
style.titleFg = termbox.ColorBlack
|
||||||
|
style.titleBg = termbox.ColorGreen
|
||||||
|
style.cursorFg = termbox.ColorBlack
|
||||||
|
style.cursorBg = termbox.ColorGreen
|
||||||
|
|
||||||
|
return style
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user