Still writing a restore tool :(
Still writing a restore tool :(
Last two hours were spent debugging
an interesting problem with TreeView in PyGTK. It was too slow to parse
and add all files from a backup snapshot to the tree view at once (not
to mention that it took 35 Mb of RAM :P), so I decided to load the tree
as needed - I would add the children of a node only when this node gets
expanded. So I happily wrote a handler to 'row-expanded' event that does
just that - adds some children to the newly expanded node.
Note: as
the node cannot expand if it doesn't have some children already, I also
add a dummy child to all directory nodes
Then the problem came up -
once I enabled my handler, the nodes would not expand anymore: the
expansion handles were there, I could click on them and see the CPU
being chewed away by the parsing of the 6 Mb nodelist, but nothing
changed in the interface - even the dummy node didn't come up.
That
confused not only me, but also #pygtk people. I wrote a 15 line simple
script to replicate the problem, but everything worked fine there :O. At
this point I started commenting stuff out at random and found out that
breaking the link between treestore and treeview (recommended in docs to
avoid excessive updates) resets the expansion state. Doh.
But it
was not the end yet. After that I noticed that the nodes didn't expand
on the first try, but only on the second. 8) After some mental
mummbo-jummbo I came to an idea that proved to be dumb, but correct.
Prepare for a gem boys and girls - if, in the process of execution of
row-expanded handler, at at least one point the expanding node has no
children (like when you have removed the dummy node, but still haven't
added the real ones) - the expansion doesn't happen!
Two
bugs^Wfeatures with the same effect. Oh, the fun of debugging never
stops :D