summaryrefslogtreecommitdiff
path: root/redo/table_unix.go
diff options
context:
space:
mode:
Diffstat (limited to 'redo/table_unix.go')
-rw-r--r--redo/table_unix.go44
1 files changed, 41 insertions, 3 deletions
diff --git a/redo/table_unix.go b/redo/table_unix.go
index 049945c..99a8a01 100644
--- a/redo/table_unix.go
+++ b/redo/table_unix.go
@@ -3,7 +3,7 @@
package ui
import (
-// "fmt"
+ "fmt"
"reflect"
"unsafe"
)
@@ -20,6 +20,12 @@ type table struct {
scrollc *C.GtkContainer
scrollwindow *C.GtkScrolledWindow
+
+ model *C.goTableModel
+ modelgtk *C.GtkTreeModel
+
+ // stuff required by GtkTreeModel
+ nColumns C.gint
}
func finishNewTable(b *tablebase, ty reflect.Type) Table {
@@ -37,12 +43,17 @@ func finishNewTable(b *tablebase, ty reflect.Type) Table {
// give the scrolled window a border (thanks to jlindgren in irc.gimp.net/#gtk+)
C.gtk_scrolled_window_set_shadow_type(t.scrollwindow, C.GTK_SHADOW_IN)
C.gtk_container_add(t.scrollc, t.treewidget)
- // TODO model
+ model := C.newTableModel(unsafe.Pointer(t))
+ t.model = model
+ t.modelgtk = (*C.GtkTreeModel)(unsafe.Pointer(model))
+ C.gtk_tree_view_set_model(t.treeview, t.modelgtk)
for i := 0; i < ty.NumField(); i++ {
cname := togstr(ty.Field(i).Name)
- C.tableAppendColumn(t.treeview, cname)
+ C.tableAppendColumn(t.treeview, C.gint(i), cname)
freegstr(cname) // free now (not deferred) to conserve memory
}
+ // and for some GtkTreeModel boilerplate
+ t.nColumns = C.gint(ty.NumField())
return t
}
@@ -62,3 +73,30 @@ func (t *table) Unlock() {
defer t.RUnlock()
// TODO
}
+
+//export goTableModel_get_n_columns
+func goTableModel_get_n_columns(model *C.GtkTreeModel) C.gint {
+ tm := (*C.goTableModel)(unsafe.Pointer(model))
+ t := (*table)(tm.gotable)
+ return t.nColumns
+}
+
+//export goTableModel_do_get_value
+func goTableModel_do_get_value(data unsafe.Pointer, row C.gint, col C.gint) *C.gchar {
+ t := (*table)(data)
+ t.RLock()
+ defer t.RUnlock()
+ d := reflect.Indirect(reflect.ValueOf(t.data))
+ datum := d.Index(int(row)).Field(int(col))
+ s := fmt.Sprintf("%v", datum)
+ return togstr(s)
+}
+
+//export goTableModel_getRowCount
+func goTableModel_getRowCount(data unsafe.Pointer) C.gint {
+ t := (*table)(data)
+ t.RLock()
+ defer t.RUnlock()
+ d := reflect.Indirect(reflect.ValueOf(t.data))
+ return C.gint(d.Len())
+}