From 6ad1fb38b9e5d8dc4c5fd04a0bd77a3b54e5d379 Mon Sep 17 00:00:00 2001 From: Brian Buller Date: Tue, 24 Jan 2017 17:00:21 -0600 Subject: [PATCH] Just commitin' --- cmd/gotime-cui/gotime-cui | Bin 2120219 -> 2120219 bytes cmd/gotime-cui/main.go | 101 ++++++++++++++--------- cmd/gotime-cui/mainloop.go | 37 +++++++++ cmd/gotime-cui/screen.go | 20 +++++ cmd/gotime-cui/screen_about.go | 142 +++++++++++++++++++++++++++++++++ cmd/gotime-cui/screen_main.go | 40 ++++++++++ cmd/gotime-cui/style.go | 27 +++++++ 7 files changed, 330 insertions(+), 37 deletions(-) create mode 100644 cmd/gotime-cui/mainloop.go create mode 100644 cmd/gotime-cui/screen.go create mode 100644 cmd/gotime-cui/screen_about.go create mode 100644 cmd/gotime-cui/screen_main.go create mode 100644 cmd/gotime-cui/style.go diff --git a/cmd/gotime-cui/gotime-cui b/cmd/gotime-cui/gotime-cui index 49e53a9d6e276d3c57c7fea199f536c8f8e41ddd..bc198b6bc6160cc6ecbefb9999fadb69bc29321c 100755 GIT binary patch delta 16015 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 bonl>A%Eds(bls=r7`^G|!*h%!gW~@O>VSN; diff --git a/cmd/gotime-cui/main.go b/cmd/gotime-cui/main.go index 9d42a36..7aae423 100644 --- a/cmd/gotime-cui/main.go +++ b/cmd/gotime-cui/main.go @@ -2,52 +2,79 @@ package main import ( "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() { - /* - err := termbox.Init() - if err != nil { - panic(err) - } - defer termbox.Close() - */ - dir := "/home/brbuller/.timewarrior/" + cfg, err := userConfig.NewConfig(AppName) - 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) - } + if cfg.Get("dir") != "" { + var dir string + fmt.Print("Timewarrior Data Directory: ") + fmt.Scanln(&dir) } - got := gotime.Create(dir) + err = termbox.Init() + if err != nil { + panic(err) + } + defer termbox.Close() + termbox.SetOutputMode(termbox.Output256) - switch op { - case "ls": - tmrs := got.GetAllTimers() - for i := range tmrs { - fmt.Println("@" + strconv.Itoa(tmrs[i].Id) + ": " + tmrs[i].ToString()) + style := defaultStyle() + mainLoop(style) + + /* + 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 { - panic(err) + + got := gotime.Create(dir) + + 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) - } - case "start": - got.StartTimer() - case "stop": - got.StopTimer() + */ +} + +const ( + MainScreenIndex = iota + AboutScreenIndex + ExitScreenIndex +) + +func createScreens() []Screen { + return []Screen{ + CreateMainScreen(), + AboutScreen(0), } } diff --git a/cmd/gotime-cui/mainloop.go b/cmd/gotime-cui/mainloop.go new file mode 100644 index 0000000..56c1e6a --- /dev/null +++ b/cmd/gotime-cui/mainloop.go @@ -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) + } + } +} diff --git a/cmd/gotime-cui/screen.go b/cmd/gotime-cui/screen.go new file mode 100644 index 0000000..b7102be --- /dev/null +++ b/cmd/gotime-cui/screen.go @@ -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() +} diff --git a/cmd/gotime-cui/screen_about.go b/cmd/gotime-cui/screen_about.go new file mode 100644 index 0000000..15cb8d6 --- /dev/null +++ b/cmd/gotime-cui/screen_about.go @@ -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) +} diff --git a/cmd/gotime-cui/screen_main.go b/cmd/gotime-cui/screen_main.go new file mode 100644 index 0000000..c8aa156 --- /dev/null +++ b/cmd/gotime-cui/screen_main.go @@ -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) { + +} diff --git a/cmd/gotime-cui/style.go b/cmd/gotime-cui/style.go new file mode 100644 index 0000000..a2ddb3c --- /dev/null +++ b/cmd/gotime-cui/style.go @@ -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 +}