| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- """Undocumented Module"""
- __all__ = ['DirectFrame']
- from panda3d.core import *
- import DirectGuiGlobals as DGG
- from DirectGuiBase import *
- from OnscreenImage import OnscreenImage
- from OnscreenGeom import OnscreenGeom
- import types
- class DirectFrame(DirectGuiWidget):
- DefDynGroups = ('text', 'geom', 'image')
- def __init__(self, parent = None, **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),
- # Change default value of text mayChange flag from 0
- # (OnscreenText.py) to 1
- ('textMayChange', 1, None),
- )
- # Merge keyword options with default options
- self.defineoptions(kw, optiondefs,
- dynamicGroups = DirectFrame.DefDynGroups)
- # Initialize superclasses
- DirectGuiWidget.__init__(self, parent)
-
- # Call option initialization functions
- self.initialiseoptions(DirectFrame)
- def destroy(self):
- DirectGuiWidget.destroy(self)
- def setText(self):
- # Determine if user passed in single string or a sequence
- if self['text'] == None:
- textList = (None,) * self['numStates']
- elif isinstance(self['text'], types.StringTypes):
- # 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' + repr(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:
- from OnscreenText import OnscreenText
- self.createcomponent(
- component, (), 'text',
- OnscreenText,
- (), parent = self.stateNodePath[i],
- text = text, scale = 1, mayChange = self['textMayChange'],
- sort = DGG.TEXT_SORT_INDEX,
- )
- def setGeom(self):
- # Determine argument type
- geom = self['geom']
-
- if geom == None:
- # Passed in None
- geomList = (None,) * self['numStates']
- elif isinstance(geom, NodePath) or \
- isinstance(geom, types.StringTypes):
- # Passed in a single node path, make a tuple out of it
- geomList = (geom,) * self['numStates']
- else:
- # Otherwise, hope that the user has passed in a tuple/list
- geomList = geom
-
- # Create/destroy components
- for i in range(self['numStates']):
- component = 'geom' + repr(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,
- (), parent = self.stateNodePath[i],
- geom = geom, scale = 1,
- sort = DGG.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) or \
- isinstance(arg, Texture) or \
- isinstance(arg, types.StringTypes):
- # 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
- isinstance(arg[0], types.StringTypes) and
- isinstance(arg[1], types.StringTypes)):
- # 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' + repr(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,
- (), parent = self.stateNodePath[i],
- image = image, scale = 1,
- sort = DGG.IMAGE_SORT_INDEX)
|