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
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