Wrote up the data model for Mac OS X Tables; now Tables work everywhere!
This commit is contained in:
parent
4e0436da18
commit
8d7f0c9a62
|
@ -59,5 +59,6 @@ extern id newTable(void);
|
||||||
extern void tableAppendColumn(id, char *);
|
extern void tableAppendColumn(id, char *);
|
||||||
extern void tableUpdate(id);
|
extern void tableUpdate(id);
|
||||||
extern id newScrollView(id);
|
extern id newScrollView(id);
|
||||||
|
extern void tableMakeDataSource(id, void *);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
package ui
|
package ui
|
||||||
|
|
||||||
import (
|
import (
|
||||||
// "fmt"
|
"fmt"
|
||||||
"reflect"
|
"reflect"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
@ -26,7 +26,7 @@ func finishNewTable(b *tablebase, ty reflect.Type) Table {
|
||||||
tablebase: b,
|
tablebase: b,
|
||||||
table: id,
|
table: id,
|
||||||
}
|
}
|
||||||
// TODO model
|
C.tableMakeDataSource(t.table, unsafe.Pointer(t))
|
||||||
for i := 0; i < ty.NumField(); i++ {
|
for i := 0; i < ty.NumField(); i++ {
|
||||||
cname := C.CString(ty.Field(i).Name)
|
cname := C.CString(ty.Field(i).Name)
|
||||||
C.tableAppendColumn(t.table, cname)
|
C.tableAppendColumn(t.table, cname)
|
||||||
|
@ -43,3 +43,23 @@ func (t *table) Unlock() {
|
||||||
defer t.RUnlock()
|
defer t.RUnlock()
|
||||||
C.tableUpdate(t.table)
|
C.tableUpdate(t.table)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//export goTableDataSource_getValue
|
||||||
|
func goTableDataSource_getValue(data unsafe.Pointer, row C.intptr_t, col C.intptr_t) *C.char {
|
||||||
|
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 C.CString(s)
|
||||||
|
}
|
||||||
|
|
||||||
|
//export goTableDataSource_getRowCount
|
||||||
|
func goTableDataSource_getRowCount(data unsafe.Pointer) C.intptr_t {
|
||||||
|
t := (*table)(data)
|
||||||
|
t.RLock()
|
||||||
|
defer t.RUnlock()
|
||||||
|
d := reflect.Indirect(reflect.ValueOf(t.data))
|
||||||
|
return C.intptr_t(d.Len())
|
||||||
|
}
|
||||||
|
|
|
@ -14,6 +14,24 @@
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation goTableDataSource
|
@implementation goTableDataSource
|
||||||
|
|
||||||
|
- (NSInteger)numberOfRowsInTableView:(NSTableView *)view
|
||||||
|
{
|
||||||
|
return (NSInteger) goTableDataSource_getRowCount(self->gotable);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (id)tableView:(NSTableView *)view objectValueForTableColumn:(NSTableColumn *)col row:(NSInteger)row
|
||||||
|
{
|
||||||
|
char *str;
|
||||||
|
NSString *s;
|
||||||
|
|
||||||
|
// TODO there has to be a better way to get the column index
|
||||||
|
str = goTableDataSource_getValue(self->gotable, (intptr_t) row, (intptr_t) [[view tableColumns] indexOfObject:col]);
|
||||||
|
s = [NSString stringWithUTF8String:str];
|
||||||
|
free(str); // allocated with C.CString() on the Go side
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
id newTable(void)
|
id newTable(void)
|
||||||
|
@ -59,3 +77,12 @@ id newScrollView(id content)
|
||||||
[sv setDocumentView:toNSView(content)];
|
[sv setDocumentView:toNSView(content)];
|
||||||
return (id) sv;
|
return (id) sv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tableMakeDataSource(id table, void *gotable)
|
||||||
|
{
|
||||||
|
goTableDataSource *model;
|
||||||
|
|
||||||
|
model = [goTableDataSource new];
|
||||||
|
model->gotable = gotable;
|
||||||
|
[toNSTableView(table) setDataSource:model];
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue