andlabs-ui/redo/containers_unix.go

72 lines
1.9 KiB
Go

// +build !windows,!darwin
// 25 july 2014
package ui
import (
"unsafe"
)
// #include "gtk_unix.h"
// extern void layoutResizing(GtkWidget *, GdkRectangle *, gpointer);
import "C"
type tab struct {
*widgetbase
notebook *C.GtkNotebook
containers []*container
layoutws []*C.GtkWidget
layoutcs []*C.GtkContainer
layouts []*C.GtkLayout
}
func newTab() Tab {
widget := C.gtk_notebook_new()
t := &tab{
widgetbase: newWidget(widget),
notebook: (*C.GtkNotebook)(unsafe.Pointer(widget)),
}
// there are no scrolling arrows by default; add them in case there are too many tabs
C.gtk_notebook_set_scrollable(t.notebook, C.TRUE)
return t
}
func (t *tab) Append(name string, control Control) {
// TODO isolate and standardize
layout := C.gtk_layout_new(nil, nil)
t.layoutws = append(t.layoutws, layout)
t.layoutcs = append(t.layoutcs, (*C.GtkContainer)(unsafe.Pointer(layout)))
t.layouts = append(t.layouts, (*C.GtkLayout)(unsafe.Pointer(layout)))
c := new(container)
t.containers = append(t.containers, c)
c.child = control
c.child.setParent((*C.GtkContainer)(unsafe.Pointer(layout)))
g_signal_connect_after(
C.gpointer(unsafe.Pointer(layout)),
"size-allocate",
C.GCallback(C.layoutResizing),
C.gpointer(unsafe.Pointer(c)))
cname := togstr(name)
defer freegstr(cname)
tab := C.gtk_notebook_append_page(t.notebook,
layout,
C.gtk_label_new(cname))
if tab == -1 {
panic("gtk_notebook_append_page() failed")
}
}
func (t *tab) allocate(x int, y int, width int, height int, d *sizing) []*allocation {
// only prepared the tabbed control; its children will be reallocated when that one is resized
return t.widgetbase.allocate(x, y, width, height, d)
}
//export layoutResizing
func layoutResizing(wid *C.GtkWidget, r *C.GdkRectangle, data C.gpointer) {
c := (*container)(unsafe.Pointer(data))
// the layout's coordinate system is localized, so the origin is (0, 0)
c.resize(0, 0, int(r.width), int(r.height))
}