From 24f5a91ff42031d65b64be724bc0237af96d6c05 Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Tue, 29 Jul 2014 03:07:11 -0400 Subject: Wrote the GTK+ Table model code. Mostly working; now it just needs an update mechanism... --- redo/table_unix.go | 44 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 41 insertions(+), 3 deletions(-) (limited to 'redo/table_unix.go') 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()) +} -- cgit v1.2.3