public Gtk.TreePath GetPathFromItem(TItem item) { var path = new Gtk.TreePath(); var parents = GetParents(item); foreach (var parent in parents) { var items = (TStore)(object)parent; var found = false; for (int i = 0; i < items.Count; i++) { if (object.ReferenceEquals(items[i], item)) { path.PrependIndex(i); item = parent; found = true; break; } } if (!found) { return(null); } } return(path); }
/// <summary> /// Gets a Gtk.TreeIter for the node. /// </summary> /// <param name="iter">Receives the iterator to the node within the Gtk.TreeStore.</param> /// <param name="treeStore">The tree store containing reference to this node.</param> /// <returns><c>true</c>, if iter was successfully retrieved, or this node is the root, <c>false</c> otherwise.</returns> /// <remarks>If this is the root node, <paramref name="iter"/> contains Gtk.TreeIter.Zero. Caller must check for this.</remarks> internal bool GetIterForItem(out Gtk.TreeIter iter, Gtk.TreeStore treeStore) { iter = Gtk.TreeIter.Zero; var path = new Gtk.TreePath(); var node = Model; var parent = Parent; while (parent != null) { var index = parent.IndexOfChild(node); path.PrependIndex(index); node = parent; parent = node.Parent; } var succeeded = (path.Depth == 0) || treeStore.GetIter(out iter, path); return(succeeded); }