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)