From 334280a11fa886738a895cc8a6bbb308c2a1a40b Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Sun, 12 Aug 2018 19:55:21 -0400 Subject: [PATCH] Added MultilineEntry. --- multilineentry.go | 97 +++++++++++++++++++++++++++++++++++++++++++++++ zz_controls.go | 1 + 2 files changed, 98 insertions(+) create mode 100644 multilineentry.go diff --git a/multilineentry.go b/multilineentry.go new file mode 100644 index 0000000..88a75c4 --- /dev/null +++ b/multilineentry.go @@ -0,0 +1,97 @@ +// 12 december 2015 + +// TODO typing in entry in OS X crashes libui +// I've had similar issues with checkboxes on libui +// something's wrong with NSMapTable + +package ui + +import ( + "unsafe" +) + +// #include "ui.h" +// extern void doMultilineEntryOnChanged(uiMultilineEntry *, void *); +// // see golang/go#19835 +// typedef void (*multilineEntryCallback)(uiMultilineEntry *, void *); +import "C" + +// MultilineEntry is a Control that represents a space that the user +// can type multiple lines of text into. +type MultilineEntry struct { + ControlBase + e *C.uiMultilineEntry + onChanged func(*MultilineEntry) +} + +func finishNewMultilineEntry(ee *C.uiMultilineEntry) *MultilineEntry { + m := new(MultilineEntry) + + m.e = ee + + C.uiMultilineEntryOnChanged(m.e, C.multilineEntryCallback(C.doMultilineEntryOnChanged), nil) + + m.ControlBase = NewControlBase(m, uintptr(unsafe.Pointer(m.e))) + return m +} + +// NewMultilineEntry creates a new MultilineEntry. +// The MultilineEntry soft-word-wraps and has no horizontal +// scrollbar. +func NewMultilineEntry() *MultilineEntry { + return finishNewMultilineEntry(C.uiNewMultilineEntry()) +} + +// NewNonWrappingMultilineEntry creates a new MultilineEntry. +// The MultilineEntry does not word-wrap and thus has horizontal +// scrollbar. +func NewNonWrappingMultilineEntry() *MultilineEntry { + return finishNewMultilineEntry(C.uiNewNonWrappingMultilineEntry()) +} + +// Text returns the MultilineEntry's text. +func (m *MultilineEntry) Text() string { + ctext := C.uiMultilineEntryText(m.e) + text := C.GoString(ctext) + C.uiFreeText(ctext) + return text +} + +// SetText sets the MultilineEntry's text to text. +func (m *MultilineEntry) SetText(text string) { + ctext := C.CString(text) + C.uiMultilineEntrySetText(m.e, ctext) + freestr(ctext) +} + +// Append adds text to the end of the MultilineEntry's text. +// TODO selection and scroll behavior +func (m *MultilineEntry) Append(text string) { + ctext := C.CString(text) + C.uiMultilineEntryAppend(m.e, ctext) + freestr(ctext) +} + +// OnChanged registers f to be run when the user makes a change to +// the MultilineEntry. Only one function can be registered at a time. +func (m *MultilineEntry) OnChanged(f func(*MultilineEntry)) { + m.onChanged = f +} + +//export doMultilineEntryOnChanged +func doMultilineEntryOnChanged(ee *C.uiMultilineEntry, data unsafe.Pointer) { + m := ControlFromLibui(uintptr(unsafe.Pointer(ee))).(*MultilineEntry) + if m.onChanged != nil { + m.onChanged(m) + } +} + +// ReadOnly returns whether the MultilineEntry can be changed. +func (m *MultilineEntry) ReadOnly() bool { + return tobool(C.uiMultilineEntryReadOnly(m.e)) +} + +// SetReadOnly sets whether the MultilineEntry can be changed. +func (m *MultilineEntry) SetReadOnly(ro bool) { + C.uiMultilineEntrySetReadOnly(m.e, frombool(ro)) +} diff --git a/zz_controls.go b/zz_controls.go index 3ea3392..2875e6e 100644 --- a/zz_controls.go +++ b/zz_controls.go @@ -27,6 +27,7 @@ func makeBasicControlsPage() ui.Control { group.SetMargined(true) vbox.Append(group, true) +group.SetChild(ui.NewNonWrappingMultilineEntry()) /* entryForm = uiNewForm(); uiFormSetPadded(entryForm, 1);