ProtoObjsUI.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. """
  2. Defines ProtoObjs List UI
  3. """
  4. import wx
  5. import os
  6. import cPickle as pickl
  7. from pandac.PandaModules import *
  8. from ProtoObjs import *
  9. class ProtoDropTarget(wx.PyDropTarget):
  10. """Implements drop target functionality to receive files, bitmaps and text"""
  11. def __init__(self, ui):
  12. wx.PyDropTarget.__init__(self)
  13. self.ui = ui
  14. self.do = wx.DataObjectComposite() # the dataobject that gets filled with the appropriate data
  15. self.filedo = wx.FileDataObject()
  16. self.textdo = wx.TextDataObject()
  17. self.bmpdo = wx.BitmapDataObject()
  18. self.do.Add(self.filedo)
  19. self.do.Add(self.bmpdo)
  20. self.do.Add(self.textdo)
  21. self.SetDataObject(self.do)
  22. def OnData(self, x, y, d):
  23. """
  24. Handles drag/dropping files/text or a bitmap
  25. """
  26. if self.GetData():
  27. df = self.do.GetReceivedFormat().GetType()
  28. if df in [wx.DF_UNICODETEXT, wx.DF_TEXT]:
  29. text = self.textdo.GetText()
  30. # self.editor.ui.protoFontsUI.tree.ChangeHierarchy(text, x, y)
  31. elif df == wx.DF_FILENAME:
  32. for name in self.filedo.GetFilenames():
  33. self.ui.AquireFile(name)
  34. elif df == wx.DF_BITMAP:
  35. bmp = self.bmpdo.GetBitmap()
  36. return d # you must return this
  37. class ProtoObjsUI(wx.Panel):
  38. def __init__(self, parent, editor, protoObjs, supportedExts):
  39. wx.Panel.__init__(self, parent)
  40. self.editor = editor
  41. self.protoObjs = protoObjs
  42. self.supportedExts = supportedExts
  43. self.llist = wx.ListCtrl(self, -1, style=wx.LC_REPORT)
  44. self.llist.InsertColumn(0, "Files")
  45. sizer = wx.BoxSizer(wx.VERTICAL)
  46. sizer.Add(self.llist, 1, wx.EXPAND, 0)
  47. self.SetSizer(sizer); self.Layout()
  48. parentSizer = wx.BoxSizer(wx.VERTICAL)
  49. parentSizer.Add(self, 1, wx.EXPAND, 0)
  50. parent.SetSizer(parentSizer); parent.Layout()
  51. self.opDelete = "Delete"
  52. self.menuItems = list()
  53. self.menuItems.append(self.opDelete)
  54. self.popupmenu = wx.Menu()
  55. for item in self.menuItems:
  56. menuItem = self.popupmenu.Append(-1, item)
  57. self.Bind(wx.EVT_MENU, self.onPopupItemSelected, menuItem)
  58. self.Bind(wx.EVT_CONTEXT_MENU, self.onShowPopup)
  59. self.SetDropTarget(ProtoDropTarget(self))
  60. def populate(self):
  61. for key in self.protoObjs.data.keys():
  62. self.add(self.protoObjs.data[key])
  63. # All subclasses should implement this method
  64. def addObj(self, filename):
  65. raise NotImplementedError
  66. def onPopupItemSelected(self, event):
  67. menuItem = self.popupmenu.FindItemById(event.GetId())
  68. text = menuItem.GetText()
  69. if text == self.opDelete:
  70. self.remove()
  71. def onShowPopup(self, event):
  72. pos = event.GetPosition()
  73. pos = self.ScreenToClient(pos)
  74. self.PopupMenu(self.popupmenu, pos)
  75. def findLabel(self, text):
  76. found = False
  77. for index in range(self.llist.GetItemCount()):
  78. itemtext = self.llist.GetItemText(index)
  79. if itemtext == text:
  80. return True
  81. return found
  82. def removeItem(self, index):
  83. if index != -1:
  84. key = self.llist.GetItemText(index)
  85. del(self.protoObjs.data[key])
  86. item = self.llist.DeleteItem(index)
  87. def remove(self):
  88. index = self.llist.GetFirstSelected()
  89. self.removeItem(index)
  90. def add(self, filename):
  91. name = os.path.basename(filename)
  92. for ext in self.supportedExts:
  93. if name.upper().endswith(ext.upper()):
  94. try:
  95. index = self.llist.InsertStringItem(self.llist.GetItemCount(), name)
  96. self.protoObjs.data[name]= filename
  97. self.addObj(filename)
  98. except:
  99. pass
  100. break
  101. def addNewItem(self, result):
  102. ProtoObjsUI.AquireFile(self, result[1])
  103. def AquireFile(self, filename):
  104. label = self.findLabel(filename)
  105. if label:
  106. self.removeItem(label)
  107. filenameFull = Filename.fromOsSpecific(filename).getFullpath()
  108. self.add(filenameFull)