144 lines
3.4 KiB
Go
144 lines
3.4 KiB
Go
package ui
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"git.bullercodeworks.com/brian/wandle"
|
|
"git.bullercodeworks.com/brian/widdles"
|
|
"github.com/nsf/termbox-go"
|
|
)
|
|
|
|
/*
|
|
* PartManager is for adding/editing/removing groups of strings
|
|
*/
|
|
type PartManager struct {
|
|
active bool
|
|
visible bool
|
|
|
|
x, y, w, h int
|
|
|
|
label string
|
|
typeString string
|
|
options []string
|
|
selOptions map[int]bool
|
|
input *widdles.ToggleField
|
|
|
|
cursor int
|
|
}
|
|
|
|
var _ widdles.Widdle = (*PartManager)(nil)
|
|
|
|
func NewPartManager(label string, x, y, w, h int) *PartManager {
|
|
return &PartManager{
|
|
label: label,
|
|
selOptions: make(map[int]bool),
|
|
input: widdles.NewToggleField("Value:", "", x+1, y+2, w-2, 1),
|
|
}
|
|
}
|
|
|
|
func (w *PartManager) Init() wandle.Cmd { return nil }
|
|
func (w *PartManager) Update(msg wandle.Msg) wandle.Cmd {
|
|
if w.active {
|
|
if msg, ok := msg.(termbox.Event); ok {
|
|
return w.handleTermboxEvent(msg)
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
func (w *PartManager) handleTermboxEvent(msg termbox.Event) wandle.Cmd {
|
|
if w.cursor == 0 {
|
|
if opt := w.input.Update(msg); opt != nil {
|
|
return opt
|
|
} else {
|
|
//return w.handleKeyPress(msg)
|
|
}
|
|
}
|
|
return w.handleKeyPress(msg)
|
|
}
|
|
func (w *PartManager) handleKeyPress(msg termbox.Event) wandle.Cmd {
|
|
if msg.Key == termbox.KeyEsc {
|
|
return func() wandle.Msg {
|
|
w.Hide()
|
|
return nil
|
|
}
|
|
} else if msg.Ch == 'j' || msg.Key == termbox.KeyArrowDown {
|
|
if w.cursor < len(w.options) {
|
|
w.cursor = w.cursor + 1
|
|
}
|
|
} else if msg.Ch == 'k' || msg.Key == termbox.KeyArrowUp {
|
|
if w.cursor > 0 {
|
|
w.cursor = w.cursor - 1
|
|
}
|
|
}
|
|
if w.IsActive() {
|
|
return func() wandle.Msg { return nil }
|
|
}
|
|
return nil
|
|
}
|
|
func (w *PartManager) View(style wandle.Style) {
|
|
if w.visible {
|
|
wandle.TitledBorderFilled(w.label, w.x, w.y, w.x+w.w, w.y+w.h, style, wandle.BRD_SIMPLE)
|
|
st := style
|
|
if w.cursor == 0 {
|
|
st = st.Invert()
|
|
}
|
|
w.input.View(st)
|
|
y := w.input.GetY() + 1
|
|
wandle.Print(w.x+1, y, style, fmt.Sprintf("Add %s:", w.typeString))
|
|
y++
|
|
for i := range w.options {
|
|
st := style
|
|
if w.cursor-1 == i {
|
|
st = st.Invert()
|
|
}
|
|
wandle.Print(w.x+3, y, st, w.options[i])
|
|
y++
|
|
}
|
|
}
|
|
}
|
|
func (w *PartManager) IsActive() bool { return w.active }
|
|
func (w *PartManager) SetActive(b bool) { w.active = b }
|
|
func (w *PartManager) Focusable() bool { return true }
|
|
func (w *PartManager) SetX(x int) {
|
|
w.x = x
|
|
w.Measure()
|
|
}
|
|
func (w *PartManager) GetX() int { return w.x }
|
|
func (w *PartManager) SetY(y int) {
|
|
w.y = y
|
|
w.Measure()
|
|
}
|
|
func (w *PartManager) GetY() int { return w.y }
|
|
func (w *PartManager) SetHeight(h int) {
|
|
w.h = h
|
|
w.Measure()
|
|
}
|
|
func (w *PartManager) GetHeight() int { return w.h }
|
|
func (w *PartManager) SetWidth(v int) {
|
|
w.w = v
|
|
w.Measure()
|
|
}
|
|
func (w *PartManager) GetWidth() int { return w.w }
|
|
func (w *PartManager) Measure() {
|
|
w.input.SetX(w.x + 1)
|
|
w.input.SetY(w.y + 1)
|
|
w.input.SetWidth(w.w - 2)
|
|
w.input.SetHeight(1)
|
|
}
|
|
|
|
func (w *PartManager) SetLabel(lbl string) { w.label = lbl }
|
|
func (w *PartManager) SetType(tp string) { w.typeString = tp }
|
|
func (w *PartManager) SetValue(val string) { w.input.SetValue(val) }
|
|
func (w *PartManager) GetValue() string { return w.input.GetValue() }
|
|
func (w *PartManager) SetOptions(opts []string) { w.options = opts }
|
|
func (w *PartManager) SetVisible(is bool) { w.visible = is }
|
|
func (w *PartManager) IsVisible() bool { return w.visible }
|
|
func (w *PartManager) Show() {
|
|
w.SetVisible(true)
|
|
w.SetActive(true)
|
|
}
|
|
func (w *PartManager) Hide() {
|
|
w.SetVisible(false)
|
|
w.SetActive(false)
|
|
}
|