diff options
Diffstat (limited to 'redo/basicctrls_darwin.go')
| -rw-r--r-- | redo/basicctrls_darwin.go | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/redo/basicctrls_darwin.go b/redo/basicctrls_darwin.go new file mode 100644 index 0000000..78e9138 --- /dev/null +++ b/redo/basicctrls_darwin.go @@ -0,0 +1,155 @@ +// 16 july 2014 + +package ui + +import ( + "unsafe" +) + +// #include "objc_darwin.h" +import "C" + +type widgetbase struct { + id C.id +} + +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 + +type controlParent struct { + id C.id +} + +func (w *widgetbase) setParent(parent *controlParent) { + // redrawing the new window handled by C.parent() + C.parent(w.id, parent.id) +} + +func (w *widgetbase) containerShow() { + C.controlSetHidden(w.id, C.NO) +} + +func (w *widgetbase) containerHide() { + C.controlSetHidden(w.id, C.YES) +} + +type button struct { + *widgetbase + clicked *event +} + +func finishNewButton(id C.id, text string) *button { + ctext := C.CString(text) + defer C.free(unsafe.Pointer(ctext)) + b := &button{ + widgetbase: newWidget(id), + clicked: newEvent(), + } + C.buttonSetText(b.id, ctext) + C.buttonSetDelegate(b.id, unsafe.Pointer(b)) + return b +} + +func newButton(text string) *button { + return finishNewButton(C.newButton(), text) +} + +func (b *button) OnClicked(e func()) { + b.clicked.set(e) +} + +//export buttonClicked +func buttonClicked(xb unsafe.Pointer) { + b := (*button)(unsafe.Pointer(xb)) + b.clicked.fire() + println("button clicked") +} + +func (b *button) Text() string { + return C.GoString(C.buttonText(b.id)) +} + +func (b *button) SetText(text string) { + ctext := C.CString(text) + defer C.free(unsafe.Pointer(ctext)) + C.buttonSetText(b.id, ctext) +} + +type checkbox struct { + *button +} + +func newCheckbox(text string) *checkbox { + return &checkbox{ + button: finishNewButton(C.newCheckbox(), text), + } +} + +// we don't need to define our own event here; we can just reuse Button's +// (it's all target-action anyway) + +func (c *checkbox) Checked() bool { + return fromBOOL(C.checkboxChecked(c.id)) +} + +func (c *checkbox) SetChecked(checked bool) { + C.checkboxSetChecked(c.id, toBOOL(checked)) +} + +type textField struct { + *widgetbase +} + +func finishNewTextField(id C.id) *textField { + return &textField{ + widgetbase: newWidget(id), + } +} + +func newTextField() *textField { + return finishNewTextField(C.newTextField()) +} + +func newPasswordField() *textField { + return finishNewTextField(C.newPasswordField()) +} + +func (t *textField) Text() string { + return C.GoString(C.textFieldText(t.id)) +} + +func (t *textField) SetText(text string) { + ctext := C.CString(text) + defer C.free(unsafe.Pointer(ctext)) + C.textFieldSetText(t.id, ctext) +} + +// cheap trick +type label struct { + *textField + standalone bool +} + +func finishNewLabel(text string, standalone bool) *label { + l := &label{ + textField: finishNewTextField(C.newLabel()), + standalone: standalone, + } + l.SetText(text) + return l +} + +func newLabel(text string) Label { + return finishNewLabel(text, false) +} + +func newStandaloneLabel(text string) Label { + return finishNewLabel(text, true) +} + +// TODO label commitResize |
