andlabs-ui/redo/controls_darwin.go

110 lines
1.8 KiB
Go
Raw Normal View History

// 16 july 2014
package ui
import (
"unsafe"
)
// #include "objc_darwin.h"
import "C"
// TODO move to common_darwin.go
func toBOOL(b bool) C.BOOL {
if b == true {
return C.YES
}
return C.NO
}
type widgetbase struct {
id C.id
parentw *window
floating bool
}
func newWidget(id C.id) *widgetbase {
return &widgetbase{
id: id,
}
}
// these few methods are embedded by all the various Controls since they all will do the same thing
func (w *widgetbase) unparent() {
if w.parentw != nil {
C.unparent(w.id)
w.floating = true
w.parentw = nil
}
}
func (w *widgetbase) parent(win *window) {
C.parent(w.id, win.id, toBOOL(w.floating))
w.floating = false
w.parentw = win
}
type button struct {
*widgetbase
clicked *event
}
func newButton(text string) *Request {
c := make(chan interface{})
return &Request{
op: func() {
ctext := C.CString(text)
defer C.free(unsafe.Pointer(ctext))
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 {
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 {
c := make(chan interface{})
return &Request{
op: func() {
c <- C.GoString(C.buttonText(b.id))
},
resp: c,
}
}
func (b *button) SetText(text string) *Request {
c := make(chan interface{})
return &Request{
op: func() {
ctext := C.CString(text)
defer C.free(unsafe.Pointer(ctext))
C.buttonSetText(b.id, ctext)
c <- struct{}{}
},
resp: c,
}
}