GenericDirCtrl#re_create_tree behaviour

Hi

When GenericDirCtrl#re_create_tree is called in order to refresh the
tree with any possible changes made to the file system since it was
loaded, it doesn’t re-expand all the tree items that were expanded
prior to calling re_create_tree. I’m working on a solution to note all
open tree items and after re_create_tree manually expand the items
that are still present in the tree.

My question: Is there a nice way that I’ve overlooked to make it
automagically re-expand previously expanded nodes after recreating the
tree? I’m on my way towards doing it manually, but since the
GenericDirCtrl’s TreeCtrl actually re-numbers the items in the tree
during the recreation process, I’ll have to do it by matching TreeItem
text strings, and it’s starting to feel like a hack (in the ugly
sense).

Thanks in advance, and best regards!
/Mathias

Mathias Bruce wrote:

When GenericDirCtrl#re_create_tree is called in order to refresh the
tree with any possible changes made to the file system since it was
loaded, it doesn’t re-expand all the tree items that were expanded
prior to calling re_create_tree. I’m working on a solution to note all
open tree items and after re_create_tree manually expand the items
that are still present in the tree.

My question: Is there a nice way that I’ve overlooked to make it
automagically re-expand previously expanded nodes after recreating the
tree?

Sorry, but wxWidgets doesn’t provide a magic way to do this. As the name
suggests it’s a generic control (ie written from the ground up) so it
doesn’t benefit from the way that modern OSes update file dialogs etc as
new files and directories are created.

However it’s not hard to get a list of the currently open folder names:

  tree = dir.tree_ctrl
  open = tree.select { | item | tree.expanded?(item) }
  open.map! { | item | tree.item_text(item) }

Note that wxRuby creates the tree items as their parent is expanded, so
this will only traverse whatever folders have been shown, not every
possible folder.

I expect you’d also want to use the full paths as the unique keys:

  def tree.item_path(item)
    return "" if item == root_item
    path = item_text(item)
    while item = item_parent(item) and item != root_item
      path = "#{item_text(item)}/#{path}"
    end
    path
  end

I need to fix TreeCtrl#get_item_data for the trees from GenericDirCtrl
as it currently crashes. It would seem sensible for the item_data to be
or include the paths. So I’d be grateful if you could follow-up with any
problems you encounter in this.

Doing the re-opening is left to you - you’ll need to work hierarchically
down the tree.

thanks
alex