summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPietro Gagliardi <[email protected]>2014-07-17 12:02:39 -0400
committerPietro Gagliardi <[email protected]>2014-07-17 12:02:39 -0400
commite4b379f84a8cb3699c8580f30af88d56be180a4d (patch)
treefda8dd32de19246504cc857af7f26bb2ffcf3418
parent659bc03f171d8639eefa47e5d37abe7af81e5534 (diff)
Added button click events to the Mac OS X backend.
-rw-r--r--redo/controls_darwin.go23
-rw-r--r--redo/controls_darwin.m25
-rw-r--r--redo/objc_darwin.h1
-rw-r--r--redo/zz_test.go3
4 files changed, 49 insertions, 3 deletions
diff --git a/redo/controls_darwin.go b/redo/controls_darwin.go
index 91dcb65..376c430 100644
--- a/redo/controls_darwin.go
+++ b/redo/controls_darwin.go
@@ -47,6 +47,7 @@ func (w *widgetbase) parent(win *window) {
type button struct {
*widgetbase
+ clicked *event
}
func newButton(text string) *Request {
@@ -55,17 +56,33 @@ func newButton(text string) *Request {
op: func() {
ctext := C.CString(text)
defer C.free(unsafe.Pointer(ctext))
- c <- &button{
+ b := &button{
widgetbase: newWidget(C.newButton(ctext)),
+ clicked: newEvent(),
}
+ C.buttonSetDelegate(b.id, unsafe.Pointer(b))
+ c <- b
},
resp: c,
}
}
func (b *button) OnClicked(e func(c Doer)) *Request {
- // TODO
- return nil
+ c := make(chan interface{})
+ return &Request{
+ op: func() {
+ b.clicked.set(e)
+ c <- struct{}{}
+ },
+ resp: c,
+ }
+}
+
+//export buttonClicked
+func buttonClicked(xb unsafe.Pointer) {
+ b := (*button)(unsafe.Pointer(xb))
+ b.clicked.fire()
+ println("button clicked")
}
func (b *button) Text() *Request {
diff --git a/redo/controls_darwin.m b/redo/controls_darwin.m
index a21ac0f..d8e0e51 100644
--- a/redo/controls_darwin.m
+++ b/redo/controls_darwin.m
@@ -22,6 +22,21 @@ void parent(id control, id parentid, BOOL floating)
[toNSView(control) release];
}
+@interface goControlDelegate : NSObject {
+@public
+ void *gocontrol;
+}
+@end
+
+@implementation goControlDelegate
+
+- (IBAction)buttonClicked:(id)sender
+{
+ buttonClicked(self->gocontrol);
+}
+
+@end
+
id newButton(char *text)
{
NSButton *b;
@@ -36,6 +51,16 @@ id newButton(char *text)
return b;
}
+void buttonSetDelegate(id button, void *b)
+{
+ goControlDelegate *d;
+
+ d = [goControlDelegate new];
+ d->gocontrol = b;
+ [toNSButton(button) setTarget:d];
+ [toNSButton(button) setAction:@selector(buttonClicked:)];
+}
+
const char *buttonText(id button)
{
return [[toNSButton(button) title] UTF8String];
diff --git a/redo/objc_darwin.h b/redo/objc_darwin.h
index b44461a..b1942de 100644
--- a/redo/objc_darwin.h
+++ b/redo/objc_darwin.h
@@ -30,6 +30,7 @@ extern void windowClose(id);
extern void unparent(id);
extern void parent(id, id, BOOL);
extern id newButton(char *);
+extern void buttonSetDelegate(id, void *);
extern const char *buttonText(id);
extern void buttonSetText(id, char *);
diff --git a/redo/zz_test.go b/redo/zz_test.go
index fb17ef7..c916252 100644
--- a/redo/zz_test.go
+++ b/redo/zz_test.go
@@ -20,6 +20,9 @@ func init() {
done <- struct{}{}
return true
}))
+ Wait(Do, b.OnClicked(func(c Doer) {
+ println("in OnClicked()")
+ }))
Wait(Do, w.Show())
<-done
}()