Browse Source

instrumented persistence for layer editor

Arkady Trestman 16 years ago
parent
commit
fa965060c1

+ 6 - 0
direct/src/leveleditor/FileMgr.py

@@ -14,12 +14,18 @@ class FileMgr:
             f = open(fileName, 'w')
             f.write("from pandac.PandaModules import *\n")
             f.write("\nobjectMgr = base.le.objectMgr\n")
+            f.write('ui = base.le.ui\n')
+            f.write('\nui.sceneGraphUI.reset()\n\n')
             f.write("# temporary place holder for nodepath\n")
             f.write("objects = {}\n")
             saveData = self.editor.objectMgr.getSaveData()
             for data in saveData:
                 f.write(data)
                 f.write('\n')
+            saveDataLayers = self.editor.ui.layerEditorUI.getSaveData()
+            for data in saveDataLayers:
+                f.write(data)
+                f.write('\n')
             f.close()
         except IOError:
             print 'failed to save %s'%fileName

+ 68 - 36
direct/src/leveleditor/LayerEditorUI.py

@@ -14,7 +14,9 @@ class LayerEditorUI(wx.Panel):
 
         self.editor = editor
         self.editorTxt = "Layer Editor"
+        self.saveData = []
         self.layersDataDict = dict()
+        self.layersDataDictNextKey = 0
         self.llist = wx.ListCtrl(self, -1, style=wx.LC_REPORT|wx.LC_EDIT_LABELS|wx.LC_NO_HEADER)
         self.llist.InsertColumn(0, "Layers")
 
@@ -44,36 +46,41 @@ class LayerEditorUI(wx.Panel):
         self.popupmenu = wx.Menu()
         for item in self.menuItems:
             menuItem = self.popupmenu.Append(-1, item)
-            self.Bind(wx.EVT_MENU, self.OnPopupItemSelected, menuItem)
+            self.Bind(wx.EVT_MENU, self.onPopupItemSelected, menuItem)
 
-        self.Bind(wx.EVT_CONTEXT_MENU, self.OnShowPopup)
+        self.Bind(wx.EVT_CONTEXT_MENU, self.onShowPopup)
         self.llist.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.onShowMembers)
 
-    def OnShowPopup(self, event):
+    def reset(self):
         #import pdb;set_trace()
+        self.layersDataDict.clear()
+        self.layersDataDictNextKey = 0
+        self.llist.DeleteAllItems()
+
+    def onShowPopup(self, event):
         pos = event.GetPosition()
         pos = self.ScreenToClient(pos)
         self.PopupMenu(self.popupmenu, pos)
 
-    def OnPopupItemSelected(self, event):
+    def onPopupItemSelected(self, event):
         menuItem = self.popupmenu.FindItemById(event.GetId())
         text = menuItem.GetText()
         if text == self.opAddObj:
-           self.AddObj()
+           self.addObj()
         elif text == self.opRemoveObj:
-           self.RemoveObj()
+           self.removeObj()
         elif text == self.opShow:
            self.onShowMembers()
         elif text == self.opAdd:
-           self.AddLayer()
+           self.addLayer()
         elif text == self.opDelete:
-           self.DeleteLayer()
+           self.deleteLayer()
         elif text == self.opRename:
-           self.RenameLayer()
+           self.renameLayer()
         else:
            wx.MessageBox("You selected item '%s'" % text)
 
-    def FindLabel(self, text):
+    def findLabel(self, text):
         found = False
         for index in range(self.llist.GetItemCount()):
             itemtext = self.llist.GetItemText(index)
@@ -81,52 +88,64 @@ class LayerEditorUI(wx.Panel):
                return True
         return found
 
-    def AddLayer(self):
+    def addLayerData(self, idx, objUID):
+        self.removeObjData(objUID)
+        layerData = self.layersDataDict[idx]
+        layerData.append(objUID)
+
+    def addLayerEntry(self, name, idx):
+        index = self.llist.InsertStringItem(self.llist.GetItemCount(), name)
+        self.llist.SetItemData(index, idx)
+        layersData = list()
+        self.layersDataDict[idx] = layersData
+        if idx > self.layersDataDictNextKey:
+           self.layersDataDictNextKey = idx
+
+    def addLayer(self):
+        #import pdb;set_trace()
         count = self.llist.GetItemCount()
         i = 1
         text = "Layer%s"%(count + i)
-        found = self.FindLabel(text)
+        found = self.findLabel(text)
         while found:
               i = i + 1
-              text = "Layer%s"%(count+i)
-              found = self.FindLabel(text)
-        index = self.llist.InsertStringItem(count, text)
-        self.llist.SetItemData(index, count + i)
-        layersData = list()
-        self.layersDataDict[count + i] = layersData
+              text = "Layer%s"%(count + i)
+              found = self.findLabel(text)
 
-    def DeleteLayer(self):
-        import pdb;set_trace()
+        self.layersDataDictNextKey = self.layersDataDictNextKey + 1
+        self.addLayerEntry(text, self.layersDataDictNextKey)
+
+    def deleteLayer(self):
         index = self.llist.GetFirstSelected()
         if index != -1:
            key = self.llist.GetItemData(index)
            del(self.layersDataDict[key])
            item = self.llist.DeleteItem(index)
 
-    def RenameLayer(self):
-        #import pdb;set_trace()
+    def renameLayer(self):
         index = self.llist.GetFirstSelected()
         if index != -1:
            self.llist.SetItemState(index, wx.LIST_STATE_SELECTED, wx.LIST_STATE_SELECTED)
            self.llist.SetItemState(index, wx.LIST_STATE_FOCUSED, wx.LIST_STATE_FOCUSED)
 
-    def RemoveObj(self):
-        #import pdb;set_trace()
+    def removeObjData(self, objUID):
+        layersDataDictKeys = self.layersDataDict.keys()
+        for i in range(len(layersDataDictKeys)):
+            layersData = self.layersDataDict[layersDataDictKeys[i]]
+            for j in range(len(layersData)):
+                if layersData[j] == objUID:
+                   del(layersData[j])
+
+    def removeObj(self):
         objNodePath = base.direct.selected.last
         if objNodePath is None:
            wx.MessageBox("No object was selected.", self.editorTxt, wx.OK|wx.ICON_EXCLAMATION)
            return
         obj = self.editor.objectMgr.findObjectByNodePath(objNodePath)
         if obj is not None:
-           layersDataDictKeys = self.layersDataDict.keys()
-           for i in range(len(layersDataDictKeys)):
-               layersData = self.layersDataDict[layersDataDictKeys[i]]
-               for j in range(len(layersData)):
-                   if layersData[j] == obj[OG.OBJ_UID]:
-                      del(layersData[j])
-
-    def AddObj(self):
-        #import pdb;set_trace()
+           self.removeObjData(obj[OG.OBJ_UID])
+
+    def addObj(self):
         index = self.llist.GetFirstSelected()
         if index == -1:
            wx.MessageBox("No layer was selected.", self.editorTxt,  wx.OK|wx.ICON_EXCLAMATION)
@@ -147,14 +166,12 @@ class LayerEditorUI(wx.Panel):
                  return
            # Looking for the object in the other layers
            # If the object is found - delete it.
-           self.RemoveObj()
+           self.removeObj()
 
            layersData.append(obj[OG.OBJ_UID])
 
     def onShowMembers(self, event):
-        #import pdb;set_trace()
         item = event.GetItem()
-
         layerMembers = list()
         layerName = item.GetText()
         key = item.GetData()
@@ -168,4 +185,19 @@ class LayerEditorUI(wx.Panel):
            #do something here
            dialog.GetStringSelection()
         dialog.Destroy()
+        
+    def traverse(self):
+        self.saveData.append("ui.layerEditorUI.reset()")
+        for index in range(self.llist.GetItemCount()):
+            self.saveData.append("ui.layerEditorUI.addLayerEntry('%s', %s )"%(self.llist.GetItemText(index), self.llist.GetItemData(index)))
+        layersDataDictKeys = self.layersDataDict.keys()
+        for i in range(len(layersDataDictKeys)):
+            layerData = self.layersDataDict[layersDataDictKeys[i]]
+            for j in range(len(layerData)):
+                self.saveData.append("ui.layerEditorUI.addLayerData(%s, '%s')"%(layersDataDictKeys[i], layerData[j]))
+
+    def getSaveData(self):
+        self.saveData = []
+        self.traverse()
+        return self.saveData
 

+ 3 - 0
direct/src/leveleditor/LevelEditorUI.py

@@ -9,6 +9,7 @@ from ViewPort import *
 from ObjectPaletteUI import *
 from ObjectPropertyUI import *
 from SceneGraphUI import *
+from LayerEditorUI import *
 from HotKeyUI import *
 
 class PandaTextDropTarget(wx.TextDropTarget):
@@ -117,6 +118,7 @@ class LevelEditorUI(WxAppShell):
         self.objectPaletteUI = ObjectPaletteUI(self.leftBarUpPane, self.editor)
         self.objectPropertyUI = ObjectPropertyUI(self.rightBarUpPane, self.editor)
         self.sceneGraphUI = SceneGraphUI(self.leftBarDownPane, self.editor)
+        self.layerEditorUI = LayerEditorUI(self.rightBarDownPane, self.editor)
 
     def onSetFocus(self):
         print 'wx got focus'
@@ -150,6 +152,7 @@ class LevelEditorUI(WxAppShell):
     def onNew(self, evt):
         self.editor.reset()
         self.sceneGraphUI.reset()
+        self.layerEditorUI.reset()
 
     def onLoad(self, evt):
         dialog = wx.FileDialog(None, "Choose a file", os.getcwd(), "", "*.py", wx.OPEN)