mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 10:22:45 -04:00
Added a new type of object replacement system and Band-Aided some crashes
This commit is contained in:
parent
35e77c0d01
commit
6aa5d76752
@ -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)
|
||||
|
||||
|
@ -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):
|
||||
|
96
direct/src/leveleditor/ScrollMenu.py
Normal file
96
direct/src/leveleditor/ScrollMenu.py
Normal file
@ -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
|
Loading…
x
Reference in New Issue
Block a user