Insert/Edit is working

This commit is contained in:
Brian Buller 2015-05-14 10:17:43 -05:00
parent 32a8c82b51
commit f951ce9b64
4 changed files with 68 additions and 37 deletions

3
.gitignore vendored
View File

@ -1,3 +1,6 @@
# Swap Files
*.swp
# Compiled Object files, Static and Dynamic libs (Shared Objects) # Compiled Object files, Static and Dynamic libs (Shared Objects)
*.o *.o
*.a *.a

View File

@ -3,7 +3,7 @@ package main
import ( import (
"errors" "errors"
"fmt" "fmt"
"github.com/boltdb/bolt" "github.com/br0xen/bolt"
"os" "os"
"strings" "strings"
) )
@ -508,7 +508,7 @@ func insertPair(path []string, k string, v string) error {
b := tx.Bucket([]byte(path[0])) b := tx.Bucket([]byte(path[0]))
if b != nil { if b != nil {
if len(path) > 0 { if len(path) > 0 {
for i := 1; i < len(path)-1; i++ { for i := 1; i < len(path); i++ {
b = b.Bucket([]byte(path[i])) b = b.Bucket([]byte(path[i]))
if b == nil { if b == nil {
return fmt.Errorf("insertPair: %s", err) return fmt.Errorf("insertPair: %s", err)
@ -530,7 +530,7 @@ var f *os.File
func logToFile(s string) { func logToFile(s string) {
if f == nil { if f == nil {
f, _ = os.Create("bolt-log") f, _ = os.OpenFile("bolt-log", os.O_RDWR|os.O_APPEND, 0660)
} }
f.WriteString(s + "\n") f.WriteString(s + "\n")
f.Sync() f.Sync()

View File

@ -2,7 +2,7 @@ package main
import ( import (
"fmt" "fmt"
"github.com/boltdb/bolt" "github.com/br0xen/bolt"
"github.com/nsf/termbox-go" "github.com/nsf/termbox-go"
"os" "os"
"syscall" "syscall"

View File

@ -5,6 +5,7 @@ import (
"github.com/nsf/termbox-go" "github.com/nsf/termbox-go"
"gogs.bullercodeworks.com/brian/termbox-util" "gogs.bullercodeworks.com/brian/termbox-util"
"strings" "strings"
"time"
) )
type ViewPort struct { type ViewPort struct {
@ -14,16 +15,18 @@ type ViewPort struct {
} }
type BrowserScreen struct { type BrowserScreen struct {
db *BoltDB db *BoltDB
cursor Cursor cursor Cursor
view_port ViewPort view_port ViewPort
queued_command string queued_command string
current_path []string current_path []string
current_type int current_type int
message string message string
mode BrowserMode mode BrowserMode
input_modal *termbox_util.InputModal input_modal *termbox_util.InputModal
confirm_modal *termbox_util.ConfirmModal confirm_modal *termbox_util.ConfirmModal
message_timeout time.Duration
message_time time.Time
} }
type BrowserMode int type BrowserMode int
@ -116,7 +119,7 @@ func (screen *BrowserScreen) handleBrowseKeyEvent(event termbox.Event) int {
} else if event.Ch == 'e' { } else if event.Ch == 'e' {
b, p, _ := screen.db.getGenericFromPath(screen.current_path) b, p, _ := screen.db.getGenericFromPath(screen.current_path)
if b != nil { if b != nil {
screen.message = "Cannot edit a bucket yet" screen.setMessage("Cannot edit a bucket")
} else if p != nil { } else if p != nil {
screen.startEditItem() screen.startEditItem()
} }
@ -137,7 +140,7 @@ func (screen *BrowserScreen) handleBrowseKeyEvent(event termbox.Event) int {
} else if p != nil { } else if p != nil {
screen.startEditItem() screen.startEditItem()
} else { } else {
screen.message = "Not sure what to do here..." screen.setMessage("Not sure what to do here...")
} }
} else if event.Ch == 'h' || event.Key == termbox.KeyArrowLeft { } else if event.Ch == 'h' || event.Key == termbox.KeyArrowLeft {
@ -175,10 +178,10 @@ func (screen *BrowserScreen) handleInputKeyEvent(event termbox.Event) int {
_, p, _ := screen.db.getGenericFromPath(screen.current_path) _, p, _ := screen.db.getGenericFromPath(screen.current_path)
if p != nil { if p != nil {
if updatePairValue(screen.current_path, new_val) != nil { if updatePairValue(screen.current_path, new_val) != nil {
screen.message = "Error occurred updating Pair." screen.setMessage("Error occurred updating Pair.")
} else { } else {
p.val = new_val p.val = new_val
screen.message = "Pair updated!" screen.setMessage("Pair updated!")
screen.refreshDatabase() screen.refreshDatabase()
} }
} }
@ -238,11 +241,12 @@ func (screen *BrowserScreen) handleInsertKeyEvent(event termbox.Event) int {
screen.input_modal.HandleKeyPress(event) screen.input_modal.HandleKeyPress(event)
if screen.input_modal.IsDone() { if screen.input_modal.IsDone() {
new_val := screen.input_modal.GetValue() new_val := screen.input_modal.GetValue()
screen.input_modal.Clear()
var insert_path []string var insert_path []string
if len(screen.current_path) > 0 { if len(screen.current_path) > 0 {
_, p, e := screen.db.getGenericFromPath(screen.current_path) _, p, e := screen.db.getGenericFromPath(screen.current_path)
if e != nil { if e != nil {
screen.message = "Error Inserting new item. Invalid Path." screen.setMessage("Error Inserting new item. Invalid Path.")
} }
insert_path = screen.current_path insert_path = screen.current_path
// where are we inserting? // where are we inserting?
@ -260,24 +264,23 @@ func (screen *BrowserScreen) handleInsertKeyEvent(event termbox.Event) int {
} }
if screen.mode&MODE_INSERT_BUCKET == MODE_INSERT_BUCKET { if screen.mode&MODE_INSERT_BUCKET == MODE_INSERT_BUCKET {
screen.message = strings.Join(insert_path, "/") screen.setMessage(strings.Join(insert_path, "/"))
err := insertBucket(insert_path, new_val) err := insertBucket(insert_path, new_val)
if err != nil { if err != nil {
screen.message = fmt.Sprintf("%s => %s", err, insert_path) screen.setMessage(fmt.Sprintf("%s => %s", err, insert_path))
} }
screen.refreshDatabase() screen.refreshDatabase()
screen.mode = MODE_BROWSE screen.mode = MODE_BROWSE
screen.input_modal.Clear() screen.input_modal.Clear()
} else if screen.mode&MODE_INSERT_PAIR == MODE_INSERT_PAIR { } else if screen.mode&MODE_INSERT_PAIR == MODE_INSERT_PAIR {
screen.message = "Add new pair: " + new_val
err := insertPair(insert_path, new_val, "") err := insertPair(insert_path, new_val, "")
if err != nil { if err != nil {
screen.message = fmt.Sprintf("%s => %s", err, insert_path) screen.setMessage(fmt.Sprintf("%s => %s", err, insert_path))
screen.refreshDatabase() screen.refreshDatabase()
screen.mode = MODE_BROWSE screen.mode = MODE_BROWSE
screen.input_modal.Clear() screen.input_modal.Clear()
} else { } else {
screen.current_path = append(screen.current_path, new_val) screen.current_path = append(insert_path, new_val)
screen.refreshDatabase() screen.refreshDatabase()
screen.startEditItem() screen.startEditItem()
} }
@ -378,8 +381,11 @@ func (screen *BrowserScreen) drawHeader(style Style) {
termbox_util.DrawStringAtPoint(fmt.Sprintf("%s%s%s", spaces, PROGRAM_NAME, spaces), 0, 0, style.title_fg, style.title_bg) termbox_util.DrawStringAtPoint(fmt.Sprintf("%s%s%s", spaces, PROGRAM_NAME, spaces), 0, 0, style.title_fg, style.title_bg)
} }
func (screen *BrowserScreen) drawFooter(style Style) { func (screen *BrowserScreen) drawFooter(style Style) {
if screen.message_timeout > 0 && time.Since(screen.message_time) > screen.message_timeout {
screen.clearMessage()
}
_, height := termbox.Size() _, height := termbox.Size()
termbox_util.DrawStringAtPoint(fmt.Sprintf("%s(%d) - %s", screen.current_path, screen.current_type, screen.message), 0, height-1, style.default_fg, style.default_bg) termbox_util.DrawStringAtPoint(screen.message, 0, height-1, style.default_fg, style.default_bg)
} }
func (screen *BrowserScreen) drawLeftPane(style Style) { func (screen *BrowserScreen) drawLeftPane(style Style) {
@ -441,16 +447,6 @@ func (screen *BrowserScreen) drawRightPane(style Style) {
termbox_util.DrawStringAtPoint(fmt.Sprintf("Key: %s", p.key), start_x, start_y+1, style.default_fg, style.default_bg) termbox_util.DrawStringAtPoint(fmt.Sprintf("Key: %s", p.key), start_x, start_y+1, style.default_fg, style.default_bg)
termbox_util.DrawStringAtPoint(fmt.Sprintf("Value: %s", p.val), start_x, start_y+2, style.default_fg, style.default_bg) termbox_util.DrawStringAtPoint(fmt.Sprintf("Value: %s", p.val), start_x, start_y+2, style.default_fg, style.default_bg)
} }
p_str := fmt.Sprintf("PREV: %s", strings.Join(screen.db.getPrevVisiblePath(screen.current_path), "/"))
n_str := fmt.Sprintf("NEXT: %s", strings.Join(screen.db.getNextVisiblePath(screen.current_path), "/"))
termbox_util.DrawStringAtPoint(p_str, start_x, start_y+4, style.default_fg, style.default_bg)
termbox_util.DrawStringAtPoint(n_str, start_x, start_y+5, style.default_fg, style.default_bg)
vs, _ := screen.db.buildVisiblePathSlice()
for i := range vs {
termbox_util.DrawStringAtPoint(vs[i], start_x, start_y+6+i, style.default_fg, style.default_bg)
}
} }
} }
} }
@ -584,7 +580,13 @@ func (screen *BrowserScreen) startInsertItemAtParent(tp BoltType) bool {
return true return true
} }
} else { } else {
ins_path := strings.Join(screen.current_path[:len(screen.current_path)-1], "/") + "/" var ins_path string
_, p, e := screen.db.getGenericFromPath(screen.current_path[:len(screen.current_path)-1])
if e == nil && p != nil {
ins_path = strings.Join(screen.current_path[:len(screen.current_path)-2], "/") + "/"
} else {
ins_path = strings.Join(screen.current_path[:len(screen.current_path)-1], "/") + "/"
}
if tp == TYPE_BUCKET { if tp == TYPE_BUCKET {
mod.SetTitle(termbox_util.AlignText("Create Bucket at "+ins_path, inp_w, termbox_util.ALIGN_CENTER)) mod.SetTitle(termbox_util.AlignText("Create Bucket at "+ins_path, inp_w, termbox_util.ALIGN_CENTER))
screen.mode = MODE_INSERT_BUCKET | MODE_MOD_TO_PARENT screen.mode = MODE_INSERT_BUCKET | MODE_MOD_TO_PARENT
@ -606,7 +608,13 @@ func (screen *BrowserScreen) startInsertItem(tp BoltType) bool {
inp_x, inp_y := ((w / 2) - (inp_w / 2)), ((h / 2) - inp_h) inp_x, inp_y := ((w / 2) - (inp_w / 2)), ((h / 2) - inp_h)
mod := termbox_util.CreateInputModal("", inp_x, inp_y, inp_w, inp_h, termbox.ColorWhite, termbox.ColorBlack) mod := termbox_util.CreateInputModal("", inp_x, inp_y, inp_w, inp_h, termbox.ColorWhite, termbox.ColorBlack)
screen.input_modal = mod screen.input_modal = mod
ins_path := strings.Join(screen.current_path, "/") + "/" var ins_path string
_, p, e := screen.db.getGenericFromPath(screen.current_path)
if e == nil && p != nil {
ins_path = strings.Join(screen.current_path[:len(screen.current_path)-1], "/") + "/"
} else {
ins_path = strings.Join(screen.current_path, "/") + "/"
}
if tp == TYPE_BUCKET { if tp == TYPE_BUCKET {
mod.SetTitle(termbox_util.AlignText("Create Bucket at "+ins_path, inp_w, termbox_util.ALIGN_CENTER)) mod.SetTitle(termbox_util.AlignText("Create Bucket at "+ins_path, inp_w, termbox_util.ALIGN_CENTER))
screen.mode = MODE_INSERT_BUCKET screen.mode = MODE_INSERT_BUCKET
@ -621,6 +629,26 @@ func (screen *BrowserScreen) startInsertItem(tp BoltType) bool {
return false return false
} }
func (screen *BrowserScreen) setMessage(msg string) {
screen.message = msg
screen.message_time = time.Now()
screen.message_timeout = time.Second * 2
}
/* setMessageWithTimeout lets you specify the timeout for the message
* setting it to -1 means it won't timeout
*/
func (screen *BrowserScreen) setMessageWithTimeout(msg string, timeout time.Duration) {
screen.message = msg
screen.message_time = time.Now()
screen.message_timeout = timeout
}
func (screen *BrowserScreen) clearMessage() {
screen.message = ""
screen.message_timeout = -1
}
func (screen *BrowserScreen) refreshDatabase() { func (screen *BrowserScreen) refreshDatabase() {
shadowDB := screen.db shadowDB := screen.db
screen.db = screen.db.refreshDatabase() screen.db = screen.db.refreshDatabase()