Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP

Loading…

GetIter() is broken #65

Closed
andrea-chiavazza opened this Issue · 4 comments

2 participants

@andrea-chiavazza

Regarding this func in gtk.go:
func (v *GtkTreeModel) GetIter(iter *GtkTreeIter, path *GtkTreePath) bool

There is something wrong with it, as the path parameter is not passed to C._gtk_tree_model_get_iter(), the newly created path_ is passed instead, and this error is generated:
Gtk-CRITICAL **: IA__gtk_tree_model_get_iter: assertionpath->depth > 0' failed`

This fixes the error:

func (v *GtkTreeModel) GetIter(iter *GtkTreeIter, path *GtkTreePath) bool {
    ret := gboolean2bool(C._gtk_tree_model_get_iter(v.TreeModel, &iter.TreeIter, unsafe.Pointer(path)))
    return ret
}

However, when using GetValue() with the resulting iter like that:
treeModel.GetValue(&iter, 1, &value)
I get this:
Gtk-CRITICAL **: gtk_tree_store_get_value: assertionVALID_ITER (iter, tree_store)' failed`

@mattn
Owner

Would you give me a example code to reproduce it?

@andrea-chiavazza

I haven't been working at this code for a while, here it is anyway, I hope it helps:

package packages

import (
    "github.com/mattn/go-gtk/gtk"
    "github.com/mattn/go-gtk/glib"
    "github.com/mattn/go-gtk/gdkpixbuf"
    "container/vector"
    "fmt"
    "os"
    "strings"
)

type Viewer struct {
    treeStore *gtk.GtkTreeStore
    treeView *gtk.GtkTreeView
    swin *gtk.GtkScrolledWindow
}

func NewViewer() (*Viewer) {
    treeStore := gtk.TreeStore(gdkpixbuf.GetGdkPixbufType(), glib.G_TYPE_STRING)
    treeView := gtk.TreeView()

    treeView.SetModel(treeStore.ToTreeModel())
    treeView.AppendColumn(gtk.TreeViewColumnWithAttributes("pixbuf", gtk.CellRendererPixbuf(), "pixbuf", 0))
    treeView.AppendColumn(gtk.TreeViewColumnWithAttributes("text", gtk.CellRendererText(), "text", 1))

    swin := gtk.ScrolledWindow(nil, nil)
    swin.Add(treeView)

    treeView.Connect("row_activated", func() {
        var path *gtk.GtkTreePath
        var column *gtk.GtkTreeViewColumn
        treeView.GetCursor(&path, &column)
        fmt.Println(path.String(), path.GetDepth())

        treeModel := treeStore.ToTreeModel()
        var iter gtk.GtkTreeIter
        treeModel.GetIter(&iter, path)

        var value glib.GValue
        value.Init(glib.G_TYPE_STRING)
        treeModel.GetValue(&iter, 1, &value)

        fmt.Println(value.GetString())
//      fmt.Println(pathToFile(path.String()))
    })

    return &Viewer{treeStore, treeView, swin}
}

func (viewer *Viewer) Update(projectName string, pkgs *vector.Vector) {
    viewer.treeStore.Clear()
    for _, p := range *pkgs {
        var cp *pkg = p.(*pkg)
        viewer.addPackage(cp, nil)
    }
}

func (viewer *Viewer) Widget() gtk.WidgetLike {
    return viewer.swin  
}

func (viewer *Viewer) addPackage(p *pkg, parent *gtk.GtkTreeIter) {
    // adds package icon to parent
    var piter gtk.GtkTreeIter
    viewer.treeStore.Append(&piter, parent)
    viewer.treeStore.Set(&piter, gtk.Image().RenderIcon(
        gtk.GTK_STOCK_DIRECTORY, gtk.GTK_ICON_SIZE_SMALL_TOOLBAR, "").Pixbuf,
        p.Name())

    // adds files
    for _, obj := range *p.Files() {
        var f *os.File = obj.(*os.File)

        var fiter gtk.GtkTreeIter
        viewer.treeStore.Append(&fiter, &piter)
        viewer.treeStore.Set(&fiter, gtk.Image().RenderIcon(
            gtk.GTK_STOCK_FILE, gtk.GTK_ICON_SIZE_SMALL_TOOLBAR, "").Pixbuf,
            fileName(f.Name()))
    }

    // adds sub-packages
    for _, obj := range *p.Packages() {
        var p *pkg = obj.(*pkg)
        viewer.addPackage(p, &piter)
    }
}

func fileName(name string) string {
    return name[strings.LastIndex(name, "/") + 1 : len(name) - 3]
}

func pathToFile(path string) *os.File {
    return nil
}
@mattn
Owner

Ah, ok.
Please check latest.

@mattn
Owner

Already fixed.

@mattn mattn closed this
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.