mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-01 01:07:51 -04:00
*** empty log message ***
This commit is contained in:
parent
576942ca88
commit
0b7bd0cf5e
@ -1 +0,0 @@
|
||||
123
|
@ -1 +0,0 @@
|
||||
123
|
@ -1,345 +0,0 @@
|
||||
"DIRECT Animation Control Panel"
|
||||
|
||||
# Import Tkinter, Pmw, and the floater code from this directory tree.
|
||||
from Tkinter import *
|
||||
from tkSimpleDialog import askfloat
|
||||
import Pmw
|
||||
import string
|
||||
import math
|
||||
|
||||
FRAMES = 0
|
||||
SECONDS = 1
|
||||
|
||||
class AnimPanel(Pmw.MegaToplevel):
|
||||
def __init__(self, parent = None, **kw):
|
||||
|
||||
INITOPT = Pmw.INITOPT
|
||||
optiondefs = (
|
||||
('title', 'Anim Panel', None),
|
||||
('actorList', (), None),
|
||||
('Actor_label_width', 12, None),
|
||||
)
|
||||
self.defineoptions(kw, optiondefs)
|
||||
|
||||
# Initialize the superclass
|
||||
Pmw.MegaToplevel.__init__(self, parent)
|
||||
|
||||
# Handle to the toplevels hull
|
||||
hull = self.component('hull')
|
||||
|
||||
# A handy little help balloon
|
||||
balloon = self.balloon = Pmw.Balloon()
|
||||
# Start with balloon help disabled
|
||||
self.balloon.configure(state = 'none')
|
||||
|
||||
menuFrame = Frame(hull, relief = GROOVE, bd = 2)
|
||||
|
||||
menuBar = Pmw.MenuBar(menuFrame, hotkeys = 1, balloon = balloon)
|
||||
menuBar.pack(side = LEFT, expand = 1, fill = X)
|
||||
menuBar.addmenu('AnimPanel', 'Anim Panel Operations')
|
||||
# Actor control status
|
||||
menuBar.addcascademenu('AnimPanel', 'Control Status',
|
||||
'Enable/disable actor control panels')
|
||||
menuBar.addmenuitem('Control Status', 'command',
|
||||
'Enable all actor controls',
|
||||
label = 'Enable all',
|
||||
command = self.enableActorControls)
|
||||
menuBar.addmenuitem('Control Status', 'command',
|
||||
'Disable all actor controls',
|
||||
label = 'Disable all',
|
||||
command = self.disableActorControls)
|
||||
# Frame Slider units
|
||||
menuBar.addcascademenu('AnimPanel', 'Display Units',
|
||||
'Select display units')
|
||||
menuBar.addmenuitem('Display Units', 'command',
|
||||
'Display frame counts', label = 'Frame count',
|
||||
command = self.displayFrameCounts)
|
||||
menuBar.addmenuitem('Display Units', 'command',
|
||||
'Display seconds', label = 'Seconds',
|
||||
command = self.displaySeconds)
|
||||
# Reset all actor controls
|
||||
menuBar.addmenuitem('AnimPanel', 'command',
|
||||
'Reset Actor controls',
|
||||
label = 'Reset all',
|
||||
command = self.resetAll)
|
||||
# Exit panel
|
||||
menuBar.addmenuitem('AnimPanel', 'command',
|
||||
'Exit Anim Panel',
|
||||
label = 'Exit',
|
||||
command = self.destroy)
|
||||
|
||||
menuBar.addmenu('Help', 'Anim Panel Help Operations')
|
||||
self.toggleBalloonVar = IntVar()
|
||||
self.toggleBalloonVar.set(0)
|
||||
menuBar.addmenuitem('Help', 'checkbutton',
|
||||
'Toggle balloon help',
|
||||
label = 'Balloon Help',
|
||||
variable = self.toggleBalloonVar,
|
||||
command = self.toggleBalloon)
|
||||
menuFrame.pack(fill = X)
|
||||
|
||||
# Create a frame to hold all the actor controls
|
||||
actorFrame = Frame(hull)
|
||||
|
||||
# Create a control for each actor
|
||||
index = 0
|
||||
self.actorControlList = []
|
||||
for actor in self['actorList']:
|
||||
ac = self.createcomponent(
|
||||
'actorControl%d' % index, (), 'Actor',
|
||||
ActorControl, (actorFrame,))
|
||||
ac.pack(expand = 1, fill = X)
|
||||
self.actorControlList.append(ac)
|
||||
index = index + 1
|
||||
|
||||
# Now pack the actor frame
|
||||
actorFrame.pack(expand = 1, fill = BOTH)
|
||||
|
||||
# Create a frame to hold the playback controls
|
||||
controlFrame = Frame(hull)
|
||||
self.playPauseVar = IntVar()
|
||||
self.playPauseVar.set(0)
|
||||
self.playPauseButton = self.createcomponent(
|
||||
'playPause', (), None,
|
||||
Checkbutton, (controlFrame,),
|
||||
text = 'Play', width = 8,
|
||||
variable = self.playPauseVar,
|
||||
indicatoron = FALSE)
|
||||
self.playPauseButton.pack(side = LEFT, expand = 1, fill = X)
|
||||
|
||||
self.resetButton = self.createcomponent(
|
||||
'reset', (), None,
|
||||
Button, (controlFrame,),
|
||||
text = 'Reset All',
|
||||
width = 8,
|
||||
command = self.resetAll)
|
||||
self.resetButton.pack(side = LEFT, expand = 1, fill = X)
|
||||
|
||||
self.loopVar = IntVar()
|
||||
self.loopVar.set(0)
|
||||
self.loopButton = self.createcomponent(
|
||||
'loopButton', (), None,
|
||||
Checkbutton, (controlFrame,),
|
||||
text = 'Loop', width = 8,
|
||||
variable = self.loopVar)
|
||||
self.loopButton.pack(side = LEFT, expand = 1, fill = X)
|
||||
|
||||
controlFrame.pack(fill = X)
|
||||
|
||||
# Execute option callbacks
|
||||
self.initialiseoptions(AnimPanel)
|
||||
|
||||
def getActorControlAt(self, index):
|
||||
return self.actorControlList[index]
|
||||
|
||||
def enableActorControlAt(self,index):
|
||||
self.getActorControlAt(index).enableControl()
|
||||
|
||||
def enableActorControls(self):
|
||||
for actorControl in self.actorControlList:
|
||||
actorControl.enableControl()
|
||||
|
||||
def disableActorControls(self):
|
||||
for actorControl in self.actorControlList:
|
||||
actorControl.disableControl()
|
||||
|
||||
def disableActorControlAt(self,index):
|
||||
self.getActorControlAt(index).disableControl()
|
||||
|
||||
def displayFrameCounts(self):
|
||||
for actorControl in self.actorControlList:
|
||||
actorControl.displayFrameCounts()
|
||||
|
||||
def displaySeconds(self):
|
||||
for actorControl in self.actorControlList:
|
||||
actorControl.displaySeconds()
|
||||
|
||||
def resetAll(self):
|
||||
for actorControl in self.actorControlList:
|
||||
actorControl.reset()
|
||||
|
||||
def toggleBalloon(self):
|
||||
if self.toggleBalloonVar.get():
|
||||
self.balloon.configure(state = 'balloon')
|
||||
else:
|
||||
self.balloon.configure(state = 'none')
|
||||
|
||||
class ActorControl(Pmw.MegaWidget):
|
||||
def __init__(self, parent = None, **kw):
|
||||
|
||||
INITOPT = Pmw.INITOPT
|
||||
DEFAULT_FONT = (('MS', 'Sans', 'Serif'), 12, 'bold')
|
||||
DEFAULT_ANIMS = ('neutral', 'run', 'walk')
|
||||
optiondefs = (
|
||||
('text', 'Actor', self._updateLabelText),
|
||||
('actor', None, None),
|
||||
('animList', DEFAULT_ANIMS, None),
|
||||
('sLabel_width', 5, None),
|
||||
('sLabel_font', DEFAULT_FONT, None),
|
||||
)
|
||||
self.defineoptions(kw, optiondefs)
|
||||
self.addoptions(
|
||||
(('active', self['animList'][0], None),)
|
||||
)
|
||||
|
||||
# Initialize the superclass
|
||||
Pmw.MegaWidget.__init__(self, parent)
|
||||
|
||||
# Handle to the toplevels hull
|
||||
interior = self.interior()
|
||||
interior.configure(relief = RAISED, bd = 2)
|
||||
|
||||
# Instance variables
|
||||
self.offset = 0.0
|
||||
self.fps = 24.0
|
||||
self.maxFrame = 120
|
||||
self.maxSeconds = self.maxFrame / self.fps
|
||||
|
||||
# Create component widgets
|
||||
self._label = self.createcomponent(
|
||||
'label', (), None,
|
||||
Menubutton, (interior,),
|
||||
font=('MSSansSerif', 14, 'bold'),
|
||||
relief = RAISED, bd = 1,
|
||||
activebackground = '#909090',
|
||||
text = self['text'])
|
||||
# Top level menu
|
||||
labelMenu = Menu(self._label, tearoff = 0 )
|
||||
|
||||
# Menu to select display mode
|
||||
self.unitsVar = IntVar()
|
||||
self.unitsVar.set(FRAMES)
|
||||
displayMenu = Menu(labelMenu, tearoff = 0 )
|
||||
displayMenu.add_radiobutton(label = 'Frame count',
|
||||
value = FRAMES,
|
||||
variable = self.unitsVar,
|
||||
command = self.updateDisplay)
|
||||
displayMenu.add_radiobutton(label = 'Seconds',
|
||||
value = SECONDS,
|
||||
variable = self.unitsVar,
|
||||
command = self.updateDisplay)
|
||||
# Items for top level menu
|
||||
labelMenu.add_cascade(label = 'Display Units', menu = displayMenu)
|
||||
labelMenu.add_command(label = 'Set Offset', command = self.setOffset)
|
||||
labelMenu.add_command(label = 'Reset', command = self.reset)
|
||||
# Now associate menu with menubutton
|
||||
self._label['menu'] = labelMenu
|
||||
self._label.pack(side = LEFT, fill = X)
|
||||
|
||||
# Combo box to select current animation
|
||||
animMenu = self.createcomponent(
|
||||
'animMenu', (), None,
|
||||
Pmw.ComboBox, (interior,),
|
||||
labelpos = W, label_text = 'Anim:',
|
||||
entry_width = 12, selectioncommand = self.selectAnimNamed,
|
||||
scrolledlist_items = self['animList'])
|
||||
animMenu.selectitem(self['active'])
|
||||
animMenu.pack(side = 'left', padx = 5, expand = 0)
|
||||
|
||||
# Combo box to select frame rate
|
||||
fpsList = (1,2,4,8,12,15,24,30)
|
||||
fpsMenu = self.createcomponent(
|
||||
'fpsMenu', (), None,
|
||||
Pmw.ComboBox, (interior,),
|
||||
labelpos = W, label_text = 'at:',
|
||||
entry_width = 4, selectioncommand = self.setFrameRate,
|
||||
scrolledlist_items = fpsList)
|
||||
fpsMenu.selectitem('24')
|
||||
fpsMenu.pack(side = LEFT, padx = 5, expand = 0)
|
||||
|
||||
# A label
|
||||
fpsLabel = Label(interior, text = "fps")
|
||||
fpsLabel.pack(side = LEFT)
|
||||
|
||||
# Scale to control animation
|
||||
frameFrame = Frame(interior, relief = SUNKEN, bd = 1)
|
||||
self.minLabel = self.createcomponent(
|
||||
'minLabel', (), 'sLabel',
|
||||
Label, (frameFrame,),
|
||||
text = 0)
|
||||
self.minLabel.pack(side = LEFT)
|
||||
|
||||
self.frameControl = self.createcomponent(
|
||||
'scale', (), None,
|
||||
Scale, (frameFrame,),
|
||||
from_ = 0.0, to = self.maxFrame, resolution = 1.0,
|
||||
orient = HORIZONTAL, showvalue = 1)
|
||||
self.frameControl.pack(side = LEFT, expand = 1)
|
||||
|
||||
self.maxLabel = self.createcomponent(
|
||||
'maxLabel', (), 'sLabel',
|
||||
Label, (frameFrame,),
|
||||
text = self.maxFrame)
|
||||
self.maxLabel.pack(side = LEFT)
|
||||
frameFrame.pack(side = LEFT, expand = 1, fill = X)
|
||||
|
||||
# Checkbutton to enable/disable control
|
||||
self.frameActiveVar = IntVar()
|
||||
self.frameActiveVar.set(1)
|
||||
frameActive = self.createcomponent(
|
||||
'checkbutton', (), None,
|
||||
Checkbutton, (interior,),
|
||||
variable = self.frameActiveVar)
|
||||
frameActive.pack(side = LEFT, expand = 1)
|
||||
|
||||
# Execute option callbacks
|
||||
self.initialiseoptions(ActorControl)
|
||||
|
||||
def _updateLabelText(self):
|
||||
self._label['text'] = self['text']
|
||||
|
||||
def updateDisplay(self):
|
||||
# Switch between showing frame counts and seconds
|
||||
if self.unitsVar.get() == FRAMES:
|
||||
newMin = int(math.floor(self.offset * self.fps))
|
||||
newMax = int(math.ceil(self.offset * self.fps)) + self.maxFrame
|
||||
self.minLabel['text'] = newMin
|
||||
self.maxLabel['text'] = newMax
|
||||
self.frameControl.configure(to = newMax, resolution = 1.0)
|
||||
else:
|
||||
newMin = self.offset
|
||||
newMax = self.offset + self.maxSeconds
|
||||
self.minLabel['text'] = "%.1f" % newMin
|
||||
self.maxLabel['text'] = "%.1f" % newMax
|
||||
print newMin, newMax
|
||||
self.frameControl.configure(to = newMax, resolution = 0.1)
|
||||
|
||||
def selectAnimNamed(self, name):
|
||||
print 'Selected Anim: ' + name
|
||||
|
||||
def setFrameRate(self, rate):
|
||||
self.fps = string.atof(rate)
|
||||
self.maxSeconds = self.maxFrame / self.fps
|
||||
self.updateDisplay()
|
||||
|
||||
def setOffset(self):
|
||||
newOffset = askfloat(title = self['text'],
|
||||
prompt = 'Start offset (seconds):')
|
||||
if newOffset:
|
||||
self.offset = newOffset
|
||||
self.updateDisplay()
|
||||
|
||||
def enableControl(self):
|
||||
self.frameActiveVar.set(1)
|
||||
|
||||
def disableControl(self):
|
||||
self.frameActiveVar.set(0)
|
||||
|
||||
def displayFrameCounts(self):
|
||||
self.unitsVar.set(FRAMES)
|
||||
self.updateDisplay()
|
||||
|
||||
def displaySeconds(self):
|
||||
self.unitsVar.set(SECONDS)
|
||||
self.updateDisplay()
|
||||
|
||||
def reset(self):
|
||||
self.offset = 0.0
|
||||
self.frameControl.set(0.0)
|
||||
self.updateDisplay()
|
||||
######################################################################
|
||||
|
||||
# Create demo in root window for testing.
|
||||
if __name__ == '__main__':
|
||||
widget = AnimPanel(actorList = (1,2,3))
|
||||
|
Loading…
x
Reference in New Issue
Block a user