summaryrefslogtreecommitdiff
path: root/redo/controls_unix.go
blob: 21c01e4b36db3a71b944042e2c6654d9a5b339ae (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
// +build !windows,!darwin

// 7 july 2014

package ui

import (
	"unsafe"
)

// #include "gtk_unix.h"
// extern void buttonClicked(GtkButton *, gpointer);
// extern void checkboxToggled(GtkToggleButton *, gpointer);
import "C"

type widgetbase struct {
	widget	*C.GtkWidget
}

func newWidget(w *C.GtkWidget) *widgetbase {
	return &widgetbase{
		widget:	w,
	}
}

// these few methods are embedded by all the various Controls since they all will do the same thing

func (w *widgetbase) setParent(c *C.GtkContainer) {
	C.gtk_container_add(c, w.widget)
	// make sure the new widget is shown
	C.gtk_widget_show_all(w.widget)
}

func (w *widgetbase) containerShow() {
	C.gtk_widget_show_all(w.widget)
}

func (w *widgetbase) containerHide() {
	C.gtk_widget_hide(w.widget)
}

type button struct {
	*widgetbase
	button		*C.GtkButton
	clicked		*event
}

// shared code for setting up buttons, check boxes, etc.
func finishNewButton(widget *C.GtkWidget, event string, handler unsafe.Pointer) *button {
	b := &button{
		widgetbase:	newWidget(widget),
		button:		(*C.GtkButton)(unsafe.Pointer(widget)),
		clicked:		newEvent(),
	}
	g_signal_connect(
		C.gpointer(unsafe.Pointer(b.button)),
		event,
		C.GCallback(handler),
		C.gpointer(unsafe.Pointer(b)))
	return b
}

func newButton(text string) *button {
	ctext := togstr(text)
	defer freegstr(ctext)
	widget := C.gtk_button_new_with_label(ctext)
	return finishNewButton(widget, "clicked", C.buttonClicked)
}

func (b *button) OnClicked(e func()) {
	b.clicked.set(e)
}

//export buttonClicked
func buttonClicked(bwid *C.GtkButton, data C.gpointer) {
	b := (*button)(unsafe.Pointer(data))
	b.clicked.fire()
	println("button clicked")
}

func (b *button) Text() string {
	return fromgstr(C.gtk_button_get_label(b.button))
}

func (b *button) SetText(text string) {
	ctext := togstr(text)
	defer freegstr(ctext)
	C.gtk_button_set_label(b.button, ctext)
}

type checkbox struct {
	// embed button so its methods and events carry over
	*button
	toggle		*C.GtkToggleButton
	checkbox		*C.GtkCheckButton
}

func newCheckbox(text string) *checkbox {
	ctext := togstr(text)
	defer freegstr(ctext)
	widget := C.gtk_check_button_new_with_label(ctext)
	return &checkbox{
		button:		finishNewButton(widget, "toggled", C.checkboxToggled),
		toggle:		(*C.GtkToggleButton)(unsafe.Pointer(widget)),
		checkbox:	(*C.GtkCheckButton)(unsafe.Pointer(widget)),
	}
}

//export checkboxToggled
func checkboxToggled(bwid *C.GtkToggleButton, data C.gpointer) {
	// note that the finishNewButton() call uses the embedded *button as data
	// this is fine because we're only deferring to buttonClicked() anyway
	buttonClicked(nil, data)
}

func (c *checkbox) Checked() bool {
	return fromgbool(C.gtk_toggle_button_get_active(c.toggle))
}

func (c *checkbox) SetChecked(checked bool) {
	C.gtk_toggle_button_set_active(c.toggle, togbool(checked))
}

//TODO
func newTab() Tab{return newButton("tab")}
func(*button)Append(string,Control){}