andlabs-ui/redo/controls_darwin.go

93 lines
1.4 KiB
Go

// 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
}
func newButton(text string) *Request {
c := make(chan interface{})
return &Request{
op: func() {
ctext := C.CString(text)
defer C.free(unsafe.Pointer(ctext))
c <- &button{
widgetbase: newWidget(C.newButton(ctext)),
}
},
resp: c,
}
}
func (b *button) OnClicked(e func(c Doer)) *Request {
// TODO
return nil
}
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,
}
}