func init() { tm := []glib.TypeMarshaler{ // Enums {glib.Type(C.gdk_drag_action_get_type()), marshalDragAction}, {glib.Type(C.gdk_colorspace_get_type()), marshalColorspace}, {glib.Type(C.gdk_event_type_get_type()), marshalEventType}, {glib.Type(C.gdk_interp_type_get_type()), marshalInterpType}, {glib.Type(C.gdk_modifier_type_get_type()), marshalModifierType}, {glib.Type(C.gdk_pixbuf_alpha_mode_get_type()), marshalPixbufAlphaMode}, {glib.Type(C.gdk_event_mask_get_type()), marshalEventMask}, // Objects/Interfaces {glib.Type(C.gdk_device_get_type()), marshalDevice}, {glib.Type(C.gdk_device_manager_get_type()), marshalDeviceManager}, {glib.Type(C.gdk_display_get_type()), marshalDisplay}, {glib.Type(C.gdk_drag_context_get_type()), marshalDragContext}, {glib.Type(C.gdk_pixbuf_get_type()), marshalPixbuf}, {glib.Type(C.gdk_screen_get_type()), marshalScreen}, {glib.Type(C.gdk_visual_get_type()), marshalVisual}, {glib.Type(C.gdk_window_get_type()), marshalWindow}, // Boxed {glib.Type(C.gdk_event_get_type()), marshalEvent}, } glib.RegisterGValueMarshalers(tm) }
//export goTableModel_do_get_value func goTableModel_do_get_value(data unsafe.Pointer, row C.gint, col C.gint, value *C.GValue) { t := (*table)(data) t.RLock() defer t.RUnlock() d := reflect.Indirect(reflect.ValueOf(t.data)) datum := d.Index(int(row)).Field(int(col)) switch { case datum.Type() == reflect.TypeOf((*image.RGBA)(nil)): d := datum.Interface().(*image.RGBA) pixbuf := toIconSizedGdkPixbuf(d) C.g_value_init(value, C.gdk_pixbuf_get_type()) object := C.gpointer(unsafe.Pointer(pixbuf)) // use g_value_take_object() so the GtkTreeView becomes the pixbuf's owner C.g_value_take_object(value, object) case datum.Kind() == reflect.Bool: d := datum.Interface().(bool) C.g_value_init(value, C.G_TYPE_BOOLEAN) C.g_value_set_boolean(value, togbool(d)) default: s := fmt.Sprintf("%v", datum) str := togstr(s) defer freegstr(str) C.g_value_init(value, C.G_TYPE_STRING) C.g_value_set_string(value, str) } }
func finishNewTable(b *tablebase, ty reflect.Type) Table { widget := C.gtk_tree_view_new() t := &table{ scroller: newScroller(widget, true, true, false), // natively scrollable; has a border; no overlay tablebase: b, treeview: (*C.GtkTreeView)(unsafe.Pointer(widget)), crtocol: make(map[*C.GtkCellRendererToggle]int), selected: newEvent(), } model := C.newTableModel(unsafe.Pointer(t)) t.model = model t.modelgtk = (*C.GtkTreeModel)(unsafe.Pointer(model)) t.selection = C.gtk_tree_view_get_selection(t.treeview) g_signal_connect( C.gpointer(unsafe.Pointer(t.selection)), "changed", C.GCallback(C.tableSelectionChanged), C.gpointer(unsafe.Pointer(t))) C.gtk_tree_view_set_model(t.treeview, t.modelgtk) for i := 0; i < ty.NumField(); i++ { colname := ty.Field(i).Tag.Get("uicolumn") if colname == "" { colname = ty.Field(i).Name } cname := togstr(colname) switch { case ty.Field(i).Type == reflect.TypeOf((*image.RGBA)(nil)): // can't use GDK_TYPE_PIXBUF here because it's a macro that expands to a function and cgo hates that t.types = append(t.types, C.gdk_pixbuf_get_type()) C.tableAppendColumn(t.treeview, C.gint(i), cname, C.gtk_cell_renderer_pixbuf_new(), attribPixbuf) case ty.Field(i).Type.Kind() == reflect.Bool: t.types = append(t.types, C.G_TYPE_BOOLEAN) cr := C.gtk_cell_renderer_toggle_new() crt := (*C.GtkCellRendererToggle)(unsafe.Pointer(cr)) t.crtocol[crt] = i g_signal_connect(C.gpointer(unsafe.Pointer(cr)), "toggled", C.GCallback(C.goTableModel_toggled), C.gpointer(unsafe.Pointer(t))) C.tableAppendColumn(t.treeview, C.gint(i), cname, cr, attribActive) default: t.types = append(t.types, C.G_TYPE_STRING) C.tableAppendColumn(t.treeview, C.gint(i), cname, C.gtk_cell_renderer_text_new(), attribText) } freegstr(cname) // free now (not deferred) to conserve memory } // and for some GtkTreeModel boilerplate t.nColumns = C.gint(ty.NumField()) return t }
func init() { tm := []glib.TypeMarshaler{ // Enums {glib.Type(C.gdk_colorspace_get_type()), marshalColorspace}, {glib.Type(C.gdk_pixbuf_alpha_mode_get_type()), marshalPixbufAlphaMode}, // Objects/Interfaces {glib.Type(C.gdk_device_get_type()), marshalDevice}, {glib.Type(C.gdk_device_manager_get_type()), marshalDeviceManager}, {glib.Type(C.gdk_display_get_type()), marshalDisplay}, {glib.Type(C.gdk_pixbuf_get_type()), marshalPixbuf}, {glib.Type(C.gdk_screen_get_type()), marshalScreen}, {glib.Type(C.gdk_window_get_type()), marshalWindow}, // Boxed {glib.Type(C.gdk_event_get_type()), marshalEvent}, } glib.RegisterGValueMarshalers(tm) }
//export goTableModel_do_get_value func goTableModel_do_get_value(data unsafe.Pointer, row C.gint, col C.gint, value *C.GValue) { t := (*table)(data) t.RLock() defer t.RUnlock() d := reflect.Indirect(reflect.ValueOf(t.data)) datum := d.Index(int(row)).Field(int(col)) switch { case datum.Type() == reflect.TypeOf(ImageIndex(0)): d := datum.Interface().(ImageIndex) C.g_value_init(value, C.gdk_pixbuf_get_type()) C.g_value_set_object(value, C.gpointer(unsafe.Pointer(t.pixbufs[d]))) case datum.Kind() == reflect.Bool: d := datum.Interface().(bool) C.g_value_init(value, C.G_TYPE_BOOLEAN) C.g_value_set_boolean(value, togbool(d)) default: s := fmt.Sprintf("%v", datum) str := togstr(s) defer freegstr(str) C.g_value_init(value, C.G_TYPE_STRING) C.g_value_set_string(value, str) } }
// PixbufGetType is a wrapper around gdk_pixbuf_get_type(). func PixbufGetType() glib.Type { return glib.Type(C.gdk_pixbuf_get_type()) }
func GetType() int { return int(C.gdk_pixbuf_get_type()) }