diff --git a/direct/src/leveleditor/LevelEditor.py b/direct/src/leveleditor/LevelEditor.py index c4565fc81e..d5c998db7f 100644 --- a/direct/src/leveleditor/LevelEditor.py +++ b/direct/src/leveleditor/LevelEditor.py @@ -8,6 +8,7 @@ from direct.showbase.TkGlobal import * from direct.directtools.DirectUtil import * from direct.directtools.DirectGeometry import * from direct.tkwidgets.SceneGraphExplorer import * +from direct.directnotify import DirectNotifyGlobal from tkMessageBox import showinfo from tkFileDialog import * from Tkinter import * @@ -292,7 +293,8 @@ except NameError: class LevelEditor(NodePath, DirectObject): """Class used to create a Toontown LevelEditor object""" - + notify = DirectNotifyGlobal.directNotify.newCategory('LevelEditor') + # Init the list of callbacks: selectedNodePathHookHooks=[] deselectedNodePathHookHooks=[] @@ -498,7 +500,7 @@ class LevelEditor(NodePath, DirectObject): self.innerBarricadeDict = {} # [gjeon] to find out currently moving camera in maya mode - self.mouseMayaCamera = False + self.mouseMayaCamera = True # [gjeon] to find out drive mode stat self.fDrive = False @@ -1105,13 +1107,19 @@ class LevelEditor(NodePath, DirectObject): def replace(self, nodePath, dnaNode): """ Replace a node path with the results of a DNANode traversal """ # Find node path's parent + if not nodePath: + return None parent = nodePath.getParent() dnaParent = dnaNode.getParent() # Get rid of the old node path and remove its DNA and # node relations from the DNA Store self.remove(dnaNode, nodePath) # Traverse the old (modified) dna to create the new node path - newNodePath = dnaNode.traverse(parent, DNASTORE, 1) + try: + newNodePath = dnaNode.traverse(parent, DNASTORE, 1) + except Exception: + self.notify.debug("Couldn't traverse existing DNA! Do not trust replace") + return None # Add it back to the dna parent dnaParent.add(dnaNode) # Update scene graph explorer @@ -1725,6 +1733,7 @@ class LevelEditor(NodePath, DirectObject): # LEVEL-OBJECT MODIFICATION FUNCTIONS def levelHandleMouse3(self, modifiers): + # import pdb; pdb.set_trace() if base.direct.cameraControl.useMayaCamControls and modifiers == 4: # alt is down, use maya controls self.mouseMayaCamera = True return @@ -1936,6 +1945,53 @@ class LevelEditor(NodePath, DirectObject): (objClass.eq(DNA_PROP)) ): self.panel.setCurrentColor(self.DNATarget.getColor()) + +## b1 = DirectButton(text = ("Button1", "click!", "roll", "disabled"), +## text_scale=0.1, borderWidth = (0.01, 0.01), +## relief=2) +## +## b2 = DirectButton(text = ("Button2", "click!", "roll", "disabled"), +## text_scale=0.1, borderWidth = (0.01, 0.01), +## relief=2) +## +## l1 = DirectLabel(text = "Test1", text_scale=0.1) +## l2 = DirectLabel(text = "Test2", text_scale=0.1) +## l3 = DirectLabel(text = "Test3", text_scale=0.1) +## +## numItemsVisible = 4 +## itemHeight = 0.11 +## +## myScrolledList = DirectScrolledList( +## decButton_pos= (0.35, 0, 0.53), +## decButton_text = "Dec", +## decButton_text_scale = 0.04, +## decButton_borderWidth = (0.005, 0.005), +## +## incButton_pos= (0.35, 0, -0.02), +## incButton_text = "Inc", +## incButton_text_scale = 0.04, +## incButton_borderWidth = (0.005, 0.005), +## +## frameSize = (0.0, 0.7, -0.05, 0.59), +## frameColor = (1,0,0,0.5), +## pos = (-1, 0, 0), +## items = [b1, b2], +## numItemsVisible = numItemsVisible, +## forceHeight = itemHeight, +## itemFrame_frameSize = (-0.2, 0.2, -0.37, 0.11), +## itemFrame_pos = (0.35, 0, 0.4), +## ) +## +## myScrolledList.addItem(l1) +## myScrolledList.addItem(l2) +## myScrolledList.addItem(l3) +## +## for fruit in ['apple', 'pear', 'banana', 'orange']: +## l = DirectLabel(text = fruit, text_scale=0.1) +## myScrolledList.addItem(l) +## +## myScrolledList.reparentTo(aspect2d) + def setDNATargetColor(self, color): if self.DNATarget: @@ -2643,7 +2699,10 @@ class LevelEditor(NodePath, DirectObject): # Now load in new file if fUseCVS: self.cvsUpdate(filename) - node = loadDNAFile(DNASTORE, Filename.fromOsSpecific(filename).cStr(), CSDefault, 1) + try: + node = loadDNAFile(DNASTORE, Filename.fromOsSpecific(filename).cStr(), CSDefault, 1) + except Exception: + self.notify.debug("Couldn't load specified DNA file. Please make sure storage code has been specified in Config.prc file") if node.getNumParents() == 1: # If the node already has a parent arc when it's loaded, we must # be using the level editor and we want to preserve that arc. @@ -4698,13 +4757,16 @@ class LevelEditorPanel(Pmw.MegaToplevel): base.direct.gridButton.pack(side = LEFT, expand = 1, fill = X) self.fMaya = IntVar() - self.fMaya.set(0) + self.fMaya.set(1) self.mayaButton = Checkbutton(buttonFrame, text = 'Maya Cam', width = 6, variable = self.fMaya, command = self.toggleMaya) self.mayaButton.pack(side = LEFT, expand = 1, fill = X) + + #Make maya mode on by default + self.toggleMaya() buttonFrame.pack(fill = X) diff --git a/direct/src/leveleditor/LevelStyleManager.py b/direct/src/leveleditor/LevelStyleManager.py index 3f8a883b4a..1eaef9493a 100755 --- a/direct/src/leveleditor/LevelStyleManager.py +++ b/direct/src/leveleditor/LevelStyleManager.py @@ -1,8 +1,10 @@ import sys, string, math, types from pandac.PandaModules import * import direct.gui.DirectGuiGlobals as DGG +from direct.gui.DirectGui import * from PieMenu import * +from ScrollMenu import * dnaDirectory = Filename.expandFrom(base.config.GetString("dna-directory", "$TTMODELS/src/dna")) @@ -1010,7 +1012,9 @@ class LevelStyleManager: # Prepend None to allow option of no item if ((dnaType == 'street') or (dnaType == 'prop') or (dnaType == 'toon_landmark')): - attribute.setMenu(self.createTextPieMenu(dnaType, dnaList)) + # attribute.setMenu(self.createTextPieMenu(dnaType, dnaList)) + attribute.setMenu(self.createScrollMenu(dnaType, dnaList)) + attribute.getMenu().createScrolledList() elif (dnaType == 'wall'): attribute.setMenu(self.createDNAPieMenu(dnaType, dnaList, sf = 0.25)) @@ -1106,6 +1110,11 @@ class LevelStyleManager: newMenu.setScale(0.5) # Create and return a pie menu return PieMenu(newMenu, textList) + + def createScrollMenu(self, dnaType, textList): + newMenu = hidden.attachNewNode(dnaType+'ScrollMenu') + + return ScrollMenu(newMenu, textList) # MISCELLANEOUS MENUS def createMiscAttributes(self): diff --git a/direct/src/leveleditor/ScrollMenu.py b/direct/src/leveleditor/ScrollMenu.py new file mode 100644 index 0000000000..3a646617f5 --- /dev/null +++ b/direct/src/leveleditor/ScrollMenu.py @@ -0,0 +1,96 @@ +########################################################### +# Class to create and maintain a scrolled list +# that can be embedded in a LevelAttribute instance +########################################################### + +from direct.gui.DirectGui import * +from toontown.toonbase import ToontownGlobals + +class ScrollMenu: + def __init__(self, nodePath, textList): + self.action = None #Call back fucntion + self.textList = textList + + self.parent = nodePath + self.frame = None + + self.initialState = None # To maintain backward compatibility + + def createScrolledList(self): + # First create a frame in which direct elements maybe placed + self.frame = DirectFrame(scale = 1.1, relief = 1.0, + frameSize = (-0.5,0.2,-0.05,0.59), + frameColor = (0.737, 0.573, 0.345, 0.000)) + + numItemsVisible = 4 + itemHeight = 0.08 + + myScrolledList = DirectScrolledList( + decButton_pos= (0.35, 0, 0.53), + decButton_text = "Dec", + decButton_text_scale = 0.04, + decButton_borderWidth = (0.005, 0.005), + + incButton_pos= (0.35, 0, -0.02), + incButton_text = "Inc", + incButton_text_scale = 0.04, + incButton_borderWidth = (0.005, 0.005), + + frameSize = (0.0, 0.8, -0.05, 0.59), + frameColor = (0,0,1,0.5), + pos = (-0.5, 0, 0), + items = [], + numItemsVisible = numItemsVisible, + forceHeight = itemHeight, + itemFrame_frameSize = (-0.35, 0.35, -0.37, 0.11), + itemFrame_pos = (0.4, 0, 0.4), + ) + + for t in self.textList: + myScrolledList.addItem(DirectButton(text = (t, t, t), + text_scale = 0.05, command = self.__selected, + extraArgs = [t], relief = None, + # text_font = ToontownGlobals.getSignFont(), + text0_fg = (0.152, 0.750, 0.258, 1), + text1_fg = (0.152, 0.750, 0.258, 1), + text2_fg = (0.977, 0.816, 0.133, 1), )) + myScrolledList.reparentTo(self.frame) + + #An exit button + b1 = DirectButton(parent = self.frame, text = "Exit", + text_scale=0.05, borderWidth = (0.01, 0.01), + relief=1, command = self.__hide) + b1.setPos(0.15, 0, -0.025) + + self.frame.reparentTo(self.parent) + + + def __selected(self, text): + if(self.action): + self.action(text) + + def __hide(self): + self.frame.reparentTo(self.parent) + + + ####################################################### + # Functions that allow compaitibility with the + # existing architecture that is tied into pie menu's + ####################################################### + def spawnPieMenuTask(self): + # Where did the user press the button? + originX = base.direct.dr.mouseX + originY = base.direct.dr.mouseY + + # Pop up menu + self.frame.reparentTo(aspect2d) + self.frame.setPos(originX, 0.0, originY) + + def removePieMenuTask(self): + pass + + def setInitialState(self, state): + self.initialState = state + + def getInitialState(self): + return self.initialState \ No newline at end of file