PaletteTreeCtrl.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. """
  2. Defines Palette tree control
  3. """
  4. import wx
  5. import cPickle as pickle
  6. from ObjectPaletteBase import *
  7. class PaletteTreeCtrl(wx.TreeCtrl):
  8. def __init__(self, parent, treeStyle, rootName):
  9. wx.TreeCtrl.__init__(self, parent, style=treeStyle)
  10. self.rootName = rootName
  11. self.root = self.AddRoot(self.rootName)
  12. self.paletteUI = parent
  13. self.opSortAlpha = "Sort Alphabetical Order"
  14. self.opSortOrig = "Sort Original Order"
  15. self.opSort = self.opSortOrig
  16. self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.onBeginDrag)
  17. def OnCompareItems(self, item1, item2):
  18. return self.paletteUI.compareItems(item1, item2)
  19. def SortTreeNodes(self, parent):
  20. self.SortChildren(parent)
  21. item, cookie = self.GetFirstChild(parent)
  22. while item:
  23. if self.ItemHasChildren(item):
  24. self.SortTreeNodes(item)
  25. # continue iteration to the next child
  26. item, cookie = self.GetNextChild(parent, cookie)
  27. def addTreeNodes(self, parentItem, parentItemName, items, itemKeys):
  28. roots = []
  29. rootItems = []
  30. for key in itemKeys:
  31. if parentItemName == items[key]:
  32. roots.append(key)
  33. for root in roots:
  34. newItem = self.AppendItem(parentItem, root)
  35. self.SetItemPyData(newItem, root)
  36. rootItems.append(newItem)
  37. itemKeys.remove(root)
  38. for rootItem in rootItems:
  39. self.addTreeNodes(rootItem, self.GetItemText(rootItem), items, itemKeys)
  40. def traverse(self, parent, itemText):
  41. if itemText == self.GetItemText(parent):
  42. return parent
  43. item, cookie = self.GetFirstChild(parent)
  44. while item:
  45. # if the item was found - return it
  46. if itemText == self.GetItemText(item):
  47. return item
  48. # the tem was not found - checking if it has children
  49. if self.ItemHasChildren(item):
  50. # item has children - delving into it
  51. child = self.traverse(item, itemText)
  52. if child is not None:
  53. return child
  54. # continue iteration to the next child
  55. item, cookie = self.GetNextChild(parent, cookie)
  56. return None
  57. def AddGroup(self):
  58. #import pdb;set_trace()
  59. parent = self.GetSelection()
  60. if parent is None:
  61. parent = self.GetRootItem()
  62. i = 1
  63. namestr = "Group%s"%(i)
  64. found = self.traverse(self.GetRootItem(), namestr)
  65. while found:
  66. i = i + 1
  67. namestr = "Group%s"%(i)
  68. found = self.traverse(self.GetRootItem(), namestr)
  69. newItem = self.AppendItem(parent, namestr)
  70. itemData = ObjectGen(name=namestr)
  71. parentName = self.GetItemText(parent)
  72. if parentName == self.rootName:
  73. self.paletteUI.palette.add(itemData)
  74. else:
  75. self.paletteUI.palette.add(itemData, parentName)
  76. self.SetItemPyData(newItem, itemData)
  77. self.Expand(self.GetRootItem())
  78. self.ScrollTo(newItem)
  79. def DeleteItem(self, item):
  80. itemText = self.GetItemText(item)
  81. if item and itemText != self.rootName:
  82. self.Delete(item)
  83. self.paletteUI.palette.delete(itemText)
  84. def DeleteSelected(self):
  85. item = self.GetSelection()
  86. self.DeleteItem(item)
  87. def ReParent(self, parent, newParent):
  88. # main loop - iterating over item's children
  89. item, cookie = self.GetFirstChild(parent)
  90. while item:
  91. itemName = self.GetItemText(item)
  92. itemData = self.GetItemPyData(item)
  93. newItem = self.AppendItem(newParent, itemName)
  94. self.SetItemPyData(newItem, itemData)
  95. # if an item had children, we need to re-parent them as well
  96. if self.ItemHasChildren(item):
  97. # recursing...
  98. self.ReParent(item, newItem, )
  99. # continue iteration to the next child
  100. item, cookie = self.GetNextChild(parent, cookie)
  101. def ChangeHierarchy(self, itemName, x, y):
  102. parent = self.GetRootItem()
  103. item = self.traverse(parent, itemName)
  104. if item is None:
  105. return
  106. dragToItem, flags = self.HitTest(wx.Point(x, y))
  107. if dragToItem.IsOk():
  108. # prevent draging into itself
  109. if dragToItem == item:
  110. return
  111. dragToItemName = self.GetItemText(dragToItem)
  112. if isinstance(self.paletteUI.palette.findItem(dragToItemName), ObjectBase):
  113. # this is a file node, bailing out
  114. return
  115. newItem = self.AppendItem(dragToItem, itemName)
  116. itemObj = self.paletteUI.palette.findItem(itemName)
  117. if itemObj is not None:
  118. # reparenting the data objects...
  119. if dragToItemName == self.rootName:
  120. self.paletteUI.palette.add(itemObj)
  121. else:
  122. self.paletteUI.palette.add(itemObj, dragToItemName)
  123. self.ReParent(item, newItem)
  124. self.Delete(item)
  125. def onBeginDrag(self, event):
  126. item = event.GetItem()
  127. if item != self.GetRootItem(): # prevent dragging root item
  128. text = self.GetItemText(item)
  129. print "Starting drag'n'drop with %s..." % repr(text)
  130. tdo = wx.TextDataObject(text)
  131. tds = wx.DropSource(self)
  132. tds.SetData(tdo)
  133. tds.DoDragDrop(True)