diff options
| author | Pietro Gagliardi <[email protected]> | 2018-08-11 19:07:04 -0400 |
|---|---|---|
| committer | Pietro Gagliardi <[email protected]> | 2018-08-11 19:07:04 -0400 |
| commit | 838e064107f0eae6fb1e3225fdec49b2dab45c5b (patch) | |
| tree | f4b6f9f86db1e5cf41aa1054797e538a0caa0826 /control.go | |
| parent | 485c946ad8961f836edb191eed60248f2ca6b617 (diff) | |
Created a new Control setup; wrote Button for it.
Diffstat (limited to 'control.go')
| -rw-r--r-- | control.go | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/control.go b/control.go new file mode 100644 index 0000000..3bcdfbe --- /dev/null +++ b/control.go @@ -0,0 +1,132 @@ +// 12 december 2015 + +package ui + +import ( + "unsafe" +) + +// #include "ui.h" +import "C" + +// no need to lock this; only the GUI thread can access it +var controls = make(map[*C.uiControl]Control) + +// Control represents a GUI control. It provdes methods +// common to all Controls. +// +// The preferred way to create new Controls is to use +// ControlBase; see ControlBase below. +type Control interface { + // Destroy destroys the Control. + Destroy() + + // Handle returns the OS-level handle that backs the + // Control. On OSs that use reference counting for + // controls, Handle does not increment the reference + // count; you are sharing package ui's reference. + Handle() uintptr + + // Visible returns whether the Control is visible. + Visible() bool + + // Show shows the Control. + Show() + + // Hide shows the Control. Hidden controls do not participate + // in layout (that is, Box, Grid, etc. does not reserve space for + // hidden controls). + Hide() + + // Enabled returns whether the Control is enabled. + Enabled() bool + + // Enable enables the Control. + Enable() + + // Disable disables the Control. + Disable() +} + +// ControlBase is an implementation of Control that provides +// all the methods that Control requires. To use it, embed a +// ControlBase (not a *ControlBase) into your structure, then +// assign the result of NewControlBase to that field: +// +// type MyControl struct { +// ui.ControlBase +// c *C.MyControl +// } +// +// func NewMyControl() *MyControl { +// m := &NewMyControl{ +// c: C.newMyControl(), +// } +// m.ControlBase = ui.NewControlBase(m, uintptr(unsafe.Pointer(c))) +// return m +// } +type ControlBase struct { + iface Control + c *C.uiControl +} + +// NewControlBase creates a new ControlBase. See the +// documentation of ControlBase for an example. +// NewControl should only be called once per instance of Control. +func NewControlBase(iface Control, c uintptr) ControlBase { + b := ControlBase{ + iface: iface, + c: (*C.uiControl)(unsafe.Pointer(c)), + } + controls[b.c] = b.iface + return b +} + +func (c *ControlBase) Destroy() { + delete(controls, c.c) + C.uiControlDestroy(c.c) +} + +func (c *ControlBase) Handle() uintptr { + return uintptr(C.uiControlHandle(c.c)) +} + +func (c *ControlBase) Visible() bool { + return frombool(C.uiControlVisible(c.c)) +} + +func (c *ControlBase) Show() { + C.uiControlShow(c.c) +} + +func (c *ControlBase) Hide() { + C.uiControlHide(c.c) +} + +func (c *ControlBase) Enabled() bool { + return frombool(C.uiControlEnabled(c.c)) +} + +func (c *ControlBase) Enable() { + C.uiControlEnable(c.c) +} + +func (c *ControlBase) Disable() { + C.uiControlDisable(c.c) +} + +// ControlFromLibui returns the Control associated with a libui +// uiControl. This is intended for implementing event handlers +// on the Go side, to prevent sharing Go pointers with C. +// This function only works on Controls that use ControlBase. +func ControlFromLibui(c uintptr) Control { + // comma-ok form to avoid creating nil entries + c, _ := controls[(*C.uiControl)(unsafe.Pointer(c))] + return c +} + +// LibuiFreeText allows implementations of Control +// to call the libui function uiFreeText. +func LibuiFreeText(c uintptr) { + C.uiFreeText((*C.char)(unsafe.Pointer(c))) +} |
