mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 02:15:43 -04:00
*** empty log message ***
This commit is contained in:
parent
725bd3e408
commit
9e9defff7e
@ -45,7 +45,7 @@ class DirectButtons(ButtonNode, PandaObject):
|
|||||||
self.nodePath = base.dataRoot.attachNewNode(self)
|
self.nodePath = base.dataRoot.attachNewNode(self)
|
||||||
|
|
||||||
def __getitem__(self, index):
|
def __getitem__(self, index):
|
||||||
if (index < 0) | (index > self.getNumButtons()):
|
if (index < 0) or (index > self.getNumButtons()):
|
||||||
raise IndexError
|
raise IndexError
|
||||||
return self.getButtonState(index)
|
return self.getButtonState(index)
|
||||||
|
|
||||||
@ -83,7 +83,7 @@ class DirectAnalogs(AnalogNode, PandaObject):
|
|||||||
self.nodePath = base.dataRoot.attachNewNode(self)
|
self.nodePath = base.dataRoot.attachNewNode(self)
|
||||||
|
|
||||||
def __getitem__(self, index):
|
def __getitem__(self, index):
|
||||||
if (index < 0) | (index > self.getNumControls()):
|
if (index < 0) or (index > self.getNumControls()):
|
||||||
raise IndexError
|
raise IndexError
|
||||||
return self.getControlState(index)
|
return self.getControlState(index)
|
||||||
|
|
||||||
@ -111,7 +111,7 @@ class DirectAnalogs(AnalogNode, PandaObject):
|
|||||||
|
|
||||||
def normalizeChannel(self, chan, minVal = -1, maxVal = 1):
|
def normalizeChannel(self, chan, minVal = -1, maxVal = 1):
|
||||||
try:
|
try:
|
||||||
if (chan == 2) | (chan == 6):
|
if (chan == 2) or (chan == 6):
|
||||||
# These channels have reduced range
|
# These channels have reduced range
|
||||||
return self.normalize(self[chan] * 3.0, minVal, maxVal)
|
return self.normalize(self[chan] * 3.0, minVal, maxVal)
|
||||||
else:
|
else:
|
||||||
@ -144,7 +144,7 @@ class DirectDials(DialNode, PandaObject):
|
|||||||
self.nodePath = base.dataRoot.attachNewNode(self)
|
self.nodePath = base.dataRoot.attachNewNode(self)
|
||||||
|
|
||||||
def __getitem__(self, index):
|
def __getitem__(self, index):
|
||||||
if (index < 0) | (index > self.getNumDials()):
|
if (index < 0) or (index > self.getNumDials()):
|
||||||
raise IndexError
|
raise IndexError
|
||||||
return self.readDial(index)
|
return self.readDial(index)
|
||||||
|
|
||||||
|
@ -57,7 +57,7 @@ class DirectCameraControl(PandaObject):
|
|||||||
# Record undo point
|
# Record undo point
|
||||||
direct.pushUndo([direct.camera])
|
direct.pushUndo([direct.camera])
|
||||||
# Where are we in the display region?
|
# Where are we in the display region?
|
||||||
if ((abs(direct.dr.mouseX) < 0.9) & (abs(direct.dr.mouseY) < 0.9)):
|
if ((abs(direct.dr.mouseX) < 0.9) and (abs(direct.dr.mouseY) < 0.9)):
|
||||||
# MOUSE IS IN CENTRAL REGION
|
# MOUSE IS IN CENTRAL REGION
|
||||||
# Hide the marker for this kind of motion
|
# Hide the marker for this kind of motion
|
||||||
self.coaMarker.hide()
|
self.coaMarker.hide()
|
||||||
@ -73,7 +73,7 @@ class DirectCameraControl(PandaObject):
|
|||||||
coa.assign(hitPt)
|
coa.assign(hitPt)
|
||||||
coaDist = hitPtDist
|
coaDist = hitPtDist
|
||||||
# Handle case of bad coa point (too close or too far)
|
# Handle case of bad coa point (too close or too far)
|
||||||
if ((coaDist < (1.1 * direct.dr.near)) |
|
if ((coaDist < (1.1 * direct.dr.near)) or
|
||||||
(coaDist > direct.dr.far)):
|
(coaDist > direct.dr.far)):
|
||||||
# Just use existing point
|
# Just use existing point
|
||||||
coa.assign(self.coaMarker.getPos(direct.camera))
|
coa.assign(self.coaMarker.getPos(direct.camera))
|
||||||
@ -96,7 +96,7 @@ class DirectCameraControl(PandaObject):
|
|||||||
self.spawnXZTranslateOrHPanYZoom()
|
self.spawnXZTranslateOrHPanYZoom()
|
||||||
# END MOUSE IN CENTRAL REGION
|
# END MOUSE IN CENTRAL REGION
|
||||||
else:
|
else:
|
||||||
if ((abs(direct.dr.mouseX) > 0.9) & (abs(direct.dr.mouseY) > 0.9)):
|
if ((abs(direct.dr.mouseX) > 0.9) and (abs(direct.dr.mouseY) > 0.9)):
|
||||||
# Mouse is in corners, spawn roll task
|
# Mouse is in corners, spawn roll task
|
||||||
self.spawnMouseRollTask()
|
self.spawnMouseRollTask()
|
||||||
else:
|
else:
|
||||||
@ -217,10 +217,10 @@ class DirectCameraControl(PandaObject):
|
|||||||
|
|
||||||
def mouseRotateTask(self, state):
|
def mouseRotateTask(self, state):
|
||||||
# If moving outside of center, ignore motion perpendicular to edge
|
# If moving outside of center, ignore motion perpendicular to edge
|
||||||
if ((state.constrainedDir == 'y') & (abs(direct.dr.mouseX) > 0.9)):
|
if ((state.constrainedDir == 'y') and (abs(direct.dr.mouseX) > 0.9)):
|
||||||
deltaX = 0
|
deltaX = 0
|
||||||
deltaY = direct.dr.mouseDeltaY
|
deltaY = direct.dr.mouseDeltaY
|
||||||
elif ((state.constrainedDir == 'x') & (abs(direct.dr.mouseY) > 0.9)):
|
elif ((state.constrainedDir == 'x') and (abs(direct.dr.mouseY) > 0.9)):
|
||||||
deltaX = direct.dr.mouseDeltaX
|
deltaX = direct.dr.mouseDeltaX
|
||||||
deltaY = 0
|
deltaY = 0
|
||||||
else:
|
else:
|
||||||
@ -291,6 +291,7 @@ class DirectCameraControl(PandaObject):
|
|||||||
def homeCam(self):
|
def homeCam(self):
|
||||||
# Record undo point
|
# Record undo point
|
||||||
direct.pushUndo([direct.camera])
|
direct.pushUndo([direct.camera])
|
||||||
|
direct.camera.reparentTo(render)
|
||||||
direct.camera.setMat(Mat4.identMat())
|
direct.camera.setMat(Mat4.identMat())
|
||||||
# Resize coa marker
|
# Resize coa marker
|
||||||
self.updateCoaMarkerSize()
|
self.updateCoaMarkerSize()
|
||||||
|
@ -71,7 +71,7 @@ class DirectManipulationControl(PandaObject):
|
|||||||
return Task.done
|
return Task.done
|
||||||
|
|
||||||
def watchMouseTask(self, state):
|
def watchMouseTask(self, state):
|
||||||
if (((abs (state.initX - direct.dr.mouseX)) > 0.01) |
|
if (((abs (state.initX - direct.dr.mouseX)) > 0.01) or
|
||||||
((abs (state.initY - direct.dr.mouseY)) > 0.01)):
|
((abs (state.initY - direct.dr.mouseY)) > 0.01)):
|
||||||
taskMgr.removeTasksNamed('manip-move-wait')
|
taskMgr.removeTasksNamed('manip-move-wait')
|
||||||
self.mode = 'move'
|
self.mode = 'move'
|
||||||
@ -197,7 +197,7 @@ class DirectManipulationControl(PandaObject):
|
|||||||
# Compute widget's xy coords in screen space
|
# Compute widget's xy coords in screen space
|
||||||
t.coaCenter = getScreenXY(direct.widget)
|
t.coaCenter = getScreenXY(direct.widget)
|
||||||
# These are used to rotate about view vector
|
# These are used to rotate about view vector
|
||||||
if t.fMouseX & t.fMouseY:
|
if t.fMouseX and t.fMouseY:
|
||||||
t.lastAngle = getCrankAngle(t.coaCenter)
|
t.lastAngle = getCrankAngle(t.coaCenter)
|
||||||
taskMgr.spawnTaskNamed(t, 'manipulateObject')
|
taskMgr.spawnTaskNamed(t, 'manipulateObject')
|
||||||
|
|
||||||
@ -214,7 +214,7 @@ class DirectManipulationControl(PandaObject):
|
|||||||
# No widget interaction, determine free manip mode
|
# No widget interaction, determine free manip mode
|
||||||
elif self.fFreeManip:
|
elif self.fFreeManip:
|
||||||
# If we've been scaling and changed modes, reset object handles
|
# If we've been scaling and changed modes, reset object handles
|
||||||
if 0 & self.fScaling & (not direct.fAlt):
|
if 0 and self.fScaling and (not direct.fAlt):
|
||||||
self.objectHandles.transferObjectHandlesScale()
|
self.objectHandles.transferObjectHandlesScale()
|
||||||
self.fScaling = 0
|
self.fScaling = 0
|
||||||
# Alt key switches to a scaling mode
|
# Alt key switches to a scaling mode
|
||||||
@ -222,10 +222,10 @@ class DirectManipulationControl(PandaObject):
|
|||||||
self.fScaling = 1
|
self.fScaling = 1
|
||||||
self.scale3D(state)
|
self.scale3D(state)
|
||||||
# Otherwise, manip mode depends on where you started
|
# Otherwise, manip mode depends on where you started
|
||||||
elif state.fMouseX & state.fMouseY:
|
elif state.fMouseX and state.fMouseY:
|
||||||
# In the corner, spin around camera's axis
|
# In the corner, spin around camera's axis
|
||||||
self.rotateAboutViewVector(state)
|
self.rotateAboutViewVector(state)
|
||||||
elif state.fMouseX | state.fMouseY:
|
elif state.fMouseX or state.fMouseY:
|
||||||
# Mouse started elsewhere in the outer frame, rotate
|
# Mouse started elsewhere in the outer frame, rotate
|
||||||
self.rotate2D(state)
|
self.rotate2D(state)
|
||||||
else:
|
else:
|
||||||
@ -393,10 +393,10 @@ class DirectManipulationControl(PandaObject):
|
|||||||
self.fScaleInit = 1
|
self.fScaleInit = 1
|
||||||
tumbleRate = 360
|
tumbleRate = 360
|
||||||
# If moving outside of center, ignore motion perpendicular to edge
|
# If moving outside of center, ignore motion perpendicular to edge
|
||||||
if ((state.constrainedDir == 'y') & (abs(direct.dr.mouseX) > 0.9)):
|
if ((state.constrainedDir == 'y') and (abs(direct.dr.mouseX) > 0.9)):
|
||||||
deltaX = 0
|
deltaX = 0
|
||||||
deltaY = direct.dr.mouseDeltaY
|
deltaY = direct.dr.mouseDeltaY
|
||||||
elif ((state.constrainedDir == 'x') & (abs(direct.dr.mouseY) > 0.9)):
|
elif ((state.constrainedDir == 'x') and (abs(direct.dr.mouseY) > 0.9)):
|
||||||
deltaX = direct.dr.mouseDeltaX
|
deltaX = direct.dr.mouseDeltaX
|
||||||
deltaY = 0
|
deltaY = 0
|
||||||
else:
|
else:
|
||||||
@ -450,7 +450,7 @@ class DirectManipulationControl(PandaObject):
|
|||||||
node, hitPt, hitPtDist = direct.iRay.pickGeom(
|
node, hitPt, hitPtDist = direct.iRay.pickGeom(
|
||||||
fIntersectUnpickable = 1)
|
fIntersectUnpickable = 1)
|
||||||
# MRM: Need to handle moving COA
|
# MRM: Need to handle moving COA
|
||||||
if (node != None) & (direct.selected.last != None):
|
if (node != None) and (direct.selected.last != None):
|
||||||
# Record undo point
|
# Record undo point
|
||||||
direct.pushUndo(direct.selected)
|
direct.pushUndo(direct.selected)
|
||||||
# Record wrt matrix
|
# Record wrt matrix
|
||||||
|
@ -239,9 +239,9 @@ class DirectSession(PandaObject):
|
|||||||
self.selected.toggleVisAll()
|
self.selected.toggleVisAll()
|
||||||
elif input == 'w':
|
elif input == 'w':
|
||||||
base.toggleWireframe()
|
base.toggleWireframe()
|
||||||
elif (input == '[') | (input == '{'):
|
elif (input == '[') or (input == '{'):
|
||||||
self.undo()
|
self.undo()
|
||||||
elif (input == ']') | (input == '}'):
|
elif (input == ']') or (input == '}'):
|
||||||
self.redo()
|
self.redo()
|
||||||
|
|
||||||
def select(self, nodePath, fMultiSelect = 0, fResetAncestry = 1):
|
def select(self, nodePath, fMultiSelect = 0, fResetAncestry = 1):
|
||||||
@ -402,7 +402,7 @@ class DirectSession(PandaObject):
|
|||||||
if i < l:
|
if i < l:
|
||||||
np = self.ancestry[i]
|
np = self.ancestry[i]
|
||||||
name = np.getName()
|
name = np.getName()
|
||||||
if (name != 'render') & (name != 'renderTop'):
|
if (name != 'render') and (name != 'renderTop'):
|
||||||
self.ancestryIndex = i
|
self.ancestryIndex = i
|
||||||
self.select(np, 0, 0)
|
self.select(np, 0, 0)
|
||||||
self.flash(np)
|
self.flash(np)
|
||||||
@ -414,7 +414,7 @@ class DirectSession(PandaObject):
|
|||||||
if i >= 0:
|
if i >= 0:
|
||||||
np = self.ancestry[i]
|
np = self.ancestry[i]
|
||||||
name = np.getName()
|
name = np.getName()
|
||||||
if (name != 'render') & (name != 'renderTop'):
|
if (name != 'render') and (name != 'renderTop'):
|
||||||
self.ancestryIndex = i
|
self.ancestryIndex = i
|
||||||
self.select(np, 0, 0)
|
self.select(np, 0, 0)
|
||||||
self.flash(np)
|
self.flash(np)
|
||||||
@ -434,7 +434,7 @@ class DirectSession(PandaObject):
|
|||||||
self.undoList = self.undoList[-25:]
|
self.undoList = self.undoList[-25:]
|
||||||
# Alert anyone who cares
|
# Alert anyone who cares
|
||||||
messenger.send('pushUndo')
|
messenger.send('pushUndo')
|
||||||
if fResetRedo & (nodePathList != []):
|
if fResetRedo and (nodePathList != []):
|
||||||
self.redoList = []
|
self.redoList = []
|
||||||
messenger.send('redoListEmpty')
|
messenger.send('redoListEmpty')
|
||||||
|
|
||||||
|
@ -571,7 +571,7 @@ class LevelEditor(NodePath, PandaObject):
|
|||||||
if parentDNAObject:
|
if parentDNAObject:
|
||||||
# Yes it does, move node path (and DNA)
|
# Yes it does, move node path (and DNA)
|
||||||
# to new parent (if active parent set)
|
# to new parent (if active parent set)
|
||||||
if ((self.NPParent != None) &
|
if ((self.NPParent != None) and
|
||||||
(self.DNAParent != None)):
|
(self.DNAParent != None)):
|
||||||
nodePath.reparentTo(self.NPParent)
|
nodePath.reparentTo(self.NPParent)
|
||||||
parentDNAObject.remove(dnaNode)
|
parentDNAObject.remove(dnaNode)
|
||||||
@ -702,11 +702,11 @@ class LevelEditor(NodePath, PandaObject):
|
|||||||
chance = randint(0,100)
|
chance = randint(0,100)
|
||||||
if chance <= 15:
|
if chance <= 15:
|
||||||
return 5.0
|
return 5.0
|
||||||
elif (chance > 15) & (chance <= 30):
|
elif (chance > 15) and (chance <= 30):
|
||||||
return 10.0
|
return 10.0
|
||||||
elif (chance > 30) & (chance <= 65):
|
elif (chance > 30) and (chance <= 65):
|
||||||
return 15.0
|
return 15.0
|
||||||
elif (chance > 65) & (chance <= 85):
|
elif (chance > 65) and (chance <= 85):
|
||||||
return 20.0
|
return 20.0
|
||||||
elif (chance > 85):
|
elif (chance > 85):
|
||||||
return 25.0
|
return 25.0
|
||||||
@ -748,7 +748,7 @@ class LevelEditor(NodePath, PandaObject):
|
|||||||
# destination (part of cleanup
|
# destination (part of cleanup
|
||||||
taskMgr.removeTasksNamed('autoPositionGrid')
|
taskMgr.removeTasksNamed('autoPositionGrid')
|
||||||
# Now find where to put node path
|
# Now find where to put node path
|
||||||
if (hotKey is not None) & nodeClass.eq(DNA_PROP):
|
if (hotKey is not None) and nodeClass.eq(DNA_PROP):
|
||||||
# If its a prop and a copy, place it based upon current
|
# If its a prop and a copy, place it based upon current
|
||||||
# mouse position
|
# mouse position
|
||||||
hitPt = self.getGridIntersectionPoint()
|
hitPt = self.getGridIntersectionPoint()
|
||||||
@ -1023,7 +1023,7 @@ class LevelEditor(NodePath, PandaObject):
|
|||||||
menuMode = 'cornice_orientation'
|
menuMode = 'cornice_orientation'
|
||||||
else:
|
else:
|
||||||
menuMode = 'cornice_texture'
|
menuMode = 'cornice_texture'
|
||||||
elif ((xPt < 0.3) | (xPt > 0.7)):
|
elif ((xPt < 0.3) or (xPt > 0.7)):
|
||||||
# Do wall operations
|
# Do wall operations
|
||||||
if direct.fControl:
|
if direct.fControl:
|
||||||
menuMode = 'wall_color'
|
menuMode = 'wall_color'
|
||||||
@ -1061,10 +1061,10 @@ class LevelEditor(NodePath, PandaObject):
|
|||||||
# Update panel color if appropriate
|
# Update panel color if appropriate
|
||||||
if self.DNATarget:
|
if self.DNATarget:
|
||||||
objClass = DNAGetClassType(self.DNATarget)
|
objClass = DNAGetClassType(self.DNATarget)
|
||||||
if ((objClass.eq(DNA_WALL)) |
|
if ((objClass.eq(DNA_WALL)) or
|
||||||
(objClass.eq(DNA_WINDOWS)) |
|
(objClass.eq(DNA_WINDOWS)) or
|
||||||
(objClass.eq(DNA_DOOR)) |
|
(objClass.eq(DNA_DOOR)) or
|
||||||
(objClass.eq(DNA_CORNICE)) |
|
(objClass.eq(DNA_CORNICE)) or
|
||||||
(objClass.eq(DNA_PROP))
|
(objClass.eq(DNA_PROP))
|
||||||
):
|
):
|
||||||
self.panel.setCurrentColor(self.DNATarget.getColor())
|
self.panel.setCurrentColor(self.DNATarget.getColor())
|
||||||
@ -1075,10 +1075,10 @@ class LevelEditor(NodePath, PandaObject):
|
|||||||
self.replaceSelected()
|
self.replaceSelected()
|
||||||
|
|
||||||
def setDNATargetCode(self, type, code):
|
def setDNATargetCode(self, type, code):
|
||||||
if (self.DNATarget != None) & (code != None):
|
if (self.DNATarget != None) and (code != None):
|
||||||
# Update code
|
# Update code
|
||||||
self.DNATarget.setCode(code)
|
self.DNATarget.setCode(code)
|
||||||
elif (self.DNATarget != None) & (code == None):
|
elif (self.DNATarget != None) and (code == None):
|
||||||
# Delete object, record pertinant properties before
|
# Delete object, record pertinant properties before
|
||||||
# you delete the object so you can restore them later
|
# you delete the object so you can restore them later
|
||||||
# Remove object
|
# Remove object
|
||||||
@ -1092,7 +1092,7 @@ class LevelEditor(NodePath, PandaObject):
|
|||||||
self.removeWindows(self.DNATarget, self.DNATargetParent)
|
self.removeWindows(self.DNATarget, self.DNATargetParent)
|
||||||
# Clear out DNATarget
|
# Clear out DNATarget
|
||||||
self.DNATarget = None
|
self.DNATarget = None
|
||||||
elif (self.DNATarget == None) & (code != None):
|
elif (self.DNATarget == None) and (code != None):
|
||||||
# Add new object
|
# Add new object
|
||||||
if (type == 'cornice'):
|
if (type == 'cornice'):
|
||||||
self.DNATarget = self.createCornice()
|
self.DNATarget = self.createCornice()
|
||||||
@ -1114,13 +1114,13 @@ class LevelEditor(NodePath, PandaObject):
|
|||||||
self.replaceSelected()
|
self.replaceSelected()
|
||||||
|
|
||||||
def setDNATargetOrientation(self, orientation):
|
def setDNATargetOrientation(self, orientation):
|
||||||
if (self.DNATarget != None) & (orientation != None):
|
if (self.DNATarget != None) and (orientation != None):
|
||||||
oldCode = self.DNATarget.getCode()[:-3]
|
oldCode = self.DNATarget.getCode()[:-3]
|
||||||
self.DNATarget.setCode(oldCode + '_' + orientation)
|
self.DNATarget.setCode(oldCode + '_' + orientation)
|
||||||
self.replaceSelected()
|
self.replaceSelected()
|
||||||
|
|
||||||
def setBuildingStyle(self, style):
|
def setBuildingStyle(self, style):
|
||||||
if (self.DNATarget != None) & (style != None):
|
if (self.DNATarget != None) and (style != None):
|
||||||
self.styleManager.setDNAFlatBuildingStyle(
|
self.styleManager.setDNAFlatBuildingStyle(
|
||||||
self.DNATarget, style,
|
self.DNATarget, style,
|
||||||
width = self.DNATarget.getWidth(),
|
width = self.DNATarget.getWidth(),
|
||||||
@ -1139,19 +1139,19 @@ class LevelEditor(NodePath, PandaObject):
|
|||||||
self.replaceSelected()
|
self.replaceSelected()
|
||||||
|
|
||||||
def setWindowCount(self, count):
|
def setWindowCount(self, count):
|
||||||
if (self.DNATarget != None) & (count != 0):
|
if (self.DNATarget != None) and (count != 0):
|
||||||
self.DNATarget.setWindowCount(count)
|
self.DNATarget.setWindowCount(count)
|
||||||
elif (self.DNATarget != None) & (count == 0):
|
elif (self.DNATarget != None) and (count == 0):
|
||||||
# Remove windows and clear out DNATarget
|
# Remove windows and clear out DNATarget
|
||||||
self.removeWindows(self.DNATarget, self.DNATargetParent)
|
self.removeWindows(self.DNATarget, self.DNATargetParent)
|
||||||
self.DNATarget = None
|
self.DNATarget = None
|
||||||
elif (self.DNATarget == None) & (count != 0):
|
elif (self.DNATarget == None) and (count != 0):
|
||||||
self.DNATarget = self.createWindows()
|
self.DNATarget = self.createWindows()
|
||||||
self.DNATargetParent.add(self.DNATarget)
|
self.DNATargetParent.add(self.DNATarget)
|
||||||
self.replaceSelected()
|
self.replaceSelected()
|
||||||
|
|
||||||
def setWallStyle(self, style):
|
def setWallStyle(self, style):
|
||||||
if (self.DNATarget != None) & (style != None):
|
if (self.DNATarget != None) and (style != None):
|
||||||
self.styleManager.setDNAWallStyle(
|
self.styleManager.setDNAWallStyle(
|
||||||
self.DNATarget, style,
|
self.DNATarget, style,
|
||||||
self.DNATarget.getHeight())
|
self.DNATarget.getHeight())
|
||||||
@ -1241,7 +1241,7 @@ class LevelEditor(NodePath, PandaObject):
|
|||||||
# MANIPULATION FUNCTIONS
|
# MANIPULATION FUNCTIONS
|
||||||
def keyboardRotateSelected(self, arrowDirection):
|
def keyboardRotateSelected(self, arrowDirection):
|
||||||
""" Rotate selected objects using arrow keys """
|
""" Rotate selected objects using arrow keys """
|
||||||
if ((arrowDirection == 'left') | (arrowDirection == 'up')):
|
if ((arrowDirection == 'left') or (arrowDirection == 'up')):
|
||||||
self.setLastAngle(self.getLastAngle() + SNAP_ANGLE)
|
self.setLastAngle(self.getLastAngle() + SNAP_ANGLE)
|
||||||
else:
|
else:
|
||||||
self.setLastAngle(self.getLastAngle() - SNAP_ANGLE)
|
self.setLastAngle(self.getLastAngle() - SNAP_ANGLE)
|
||||||
@ -1401,7 +1401,7 @@ class LevelEditor(NodePath, PandaObject):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
def getRandomWindowCount(self):
|
def getRandomWindowCount(self):
|
||||||
if ((self.lastWall != None) & (self.lastBuilding != None)):
|
if ((self.lastWall != None) and (self.lastBuilding != None)):
|
||||||
h = ROUND_INT(self.lastWall.getHeight())
|
h = ROUND_INT(self.lastWall.getHeight())
|
||||||
w = ROUND_INT(self.lastBuilding.getWidth())
|
w = ROUND_INT(self.lastBuilding.getWidth())
|
||||||
# Otherwise....
|
# Otherwise....
|
||||||
@ -1460,7 +1460,7 @@ class LevelEditor(NodePath, PandaObject):
|
|||||||
taskMgr.removeTasksNamed('autoMoveDelay')
|
taskMgr.removeTasksNamed('autoMoveDelay')
|
||||||
handlesToCam = direct.widget.getPos(direct.camera)
|
handlesToCam = direct.widget.getPos(direct.camera)
|
||||||
handlesToCam = handlesToCam * ( direct.dr.near/handlesToCam[1])
|
handlesToCam = handlesToCam * ( direct.dr.near/handlesToCam[1])
|
||||||
if ((abs(handlesToCam[0]) > (direct.dr.nearWidth * 0.4)) |
|
if ((abs(handlesToCam[0]) > (direct.dr.nearWidth * 0.4)) or
|
||||||
(abs(handlesToCam[2]) > (direct.dr.nearHeight * 0.4))):
|
(abs(handlesToCam[2]) > (direct.dr.nearHeight * 0.4))):
|
||||||
taskMgr.removeTasksNamed('manipulateCamera')
|
taskMgr.removeTasksNamed('manipulateCamera')
|
||||||
direct.cameraControl.centerCamIn(0.5)
|
direct.cameraControl.centerCamIn(0.5)
|
||||||
@ -1701,7 +1701,7 @@ class LevelEditor(NodePath, PandaObject):
|
|||||||
xPt = hitPt[0]
|
xPt = hitPt[0]
|
||||||
zPt = hitPt[2]
|
zPt = hitPt[2]
|
||||||
# Left or right of building
|
# Left or right of building
|
||||||
if ((xPt < 0) | (xPt > aDNAFlatBuilding.getWidth())):
|
if ((xPt < 0) or (xPt > aDNAFlatBuilding.getWidth())):
|
||||||
return -1
|
return -1
|
||||||
# Below the building
|
# Below the building
|
||||||
if zPt < 0:
|
if zPt < 0:
|
||||||
@ -2079,7 +2079,7 @@ class LevelStyleManager:
|
|||||||
pair = map(string.strip, l.split(':'))
|
pair = map(string.strip, l.split(':'))
|
||||||
if style.__dict__.has_key(pair[0]):
|
if style.__dict__.has_key(pair[0]):
|
||||||
# Convert colors and count strings to numerical values
|
# Convert colors and count strings to numerical values
|
||||||
if ((string.find(pair[0],'_color') >= 0) |
|
if ((string.find(pair[0],'_color') >= 0) or
|
||||||
(string.find(pair[0],'_count') >= 0)):
|
(string.find(pair[0],'_count') >= 0)):
|
||||||
style[pair[0]] = eval(pair[1])
|
style[pair[0]] = eval(pair[1])
|
||||||
else:
|
else:
|
||||||
@ -2482,7 +2482,7 @@ class LevelStyleManager:
|
|||||||
for dnaType in DNA_TYPES:
|
for dnaType in DNA_TYPES:
|
||||||
# Create a dictionary of dna types
|
# Create a dictionary of dna types
|
||||||
dict = {}
|
dict = {}
|
||||||
if ((dnaType == 'street') | (dnaType == 'prop') |
|
if ((dnaType == 'street') or (dnaType == 'prop') or
|
||||||
(dnaType == 'toon_landmark')):
|
(dnaType == 'toon_landmark')):
|
||||||
dnaList = self.getCatalogCodes(dnaType)
|
dnaList = self.getCatalogCodes(dnaType)
|
||||||
else:
|
else:
|
||||||
@ -2494,7 +2494,7 @@ class LevelStyleManager:
|
|||||||
attribute = LevelAttribute(dnaType + '_texture')
|
attribute = LevelAttribute(dnaType + '_texture')
|
||||||
attribute.setDict(dict)
|
attribute.setDict(dict)
|
||||||
# Prepend None to allow option of no item
|
# Prepend None to allow option of no item
|
||||||
if ((dnaType == 'street') | (dnaType == 'prop') |
|
if ((dnaType == 'street') or (dnaType == 'prop') or
|
||||||
(dnaType == 'toon_landmark')):
|
(dnaType == 'toon_landmark')):
|
||||||
attribute.setMenu(self.createTextPieMenu(dnaType, dnaList))
|
attribute.setMenu(self.createTextPieMenu(dnaType, dnaList))
|
||||||
elif (dnaType == 'wall'):
|
elif (dnaType == 'wall'):
|
||||||
@ -3320,12 +3320,12 @@ class LevelEditorPanel(Pmw.MegaToplevel):
|
|||||||
def updateSelectedObjColor(self, color):
|
def updateSelectedObjColor(self, color):
|
||||||
try:
|
try:
|
||||||
obj = self.levelEditor.DNATarget
|
obj = self.levelEditor.DNATarget
|
||||||
if self.fUpdateSelected & (obj != None):
|
if self.fUpdateSelected and (obj != None):
|
||||||
objClass = DNAGetClassType(obj)
|
objClass = DNAGetClassType(obj)
|
||||||
if ((objClass.eq(DNA_WALL)) |
|
if ((objClass.eq(DNA_WALL)) or
|
||||||
(objClass.eq(DNA_WINDOWS)) |
|
(objClass.eq(DNA_WINDOWS)) or
|
||||||
(objClass.eq(DNA_DOOR)) |
|
(objClass.eq(DNA_DOOR)) or
|
||||||
(objClass.eq(DNA_CORNICE)) |
|
(objClass.eq(DNA_CORNICE)) or
|
||||||
(objClass.eq(DNA_PROP))
|
(objClass.eq(DNA_PROP))
|
||||||
):
|
):
|
||||||
self.levelEditor.setDNATargetColor(
|
self.levelEditor.setDNATargetColor(
|
||||||
|
@ -74,7 +74,7 @@ class PieMenu(NodePath, PandaObject):
|
|||||||
self.lines.setVertex(1,(deltaX/self.sfx),0.0,(deltaY/self.sfz))
|
self.lines.setVertex(1,(deltaX/self.sfx),0.0,(deltaY/self.sfz))
|
||||||
|
|
||||||
# How far from starting point has user moved the cursor?
|
# How far from starting point has user moved the cursor?
|
||||||
if ((abs(deltaX) < 0.1) & (abs(deltaY) < 0.1)):
|
if ((abs(deltaX) < 0.1) and (abs(deltaY) < 0.1)):
|
||||||
# In the center
|
# In the center
|
||||||
if self.fUpdateOnlyOnChange:
|
if self.fUpdateOnlyOnChange:
|
||||||
# Only do this when things change
|
# Only do this when things change
|
||||||
|
@ -109,21 +109,21 @@ def _pdir(obj, str = None, fOverloaded = 0, width = None,
|
|||||||
if str:
|
if str:
|
||||||
if re.search(str, key, re.I):
|
if re.search(str, key, re.I):
|
||||||
aproposKeys.append(key)
|
aproposKeys.append(key)
|
||||||
if (not width) & (keyWidth > maxWidth):
|
if (not width) and (keyWidth > maxWidth):
|
||||||
maxWidth = keyWidth
|
maxWidth = keyWidth
|
||||||
else:
|
else:
|
||||||
if key[:2] == '__':
|
if key[:2] == '__':
|
||||||
privateKeys.append(key)
|
privateKeys.append(key)
|
||||||
if (not width) & (keyWidth > maxWidth):
|
if (not width) and (keyWidth > maxWidth):
|
||||||
maxWidth = keyWidth
|
maxWidth = keyWidth
|
||||||
elif (key[:10] == 'overloaded'):
|
elif (key[:10] == 'overloaded'):
|
||||||
if fOverloaded:
|
if fOverloaded:
|
||||||
overloadedKeys.append(key)
|
overloadedKeys.append(key)
|
||||||
if (not width) & (keyWidth > maxWidth):
|
if (not width) and (keyWidth > maxWidth):
|
||||||
maxWidth = keyWidth
|
maxWidth = keyWidth
|
||||||
else:
|
else:
|
||||||
remainingKeys.append(key)
|
remainingKeys.append(key)
|
||||||
if (not width) & (keyWidth > maxWidth):
|
if (not width) and (keyWidth > maxWidth):
|
||||||
maxWidth = keyWidth
|
maxWidth = keyWidth
|
||||||
# Sort appropriate keys
|
# Sort appropriate keys
|
||||||
if str:
|
if str:
|
||||||
|
@ -672,7 +672,7 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
Hook called upon deselection of a node path used to select playback
|
Hook called upon deselection of a node path used to select playback
|
||||||
marker if subnode selected
|
marker if subnode selected
|
||||||
"""
|
"""
|
||||||
if ((nodePath.id() == self.playbackMarker.id()) |
|
if ((nodePath.id() == self.playbackMarker.id()) or
|
||||||
(nodePath.id() == self.tangentMarker.id())):
|
(nodePath.id() == self.tangentMarker.id())):
|
||||||
self.tangentGroup.hide()
|
self.tangentGroup.hide()
|
||||||
|
|
||||||
@ -947,7 +947,7 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
self.recordPoint(self.recordStart)
|
self.recordPoint(self.recordStart)
|
||||||
# Everything else
|
# Everything else
|
||||||
else:
|
else:
|
||||||
if ((self.recordingType.get() == 'Refine') |
|
if ((self.recordingType.get() == 'Refine') or
|
||||||
(self.recordingType.get() == 'Extend')):
|
(self.recordingType.get() == 'Extend')):
|
||||||
# Turn off looping playback
|
# Turn off looping playback
|
||||||
self.loopPlayback = 0
|
self.loopPlayback = 0
|
||||||
@ -972,7 +972,7 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
if self.samplingMode == 'Continuous':
|
if self.samplingMode == 'Continuous':
|
||||||
# Kill old task
|
# Kill old task
|
||||||
taskMgr.removeTasksNamed(self.name + '-recordTask')
|
taskMgr.removeTasksNamed(self.name + '-recordTask')
|
||||||
if ((self.recordingType.get() == 'Refine') |
|
if ((self.recordingType.get() == 'Refine') or
|
||||||
(self.recordingType.get() == 'Extend')):
|
(self.recordingType.get() == 'Extend')):
|
||||||
# Reparent node path back to parent
|
# Reparent node path back to parent
|
||||||
self['nodePath'].wrtReparentTo(self.nodePathParent)
|
self['nodePath'].wrtReparentTo(self.nodePathParent)
|
||||||
@ -988,7 +988,7 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
self.setSamplingMode('Continuous')
|
self.setSamplingMode('Continuous')
|
||||||
self.enableKeyframeButton()
|
self.enableKeyframeButton()
|
||||||
# Clean up after refine or extend
|
# Clean up after refine or extend
|
||||||
if ((self.recordingType.get() == 'Refine') |
|
if ((self.recordingType.get() == 'Refine') or
|
||||||
(self.recordingType.get() == 'Extend')):
|
(self.recordingType.get() == 'Extend')):
|
||||||
# Merge prePoints, pointSet, postPoints
|
# Merge prePoints, pointSet, postPoints
|
||||||
self.mergePoints()
|
self.mergePoints()
|
||||||
@ -1008,7 +1008,7 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
|
|
||||||
def addKeyframe(self, fToggleRecord = 1):
|
def addKeyframe(self, fToggleRecord = 1):
|
||||||
# Make sure we're in a recording mode!
|
# Make sure we're in a recording mode!
|
||||||
if (fToggleRecord &
|
if (fToggleRecord and
|
||||||
(not self.getVariable('Recording', 'Record').get())):
|
(not self.getVariable('Recording', 'Record').get())):
|
||||||
# Set sampling mode
|
# Set sampling mode
|
||||||
self.setSamplingMode('Keyframe')
|
self.setSamplingMode('Keyframe')
|
||||||
@ -1042,16 +1042,16 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
|
|
||||||
def recordPoint(self, time):
|
def recordPoint(self, time):
|
||||||
# Call user define callback before recording point
|
# Call user define callback before recording point
|
||||||
if (self.getVariable('Recording', 'PRF Active').get() &
|
if (self.getVariable('Recording', 'PRF Active').get() and
|
||||||
(self.preRecordFunc != None)):
|
(self.preRecordFunc != None)):
|
||||||
self.preRecordFunc()
|
self.preRecordFunc()
|
||||||
# Get point
|
# Get point
|
||||||
pos = self['nodePath'].getPos(self.nodePathParent)
|
pos = self['nodePath'].getPos(self.nodePathParent)
|
||||||
hpr = self['nodePath'].getHpr(self.nodePathParent)
|
hpr = self['nodePath'].getHpr(self.nodePathParent)
|
||||||
# Blend between recordNodePath and self['nodePath']
|
# Blend between recordNodePath and self['nodePath']
|
||||||
if ((self.recordingType.get() == 'Refine') |
|
if ((self.recordingType.get() == 'Refine') or
|
||||||
(self.recordingType.get() == 'Extend')):
|
(self.recordingType.get() == 'Extend')):
|
||||||
if ((time < self.controlStart) &
|
if ((time < self.controlStart) and
|
||||||
((self.controlStart - self.recordStart) != 0.0)):
|
((self.controlStart - self.recordStart) != 0.0)):
|
||||||
rPos = self.playbackNodePath.getPos(self.nodePathParent)
|
rPos = self.playbackNodePath.getPos(self.nodePathParent)
|
||||||
rHpr = self.playbackNodePath.getHpr(self.nodePathParent)
|
rHpr = self.playbackNodePath.getHpr(self.nodePathParent)
|
||||||
@ -1060,8 +1060,8 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
# Transition between the recorded node path and the driven one
|
# Transition between the recorded node path and the driven one
|
||||||
pos = (rPos * (1 - t)) + (pos * t)
|
pos = (rPos * (1 - t)) + (pos * t)
|
||||||
hpr = (rHpr * (1 - t)) + (hpr * t)
|
hpr = (rHpr * (1 - t)) + (hpr * t)
|
||||||
elif ((self.recordingType.get() == 'Refine') &
|
elif ((self.recordingType.get() == 'Refine') and
|
||||||
(time > self.controlStop) &
|
(time > self.controlStop) and
|
||||||
((self.recordStop - self.controlStop) != 0.0)):
|
((self.recordStop - self.controlStop) != 0.0)):
|
||||||
rPos = self.playbackNodePath.getPos(self.nodePathParent)
|
rPos = self.playbackNodePath.getPos(self.nodePathParent)
|
||||||
rHpr = self.playbackNodePath.getHpr(self.nodePathParent)
|
rHpr = self.playbackNodePath.getHpr(self.nodePathParent)
|
||||||
@ -1084,7 +1084,7 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
|
|
||||||
def computeCurves(self):
|
def computeCurves(self):
|
||||||
# Check to make sure curve fitters have points
|
# Check to make sure curve fitters have points
|
||||||
if ((self.xyzCurveFitter.getNumSamples() == 0) |
|
if ((self.xyzCurveFitter.getNumSamples() == 0) or
|
||||||
(self.hprCurveFitter.getNumSamples() == 0)):
|
(self.hprCurveFitter.getNumSamples() == 0)):
|
||||||
print 'MopathRecorder.computeCurves: Must define curve first'
|
print 'MopathRecorder.computeCurves: Must define curve first'
|
||||||
return
|
return
|
||||||
@ -1288,7 +1288,7 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
self.loopPlayback = self.getVariable('Playback', 'Loop').get()
|
self.loopPlayback = self.getVariable('Playback', 'Loop').get()
|
||||||
|
|
||||||
def playbackGoTo(self, time):
|
def playbackGoTo(self, time):
|
||||||
if (self.xyzNurbsCurve == None) & (self.hprNurbsCurve == None):
|
if (self.xyzNurbsCurve == None) and (self.hprNurbsCurve == None):
|
||||||
return
|
return
|
||||||
self.playbackTime = CLAMP(time, 0.0, self.maxT)
|
self.playbackTime = CLAMP(time, 0.0, self.maxT)
|
||||||
if self.xyzNurbsCurve != None:
|
if self.xyzNurbsCurve != None:
|
||||||
@ -1301,7 +1301,7 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
self.playbackNodePath.setHpr(self.nodePathParent, hpr)
|
self.playbackNodePath.setHpr(self.nodePathParent, hpr)
|
||||||
|
|
||||||
def startPlayback(self):
|
def startPlayback(self):
|
||||||
if (self.xyzNurbsCurve == None) & (self.hprNurbsCurve == None):
|
if (self.xyzNurbsCurve == None) and (self.hprNurbsCurve == None):
|
||||||
return
|
return
|
||||||
# Kill any existing tasks
|
# Kill any existing tasks
|
||||||
self.stopPlayback()
|
self.stopPlayback()
|
||||||
@ -1329,7 +1329,7 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
cTime = state.currentTime + dTime
|
cTime = state.currentTime + dTime
|
||||||
# Stop task if not looping and at end of curve
|
# Stop task if not looping and at end of curve
|
||||||
# Or if refining curve and past recordStop
|
# Or if refining curve and past recordStop
|
||||||
if ((self.recordingType.get() == 'Refine') &
|
if ((self.recordingType.get() == 'Refine') and
|
||||||
(cTime > self.recordStop)):
|
(cTime > self.recordStop)):
|
||||||
# Go to recordStop
|
# Go to recordStop
|
||||||
self.getWidget('Playback', 'Time').set(self.recordStop)
|
self.getWidget('Playback', 'Time').set(self.recordStop)
|
||||||
@ -1338,8 +1338,8 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
# Also kill record task
|
# Also kill record task
|
||||||
self.toggleRecordVar()
|
self.toggleRecordVar()
|
||||||
return Task.done
|
return Task.done
|
||||||
elif (((self.loopPlayback == 0) & (cTime > self.maxT)) |
|
elif (((self.loopPlayback == 0) and (cTime > self.maxT)) or
|
||||||
((self.recordingType.get() == 'Extend') & (cTime > self.maxT))):
|
((self.recordingType.get() == 'Extend') and (cTime > self.maxT))):
|
||||||
# Go to maxT
|
# Go to maxT
|
||||||
self.getWidget('Playback', 'Time').set(self.maxT)
|
self.getWidget('Playback', 'Time').set(self.maxT)
|
||||||
# Then stop playback
|
# Then stop playback
|
||||||
@ -1373,7 +1373,7 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
self.desampleFrequency = frequency
|
self.desampleFrequency = frequency
|
||||||
|
|
||||||
def desampleCurve(self):
|
def desampleCurve(self):
|
||||||
if ((self.xyzCurveFitter.getNumSamples() == 0) |
|
if ((self.xyzCurveFitter.getNumSamples() == 0) or
|
||||||
(self.hprCurveFitter.getNumSamples() == 0)):
|
(self.hprCurveFitter.getNumSamples() == 0)):
|
||||||
print 'MopathRecorder.desampleCurve: Must define curve first'
|
print 'MopathRecorder.desampleCurve: Must define curve first'
|
||||||
return
|
return
|
||||||
@ -1393,7 +1393,7 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
self.numSamples = int(numSamples)
|
self.numSamples = int(numSamples)
|
||||||
|
|
||||||
def sampleCurve(self, even = 'None Given'):
|
def sampleCurve(self, even = 'None Given'):
|
||||||
if (self.xyzNurbsCurve == None) & (self.hprNurbsCurve == None):
|
if (self.xyzNurbsCurve == None) and (self.hprNurbsCurve == None):
|
||||||
print 'MopathRecorder.sampleCurve: Must define curve first'
|
print 'MopathRecorder.sampleCurve: Must define curve first'
|
||||||
return
|
return
|
||||||
# Reset curve fitters
|
# Reset curve fitters
|
||||||
@ -1662,7 +1662,7 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
# Get points within bounds
|
# Get points within bounds
|
||||||
for time, pos, hpr in oldPoints:
|
for time, pos, hpr in oldPoints:
|
||||||
# Is it within the time?
|
# Is it within the time?
|
||||||
if ((time > self.cropFrom) &
|
if ((time > self.cropFrom) and
|
||||||
(time < self.cropTo)):
|
(time < self.cropTo)):
|
||||||
# Add it to the curve fitters
|
# Add it to the curve fitters
|
||||||
t = time - self.cropFrom
|
t = time - self.cropFrom
|
||||||
@ -1707,7 +1707,7 @@ class MopathRecorder(AppShell, PandaObject):
|
|||||||
nodePath = loader.loadModel(mopathFilename)
|
nodePath = loader.loadModel(mopathFilename)
|
||||||
if nodePath:
|
if nodePath:
|
||||||
self.extractCurves(nodePath)
|
self.extractCurves(nodePath)
|
||||||
if ((self.xyzNurbsCurve != None) &
|
if ((self.xyzNurbsCurve != None) and
|
||||||
(self.hprNurbsCurve != None)):
|
(self.hprNurbsCurve != None)):
|
||||||
# Save a pointset for this curve
|
# Save a pointset for this curve
|
||||||
self.savePointSet()
|
self.savePointSet()
|
||||||
|
@ -455,7 +455,7 @@ class Placer(AppShell):
|
|||||||
self.nodePathMenuEntry.configure(
|
self.nodePathMenuEntry.configure(
|
||||||
background = self.nodePathMenuBG)
|
background = self.nodePathMenuBG)
|
||||||
# Check to see if node path and ref node path are the same
|
# Check to see if node path and ref node path are the same
|
||||||
if ((self.refCS != None) &
|
if ((self.refCS != None) and
|
||||||
(self.refCS.id() == self['nodePath'].id())):
|
(self.refCS.id() == self['nodePath'].id())):
|
||||||
# Yes they are, use temp CS as ref
|
# Yes they are, use temp CS as ref
|
||||||
# This calls updatePlacer
|
# This calls updatePlacer
|
||||||
@ -499,7 +499,7 @@ class Placer(AppShell):
|
|||||||
listbox = self.refNodePathMenu.component('scrolledlist')
|
listbox = self.refNodePathMenu.component('scrolledlist')
|
||||||
listbox.setlist(self.refNodePathNames)
|
listbox.setlist(self.refNodePathNames)
|
||||||
# Check to see if node path and ref node path are the same
|
# Check to see if node path and ref node path are the same
|
||||||
if (nodePath != None) & (nodePath.id() == self['nodePath'].id()):
|
if (nodePath != None) and (nodePath.id() == self['nodePath'].id()):
|
||||||
# Yes they are, use temp CS and update listbox accordingly
|
# Yes they are, use temp CS and update listbox accordingly
|
||||||
nodePath = self.tempCS
|
nodePath = self.tempCS
|
||||||
self.refNodePathMenu.selectitem('self')
|
self.refNodePathMenu.selectitem('self')
|
||||||
@ -549,7 +549,7 @@ class Placer(AppShell):
|
|||||||
hpr = Vec3(0)
|
hpr = Vec3(0)
|
||||||
scale = Vec3(1)
|
scale = Vec3(1)
|
||||||
np = self['nodePath']
|
np = self['nodePath']
|
||||||
if (np != None) & isinstance(np, NodePath):
|
if (np != None) and isinstance(np, NodePath):
|
||||||
# Update temp CS
|
# Update temp CS
|
||||||
self.updateAuxiliaryCoordinateSystems()
|
self.updateAuxiliaryCoordinateSystems()
|
||||||
# Update widgets
|
# Update widgets
|
||||||
@ -620,7 +620,7 @@ class Placer(AppShell):
|
|||||||
|
|
||||||
def xformRelative(self, value, axis):
|
def xformRelative(self, value, axis):
|
||||||
nodePath = self['nodePath']
|
nodePath = self['nodePath']
|
||||||
if (nodePath != None) & (self.refCS != None):
|
if (nodePath != None) and (self.refCS != None):
|
||||||
if axis == 'x':
|
if axis == 'x':
|
||||||
nodePath.setX(self.refCS, value)
|
nodePath.setX(self.refCS, value)
|
||||||
elif axis == 'y':
|
elif axis == 'y':
|
||||||
@ -639,8 +639,8 @@ class Placer(AppShell):
|
|||||||
|
|
||||||
def xformOrbit(self, value, axis):
|
def xformOrbit(self, value, axis):
|
||||||
nodePath = self['nodePath']
|
nodePath = self['nodePath']
|
||||||
if ((nodePath != None) & (self.refCS != None) &
|
if ((nodePath != None) and (self.refCS != None) and
|
||||||
(self.orbitFromCS != None) & (self.orbitToCS != None)):
|
(self.orbitFromCS != None) and (self.orbitToCS != None)):
|
||||||
if axis == 'x':
|
if axis == 'x':
|
||||||
self.posOffset.setX(value)
|
self.posOffset.setX(value)
|
||||||
elif axis == 'y':
|
elif axis == 'y':
|
||||||
|
@ -232,9 +232,9 @@ class Dial(Pmw.MegaWidget):
|
|||||||
delta = self.delta
|
delta = self.delta
|
||||||
dialAngle = dialAngle % TWO_PI
|
dialAngle = dialAngle % TWO_PI
|
||||||
# Check for rollover, if necessary
|
# Check for rollover, if necessary
|
||||||
if (self.lastAngle > ONEPOINTFIVE_PI) & (dialAngle < POINTFIVE_PI):
|
if (self.lastAngle > ONEPOINTFIVE_PI) and (dialAngle < POINTFIVE_PI):
|
||||||
self.baseVal = self.baseVal + delta
|
self.baseVal = self.baseVal + delta
|
||||||
elif (self.lastAngle < POINTFIVE_PI) & (dialAngle > ONEPOINTFIVE_PI):
|
elif (self.lastAngle < POINTFIVE_PI) and (dialAngle > ONEPOINTFIVE_PI):
|
||||||
self.baseVal = self.baseVal - delta
|
self.baseVal = self.baseVal - delta
|
||||||
self.lastAngle = dialAngle
|
self.lastAngle = dialAngle
|
||||||
# Update value and entry
|
# Update value and entry
|
||||||
@ -257,7 +257,7 @@ class Dial(Pmw.MegaWidget):
|
|||||||
self.dialAngle = None
|
self.dialAngle = None
|
||||||
else:
|
else:
|
||||||
self.updateIndicator(value)
|
self.updateIndicator(value)
|
||||||
if fCommand & (self['command'] != None):
|
if fCommand and (self['command'] != None):
|
||||||
apply(self['command'], [value] + self['commandData'])
|
apply(self['command'], [value] + self['commandData'])
|
||||||
|
|
||||||
def updateIndicator(self, value):
|
def updateIndicator(self, value):
|
||||||
|
@ -223,7 +223,7 @@ class EntryScale(Pmw.MegaWidget):
|
|||||||
self.entry.checkentry()
|
self.entry.checkentry()
|
||||||
|
|
||||||
# execute command
|
# execute command
|
||||||
if fCommand & (self['command'] is not None):
|
if fCommand and (self['command'] is not None):
|
||||||
self['command']( newVal )
|
self['command']( newVal )
|
||||||
|
|
||||||
def onReturn(self, *args):
|
def onReturn(self, *args):
|
||||||
@ -349,7 +349,7 @@ class EntryScaleGroup(Pmw.MegaToplevel):
|
|||||||
self._value[i] = value[i]
|
self._value[i] = value[i]
|
||||||
# Update entryScale, but don't execute its command
|
# Update entryScale, but don't execute its command
|
||||||
self.entryScaleList[i].set(value[i], 0)
|
self.entryScaleList[i].set(value[i], 0)
|
||||||
if fCommand & (self['command'] is not None):
|
if fCommand and (self['command'] is not None):
|
||||||
self['command'](self._value)
|
self['command'](self._value)
|
||||||
|
|
||||||
def setAt(self, index, value):
|
def setAt(self, index, value):
|
||||||
|
@ -182,7 +182,7 @@ class Floater(Pmw.MegaWidget):
|
|||||||
self.entry.checkentry()
|
self.entry.checkentry()
|
||||||
|
|
||||||
# execute command
|
# execute command
|
||||||
if fCommand & (self['command'] is not None):
|
if fCommand and (self['command'] is not None):
|
||||||
apply(self['command'], [newVal] + self['commandData'])
|
apply(self['command'], [newVal] + self['commandData'])
|
||||||
|
|
||||||
def reset(self):
|
def reset(self):
|
||||||
@ -305,7 +305,7 @@ class FloaterGroup(Pmw.MegaToplevel):
|
|||||||
self._value[i] = value[i]
|
self._value[i] = value[i]
|
||||||
# Update floater, but don't execute its command
|
# Update floater, but don't execute its command
|
||||||
self.floaterList[i].set(value[i], 0)
|
self.floaterList[i].set(value[i], 0)
|
||||||
if fCommand & (self['command'] is not None):
|
if fCommand and (self['command'] is not None):
|
||||||
self['command'](self._value)
|
self['command'](self._value)
|
||||||
|
|
||||||
def setAt(self, index, value):
|
def setAt(self, index, value):
|
||||||
|
@ -1,357 +1,357 @@
|
|||||||
# ADAPTED FROM IDLE TreeWidget.py
|
# ADAPTED FROM IDLE TreeWidget.py
|
||||||
# XXX TO DO:
|
# XXX TO DO:
|
||||||
# - popup menu
|
# - popup menu
|
||||||
# - support partial or total redisplay
|
# - support partial or total redisplay
|
||||||
# - key bindings (instead of quick-n-dirty bindings on Canvas):
|
# - key bindings (instead of quick-n-dirty bindings on Canvas):
|
||||||
# - up/down arrow keys to move focus around
|
# - up/down arrow keys to move focus around
|
||||||
# - ditto for page up/down, home/end
|
# - ditto for page up/down, home/end
|
||||||
# - left/right arrows to expand/collapse & move out/in
|
# - left/right arrows to expand/collapse and move out/in
|
||||||
# - more doc strings
|
# - more doc strings
|
||||||
# - add icons for "file", "module", "class", "method"; better "python" icon
|
# - add icons for "file", "module", "class", "method"; better "python" icon
|
||||||
# - callback for selection???
|
# - callback for selection???
|
||||||
# - multiple-item selection
|
# - multiple-item selection
|
||||||
# - tooltips
|
# - tooltips
|
||||||
# - redo geometry without magic numbers
|
# - redo geometry without magic numbers
|
||||||
# - keep track of object ids to allow more careful cleaning
|
# - keep track of object ids to allow more careful cleaning
|
||||||
# - optimize tree redraw after expand of subnode
|
# - optimize tree redraw after expand of subnode
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import string
|
import string
|
||||||
from Tkinter import *
|
from Tkinter import *
|
||||||
from PandaObject import *
|
from PandaObject import *
|
||||||
|
|
||||||
# Initialize icon directory
|
# Initialize icon directory
|
||||||
f = Filename('icons')
|
f = Filename('icons')
|
||||||
f.resolveFilename(getModelPath())
|
f.resolveFilename(getModelPath())
|
||||||
ICONDIR = f.toOsSpecific()
|
ICONDIR = f.toOsSpecific()
|
||||||
if not os.path.isdir(ICONDIR):
|
if not os.path.isdir(ICONDIR):
|
||||||
raise RuntimeError, "can't find DIRECT icon directory (%s)" % `ICONDIR`
|
raise RuntimeError, "can't find DIRECT icon directory (%s)" % `ICONDIR`
|
||||||
|
|
||||||
class TreeNode:
|
class TreeNode:
|
||||||
|
|
||||||
def __init__(self, canvas, parent, item, menuList = []):
|
def __init__(self, canvas, parent, item, menuList = []):
|
||||||
self.canvas = canvas
|
self.canvas = canvas
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
self.item = item
|
self.item = item
|
||||||
self.state = 'collapsed'
|
self.state = 'collapsed'
|
||||||
self.selected = 0
|
self.selected = 0
|
||||||
self.children = {}
|
self.children = {}
|
||||||
self.kidKeys = []
|
self.kidKeys = []
|
||||||
self.x = self.y = None
|
self.x = self.y = None
|
||||||
self.iconimages = {} # cache of PhotoImage instances for icons
|
self.iconimages = {} # cache of PhotoImage instances for icons
|
||||||
self.menuList = menuList
|
self.menuList = menuList
|
||||||
self.menuVar = IntVar()
|
self.menuVar = IntVar()
|
||||||
self.menuVar.set(0)
|
self.menuVar.set(0)
|
||||||
self._popupMenu = None
|
self._popupMenu = None
|
||||||
if self.menuList:
|
if self.menuList:
|
||||||
self._popupMenu = Menu(self.canvas, tearoff = 0)
|
self._popupMenu = Menu(self.canvas, tearoff = 0)
|
||||||
for i in range(len(self.menuList)):
|
for i in range(len(self.menuList)):
|
||||||
item = self.menuList[i]
|
item = self.menuList[i]
|
||||||
self._popupMenu.add_radiobutton(
|
self._popupMenu.add_radiobutton(
|
||||||
label = item,
|
label = item,
|
||||||
variable = self.menuVar,
|
variable = self.menuVar,
|
||||||
value = i,
|
value = i,
|
||||||
indicatoron = 0,
|
indicatoron = 0,
|
||||||
command = self.popupMenuCommand)
|
command = self.popupMenuCommand)
|
||||||
|
|
||||||
def destroy(self):
|
def destroy(self):
|
||||||
for key in self.kidKeys:
|
for key in self.kidKeys:
|
||||||
c = self.children[key]
|
c = self.children[key]
|
||||||
del self.children[key]
|
del self.children[key]
|
||||||
c.destroy()
|
c.destroy()
|
||||||
self.parent = None
|
self.parent = None
|
||||||
|
|
||||||
def geticonimage(self, name):
|
def geticonimage(self, name):
|
||||||
try:
|
try:
|
||||||
return self.iconimages[name]
|
return self.iconimages[name]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
pass
|
pass
|
||||||
file, ext = os.path.splitext(name)
|
file, ext = os.path.splitext(name)
|
||||||
ext = ext or ".gif"
|
ext = ext or ".gif"
|
||||||
fullname = os.path.join(ICONDIR, file + ext)
|
fullname = os.path.join(ICONDIR, file + ext)
|
||||||
image = PhotoImage(master=self.canvas, file=fullname)
|
image = PhotoImage(master=self.canvas, file=fullname)
|
||||||
self.iconimages[name] = image
|
self.iconimages[name] = image
|
||||||
return image
|
return image
|
||||||
|
|
||||||
def select(self, event=None):
|
def select(self, event=None):
|
||||||
if self.selected:
|
if self.selected:
|
||||||
return
|
return
|
||||||
self.deselectall()
|
self.deselectall()
|
||||||
self.selected = 1
|
self.selected = 1
|
||||||
self.canvas.delete(self.image_id)
|
self.canvas.delete(self.image_id)
|
||||||
self.drawicon()
|
self.drawicon()
|
||||||
self.drawtext()
|
self.drawtext()
|
||||||
self.item.OnSelect()
|
self.item.OnSelect()
|
||||||
|
|
||||||
def deselect(self, event=None):
|
def deselect(self, event=None):
|
||||||
if not self.selected:
|
if not self.selected:
|
||||||
return
|
return
|
||||||
self.selected = 0
|
self.selected = 0
|
||||||
self.canvas.delete(self.image_id)
|
self.canvas.delete(self.image_id)
|
||||||
self.drawicon()
|
self.drawicon()
|
||||||
self.drawtext()
|
self.drawtext()
|
||||||
|
|
||||||
def deselectall(self):
|
def deselectall(self):
|
||||||
if self.parent:
|
if self.parent:
|
||||||
self.parent.deselectall()
|
self.parent.deselectall()
|
||||||
else:
|
else:
|
||||||
self.deselecttree()
|
self.deselecttree()
|
||||||
|
|
||||||
def deselecttree(self):
|
def deselecttree(self):
|
||||||
if self.selected:
|
if self.selected:
|
||||||
self.deselect()
|
self.deselect()
|
||||||
for key in self.kidKeys:
|
for key in self.kidKeys:
|
||||||
child = self.children[key]
|
child = self.children[key]
|
||||||
child.deselecttree()
|
child.deselecttree()
|
||||||
|
|
||||||
def flip(self, event=None):
|
def flip(self, event=None):
|
||||||
if self.state == 'expanded':
|
if self.state == 'expanded':
|
||||||
self.collapse()
|
self.collapse()
|
||||||
else:
|
else:
|
||||||
self.expand()
|
self.expand()
|
||||||
self.item.OnDoubleClick()
|
self.item.OnDoubleClick()
|
||||||
return "break"
|
return "break"
|
||||||
|
|
||||||
def popupMenu(self, event=None):
|
def popupMenu(self, event=None):
|
||||||
if self._popupMenu:
|
if self._popupMenu:
|
||||||
self._popupMenu.post(event.widget.winfo_pointerx(),
|
self._popupMenu.post(event.widget.winfo_pointerx(),
|
||||||
event.widget.winfo_pointery())
|
event.widget.winfo_pointery())
|
||||||
return "break"
|
return "break"
|
||||||
|
|
||||||
def popupMenuCommand(self):
|
def popupMenuCommand(self):
|
||||||
self.item.MenuCommand(self.menuList[self.menuVar.get()])
|
self.item.MenuCommand(self.menuList[self.menuVar.get()])
|
||||||
|
|
||||||
def expand(self, event=None):
|
def expand(self, event=None):
|
||||||
if not self.item.IsExpandable():
|
if not self.item.IsExpandable():
|
||||||
return
|
return
|
||||||
if self.state != 'expanded':
|
if self.state != 'expanded':
|
||||||
self.state = 'expanded'
|
self.state = 'expanded'
|
||||||
self.update()
|
self.update()
|
||||||
self.view()
|
self.view()
|
||||||
|
|
||||||
def collapse(self, event=None):
|
def collapse(self, event=None):
|
||||||
if self.state != 'collapsed':
|
if self.state != 'collapsed':
|
||||||
self.state = 'collapsed'
|
self.state = 'collapsed'
|
||||||
self.update()
|
self.update()
|
||||||
|
|
||||||
def view(self):
|
def view(self):
|
||||||
top = self.y - 2
|
top = self.y - 2
|
||||||
bottom = self.lastvisiblechild().y + 17
|
bottom = self.lastvisiblechild().y + 17
|
||||||
height = bottom - top
|
height = bottom - top
|
||||||
visible_top = self.canvas.canvasy(0)
|
visible_top = self.canvas.canvasy(0)
|
||||||
visible_height = self.canvas.winfo_height()
|
visible_height = self.canvas.winfo_height()
|
||||||
visible_bottom = self.canvas.canvasy(visible_height)
|
visible_bottom = self.canvas.canvasy(visible_height)
|
||||||
if visible_top <= top and bottom <= visible_bottom:
|
if visible_top <= top and bottom <= visible_bottom:
|
||||||
return
|
return
|
||||||
x0, y0, x1, y1 = self.canvas._getints(self.canvas['scrollregion'])
|
x0, y0, x1, y1 = self.canvas._getints(self.canvas['scrollregion'])
|
||||||
if top >= visible_top and height <= visible_height:
|
if top >= visible_top and height <= visible_height:
|
||||||
fraction = top + height - visible_height
|
fraction = top + height - visible_height
|
||||||
else:
|
else:
|
||||||
fraction = top
|
fraction = top
|
||||||
fraction = float(fraction) / y1
|
fraction = float(fraction) / y1
|
||||||
self.canvas.yview_moveto(fraction)
|
self.canvas.yview_moveto(fraction)
|
||||||
|
|
||||||
def lastvisiblechild(self):
|
def lastvisiblechild(self):
|
||||||
if self.kidKeys and self.state == 'expanded':
|
if self.kidKeys and self.state == 'expanded':
|
||||||
return self.children[self.kidKeys[-1]].lastvisiblechild()
|
return self.children[self.kidKeys[-1]].lastvisiblechild()
|
||||||
else:
|
else:
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def update(self):
|
def update(self):
|
||||||
if self.parent:
|
if self.parent:
|
||||||
self.parent.update()
|
self.parent.update()
|
||||||
else:
|
else:
|
||||||
oldcursor = self.canvas['cursor']
|
oldcursor = self.canvas['cursor']
|
||||||
self.canvas['cursor'] = "watch"
|
self.canvas['cursor'] = "watch"
|
||||||
self.canvas.update()
|
self.canvas.update()
|
||||||
self.canvas.delete(ALL) # XXX could be more subtle
|
self.canvas.delete(ALL) # XXX could be more subtle
|
||||||
self.draw(7, 2)
|
self.draw(7, 2)
|
||||||
x0, y0, x1, y1 = self.canvas.bbox(ALL)
|
x0, y0, x1, y1 = self.canvas.bbox(ALL)
|
||||||
self.canvas.configure(scrollregion=(0, 0, x1, y1))
|
self.canvas.configure(scrollregion=(0, 0, x1, y1))
|
||||||
self.canvas['cursor'] = oldcursor
|
self.canvas['cursor'] = oldcursor
|
||||||
|
|
||||||
def draw(self, x, y):
|
def draw(self, x, y):
|
||||||
# XXX This hard-codes too many geometry constants!
|
# XXX This hard-codes too many geometry constants!
|
||||||
self.x, self.y = x, y
|
self.x, self.y = x, y
|
||||||
self.drawicon()
|
self.drawicon()
|
||||||
self.drawtext()
|
self.drawtext()
|
||||||
if self.state != 'expanded':
|
if self.state != 'expanded':
|
||||||
return y+17
|
return y+17
|
||||||
# draw children
|
# draw children
|
||||||
#if not self.children:
|
#if not self.children:
|
||||||
#self.children = []
|
#self.children = []
|
||||||
sublist = self.item._GetSubList()
|
sublist = self.item._GetSubList()
|
||||||
if not sublist:
|
if not sublist:
|
||||||
# IsExpandable() was mistaken; that's allowed
|
# IsExpandable() was mistaken; that's allowed
|
||||||
return y+17
|
return y+17
|
||||||
self.kidKeys = []
|
self.kidKeys = []
|
||||||
for item in sublist:
|
for item in sublist:
|
||||||
key = item.nodePath.id()
|
key = item.nodePath.id()
|
||||||
if self.children.has_key(key):
|
if self.children.has_key(key):
|
||||||
child = self.children[key]
|
child = self.children[key]
|
||||||
else:
|
else:
|
||||||
child = TreeNode(self.canvas, self, item, self.menuList)
|
child = TreeNode(self.canvas, self, item, self.menuList)
|
||||||
self.children[key] = child
|
self.children[key] = child
|
||||||
self.kidKeys.append(key)
|
self.kidKeys.append(key)
|
||||||
cx = x+20
|
cx = x+20
|
||||||
cy = y+17
|
cy = y+17
|
||||||
cylast = 0
|
cylast = 0
|
||||||
for key in self.kidKeys:
|
for key in self.kidKeys:
|
||||||
child = self.children[key]
|
child = self.children[key]
|
||||||
cylast = cy
|
cylast = cy
|
||||||
self.canvas.create_line(x+9, cy+7, cx, cy+7, fill="gray50")
|
self.canvas.create_line(x+9, cy+7, cx, cy+7, fill="gray50")
|
||||||
cy = child.draw(cx, cy)
|
cy = child.draw(cx, cy)
|
||||||
if child.item.IsExpandable():
|
if child.item.IsExpandable():
|
||||||
if child.state == 'expanded':
|
if child.state == 'expanded':
|
||||||
iconname = "minusnode"
|
iconname = "minusnode"
|
||||||
callback = child.collapse
|
callback = child.collapse
|
||||||
else:
|
else:
|
||||||
iconname = "plusnode"
|
iconname = "plusnode"
|
||||||
callback = child.expand
|
callback = child.expand
|
||||||
image = self.geticonimage(iconname)
|
image = self.geticonimage(iconname)
|
||||||
id = self.canvas.create_image(x+9, cylast+7, image=image)
|
id = self.canvas.create_image(x+9, cylast+7, image=image)
|
||||||
# XXX This leaks bindings until canvas is deleted:
|
# XXX This leaks bindings until canvas is deleted:
|
||||||
self.canvas.tag_bind(id, "<1>", callback)
|
self.canvas.tag_bind(id, "<1>", callback)
|
||||||
self.canvas.tag_bind(id, "<Double-1>", lambda x: None)
|
self.canvas.tag_bind(id, "<Double-1>", lambda x: None)
|
||||||
id = self.canvas.create_line(x+9, y+10, x+9, cylast+7,
|
id = self.canvas.create_line(x+9, y+10, x+9, cylast+7,
|
||||||
##stipple="gray50", # XXX Seems broken in Tk 8.0.x
|
##stipple="gray50", # XXX Seems broken in Tk 8.0.x
|
||||||
fill="gray50")
|
fill="gray50")
|
||||||
self.canvas.tag_lower(id) # XXX .lower(id) before Python 1.5.2
|
self.canvas.tag_lower(id) # XXX .lower(id) before Python 1.5.2
|
||||||
return cy
|
return cy
|
||||||
|
|
||||||
def drawicon(self):
|
def drawicon(self):
|
||||||
if self.selected:
|
if self.selected:
|
||||||
imagename = (self.item.GetSelectedIconName() or
|
imagename = (self.item.GetSelectedIconName() or
|
||||||
self.item.GetIconName() or
|
self.item.GetIconName() or
|
||||||
"openfolder")
|
"openfolder")
|
||||||
else:
|
else:
|
||||||
imagename = self.item.GetIconName() or "folder"
|
imagename = self.item.GetIconName() or "folder"
|
||||||
image = self.geticonimage(imagename)
|
image = self.geticonimage(imagename)
|
||||||
id = self.canvas.create_image(self.x, self.y, anchor="nw", image=image)
|
id = self.canvas.create_image(self.x, self.y, anchor="nw", image=image)
|
||||||
self.image_id = id
|
self.image_id = id
|
||||||
self.canvas.tag_bind(id, "<1>", self.select)
|
self.canvas.tag_bind(id, "<1>", self.select)
|
||||||
self.canvas.tag_bind(id, "<Double-1>", self.flip)
|
self.canvas.tag_bind(id, "<Double-1>", self.flip)
|
||||||
self.canvas.tag_bind(id, "<3>", self.popupMenu)
|
self.canvas.tag_bind(id, "<3>", self.popupMenu)
|
||||||
|
|
||||||
def drawtext(self):
|
def drawtext(self):
|
||||||
textx = self.x+20-1
|
textx = self.x+20-1
|
||||||
texty = self.y-1
|
texty = self.y-1
|
||||||
labeltext = self.item.GetLabelText()
|
labeltext = self.item.GetLabelText()
|
||||||
if labeltext:
|
if labeltext:
|
||||||
id = self.canvas.create_text(textx, texty, anchor="nw",
|
id = self.canvas.create_text(textx, texty, anchor="nw",
|
||||||
text=labeltext)
|
text=labeltext)
|
||||||
self.canvas.tag_bind(id, "<1>", self.select)
|
self.canvas.tag_bind(id, "<1>", self.select)
|
||||||
self.canvas.tag_bind(id, "<Double-1>", self.flip)
|
self.canvas.tag_bind(id, "<Double-1>", self.flip)
|
||||||
x0, y0, x1, y1 = self.canvas.bbox(id)
|
x0, y0, x1, y1 = self.canvas.bbox(id)
|
||||||
textx = max(x1, 200) + 10
|
textx = max(x1, 200) + 10
|
||||||
text = self.item.GetText() or "<no text>"
|
text = self.item.GetText() or "<no text>"
|
||||||
try:
|
try:
|
||||||
self.entry
|
self.entry
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
self.edit_finish()
|
self.edit_finish()
|
||||||
try:
|
try:
|
||||||
label = self.label
|
label = self.label
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
# padding carefully selected (on Windows) to match Entry widget:
|
# padding carefully selected (on Windows) to match Entry widget:
|
||||||
self.label = Label(self.canvas, text=text, bd=0, padx=2, pady=2)
|
self.label = Label(self.canvas, text=text, bd=0, padx=2, pady=2)
|
||||||
if self.selected:
|
if self.selected:
|
||||||
self.label.configure(fg="white", bg="darkblue")
|
self.label.configure(fg="white", bg="darkblue")
|
||||||
else:
|
else:
|
||||||
self.label.configure(fg="black", bg="white")
|
self.label.configure(fg="black", bg="white")
|
||||||
id = self.canvas.create_window(textx, texty,
|
id = self.canvas.create_window(textx, texty,
|
||||||
anchor="nw", window=self.label)
|
anchor="nw", window=self.label)
|
||||||
self.label.bind("<1>", self.select_or_edit)
|
self.label.bind("<1>", self.select_or_edit)
|
||||||
self.label.bind("<Double-1>", self.flip)
|
self.label.bind("<Double-1>", self.flip)
|
||||||
self.label.bind("<3>", self.popupMenu)
|
self.label.bind("<3>", self.popupMenu)
|
||||||
self.text_id = id
|
self.text_id = id
|
||||||
|
|
||||||
def select_or_edit(self, event=None):
|
def select_or_edit(self, event=None):
|
||||||
if self.selected and self.item.IsEditable():
|
if self.selected and self.item.IsEditable():
|
||||||
self.edit(event)
|
self.edit(event)
|
||||||
else:
|
else:
|
||||||
self.select(event)
|
self.select(event)
|
||||||
|
|
||||||
def edit(self, event=None):
|
def edit(self, event=None):
|
||||||
self.entry = Entry(self.label, bd=0, highlightthickness=1, width=0)
|
self.entry = Entry(self.label, bd=0, highlightthickness=1, width=0)
|
||||||
self.entry.insert(0, self.label['text'])
|
self.entry.insert(0, self.label['text'])
|
||||||
self.entry.selection_range(0, END)
|
self.entry.selection_range(0, END)
|
||||||
self.entry.pack(ipadx=5)
|
self.entry.pack(ipadx=5)
|
||||||
self.entry.focus_set()
|
self.entry.focus_set()
|
||||||
self.entry.bind("<Return>", self.edit_finish)
|
self.entry.bind("<Return>", self.edit_finish)
|
||||||
self.entry.bind("<Escape>", self.edit_cancel)
|
self.entry.bind("<Escape>", self.edit_cancel)
|
||||||
|
|
||||||
def edit_finish(self, event=None):
|
def edit_finish(self, event=None):
|
||||||
try:
|
try:
|
||||||
entry = self.entry
|
entry = self.entry
|
||||||
del self.entry
|
del self.entry
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
return
|
return
|
||||||
text = entry.get()
|
text = entry.get()
|
||||||
entry.destroy()
|
entry.destroy()
|
||||||
if text and text != self.item.GetText():
|
if text and text != self.item.GetText():
|
||||||
self.item.SetText(text)
|
self.item.SetText(text)
|
||||||
text = self.item.GetText()
|
text = self.item.GetText()
|
||||||
self.label['text'] = text
|
self.label['text'] = text
|
||||||
self.drawtext()
|
self.drawtext()
|
||||||
self.canvas.focus_set()
|
self.canvas.focus_set()
|
||||||
|
|
||||||
def edit_cancel(self, event=None):
|
def edit_cancel(self, event=None):
|
||||||
self.drawtext()
|
self.drawtext()
|
||||||
self.canvas.focus_set()
|
self.canvas.focus_set()
|
||||||
|
|
||||||
|
|
||||||
class TreeItem:
|
class TreeItem:
|
||||||
|
|
||||||
"""Abstract class representing tree items.
|
"""Abstract class representing tree items.
|
||||||
|
|
||||||
Methods should typically be overridden, otherwise a default action
|
Methods should typically be overridden, otherwise a default action
|
||||||
is used.
|
is used.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
"""Constructor. Do whatever you need to do."""
|
"""Constructor. Do whatever you need to do."""
|
||||||
|
|
||||||
def GetText(self):
|
def GetText(self):
|
||||||
"""Return text string to display."""
|
"""Return text string to display."""
|
||||||
|
|
||||||
def GetLabelText(self):
|
def GetLabelText(self):
|
||||||
"""Return label text string to display in front of text (if any)."""
|
"""Return label text string to display in front of text (if any)."""
|
||||||
|
|
||||||
def IsExpandable(self):
|
def IsExpandable(self):
|
||||||
"""Return whether there are subitems."""
|
"""Return whether there are subitems."""
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
def _GetSubList(self):
|
def _GetSubList(self):
|
||||||
"""Do not override! Called by TreeNode."""
|
"""Do not override! Called by TreeNode."""
|
||||||
if not self.IsExpandable():
|
if not self.IsExpandable():
|
||||||
return []
|
return []
|
||||||
sublist = self.GetSubList()
|
sublist = self.GetSubList()
|
||||||
return sublist
|
return sublist
|
||||||
|
|
||||||
def IsEditable(self):
|
def IsEditable(self):
|
||||||
"""Return whether the item's text may be edited."""
|
"""Return whether the item's text may be edited."""
|
||||||
|
|
||||||
def SetText(self, text):
|
def SetText(self, text):
|
||||||
"""Change the item's text (if it is editable)."""
|
"""Change the item's text (if it is editable)."""
|
||||||
|
|
||||||
def GetIconName(self):
|
def GetIconName(self):
|
||||||
"""Return name of icon to be displayed normally."""
|
"""Return name of icon to be displayed normally."""
|
||||||
|
|
||||||
def GetSelectedIconName(self):
|
def GetSelectedIconName(self):
|
||||||
"""Return name of icon to be displayed when selected."""
|
"""Return name of icon to be displayed when selected."""
|
||||||
|
|
||||||
def GetSubList(self):
|
def GetSubList(self):
|
||||||
"""Return list of items forming sublist."""
|
"""Return list of items forming sublist."""
|
||||||
|
|
||||||
def OnDoubleClick(self):
|
def OnDoubleClick(self):
|
||||||
"""Called on a double-click on the item."""
|
"""Called on a double-click on the item."""
|
||||||
|
|
||||||
def OnSelect(self):
|
def OnSelect(self):
|
||||||
"""Called when item selected."""
|
"""Called when item selected."""
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -213,7 +213,7 @@ class VectorEntry(Pmw.MegaWidget):
|
|||||||
|
|
||||||
def action(self, fCommand = 1):
|
def action(self, fCommand = 1):
|
||||||
self._refreshFloaters()
|
self._refreshFloaters()
|
||||||
if fCommand & (self['command'] != None):
|
if fCommand and (self['command'] != None):
|
||||||
self['command'](self._value)
|
self['command'](self._value)
|
||||||
|
|
||||||
def reset(self):
|
def reset(self):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user