panda3d/direct/src/gui/DirectFrame.py
2001-09-05 00:43:20 +00:00

160 lines
6.2 KiB
Python

from DirectGuiBase import *
class DirectFrame(DirectGuiWidget):
def __init__(self, parent = guiTop, **kw):
# Inherits from DirectGuiWidget
# A Direct Frame can have:
# - A background texture (pass in path to image, or Texture Card)
# - A midground geometry item (pass in geometry)
# - A foreground text Node (pass in text string or Onscreen Text)
# Each of these has 1 or more states
# The same object can be used for all states or each
# state can have a different text/geom/image (for radio button
# and check button indicators, for example
optiondefs = (
# Define type of DirectGuiWidget
('pgFunc', PGItem, None),
('numStates', 1, None),
('state', self.inactiveInitState, None),
# Frame can have:
# A background texture
('image', None, self.setImage),
# A midground geometry item
('geom', None, self.setGeom),
# A foreground text node
('text', None, self.setText),
)
# Merge keyword options with default options
self.defineoptions(kw, optiondefs,
dynamicGroups = ('text', 'geom', 'image'))
# Initialize superclasses
DirectGuiWidget.__init__(self, parent)
# Call option initialization functions
self.initialiseoptions(DirectFrame)
def setText(self):
# Determine if user passed in single string or a sequence
if self['text'] == None:
textList = (None,) * self['numStates']
elif type(self['text']) == types.StringType:
# If just passing in a single string, make a tuple out of it
textList = (self['text'],) * self['numStates']
else:
# Otherwise, hope that the user has passed in a tuple/list
textList = self['text']
# Create/destroy components
for i in range(self['numStates']):
component = 'text' + `i`
# If fewer items specified than numStates,
# just repeat last item
try:
text = textList[i]
except IndexError:
text = textList[-1]
if self.hascomponent(component):
if text == None:
# Destroy component
self.destroycomponent(component)
else:
self[component + '_text'] = text
else:
if text == None:
return
else:
self.createcomponent(
component, (), 'text',
OnscreenText.OnscreenText,
(), parent = self.stateNodePath[i],
text = text, scale = 1,
sort = TEXT_SORT_INDEX,
mayChange = 1)
def setGeom(self):
# Determine argument type
if self['geom'] == None:
# Passed in None
geomList = (None,) * self['numStates']
elif isinstance(self['geom'], NodePath):
# Passed in a single node path, make a tuple out of it
geomList = (self['geom'],) * self['numStates']
else:
# Otherwise, hope that the user has passed in a tuple/list
geomList = self['geom']
# Create/destroy components
for i in range(self['numStates']):
component = 'geom' + `i`
# If fewer items specified than numStates,
# just repeat last item
try:
geom = geomList[i]
except IndexError:
geom = geomList[-1]
if self.hascomponent(component):
if geom == None:
# Destroy component
self.destroycomponent(component)
else:
self[component + '_geom'] = geom
else:
if geom == None:
return
else:
self.createcomponent(
component, (), 'geom',
OnscreenGeom.OnscreenGeom,
(), parent = self.stateNodePath[i],
geom = geom, scale = 1,
sort = GEOM_SORT_INDEX)
def setImage(self):
# Determine argument type
arg = self['image']
if arg == None:
# Passed in None
imageList = (None,) * self['numStates']
elif isinstance(arg, NodePath):
imageList = (arg,) * self['numStates']
elif type(arg) == types.StringType:
# Passed in a single node path, make a tuple out of it
imageList = (arg,) * self['numStates']
else:
# Otherwise, hope that the user has passed in a tuple/list
if ((len(arg) == 2) and
(type(arg[0]) == types.StringType) and
(type(arg[1]) == types.StringType)):
# Its a model/node pair of strings
imageList = (arg,) * self['numStates']
else:
# Assume its a list of node paths
imageList = arg
# Create/destroy components
for i in range(self['numStates']):
component = 'image' + `i`
# If fewer items specified than numStates,
# just repeat last item
try:
image = imageList[i]
except IndexError:
image = imageList[-1]
if self.hascomponent(component):
if image == None:
# Destroy component
self.destroycomponent(component)
else:
self[component + '_image'] = image
else:
if image == None:
return
else:
self.createcomponent(
component, (), 'image',
OnscreenImage.OnscreenImage,
(), parent = self.stateNodePath[i],
image = image, scale = 1,
sort = IMAGE_SORT_INDEX)