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) }