panda3d/direct/src/gui/Button.py
2001-04-12 16:53:42 +00:00

194 lines
6.1 KiB
Python

from ShowBaseGlobal import *
from DirectObject import *
from GuiGlobals import *
import GuiButton
import Label
class Button(DirectObject):
def __init__(self, name,
label = None,
scale = 0.1,
width = None,
align = None,
drawOrder = getDefaultDrawOrder(),
font = getDefaultFont(),
pos = (0, 0),
geomRect = None,
supportInactive = 0,
inactive = 0,
upStyle = Label.ButtonUp,
litStyle = Label.ButtonLit,
downStyle = Label.ButtonDown,
inactiveStyle = Label.ButtonInactive):
self.name = name
self.width = width
# if no label given, use the button name
if (label == None):
label = self.name
self.inactive = inactive
if inactive:
supportInactive = 1
# check to see if this is an actual guiLabel or just text
if (type(label) == type('')):
# text label, make text button
self.label = label
self.lUp = Label.textLabel(self.label, upStyle, scale,
width, drawOrder, font)
if width == None:
width = self.lUp.getWidth() / scale
self.width = width
self.lLit = Label.textLabel(self.label, litStyle, scale,
width, drawOrder, font)
self.lDown = Label.textLabel(self.label, downStyle, scale,
width, drawOrder, font)
if supportInactive:
self.lInactive = Label.textLabel(self.label, inactiveStyle,
scale, width, drawOrder, font)
elif (isinstance(label, NodePath)):
# If it's a NodePath, assume it's a little texture card.
self.lUp = Label.modelLabel(label,
geomRect = geomRect,
style = upStyle,
scale = scale,
drawOrder = drawOrder)
if width == None:
width = self.lUp.getWidth() / scale
self.width = width
self.lLit = Label.modelLabel(label,
geomRect = geomRect,
style = litStyle,
scale = scale,
drawOrder = drawOrder)
self.lDown = Label.modelLabel(label,
geomRect = geomRect,
style = downStyle,
scale = scale,
drawOrder = drawOrder)
if supportInactive:
self.lInactive = Label.modelLabel(label,
geomRect = geomRect,
style = inactiveStyle,
scale = scale,
drawOrder = drawOrder)
else:
# label provided, use it for all labels
self.lUp = self.lLit = self.lDown = self.lInactive = label
if width == None:
width = self.lUp.getWidth()
if not supportInactive:
self.lInactive = self.lUp
self.button = GuiButton.GuiButton(self.name, self.lUp, self.lLit,
self.lDown, self.lDown, self.lInactive)
self.button.setDrawOrder(drawOrder)
if align == TMALIGNLEFT:
self.xoffset = width / 2.0 * scale
elif align == TMALIGNRIGHT:
self.xoffset = -width / 2.0 * scale
else:
self.xoffset = 0
self.setPos(pos[0], pos[1])
self.managed = 0
return None
def cleanup(self):
if (self.managed):
self.unmanage()
self.lUp = None
self.lLit = None
self.lDown = None
self.lInactive = None
self.button = None
return None
def __str__(self):
return "Button: %s" % self.name
def getName(self):
return self.name
def getLabel(self):
return self.label
def getGuiItem(self):
return self.button
def getWidth(self):
return self.width
def setWidth(self, width):
self.lUp.setWidth(width)
self.lLit.setWidth(width)
self.lDown.setWidth(width)
self.lInactive.setWidth(width)
def setInactive(self, inactive):
self.inactive = inactive
if self.managed:
self.button.exit()
if self.inactive:
self.button.inactive()
else:
self.button.up()
def manage(self, nodepath = aspect2d):
if not self.managed:
if nodepath:
self.button.manage(guiMgr, base.eventMgr.eventHandler,
nodepath.node())
else:
self.button.manage(guiMgr, base.eventMgr.eventHandler)
if self.inactive:
self.button.exit()
self.button.inactive()
self.managed = 1
def unmanage(self):
if self.managed:
self.button.unmanage()
self.managed = 0
def getPos(self):
v = self.button.getPos()
return Vec3(v[0] - self.xoffset, v[1], v[2])
def setPos(self, x, y, node = None):
if node == None:
v3 = Vec3(x + self.xoffset, 0., y)
else:
mat = node.getMat(base.render2d)
v3 = Vec3(mat.xformPoint(Point3(x + self.xoffset, 0., y)))
self.button.setPos(v3)
def setBehaviorEvent(self, eventName):
self.button.setBehaviorEvent(eventName)
def startBehavior(self):
self.button.startBehavior()
def stopBehavior(self):
self.button.stopBehavior()