== Introduction ==

In the hopes that someone might find this usefull...
I had to write my own directory chooser because wx.DirDialog didn't work out well for me under linux.

== What Objects are Involved ==

wx.GenericDirCtrl

== Process Overview ==

The first thing to do is to create a custom dialog:
{{{
class CustomDirDialog(wx.Dialog):
    def __init__(self, parent, id, title):
        wx.Dialog.__init__(self, parent, id, title, size=(400,400))
        ...
}}}

Feel free to add a toolbar with some icons on the top:
(ID_OUTPUT_CUSTOM_FOLDERINS is the ID associated with the 'click' event on this button - it's set to an integer elsewhere)
{{{
        newfolder_img = wx.Image('GUI/resources/Folder-new.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap()
        self.toolbar = wx.ToolBar(self, -1, style=wx.TB_HORIZONTAL)
        self.toolbar.AddSimpleTool(ID_OUTPUT_CUSTOM_FOLDERINS, newfolder_img, 'New Folder', '')
        self.toolbar.Realize()
}}}

Now add the generic dir control:

{{{
        self.dcCustom = wx.GenericDirCtrl(self, size=wx.Size(350,250),
                  style=wx.DIRCTRL_DIR_ONLY|wx.DIRCTRL_EDIT_LABELS|     wx.BORDER_SUNKEN)
}}}

We'll need an event for handling directory additions:
(Notice that you need to bind the ID of the tree control, not the generic directory control, to the event)
{{{
        wx.EVT_TOOL(self, ID_OUTPUT_CUSTOM_FOLDERINS, self.OnFolderInsert)
}}}

Here's the handlers:
{{{
    def OnFolderInsert(self, event):
        tree = self.dcCustom.GetTreeCtrl()
        treeitem = tree.GetSelection()
        parentpath = self.dcCustom.GetPath()
        path =  parentpath + os.sep + 'NewFolder'
        os.mkdir(path)
        self.dcCustom.ReCreateTree()
        self.dcCustom.ExpandPath(parentpath)
        self.dcCustom.SetPath(path)
        newitem = tree.GetSelection()
        tree.EditLabel(newitem)
}}}

I also had a custom popup menu on the tree control for doing renaming and deletion events.
First bind the right click event to the tree control:
{{{
      wx.EVT_RIGHT_DOWN(self.dcCustom.GetTreeCtrl(), self.OnRightDown)
}}}

Here's the event handler:
{{{
    def OnRightDown(self,event):
        """Popup Menu handler
        """
        #fix parent offset
        x, y = event.GetPosition()
        x +=25
        y +=55
       
        #popup menu
        popup = wx.Menu()
        item1 = wx.MenuItem(popup, ID_OUTPUT_POP_REMOVE, "Rename")
        item2 = wx.MenuItem(popup, ID_OUTPUT_POP_DELETE, "Delete")
        popup.AppendItem(item1)
        popup.AppendItem(item2)
        
        #events
        wx.EVT_MENU(popup, ID_OUTPUT_POP_REMOVE, self.OnPopupRename)
        wx.EVT_MENU(popup, ID_OUTPUT_POP_DELETE, self.OnPopupDelete)
        self.PopupMenu(popup, (x,y))
}}}

And now the rename and delete handler:
{{{        
    def OnPopupRename(self, event):
        tree = self.dcCustom.GetTreeCtrl()
        treeitem = tree.GetSelection()
        tree.EditLabel(treeitem)
    
    def OnPopupDelete(self, event):
        path = self.dcCustom.GetPath()
        if path:
            os.rmdir(path)
            self.dcCustom.ReCreateTree()
            self.dcCustom.ExpandPath(os.path.dirname(path))
}}}

=== Special Concerns ===
The event position seems quirky, so i did some simple adjustments. I'm sure theres a more elegant way.

=== Comments ===
This should allow you to add, remove, and rename directories inside the wx.GenericDirCtrl