diff --git a/LICENSE b/LICENSE old mode 100755 new mode 100644 diff --git a/README.md b/README.md old mode 100755 new mode 100644 diff --git a/bolt_model.go b/bolt_model.go old mode 100755 new mode 100644 diff --git a/boltbrowser.go b/boltbrowser.go old mode 100755 new mode 100644 diff --git a/screen.go b/screen.go old mode 100755 new mode 100644 diff --git a/screen_about.go b/screen_about.go old mode 100755 new mode 100644 diff --git a/screen_browser.go b/screen_browser.go old mode 100755 new mode 100644 index 519a6d3..5fef2ff --- a/screen_browser.go +++ b/screen_browser.go @@ -484,19 +484,27 @@ func (screen *BrowserScreen) drawRightPane(style Style) { // Screen is wide enough, split it termboxUtil.FillWithChar('=', 0, 1, w, 1, style.defaultFg, style.defaultBg) termboxUtil.FillWithChar('|', (w / 2), screen.viewPort.firstRow-1, (w / 2), h, style.defaultFg, style.defaultBg) + // Clear the right pane + termboxUtil.FillWithChar(' ', (w/2)+1, screen.viewPort.firstRow, w, h, style.defaultFg, style.defaultBg) b, p, err := screen.db.getGenericFromPath(screen.currentPath) if err == nil { startX := (w / 2) + 2 startY := 2 if b != nil { - termboxUtil.DrawStringAtPoint(fmt.Sprintf("Path: %s", strings.Join(b.GetPath(), "/")), startX, startY, style.defaultFg, style.defaultBg) - termboxUtil.DrawStringAtPoint(fmt.Sprintf("Buckets: %d", len(b.buckets)), startX, startY+1, style.defaultFg, style.defaultBg) - termboxUtil.DrawStringAtPoint(fmt.Sprintf("Pairs: %d", len(b.pairs)), startX, startY+2, style.defaultFg, style.defaultBg) + pathString := fmt.Sprintf("Path: %s", strings.Join(b.GetPath(), "/")) + startY += screen.drawMultilineText(pathString, 6, startX, startY, (w/2)-1, style.defaultFg, style.defaultBg) + bucketString := fmt.Sprintf("Buckets: %d", len(b.buckets)) + startY += screen.drawMultilineText(bucketString, 9, startX, startY, (w/2)-1, style.defaultFg, style.defaultBg) + pairsString := fmt.Sprintf("Pairs: %d", len(b.pairs)) + startY += screen.drawMultilineText(pairsString, 7, startX, startY, (w/2)-1, style.defaultFg, style.defaultBg) } else if p != nil { - termboxUtil.DrawStringAtPoint(fmt.Sprintf("Path: %s", strings.Join(p.GetPath(), "/")), startX, startY, style.defaultFg, style.defaultBg) - termboxUtil.DrawStringAtPoint(fmt.Sprintf("Key: %s", p.key), startX, startY+1, style.defaultFg, style.defaultBg) - termboxUtil.DrawStringAtPoint(fmt.Sprintf("Value: %s", p.val), startX, startY+2, style.defaultFg, style.defaultBg) + pathString := fmt.Sprintf("Path: %s", strings.Join(p.GetPath(), "/")) + startY += screen.drawMultilineText(pathString, 6, startX, startY, (w/2)-1, style.defaultFg, style.defaultBg) + keyString := fmt.Sprintf("Key: %s", p.key) + startY += screen.drawMultilineText(keyString, 5, startX, startY, (w/2)-1, style.defaultFg, style.defaultBg) + valString := fmt.Sprintf("Value: %s", p.val) + startY += screen.drawMultilineText(valString, 7, startX, startY, (w/2)-1, style.defaultFg, style.defaultBg) } } } @@ -522,13 +530,13 @@ func (screen *BrowserScreen) drawBucket(bkt *BoltBucket, style Style, y int) int bucketBg = style.cursorBg } - bktString := strings.Repeat(" ", len(bkt.GetPath())*2) //screen.db.getDepthFromPath(bkt.GetPath())*2) - if bkt.expanded { - bktString = bktString + "- " + bkt.name + " " - bktString = fmt.Sprintf("%s%s", bktString, strings.Repeat(" ", (w-len(bktString)))) + prefixSpaces := strings.Repeat(" ", len(bkt.GetPath())*2) + bktString := prefixSpaces + prefixSpaces = prefixSpaces + " " - termboxUtil.DrawStringAtPoint(bktString, 0, (y + usedLines), bucketFg, bucketBg) - usedLines++ + if bkt.expanded { + bktString = bktString + "- " + bkt.name + usedLines = screen.drawMultilineText(bktString, (len(bkt.GetPath())*2 + 2), 0, y, (w - 1), bucketFg, bucketBg) for i := range bkt.buckets { usedLines += screen.drawBucket(&bkt.buckets[i], style, y+usedLines) @@ -538,9 +546,7 @@ func (screen *BrowserScreen) drawBucket(bkt *BoltBucket, style Style, y int) int } } else { bktString = bktString + "+ " + bkt.name - bktString = fmt.Sprintf("%s%s", bktString, strings.Repeat(" ", (w-len(bktString)))) - termboxUtil.DrawStringAtPoint(bktString, 0, (y + usedLines), bucketFg, bucketBg) - usedLines++ + usedLines = screen.drawMultilineText(bktString, (len(bkt.GetPath())*2 + 2), 0, y, (w - 1), bucketFg, bucketBg) } return usedLines } @@ -550,6 +556,7 @@ func (screen *BrowserScreen) drawPair(bp *BoltPair, style Style, y int) int { if w > 80 { w = w / 2 } + usedLines := 0 bucketFg := style.defaultFg bucketBg := style.defaultBg if comparePaths(screen.currentPath, bp.GetPath()) { @@ -557,13 +564,33 @@ func (screen *BrowserScreen) drawPair(bp *BoltPair, style Style, y int) int { bucketBg = style.cursorBg } - pairString := strings.Repeat(" ", len(bp.GetPath())*2) //screen.db.getDepthFromPath(bp.GetPath())*2) + prefixSpaces := strings.Repeat(" ", len(bp.GetPath())*2) + pairString := prefixSpaces pairString = fmt.Sprintf("%s%s: %s", pairString, bp.key, bp.val) - if w-len(pairString) > 0 { - pairString = fmt.Sprintf("%s%s", pairString, strings.Repeat(" ", (w-len(pairString)))) + prefixSpaces = prefixSpaces + " " + if len(pairString) > w { + // Long pair string, wrap it + // We're going to try to wrap it at the :, if we can + if len(bp.GetPath())*2+len(bp.key)+1 > w { + // We can't... So just wrap it + usedLines = screen.drawMultilineText(pairString, (len(bp.GetPath()) * 2), 0, y, (w - 1), style.defaultFg, style.defaultBg) + } else { + // That's convenient, wrap at the : + pairString := strings.Repeat(" ", len(bp.GetPath())*2) + pairString = fmt.Sprintf("%s%s:", pairString, bp.key) + termboxUtil.DrawStringAtPoint(pairString, 0, y, bucketFg, bucketBg) + usedLines++ + pairString = strings.Repeat(" ", len(bp.GetPath())*2+2) + bp.val + usedLines += screen.drawMultilineText(pairString, (len(bp.GetPath())*2)+2, 0, y+1, (w - 1), bucketFg, bucketBg) + } + } else { + if w-len(pairString) > 0 { + pairString = fmt.Sprintf("%s%s", pairString, strings.Repeat(" ", (w-len(pairString)))) + } + termboxUtil.DrawStringAtPoint(pairString, 0, y, bucketFg, bucketBg) + usedLines = 1 } - termboxUtil.DrawStringAtPoint(pairString, 0, y, bucketFg, bucketBg) - return 1 + return usedLines } func (screen *BrowserScreen) startDeleteItem() bool { @@ -687,6 +714,7 @@ func (screen *BrowserScreen) startInsertItem(tp BoltType) bool { } inpX, inpY := ((w / 2) - (inpW / 2)), ((h / 2) - inpH) mod := termboxUtil.CreateInputModal("", inpX, inpY, inpW, inpH, termbox.ColorWhite, termbox.ColorBlack) + //mod.SetInputWrap(true) screen.inputModal = mod var insPath string _, p, e := screen.db.getGenericFromPath(screen.currentPath) @@ -720,6 +748,27 @@ func (screen *BrowserScreen) startInsertItem(tp BoltType) bool { return false } +// Print text on multiple lines, if needed +// msg - What to print +// mlPadding - number of spaces to pad lines after the first +// startX - Starting x +// startY - Starting y +// maxWidth - Maximum width +// fg, bg - Colors +// Returns the number of lines used +func (screen *BrowserScreen) drawMultilineText(msg string, mlPadding, startX, startY, maxWidth int, fg, bg termbox.Attribute) int { + var numLines int + spacePadding := strings.Repeat(" ", mlPadding) + for len(msg) > maxWidth { + termboxUtil.DrawStringAtPoint(msg[:maxWidth-1], startX, (startY + numLines), fg, bg) + msg = spacePadding + msg[maxWidth-1:] + numLines++ + } + termboxUtil.DrawStringAtPoint(msg, startX, (startY + numLines), fg, bg) + numLines++ + return numLines +} + func (screen *BrowserScreen) setMessage(msg string) { screen.message = msg screen.messageTime = time.Now() diff --git a/style.go b/style.go old mode 100755 new mode 100644 diff --git a/util.go b/util.go deleted file mode 100644 index 06ab7d0..0000000 --- a/util.go +++ /dev/null @@ -1 +0,0 @@ -package main