Made Button.Clicked a callback.

This commit is contained in:
Pietro Gagliardi 2014-07-01 08:51:19 -04:00
parent 3565889e15
commit f4963e909b
2 changed files with 111 additions and 100 deletions

View File

@ -4,6 +4,11 @@ package ui
// A Button represents a clickable button with some text. // A Button represents a clickable button with some text.
type Button struct { type Button struct {
// Clicked is called when the button is clicked.
// This cannot be changed after the Window containing the Button has been created.
// If you do not specify a handler, a default of "do nothing" will be used instead.
Clicked func()
created bool created bool
sysData *sysData sysData *sysData
initText string initText string
@ -35,8 +40,9 @@ func (b *Button) Text() string {
} }
func (b *Button) make(window *sysData) error { func (b *Button) make(window *sysData) error {
b.sysData.event = func() { b.sysData.event = b.Clicked
window.winhandler.Event(Clicked, b) if b.sysData.event == nil {
b.sysData.event = func() {}
} }
err := b.sysData.make(window) err := b.sysData.make(window)
if err != nil { if err != nil {

View File

@ -44,6 +44,9 @@ func gridWindow() *Window {
l20 := NewLabel("2,0") l20 := NewLabel("2,0")
c21 := NewCheckbox("2,1") c21 := NewCheckbox("2,1")
c21.SetChecked(true) c21.SetChecked(true)
b12.Clicked = func() {
c21.SetChecked(!c21.Checked())
}
l22 := NewLabel("2,2") l22 := NewLabel("2,2")
g := NewGrid(3, g := NewGrid(3,
b00, b01, b02, b00, b01, b02,
@ -53,11 +56,6 @@ func gridWindow() *Window {
g.SetStretchy(1, 1) g.SetStretchy(1, 1)
w.SetSpaced(*spacingTest) w.SetSpaced(*spacingTest)
w.Open(g) w.Open(g)
//TODO
// go func() {for {select {
// case <-b12.Clicked:
// c21.SetChecked(!c21.Checked())
// }}}()
return w return w
} }
@ -224,12 +222,26 @@ func areaTest() {
widthbox := NewLineEdit("320") widthbox := NewLineEdit("320")
heightbox := NewLineEdit("240") heightbox := NewLineEdit("240")
resize := NewButton("Resize") resize := NewButton("Resize")
resize.Clicked = func() {
width, err := strconv.Atoi(widthbox.Text())
if err != nil { println(err); return }
height, err := strconv.Atoi(heightbox.Text())
if err != nil { println(err); return }
a.SetSize(width, height)
}
sizeStack := NewHorizontalStack(widthbox, heightbox, resize) sizeStack := NewHorizontalStack(widthbox, heightbox, resize)
sizeStack.SetStretchy(0) sizeStack.SetStretchy(0)
sizeStack.SetStretchy(1) sizeStack.SetStretchy(1)
sizeStack.SetStretchy(2) sizeStack.SetStretchy(2)
modaltest := NewButton("Modal") modaltest := NewButton("Modal")
modaltest.Clicked = func() {
MsgBox("Modal Test", "")
}
repainttest := NewButton("Repaint All") repainttest := NewButton("Repaint All")
repainttest.Clicked = func() {
areahandler.mutate()
a.RepaintAll()
}
sizeStack = NewHorizontalStack(sizeStack, repainttest, modaltest) sizeStack = NewHorizontalStack(sizeStack, repainttest, modaltest)
sizeStack.SetStretchy(0) sizeStack.SetStretchy(0)
sizeStack.SetStretchy(1) sizeStack.SetStretchy(1)
@ -270,22 +282,6 @@ type areatestwinhandler struct {
repainttest *Button repainttest *Button
} }
func (a *areatestwinhandler) Event(e Event, d interface{}) { func (a *areatestwinhandler) Event(e Event, d interface{}) {
switch e {
case Clicked:
switch d {
case a.resize:
width, err := strconv.Atoi(a.widthbox.Text())
if err != nil { println(err); return }
height, err := strconv.Atoi(a.heightbox.Text())
if err != nil { println(err); return }
a.a.SetSize(width, height)
case a.modaltest:
MsgBox("Modal Test", "")
case a.repainttest:
a.areahandler.mutate()
a.a.RepaintAll()
}
}
} }
var areabounds = flag.Bool("areabounds", false, "run area bounds test instead") var areabounds = flag.Bool("areabounds", false, "run area bounds test instead")
@ -426,6 +422,7 @@ func runMainTest() {
invalidTest(handler.cb1, handler.lb1, s, NewGrid(1, Space())) invalidTest(handler.cb1, handler.lb1, s, NewGrid(1, Space()))
} }
handler.w.SetSpaced(*spacingTest) handler.w.SetSpaced(*spacingTest)
handler.setUpEvents()
handler.w.Open(s) handler.w.Open(s)
if *gridtest { if *gridtest {
gridWindow() gridWindow()
@ -445,6 +442,7 @@ func runMainTest() {
// send: w.Send, // send: w.Send,
} }
dh.w = NewWindow("Dialogs", 200, 200, dh) dh.w = NewWindow("Dialogs", 200, 200, dh)
dh.setUpEvents()
if *dialogTest { if *dialogTest {
s := NewVerticalStack( s := NewVerticalStack(
dialog_bMsgBox, dialog_bMsgBox,
@ -488,11 +486,11 @@ func runMainTest() {
} }
} }
func (handler *testwinhandler) Event(e Event, d interface{}) { // TODO
switch e { func (handler *testwinhandler) Event(Event,interface{}){}
case Clicked:
switch d { func (handler *testwinhandler) setUpEvents() {
case handler.b: handler.b.Clicked = func() {
handler.w.SetTitle(fmt.Sprintf("%v | %s | %s | %s | %s", handler.w.SetTitle(fmt.Sprintf("%v | %s | %s | %s | %s",
handler.c.Checked(), handler.c.Checked(),
handler.cb1.Selection(), handler.cb1.Selection(),
@ -500,7 +498,8 @@ func (handler *testwinhandler) Event(e Event, d interface{}) {
handler.e.Text(), handler.e.Text(),
handler.password.Text())) handler.password.Text()))
handler.doAdjustments() handler.doAdjustments()
case handler.b2: }
handler.b2.Clicked = func() {
if handler.cb1.Len() > 1 { if handler.cb1.Len() > 1 {
handler.cb1.Delete(1) handler.cb1.Delete(1)
} }
@ -513,7 +512,8 @@ func (handler *testwinhandler) Event(e Event, d interface{}) {
if handler.lb2.Len() > 4 { if handler.lb2.Len() > 4 {
handler.lb2.Delete(4) handler.lb2.Delete(4)
} }
case handler.b3: }
handler.b3.Clicked = func() {
f := MsgBox f := MsgBox
if handler.c.Checked() { if handler.c.Checked() {
f = MsgBoxError f = MsgBoxError
@ -524,7 +524,8 @@ func (handler *testwinhandler) Event(e Event, d interface{}) {
handler.cb2.SelectedIndex(), handler.cb2.Selection(), handler.cb2.Len(), handler.cb2.SelectedIndex(), handler.cb2.Selection(), handler.cb2.Len(),
handler.lb1.SelectedIndices(), handler.lb1.Selection(), handler.lb1.Len(), handler.lb1.SelectedIndices(), handler.lb1.Selection(), handler.lb1.Len(),
handler.lb2.SelectedIndices(), handler.lb2.Selection(), handler.lb2.Len())) handler.lb2.SelectedIndices(), handler.lb2.Selection(), handler.lb2.Len()))
case handler.incButton: }
handler.incButton.Clicked = func() {
handler.prog++ handler.prog++
if handler.prog > 100 { if handler.prog > 100 {
handler.prog = 100 handler.prog = 100
@ -532,17 +533,21 @@ func (handler *testwinhandler) Event(e Event, d interface{}) {
handler.pbar.SetProgress(handler.prog) handler.pbar.SetProgress(handler.prog)
handler.cb1.Append("append multi 1", "append multi 2") handler.cb1.Append("append multi 1", "append multi 2")
handler.lb2.Append("append multi 1", "append multi 2") handler.lb2.Append("append multi 1", "append multi 2")
case handler.decButton: }
handler.decButton.Clicked = func() {
handler.prog-- handler.prog--
if handler.prog < 0 { if handler.prog < 0 {
handler.prog = 0 handler.prog = 0
} }
handler.pbar.SetProgress(handler.prog) handler.pbar.SetProgress(handler.prog)
case handler.indetButton: }
handler.indetButton.Clicked = func() {
handler.pbar.SetProgress(-1) handler.pbar.SetProgress(-1)
case handler.invalidButton: }
handler.invalidButton.Clicked = func() {
invalidTest(handler.cb1, handler.lb1, nil, nil) invalidTest(handler.cb1, handler.lb1, nil, nil)
case handler.bmsg: }
handler.bmsg.Clicked = func() {
MsgBox("Title Only, no parent", "") MsgBox("Title Only, no parent", "")
handler.w.MsgBox("Title and Text", "parent") handler.w.MsgBox("Title and Text", "parent")
} }
@ -552,7 +557,6 @@ func (handler *testwinhandler) Event(e Event, d interface{}) {
// case CustomEvent + 1: // case CustomEvent + 1:
// resetl() // resetl()
} }
}
type dialoghandler struct { type dialoghandler struct {
bMsgBox *Button bMsgBox *Button
@ -563,20 +567,21 @@ type dialoghandler struct {
} }
// == TODO == // == TODO ==
func (handler *dialoghandler) Event(e Event, d interface{}) { func (handler *dialoghandler) Event(e Event, d interface{}) {}
if e == Clicked {
switch d { func (handler *dialoghandler) setUpEvents() {
case handler.bMsgBox: handler.bMsgBox.Clicked = func() {
// handler.send(CustomEvent, "DIALOG") // handler.send(CustomEvent, "DIALOG")
handler.w.MsgBox("Message Box", "Dismiss") handler.w.MsgBox("Message Box", "Dismiss")
// handler.send(CustomEvent, nil) // handler.send(CustomEvent, nil)
case handler.bMsgBoxError: }
handler.bMsgBoxError.Clicked = func() {
// handler.send(CustomEvent, "DIALOG") // handler.send(CustomEvent, "DIALOG")
handler.w.MsgBoxError("Message Box", "Dismiss") handler.w.MsgBoxError("Message Box", "Dismiss")
// handler.send(CustomEvent, nil) // handler.send(CustomEvent, nil)
case handler.bCenter:
handler.w.Center()
} }
handler.bCenter.Clicked = func() {
handler.w.Center()
} }
} }