Code Search for Developers
 
 
  

explorertree.py from The Nebula Device at Krugle


Show explorertree.py syntax highlighted

#-------------------------------------------------------------------------------
# explorertree.py
#-------------------------------------------------------------------------------

import os, glob, win32api, win32file, wx

class ExplorerTree(wx.TreeCtrl):
    def __init__(self, parent):
        wx.TreeCtrl.__init__(self, parent, style = wx.TR_HIDE_ROOT)
        self.filter = '*.*'
        self.expandedDirs = []
        self.createImageList()
        self.lastDrive = self.loadDrives()
        self.Bind(wx.EVT_TREE_ITEM_EXPANDING, self.onItemExpanding)
        self.Bind(wx.EVT_TREE_ITEM_EXPANDED, self.onItemExpanded)
        self.Bind(wx.EVT_TREE_ITEM_COLLAPSED, self.onItemCollapsed)
        self.Bind(wx.EVT_LEFT_DCLICK, self.onLeftDClick)

    def update(self, filter):
        self.filter = filter
        leafDirs = list(self.expandedDirs)
        found = True
        while found:
            found = False
            for i in leafDirs:
                for j in leafDirs:
                    if i != j:
                        k = os.path.commonprefix((i, j))
                        if i == k:
                            leafDirs.remove(i)
                            found = True
                        elif j == k:
                            leafDirs.remove(j)
                            found = True
        stack = []
        i = self.lastDrive
        while True:
            path, clean = self.GetItemData(i).GetData()
            self.SetItemData(i, wx.TreeItemData((path, False)))
            if path in leafDirs:
                self.rebuildItem(i)
            if self.GetLastChild(i):
                stack.append(i)
            sibling = self.GetPrevSibling(i)
            if sibling:
                i = sibling
            else:
                if len(stack):
                    i = self.GetLastChild(stack.pop())
                else:
                    return

# private
    def createImageList(self):
        size = (16, 16)
        self.imageList = wx.ImageList(16, 16)
        self.imgFloppy = self.imageList.Add(wx.ArtProvider_GetBitmap('FLOPPY', wx.ART_OTHER, size))
        self.imgHardDisk = self.imageList.Add(wx.ArtProvider_GetBitmap('HARDDISK', wx.ART_OTHER, size))
        self.imgCDROM = self.imageList.Add(wx.ArtProvider_GetBitmap('CDROM', wx.ART_OTHER, size))
        self.imgDir = self.imageList.Add(wx.ArtProvider_GetBitmap('DIR', wx.ART_OTHER, size))
        self.imgFile = self.imageList.Add(wx.ArtProvider_GetBitmap('FILE', wx.ART_OTHER, size))
        self.imgDb3 = self.imageList.Add(wx.ArtProvider_GetBitmap('DB3', wx.ART_OTHER, size))
        self.imgXml = self.imageList.Add(wx.ArtProvider_GetBitmap('XML', wx.ART_OTHER, size))
        self.SetImageList(self.imageList)

    def loadDrives(self):
        child = None
        root = self.AddRoot('')
        for i in win32api.GetLogicalDriveStrings().split('\0')[:-1]:
            type = win32file.GetDriveType(i)
            itemData = wx.TreeItemData((i, False))
            if type == win32file.DRIVE_REMOVABLE:
                child = self.AppendItem(root, '[' + i.replace('\\', ']'), self.imgFloppy, data = itemData)
            elif type == win32file.DRIVE_FIXED:
                child = self.AppendItem(root, '[' + i.replace('\\', ']'), self.imgHardDisk, data = itemData)
            elif type == win32file.DRIVE_CDROM:
                child = self.AppendItem(root, '[' + i.replace('\\', ']'), self.imgCDROM, data = itemData)
            self.SetItemHasChildren(child, True)
        return child

    def onItemExpanding(self, event):
        item = event.GetItem()
        path, clean = self.GetItemData(item).GetData()
        if not clean:
            self.rebuildItem(item)

    def onItemExpanded(self, event):
        item = event.GetItem()
        path, clean = self.GetItemData(item).GetData()
        if path not in self.expandedDirs:
            self.expandedDirs.append(path)

    def onItemCollapsed(self, event):
        item = event.GetItem()
        path, clean = self.GetItemData(item).GetData()
        if path in self.expandedDirs:
            self.expandedDirs.remove(path)

    def onLeftDClick(self, event):
        item, flags = self.HitTest(event.GetPosition())
        path, clean = self.GetItemData(item).GetData()
        if os.path.isfile(path):
            mainFrame = self.GetParent().GetParent().GetParent().GetParent()
            root, ext = os.path.splitext(path)
            if ext == '.db3':
                mainFrame.openDb3File(path)
            elif ext == '.xml':
                mainFrame.openXmlFile(path)
        else:
            event.Skip()

    def rebuildItem(self, item):
        self.DeleteChildren(item)
        path, clean = self.GetItemData(item).GetData()
        for i in glob.glob(os.path.join(path, '*')):
            if os.path.isdir(i):
                itemData = wx.TreeItemData((i, False))
                child = self.AppendItem(item, os.path.basename(i) + '/', self.imgDir, data = itemData)
                self.SetItemHasChildren(child, True)
        for i in glob.glob(os.path.join(path, self.filter)):
            itemData = wx.TreeItemData((i, True))
            root, ext = os.path.splitext(i)
            if ext == '.db3':
                child = self.AppendItem(item, os.path.basename(i), self.imgDb3, data = itemData)
            elif ext == '.xml':
                child = self.AppendItem(item, os.path.basename(i), self.imgXml, data = itemData)
            else:
                child = self.AppendItem(item, os.path.basename(i), self.imgFile, data = itemData)
        self.SetItemData(item, wx.TreeItemData((path, True)))

#-------------------------------------------------------------------------------
# Eof
#-------------------------------------------------------------------------------



See more files for this project here

The Nebula Device

Realtime 3D game/visualization engine, written in C++, scriptable through Tcl/Tk, Python and Lua. Supports D3D and OpenGL for rendering, runs under Linux and Windows.

Project homepage: http://sourceforge.net/projects/nebuladevice
Programming language(s): C,C++,Python
License: other

  __init__.py
  aboutdialog.py
  db3grid.py
  db3notebook.py
  db3page.py
  db3tree.py
  db3xmldialog.py
  explorerchoice.py
  explorerpage.py
  explorerpanel.py
  explorertree.py
  leftnotebook.py
  mainapp.py
  mainframe.py
  medartprovider.py
  medsplash.py
  medsplitter.py
  rightpanel.py
  xmldb3dialog.py
  xmledit.py
  xmlnotebook.py
  xmltree.py