Updated the GTK+ backend to have the new parenting and sizing changes. Now to implement Tab! ...though I should probably implement the changes on Mac OS X first.
This commit is contained in:
parent
010c97d686
commit
d1702d33e0
|
@ -15,8 +15,6 @@ import "C"
|
||||||
|
|
||||||
type widgetbase struct {
|
type widgetbase struct {
|
||||||
widget *C.GtkWidget
|
widget *C.GtkWidget
|
||||||
parentw *window
|
|
||||||
floating bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func newWidget(w *C.GtkWidget) *widgetbase {
|
func newWidget(w *C.GtkWidget) *widgetbase {
|
||||||
|
@ -27,31 +25,18 @@ func newWidget(w *C.GtkWidget) *widgetbase {
|
||||||
|
|
||||||
// these few methods are embedded by all the various Controls since they all will do the same thing
|
// these few methods are embedded by all the various Controls since they all will do the same thing
|
||||||
|
|
||||||
func (w *widgetbase) unparent() {
|
func (w *widgetbase) setParent(c *C.GtkContainer) {
|
||||||
if w.parentw != nil {
|
C.gtk_container_add(c, w.widget)
|
||||||
// add another reference so it doesn't get removed by accident
|
|
||||||
C.g_object_ref(C.gpointer(unsafe.Pointer(w.widget)))
|
|
||||||
// we unref this in parent() below
|
|
||||||
w.floating = true
|
|
||||||
C.gtk_container_remove(w.parentw.layoutc, w.widget)
|
|
||||||
// redraw since we changed controls (by queueing a resize; thanks Jasper in irc.gimp.net/#gtk+)
|
|
||||||
C.gtk_widget_queue_resize(w.parentw.layoutw)
|
|
||||||
w.parentw = nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *widgetbase) parent(win *window) {
|
|
||||||
C.gtk_container_add(win.layoutc, w.widget)
|
|
||||||
w.parentw = win
|
|
||||||
// was previously parented; unref our saved ref
|
|
||||||
if w.floating {
|
|
||||||
C.g_object_unref(C.gpointer(unsafe.Pointer(w.widget)))
|
|
||||||
w.floating = false
|
|
||||||
}
|
|
||||||
// make sure the new widget is shown
|
// make sure the new widget is shown
|
||||||
C.gtk_widget_show_all(w.widget)
|
C.gtk_widget_show_all(w.widget)
|
||||||
// redraw since we changed controls (see above)
|
}
|
||||||
C.gtk_widget_queue_resize(win.layoutw)
|
|
||||||
|
func (w *widgetbase) containerShow() {
|
||||||
|
C.gtk_widget_show_all(w.widget)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w *widgetbase) containerHide() {
|
||||||
|
C.gtk_widget_hide(w.widget)
|
||||||
}
|
}
|
||||||
|
|
||||||
type button struct {
|
type button struct {
|
||||||
|
@ -135,3 +120,7 @@ func (c *checkbox) Checked() bool {
|
||||||
func (c *checkbox) SetChecked(checked bool) {
|
func (c *checkbox) SetChecked(checked bool) {
|
||||||
C.gtk_toggle_button_set_active(c.toggle, togbool(checked))
|
C.gtk_toggle_button_set_active(c.toggle, togbool(checked))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TODO
|
||||||
|
func newTab() Tab{return newButton("tab")}
|
||||||
|
func(*button)Append(string,Control){}
|
||||||
|
|
|
@ -35,11 +35,12 @@ func (w *window) beginResize() (d *sizing) {
|
||||||
return d
|
return d
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *window) endResize(d *sizing) {
|
func (c *container) endResize(d *sizing) {
|
||||||
C.gtk_widget_queue_draw(w.widget)
|
// TODO
|
||||||
|
// C.gtk_widget_queue_draw(w.widget)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *window) translateAllocationCoords(allocations []*allocation, winwidth, winheight int) {
|
func (c *container) translateAllocationCoords(allocations []*allocation, winwidth, winheight int) {
|
||||||
// no need for coordinate conversion with gtk+
|
// no need for coordinate conversion with gtk+
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@ import "C"
|
||||||
|
|
||||||
type window struct {
|
type window struct {
|
||||||
widget *C.GtkWidget
|
widget *C.GtkWidget
|
||||||
container *C.GtkContainer
|
wc *C.GtkContainer
|
||||||
bin *C.GtkBin
|
bin *C.GtkBin
|
||||||
window *C.GtkWindow
|
window *C.GtkWindow
|
||||||
|
|
||||||
|
@ -24,28 +24,32 @@ type window struct {
|
||||||
layoutc *C.GtkContainer
|
layoutc *C.GtkContainer
|
||||||
layout *C.GtkLayout
|
layout *C.GtkLayout
|
||||||
|
|
||||||
child Control
|
|
||||||
|
|
||||||
closing *event
|
closing *event
|
||||||
|
|
||||||
spaced bool
|
*container
|
||||||
}
|
}
|
||||||
|
|
||||||
func newWindow(title string, width int, height int) *window {
|
type controlParent interface {
|
||||||
|
setParent(*C.GtkContainer)
|
||||||
|
}
|
||||||
|
|
||||||
|
func newWindow(title string, width int, height int, control Control) *window {
|
||||||
widget := C.gtk_window_new(C.GTK_WINDOW_TOPLEVEL)
|
widget := C.gtk_window_new(C.GTK_WINDOW_TOPLEVEL)
|
||||||
ctitle := togstr(title)
|
ctitle := togstr(title)
|
||||||
defer freegstr(ctitle)
|
defer freegstr(ctitle)
|
||||||
layoutw := C.gtk_layout_new(nil, nil)
|
layoutw := C.gtk_layout_new(nil, nil)
|
||||||
w := &window{
|
w := &window{
|
||||||
widget: widget,
|
widget: widget,
|
||||||
container: (*C.GtkContainer)(unsafe.Pointer(widget)),
|
wc: (*C.GtkContainer)(unsafe.Pointer(widget)),
|
||||||
bin: (*C.GtkBin)(unsafe.Pointer(widget)),
|
bin: (*C.GtkBin)(unsafe.Pointer(widget)),
|
||||||
window: (*C.GtkWindow)(unsafe.Pointer(widget)),
|
window: (*C.GtkWindow)(unsafe.Pointer(widget)),
|
||||||
layoutw: layoutw,
|
layoutw: layoutw,
|
||||||
layoutc: (*C.GtkContainer)(unsafe.Pointer(layoutw)),
|
layoutc: (*C.GtkContainer)(unsafe.Pointer(layoutw)),
|
||||||
layout: (*C.GtkLayout)(unsafe.Pointer(layoutw)),
|
layout: (*C.GtkLayout)(unsafe.Pointer(layoutw)),
|
||||||
closing: newEvent(),
|
closing: newEvent(),
|
||||||
|
container: new(container),
|
||||||
}
|
}
|
||||||
|
w.container.beginResize = w.beginResize
|
||||||
C.gtk_window_set_title(w.window, ctitle)
|
C.gtk_window_set_title(w.window, ctitle)
|
||||||
g_signal_connect(
|
g_signal_connect(
|
||||||
C.gpointer(unsafe.Pointer(w.window)),
|
C.gpointer(unsafe.Pointer(w.window)),
|
||||||
|
@ -62,7 +66,9 @@ func newWindow(title string, width int, height int) *window {
|
||||||
C.GCallback(C.windowResizing),
|
C.GCallback(C.windowResizing),
|
||||||
C.gpointer(unsafe.Pointer(w)))
|
C.gpointer(unsafe.Pointer(w)))
|
||||||
C.gtk_window_resize(w.window, C.gint(width), C.gint(height))
|
C.gtk_window_resize(w.window, C.gint(width), C.gint(height))
|
||||||
C.gtk_container_add(w.container, layoutw)
|
C.gtk_container_add(w.wc, layoutw)
|
||||||
|
w.child = control
|
||||||
|
w.child.setParent(w.layoutc)
|
||||||
return w
|
return w
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -105,6 +111,6 @@ func windowClosing(wid *C.GtkWidget, e *C.GdkEvent, data C.gpointer) C.gboolean
|
||||||
//export windowResizing
|
//export windowResizing
|
||||||
func windowResizing(wid *C.GtkWidget, r *C.GdkRectangle, data C.gpointer) {
|
func windowResizing(wid *C.GtkWidget, r *C.GdkRectangle, data C.gpointer) {
|
||||||
w := (*window)(unsafe.Pointer(data))
|
w := (*window)(unsafe.Pointer(data))
|
||||||
w.doresize(int(r.width), int(r.height))
|
w.resize(int(r.width), int(r.height))
|
||||||
fmt.Printf("new size %d x %d\n", r.width, r.height)
|
fmt.Printf("new size %d x %d\n", r.width, r.height)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue