clui/dialog.go
2015-10-21 17:04:57 -07:00

83 lines
1.9 KiB
Go

package clui
import (
term "github.com/nsf/termbox-go"
)
type OkCancelDialog struct {
view View
parent *Composer
result int
onClose func()
}
func NewOkCancelDialog(c *Composer, title, question string, buttonTitles []string) *OkCancelDialog {
dlg := new(OkCancelDialog)
cw, ch := term.Size()
dlg.parent = c
dlg.view = c.CreateView(cw/2-12, ch/2-8, 20, 10, title)
dlg.view.SetModal(true)
dlg.view.SetPack(Vertical)
NewFrame(dlg.view, dlg.view, 1, 1, BorderNone, DoNotScale)
fbtn := NewFrame(dlg.view, dlg.view, 1, 1, BorderNone, 1)
NewFrame(dlg.view, fbtn, 1, 1, BorderNone, DoNotScale)
lb := NewLabel(dlg.view, fbtn, 10, 3, question, 1)
NewFrame(dlg.view, fbtn, 1, 1, BorderNone, DoNotScale)
lb.SetMultiline(true)
NewFrame(dlg.view, dlg.view, 1, 1, BorderNone, DoNotScale)
frm1 := NewFrame(dlg.view, dlg.view, 16, 4, BorderNone, DoNotScale)
NewFrame(dlg.view, frm1, 1, 1, BorderNone, 1)
bText := "OK"
if len(buttonTitles) > 0 {
bText = buttonTitles[0]
}
btnOk := NewButton(dlg.view, frm1, AutoSize, AutoSize, bText, DoNotScale)
if len(buttonTitles) > 1 {
bText = buttonTitles[1]
} else {
bText = "Cancel"
}
NewFrame(dlg.view, frm1, 1, 1, BorderNone, 1)
btnCancel := NewButton(dlg.view, frm1, AutoSize, AutoSize, bText, DoNotScale)
NewFrame(dlg.view, frm1, 1, 1, BorderNone, 1)
dlg.view.ActivateControl(btnCancel)
dlg.view.OnClose(func(ev Event) {
if dlg.result == DialogAlive {
dlg.result = DialogClosed
c.DestroyView(dlg.view)
if dlg.onClose != nil {
go dlg.onClose()
}
}
})
btnOk.OnClick(func(ev Event) {
dlg.result = DialogOK
c.DestroyView(dlg.view)
if dlg.onClose != nil {
go dlg.onClose()
}
})
btnCancel.OnClick(func(ev Event) {
dlg.result = DialogCancel
c.DestroyView(dlg.view)
if dlg.onClose != nil {
go dlg.onClose()
}
})
return dlg
}
func (d *OkCancelDialog) OnClose(fn func()) {
d.onClose = fn
}
func (d *OkCancelDialog) Result() int {
return d.result
}