| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- """
- Defines Palette tree control
- """
- import wx
- import cPickle as pickle
- from ObjectPaletteBase import *
- class PaletteTreeCtrl(wx.TreeCtrl):
- def __init__(self, parent, treeStyle, rootName):
- wx.TreeCtrl.__init__(self, parent, style=treeStyle)
- self.rootName = rootName
- self.root = self.AddRoot(self.rootName)
- self.paletteUI = parent
- self.opSortAlpha = "Sort Alphabetical Order"
- self.opSortOrig = "Sort Original Order"
- self.opSort = self.opSortOrig
- self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.onBeginDrag)
- def OnCompareItems(self, item1, item2):
- return self.paletteUI.compareItems(item1, item2)
- def SortTreeNodes(self, parent):
- self.SortChildren(parent)
- item, cookie = self.GetFirstChild(parent)
- while item:
- if self.ItemHasChildren(item):
- self.SortTreeNodes(item)
- # continue iteration to the next child
- item, cookie = self.GetNextChild(parent, cookie)
- def addTreeNodes(self, parentItem, parentItemName, items, itemKeys):
- roots = []
- rootItems = []
- for key in itemKeys:
- if parentItemName == items[key]:
- roots.append(key)
- for root in roots:
- newItem = self.AppendItem(parentItem, root)
- self.SetItemPyData(newItem, root)
- rootItems.append(newItem)
- itemKeys.remove(root)
- for rootItem in rootItems:
- self.addTreeNodes(rootItem, self.GetItemText(rootItem), items, itemKeys)
- def traverse(self, parent, itemText):
- if itemText == self.GetItemText(parent):
- return parent
- item, cookie = self.GetFirstChild(parent)
- while item:
- # if the item was found - return it
- if itemText == self.GetItemText(item):
- return item
- # the tem was not found - checking if it has children
- if self.ItemHasChildren(item):
- # item has children - delving into it
- child = self.traverse(item, itemText)
- if child is not None:
- return child
- # continue iteration to the next child
- item, cookie = self.GetNextChild(parent, cookie)
- return None
- def AddGroup(self):
- #import pdb;set_trace()
- parent = self.GetSelection()
- if parent is None:
- parent = self.GetRootItem()
- i = 1
- namestr = "Group%s"%(i)
- found = self.traverse(self.GetRootItem(), namestr)
- while found:
- i = i + 1
- namestr = "Group%s"%(i)
- found = self.traverse(self.GetRootItem(), namestr)
- newItem = self.AppendItem(parent, namestr)
- itemData = ObjectGen(name=namestr)
- parentName = self.GetItemText(parent)
- if parentName == self.rootName:
- self.paletteUI.palette.add(itemData)
- else:
- self.paletteUI.palette.add(itemData, parentName)
- self.SetItemPyData(newItem, itemData)
- self.Expand(self.GetRootItem())
- self.ScrollTo(newItem)
- def DeleteItem(self, item):
- itemText = self.GetItemText(item)
- if item and itemText != self.rootName:
- self.Delete(item)
- self.paletteUI.palette.delete(itemText)
- def DeleteSelected(self):
- item = self.GetSelection()
- self.DeleteItem(item)
- def ReParent(self, parent, newParent):
- # main loop - iterating over item's children
- item, cookie = self.GetFirstChild(parent)
- while item:
- itemName = self.GetItemText(item)
- itemData = self.GetItemPyData(item)
- newItem = self.AppendItem(newParent, itemName)
- self.SetItemPyData(newItem, itemData)
- # if an item had children, we need to re-parent them as well
- if self.ItemHasChildren(item):
- # recursing...
- self.ReParent(item, newItem, )
- # continue iteration to the next child
- item, cookie = self.GetNextChild(parent, cookie)
- def ChangeHierarchy(self, itemName, x, y):
- parent = self.GetRootItem()
- item = self.traverse(parent, itemName)
- if item is None:
- return
- dragToItem, flags = self.HitTest(wx.Point(x, y))
- if dragToItem.IsOk():
- # prevent draging into itself
- if dragToItem == item:
- return
- dragToItemName = self.GetItemText(dragToItem)
- if isinstance(self.paletteUI.palette.findItem(dragToItemName), ObjectBase):
- # this is a file node, bailing out
- return
- newItem = self.AppendItem(dragToItem, itemName)
- itemObj = self.paletteUI.palette.findItem(itemName)
- if itemObj is not None:
- # reparenting the data objects...
- if dragToItemName == self.rootName:
- self.paletteUI.palette.add(itemObj)
- else:
- self.paletteUI.palette.add(itemObj, dragToItemName)
- self.ReParent(item, newItem)
- self.Delete(item)
- def onBeginDrag(self, event):
- item = event.GetItem()
- if item != self.GetRootItem(): # prevent dragging root item
- text = self.GetItemText(item)
- print "Starting drag'n'drop with %s..." % repr(text)
- tdo = wx.TextDataObject(text)
- tds = wx.DropSource(self)
- tds.SetData(tdo)
- tds.DoDragDrop(True)
|