From bb6cb14569ced2141a7f8ea9818f354765ff79f0 Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Sat, 12 Dec 2015 19:37:57 -0500 Subject: [PATCH] Added Group. --- group.go | 118 +++++++++++++++++++++++++++++++++++++++++++++++++++++ zz_test.go | 7 +++- 2 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 group.go diff --git a/group.go b/group.go new file mode 100644 index 0000000..0a7a5c8 --- /dev/null +++ b/group.go @@ -0,0 +1,118 @@ +// 12 december 2015 + +package ui + +import ( + "unsafe" +) + +// #include "ui.h" +import "C" + +// Group is a Control that holds another Control and wraps it around +// a labelled box (though some systems make this box invisible). +// You can use this to group related controls together. +type Group struct { + c *C.uiControl + g *C.uiGroup + + child Control +} + +// NewGroup creates a new Group. +func NewGroup(title string) *Group { + g := new(Group) + + ctitle := C.CString(title) + g.g = C.uiNewGroup(ctitle) + g.c = (*C.uiControl)(unsafe.Pointer(g.g)) + freestr(ctitle) + + return g +} + +// Destroy destroys the Group. If the Group has a child, +// Destroy calls Destroy on that as well. +func (g *Group) Destroy() { + if g.child != nil { + c := g.child + g.SetChild(nil) + c.Destroy() + } + C.uiControlDestroy(g.c) +} + +// LibuiControl returns the libui uiControl pointer that backs +// the Group. This is only used by package ui itself and should +// not be called by programs. +func (g *Group) LibuiControl() uintptr { + return uintptr(unsafe.Pointer(g.c)) +} + +// Handle returns the OS-level handle associated with this Group. +// On Windows this is an HWND of a standard Windows API BUTTON +// class (as provided by Common Controls version 6). +// On GTK+ this is a pointer to a GtkFrame. +// On OS X this is a pointer to a NSBox. +func (g *Group) Handle() uintptr { + return uintptr(C.uiControlHandle(g.c)) +} + +// Show shows the Group. It uses the OS conception of "presenting" +// the Group, whatever that may be on a given OS. +func (g *Group) Show() { + C.uiControlShow(g.c) +} + +// Hide hides the Group. +func (g *Group) Hide() { + C.uiControlHide(g.c) +} + +// Enable enables the Group. +func (g *Group) Enable() { + C.uiControlEnable(g.c) +} + +// Disable disables the Group. +func (g *Group) Disable() { + C.uiControlDisable(g.c) +} + +// Title returns the Group's title. +func (g *Group) Title() string { + ctitle := C.uiGroupTitle(g.g) + title := C.GoString(ctitle) + C.uiFreeText(ctitle) + return title +} + +// SetTitle sets the Group's title to title. +func (g *Group) SetTitle(title string) { + ctitle := C.CString(title) + C.uiGroupSetTitle(g.g, ctitle) + freestr(ctitle) +} + +// SetChild sets the Group's child to child. If child is nil, the Group +// will not have a child. +func (g *Group) SetChild(child Control) { + g.child = child + c := (*C.uiControl)(nil) + if g.child != nil { + c = touiControl(g.child.LibuiControl()) + } + C.uiGroupSetChild(g.g, c) +} + +// Margined returns whether the Group has margins around its child. +func (g *Group) Margined() bool { + return tobool(C.uiGroupMargined(g.g)) +} + +// SetMargined controls whether the Group has margins around its +// child. The size of the margins are determined by the OS and its +// best practices. +func (g *Group) SetMargined(margined bool) { + C.uiGroupSetMargined(g.g, frombool(margined)) +} diff --git a/zz_test.go b/zz_test.go index b642210..742fb9a 100644 --- a/zz_test.go +++ b/zz_test.go @@ -11,9 +11,14 @@ func TestIt(t *testing.T) { Quit() return true }) - s := NewSlider(0, 100) + s := NewGroup("Group") w.SetChild(s) w.SetMargined(true) + b := NewButton("Click Me") + b.OnClicked(func(*Button) { + s.SetMargined(!s.Margined()) + }) + s.SetChild(b) w.Show() }) if err != nil {