Switching over to termbox-util
Also, remove some unneeded stuff.
This commit is contained in:
parent
97aa2ce9d0
commit
cc46445c69
@ -12,6 +12,22 @@ type BoltDB struct {
|
|||||||
buckets []BoltBucket
|
buckets []BoltBucket
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type BoltBucket struct {
|
||||||
|
name string
|
||||||
|
path []string
|
||||||
|
pairs []BoltPair
|
||||||
|
buckets []BoltBucket
|
||||||
|
parent *BoltBucket
|
||||||
|
expanded bool
|
||||||
|
}
|
||||||
|
|
||||||
|
type BoltPair struct {
|
||||||
|
path []string
|
||||||
|
parent *BoltBucket
|
||||||
|
key string
|
||||||
|
val string
|
||||||
|
}
|
||||||
|
|
||||||
func (bd *BoltDB) getDepthFromPath(path []string) int {
|
func (bd *BoltDB) getDepthFromPath(path []string) int {
|
||||||
depth := 0
|
depth := 0
|
||||||
b, p, err := bd.getGenericFromPath(path)
|
b, p, err := bd.getGenericFromPath(path)
|
||||||
@ -186,15 +202,6 @@ func (bd *BoltDB) getBucket(k string) (*BoltBucket, error) {
|
|||||||
return nil, errors.New("Bucket Not Found")
|
return nil, errors.New("Bucket Not Found")
|
||||||
}
|
}
|
||||||
|
|
||||||
type BoltBucket struct {
|
|
||||||
name string
|
|
||||||
path []string
|
|
||||||
pairs []BoltPair
|
|
||||||
buckets []BoltBucket
|
|
||||||
parent *BoltBucket
|
|
||||||
expanded bool
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *BoltBucket) getBucket(k string) (*BoltBucket, error) {
|
func (b *BoltBucket) getBucket(k string) (*BoltBucket, error) {
|
||||||
for i := range b.buckets {
|
for i := range b.buckets {
|
||||||
if b.buckets[i].name == k {
|
if b.buckets[i].name == k {
|
||||||
@ -213,13 +220,6 @@ func (b *BoltBucket) getPair(k string) (*BoltPair, error) {
|
|||||||
return nil, errors.New("Pair Not Found")
|
return nil, errors.New("Pair Not Found")
|
||||||
}
|
}
|
||||||
|
|
||||||
type BoltPair struct {
|
|
||||||
path []string
|
|
||||||
parent *BoltBucket
|
|
||||||
key string
|
|
||||||
val string
|
|
||||||
}
|
|
||||||
|
|
||||||
func toggleOpenBucket(path []string) error {
|
func toggleOpenBucket(path []string) error {
|
||||||
// Find the BoltBucket with a path == path
|
// Find the BoltBucket with a path == path
|
||||||
b, err := memBolt.getBucketFromPath(path)
|
b, err := memBolt.getBucketFromPath(path)
|
||||||
|
@ -3,6 +3,7 @@ package main
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/nsf/termbox-go"
|
"github.com/nsf/termbox-go"
|
||||||
|
"gogs.bullercodeworks.com/brian/termbox-util"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Command struct {
|
type Command struct {
|
||||||
@ -15,8 +16,8 @@ type AboutScreen int
|
|||||||
func drawCommandsAtPoint(commands []Command, x int, y int, style Style) {
|
func drawCommandsAtPoint(commands []Command, x int, y int, style Style) {
|
||||||
x_pos, y_pos := x, y
|
x_pos, y_pos := x, y
|
||||||
for index, cmd := range commands {
|
for index, cmd := range commands {
|
||||||
drawStringAtPoint(fmt.Sprintf("%6s", cmd.key), x_pos, y_pos, style.default_fg, style.default_bg)
|
termbox_util.DrawStringAtPoint(fmt.Sprintf("%6s", cmd.key), x_pos, y_pos, style.default_fg, style.default_bg)
|
||||||
drawStringAtPoint(cmd.description, x_pos+8, y_pos, style.default_fg, style.default_bg)
|
termbox_util.DrawStringAtPoint(cmd.description, x_pos+8, y_pos, style.default_fg, style.default_bg)
|
||||||
y_pos++
|
y_pos++
|
||||||
if index > 2 && index%2 == 1 {
|
if index > 2 && index%2 == 1 {
|
||||||
y_pos++
|
y_pos++
|
||||||
|
@ -22,28 +22,20 @@ type BrowserScreen struct {
|
|||||||
current_type int
|
current_type int
|
||||||
message string
|
message string
|
||||||
mode BrowserMode
|
mode BrowserMode
|
||||||
input_modal *InputModal
|
input_modal *termbox_util.InputModal
|
||||||
}
|
}
|
||||||
|
|
||||||
type BrowserMode int
|
type BrowserMode int
|
||||||
|
|
||||||
const (
|
const (
|
||||||
MODE_BROWSE = iota
|
MODE_BROWSE = 16 // 001 0000
|
||||||
MODE_CHANGE_VAL
|
MODE_CHANGE_VAL = 32 // 010 0000
|
||||||
MODE_INSERT_BUCKET
|
MODE_INSERT_BUCKET = 48 // 011 0000
|
||||||
MODE_INSERT_PAIR
|
MODE_INSERT_PAIR = 64 // 100 0000
|
||||||
|
MODE_INSERT_PAIR_KEY = 65 // 100 0001
|
||||||
|
MODE_INSERT_PAIR_VAL = 66 // 100 0010
|
||||||
)
|
)
|
||||||
|
|
||||||
type InputModal struct {
|
|
||||||
x int
|
|
||||||
y int
|
|
||||||
width int
|
|
||||||
height int
|
|
||||||
text string
|
|
||||||
curr_val string
|
|
||||||
current_cursor int
|
|
||||||
}
|
|
||||||
|
|
||||||
type BoltType int
|
type BoltType int
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -52,12 +44,15 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func (screen *BrowserScreen) handleKeyEvent(event termbox.Event) int {
|
func (screen *BrowserScreen) handleKeyEvent(event termbox.Event) int {
|
||||||
|
if screen.mode == 0 {
|
||||||
|
screen.mode = MODE_BROWSE
|
||||||
|
}
|
||||||
if screen.mode == MODE_BROWSE {
|
if screen.mode == MODE_BROWSE {
|
||||||
return screen.handleBrowseKeyEvent(event)
|
return screen.handleBrowseKeyEvent(event)
|
||||||
} else if screen.mode == MODE_CHANGE_VAL {
|
} else if screen.mode == MODE_CHANGE_VAL {
|
||||||
return screen.handleInputKeyEvent(event)
|
return screen.handleInputKeyEvent(event)
|
||||||
} else if screen.mode == MODE_INSERT_BUCKET {
|
} else if screen.mode == MODE_INSERT_BUCKET {
|
||||||
return screen.handleInsertBucketKeyEvent(event)
|
return screen.handleInsertItemEvent(event)
|
||||||
}
|
}
|
||||||
return BROWSER_SCREEN_INDEX
|
return BROWSER_SCREEN_INDEX
|
||||||
}
|
}
|
||||||
@ -97,24 +92,25 @@ func (screen *BrowserScreen) handleBrowseKeyEvent(event termbox.Event) int {
|
|||||||
screen.moveCursorUp()
|
screen.moveCursorUp()
|
||||||
|
|
||||||
} else if event.Ch == 'p' {
|
} else if event.Ch == 'p' {
|
||||||
screen.insertPair()
|
screen.startInsertItem(TYPE_PAIR)
|
||||||
|
|
||||||
} else if event.Ch == 'b' {
|
} else if event.Ch == 'b' {
|
||||||
screen.insertBucket()
|
screen.startInsertItem(TYPE_BUCKET)
|
||||||
|
|
||||||
} else if event.Ch == 'e' {
|
} else if event.Ch == 'e' {
|
||||||
_, p, _ := screen.db.getGenericFromPath(screen.current_path)
|
b, p, _ := screen.db.getGenericFromPath(screen.current_path)
|
||||||
if p != nil {
|
if b != nil {
|
||||||
screen.createEditModal()
|
|
||||||
}
|
|
||||||
screen.message = "Cannot edit a bucket yet"
|
screen.message = "Cannot edit a bucket yet"
|
||||||
|
} else if p != nil {
|
||||||
|
screen.startEditItem(TYPE_PAIR)
|
||||||
|
}
|
||||||
|
|
||||||
} else if event.Key == termbox.KeyEnter {
|
} else if event.Key == termbox.KeyEnter {
|
||||||
b, p, _ := screen.db.getGenericFromPath(screen.current_path)
|
b, p, _ := screen.db.getGenericFromPath(screen.current_path)
|
||||||
if b != nil {
|
if b != nil {
|
||||||
toggleOpenBucket(screen.current_path)
|
toggleOpenBucket(screen.current_path)
|
||||||
} else if p != nil {
|
} else if p != nil {
|
||||||
screen.createEditModal()
|
screen.startEditItem(TYPE_PAIR)
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if event.Ch == 'l' || event.Key == termbox.KeyArrowRight {
|
} else if event.Ch == 'l' || event.Key == termbox.KeyArrowRight {
|
||||||
@ -123,7 +119,7 @@ func (screen *BrowserScreen) handleBrowseKeyEvent(event termbox.Event) int {
|
|||||||
if b != nil {
|
if b != nil {
|
||||||
toggleOpenBucket(screen.current_path)
|
toggleOpenBucket(screen.current_path)
|
||||||
} else if p != nil {
|
} else if p != nil {
|
||||||
screen.createEditModal()
|
screen.startEditItem(TYPE_PAIR)
|
||||||
} else {
|
} else {
|
||||||
screen.message = "Not sure what to do here..."
|
screen.message = "Not sure what to do here..."
|
||||||
}
|
}
|
||||||
@ -156,31 +152,31 @@ func (screen *BrowserScreen) handleBrowseKeyEvent(event termbox.Event) int {
|
|||||||
func (screen *BrowserScreen) handleInputKeyEvent(event termbox.Event) int {
|
func (screen *BrowserScreen) handleInputKeyEvent(event termbox.Event) int {
|
||||||
if event.Key == termbox.KeyEsc {
|
if event.Key == termbox.KeyEsc {
|
||||||
screen.mode = MODE_BROWSE
|
screen.mode = MODE_BROWSE
|
||||||
} else if event.Key == termbox.KeyEnter {
|
screen.input_modal.Clear()
|
||||||
b, p, e := screen.db.getGenericFromPath(screen.current_path)
|
|
||||||
if e == nil {
|
|
||||||
if b != nil {
|
|
||||||
screen.message = "Cannot edit bucket"
|
|
||||||
} else if p != nil {
|
|
||||||
if err := updatePairValue(screen.current_path, screen.input_modal.curr_val); err != nil {
|
|
||||||
screen.message = fmt.Sprint(err)
|
|
||||||
} else {
|
} else {
|
||||||
p.val = screen.input_modal.curr_val
|
screen.input_modal.HandleKeyPress(event)
|
||||||
|
if screen.input_modal.IsDone() {
|
||||||
|
new_val := screen.input_modal.GetValue()
|
||||||
|
_, p, _ := screen.db.getGenericFromPath(screen.current_path)
|
||||||
|
if p != nil {
|
||||||
|
if updatePairValue(screen.current_path, new_val) != nil {
|
||||||
|
screen.message = "Error occurred updating Pair."
|
||||||
|
} else {
|
||||||
|
p.val = new_val
|
||||||
|
screen.message = "Pair updated!"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
screen.mode = MODE_BROWSE
|
screen.mode = MODE_BROWSE
|
||||||
|
screen.input_modal.Clear()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if event.Key == termbox.KeyBackspace || event.Key == termbox.KeyBackspace2 || event.Key == termbox.KeyDelete {
|
|
||||||
screen.input_modal.curr_val = screen.input_modal.curr_val[:len(screen.input_modal.curr_val)-1]
|
|
||||||
} else {
|
|
||||||
screen.input_modal.curr_val += string(event.Ch)
|
|
||||||
}
|
|
||||||
return BROWSER_SCREEN_INDEX
|
return BROWSER_SCREEN_INDEX
|
||||||
}
|
}
|
||||||
|
|
||||||
func (screen *BrowserScreen) handleInsertBucketKeyEvent(event termbox.Event) int {
|
func (screen *BrowserScreen) handleInsertItemEvent(event termbox.Event) int {
|
||||||
if event.Key == termbox.KeyEsc {
|
if event.Key == termbox.KeyEsc {
|
||||||
screen.mode = MODE_BROWSE
|
screen.mode = MODE_BROWSE
|
||||||
|
/*
|
||||||
} else if event.Key == termbox.KeyEnter {
|
} else if event.Key == termbox.KeyEnter {
|
||||||
b, p, e := screen.db.getGenericFromPath(screen.current_path)
|
b, p, e := screen.db.getGenericFromPath(screen.current_path)
|
||||||
if e == nil {
|
if e == nil {
|
||||||
@ -208,6 +204,7 @@ func (screen *BrowserScreen) handleInsertBucketKeyEvent(event termbox.Event) int
|
|||||||
screen.input_modal.curr_val = screen.input_modal.curr_val[:len(screen.input_modal.curr_val)-1]
|
screen.input_modal.curr_val = screen.input_modal.curr_val[:len(screen.input_modal.curr_val)-1]
|
||||||
} else {
|
} else {
|
||||||
screen.input_modal.curr_val += string(event.Ch)
|
screen.input_modal.curr_val += string(event.Ch)
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
return BROWSER_SCREEN_INDEX
|
return BROWSER_SCREEN_INDEX
|
||||||
}
|
}
|
||||||
@ -284,33 +281,11 @@ func (screen *BrowserScreen) drawScreen(style Style) {
|
|||||||
screen.drawRightPane(style)
|
screen.drawRightPane(style)
|
||||||
screen.drawHeader(style)
|
screen.drawHeader(style)
|
||||||
screen.drawFooter(style)
|
screen.drawFooter(style)
|
||||||
if screen.mode == MODE_CHANGE_VAL {
|
if screen.mode == MODE_CHANGE_VAL || screen.mode == MODE_INSERT_BUCKET || screen.mode&MODE_INSERT_PAIR == MODE_INSERT_PAIR {
|
||||||
screen.drawInput(style)
|
screen.input_modal.Draw()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (screen *BrowserScreen) drawInput(style Style) {
|
|
||||||
box_x := screen.input_modal.x
|
|
||||||
box_y := screen.input_modal.y
|
|
||||||
box_width := screen.input_modal.width
|
|
||||||
box_height := screen.input_modal.height
|
|
||||||
|
|
||||||
termbox_util.FillWithChar(' ', box_x, box_y, box_x+box_width,
|
|
||||||
box_y+box_height, style.default_fg, style.default_bg,
|
|
||||||
)
|
|
||||||
termbox_util.DrawBorder(box_x, box_y, box_x+box_width, box_y+box_height, style.default_fg, style.default_bg)
|
|
||||||
|
|
||||||
termbox_util.DrawStringAtPoint(screen.input_modal.text, box_x+1,
|
|
||||||
box_y+1, style.default_fg|termbox.AttrBold, style.default_bg|termbox.AttrBold,
|
|
||||||
)
|
|
||||||
termbox_util.DrawBorder(box_x+2, box_y+2, box_x+box_width-2, box_y+4, style.default_fg, style.default_bg)
|
|
||||||
|
|
||||||
termbox_util.DrawStringAtPoint(screen.input_modal.curr_val, box_x+2, box_y+3, style.title_fg, style.title_bg)
|
|
||||||
termbox.SetCell(box_x+1+len(screen.input_modal.curr_val)+1, box_y+1, ' ', style.title_bg, style.title_fg)
|
|
||||||
|
|
||||||
termbox_util.DrawStringAtPoint(termbox_util.AlignText("'Enter' to Accept, 'ESC' to cancel", box_width-2, ALIGN_CENTER), box_x+2, box_y+5, style.default_fg, style.default_bg)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (screen *BrowserScreen) drawHeader(style Style) {
|
func (screen *BrowserScreen) drawHeader(style Style) {
|
||||||
width, _ := termbox.Size()
|
width, _ := termbox.Size()
|
||||||
spaces := strings.Repeat(" ", (width / 2))
|
spaces := strings.Repeat(" ", (width / 2))
|
||||||
@ -446,37 +421,48 @@ func (screen *BrowserScreen) drawPair(bp *BoltPair, style Style, y int) int {
|
|||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
func (screen *BrowserScreen) createEditModal() bool {
|
func (screen *BrowserScreen) startEditItem(tp BoltType) bool {
|
||||||
b, p, e := screen.db.getGenericFromPath(screen.current_path)
|
b, p, e := screen.db.getGenericFromPath(screen.current_path)
|
||||||
if e == nil {
|
if e == nil {
|
||||||
w, h := termbox.Size()
|
w, h := termbox.Size()
|
||||||
inp_w, inp_h := (w / 2), 6
|
inp_w, inp_h := (w / 2), 6
|
||||||
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 := InputModal{x: inp_x, y: inp_y, width: inp_w, height: inp_h}
|
mod := termbox_util.CreateInputModal("", inp_x, inp_y, inp_w, inp_h, termbox.ColorWhite, termbox.ColorBlack)
|
||||||
if b != nil {
|
if b != nil {
|
||||||
mod.text = termbox_util.AlignText(fmt.Sprintf("Rename Bucket '%s' to:", b.name), inp_w, ALIGN_CENTER)
|
mod.SetTitle(termbox_util.AlignText(fmt.Sprintf("Rename Bucket '%s' to:", b.name), inp_w, termbox_util.ALIGN_CENTER))
|
||||||
mod.curr_val = b.name
|
mod.SetValue(b.name)
|
||||||
} else if p != nil {
|
} else if p != nil {
|
||||||
mod.text = termbox_util.AlignText(fmt.Sprintf("Input new value for '%s':", p.key), inp_w, ALIGN_CENTER)
|
mod.SetTitle(termbox_util.AlignText(fmt.Sprintf("Input new value for '%s'", p.key), inp_w, termbox_util.ALIGN_CENTER))
|
||||||
mod.curr_val = p.val
|
mod.SetValue(p.val)
|
||||||
}
|
}
|
||||||
screen.input_modal = &mod
|
screen.input_modal = mod
|
||||||
screen.mode = MODE_CHANGE_VAL
|
screen.mode = MODE_CHANGE_VAL
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (screen *BrowserScreen) startInsertItem(tp BoltType) bool {
|
||||||
|
if tp == TYPE_BUCKET {
|
||||||
|
screen.mode = MODE_INSERT_BUCKET
|
||||||
|
|
||||||
|
} else if tp == TYPE_PAIR {
|
||||||
|
screen.mode = MODE_INSERT_PAIR
|
||||||
|
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
func (screen *BrowserScreen) insertBucket() bool {
|
func (screen *BrowserScreen) insertBucket() bool {
|
||||||
//b, _, e := screen.db.getGenericFromPath(screen.current_path)
|
//b, _, e := screen.db.getGenericFromPath(screen.current_path)
|
||||||
//if e == nil {
|
//if e == nil {
|
||||||
w, h := termbox.Size()
|
w, h := termbox.Size()
|
||||||
inp_w, inp_h := (w / 2), 6
|
inp_w, inp_h := (w / 2), 6
|
||||||
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 := InputModal{x: inp_x, y: inp_y, width: inp_w, height: inp_h}
|
mod := termbox_util.CreateInputModal("", inp_x, inp_y, inp_w, inp_h, termbox.ColorWhite, termbox.ColorBlack)
|
||||||
mod.text = termbox_util.AlignText("New Bucket Name:", inp_w, ALIGN_CENTER)
|
mod.SetTitle(termbox_util.AlignText("New Bucket Name:", inp_w, termbox_util.ALIGN_CENTER))
|
||||||
mod.curr_val = ""
|
mod.SetValue("")
|
||||||
screen.input_modal = &mod
|
screen.input_modal = mod
|
||||||
screen.mode = MODE_INSERT_BUCKET
|
screen.mode = MODE_INSERT_BUCKET
|
||||||
return true
|
return true
|
||||||
//}
|
//}
|
||||||
|
90
widget.go
90
widget.go
@ -1,90 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import "github.com/nsf/termbox-go"
|
|
||||||
|
|
||||||
type Widget interface {
|
|
||||||
layoutUnderPressure(pressure int) (int, int)
|
|
||||||
drawAtPoint(cursor Cursor, x int, y int, pressure int, style Style) (int, int)
|
|
||||||
}
|
|
||||||
|
|
||||||
type WidgetSlice []Widget
|
|
||||||
|
|
||||||
func (widgets WidgetSlice) sizeAtPressure(pressure int) (int, int) {
|
|
||||||
total_widget_width := 0
|
|
||||||
max_widget_height := 0
|
|
||||||
for _, widget := range widgets {
|
|
||||||
widget_width, widget_height := widget.layoutUnderPressure(pressure)
|
|
||||||
total_widget_width += widget_width
|
|
||||||
if widget_height > max_widget_height {
|
|
||||||
max_widget_height = widget_height
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return total_widget_width, max_widget_height
|
|
||||||
}
|
|
||||||
|
|
||||||
func (widgets WidgetSlice) numberVisibleAtPressure(pressure int) int {
|
|
||||||
count := 0
|
|
||||||
for _, widget := range widgets {
|
|
||||||
widget_width, _ := widget.layoutUnderPressure(pressure)
|
|
||||||
if widget_width > 0 {
|
|
||||||
count++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return count
|
|
||||||
}
|
|
||||||
|
|
||||||
func (widgets WidgetSlice) layout() (int, int) {
|
|
||||||
width, _ := termbox.Size()
|
|
||||||
pressure := 0
|
|
||||||
spacing := 4
|
|
||||||
padding := 2
|
|
||||||
for ; pressure < 10; pressure++ {
|
|
||||||
spacing = 4
|
|
||||||
total_widget_width, _ := widgets.sizeAtPressure(pressure)
|
|
||||||
num_spaces := widgets.numberVisibleAtPressure(pressure) - 1
|
|
||||||
for ; total_widget_width+num_spaces*spacing > (width-2*padding) && spacing > 2; spacing-- {
|
|
||||||
}
|
|
||||||
if total_widget_width+num_spaces*spacing <= (width - 2*padding) {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return pressure, spacing
|
|
||||||
}
|
|
||||||
|
|
||||||
func listOfWidgets() WidgetSlice {
|
|
||||||
all_widgets := [...]Widget{
|
|
||||||
NavigationWidget(0),
|
|
||||||
//CursorWidget(0),
|
|
||||||
//OffsetWidget(0),
|
|
||||||
}
|
|
||||||
return all_widgets[:]
|
|
||||||
}
|
|
||||||
|
|
||||||
func heightOfWidgets() int {
|
|
||||||
widgets := listOfWidgets()
|
|
||||||
pressure, _ := widgets.layout()
|
|
||||||
_, max_widget_height := widgets.sizeAtPressure(pressure)
|
|
||||||
return max_widget_height
|
|
||||||
}
|
|
||||||
|
|
||||||
func drawWidgets(cursor Cursor, style Style) (int, int) {
|
|
||||||
widgets := listOfWidgets()
|
|
||||||
|
|
||||||
width, height := termbox.Size()
|
|
||||||
spacing := 4
|
|
||||||
padding := 2
|
|
||||||
pressure, spacing := widgets.layout()
|
|
||||||
total_widget_width, max_widget_height := widgets.sizeAtPressure(pressure)
|
|
||||||
num_spaces := widgets.numberVisibleAtPressure(pressure) - 1
|
|
||||||
start_x, start_y := (width-2*padding-(total_widget_width+num_spaces*spacing))/2+padding, height-max_widget_height
|
|
||||||
x, y := start_x, start_y
|
|
||||||
for _, widget := range widgets {
|
|
||||||
widget_width, _ := widget.drawAtPoint(cursor, x, y, pressure, style)
|
|
||||||
x += widget_width
|
|
||||||
if widget_width > 0 {
|
|
||||||
x += spacing
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return total_widget_width + num_spaces*spacing, max_widget_height
|
|
||||||
}
|
|
@ -1,22 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
type NavigationWidget int
|
|
||||||
|
|
||||||
func (widget NavigationWidget) layoutUnderPressure(pressure int) (int, int) {
|
|
||||||
layouts := map[int]string{
|
|
||||||
0: "Navigate: ↓j ↑k",
|
|
||||||
}
|
|
||||||
runeCount := 0
|
|
||||||
for _, _ = range layouts[0] {
|
|
||||||
runeCount++
|
|
||||||
}
|
|
||||||
return runeCount, 2
|
|
||||||
}
|
|
||||||
|
|
||||||
func (widget NavigationWidget) drawAtPoint(cursor Cursor, x int, y int, pressure int, style Style) (int, int) {
|
|
||||||
fg := style.default_fg
|
|
||||||
bg := style.default_bg
|
|
||||||
x_pos := x
|
|
||||||
x_pos += drawStringAtPoint("Navigate: ↓j ↑k", x_pos, y, fg, bg)
|
|
||||||
return x_pos - x, 2
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user