mirror of
https://github.com/Sneed-Group/Poodletooth-iLand
synced 2024-12-26 13:12:30 -06:00
181 lines
6.8 KiB
Python
181 lines
6.8 KiB
Python
|
"""Undocumented Module"""
|
||
|
|
||
|
__all__ = ['DirectFrame']
|
||
|
|
||
|
from pandac.PandaModules import *
|
||
|
import DirectGuiGlobals as DGG
|
||
|
from DirectGuiBase import *
|
||
|
from OnscreenImage import OnscreenImage
|
||
|
from OnscreenGeom import OnscreenGeom
|
||
|
import string, 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)
|