panda3d/direct/src/gui/ScrollingLabel.py
2001-03-13 01:38:00 +00:00

244 lines
7.2 KiB
Python

from ShowBaseGlobal import *
from GuiGlobals import *
import PandaObject
import Frame
import GuiFrame
import Button
import GuiLabel
import Sign
import Label
class ScrollingLabel(PandaObject.PandaObject):
# special methods
def __init__(self, name, itemList,
label = None,
scale = 0.1,
width = None,
drawOrder = getDefaultDrawOrder(),
font = getDefaultFont()):
self.name = name
self.eventName = self.name
self.frame = Frame.Frame(name)
self.frame.setOffset(0.015)
self.item = 0
self.items = itemList
self.keyFocus = 1
if width == None:
# Compute the maximum width of the all the items.
width = 0
text = TextNode()
text.setFont(font)
for item in itemList:
w = text.calcWidth(item) + 0.2
width = max(width, w)
# create the new title
self.title = Sign.Sign(self.name, self.name, Label.ScrollTitle,
scale, width, drawOrder, font)
self.frame.addItem(self.title)
self.itemSign = Sign.Sign('item', '', Label.ScrollItem,
scale, width, drawOrder, font)
self.frame.addItem(self.itemSign)
# pack the first label under the name
self.frame.packItem(self.itemSign, GuiFrame.GuiFrame.UNDER,
self.title)
self.frame.packItem(self.itemSign, GuiFrame.GuiFrame.ALIGNLEFT,
self.title)
# create the scroll buttons
self.leftButton = Button.Button(self.eventName + "-left", " < ",
scale, None, drawOrder, font)
self.leftButton.getGuiItem().setDownRolloverEvent(self.eventName + "-left")
self.leftButton.getGuiItem().setUpRolloverEvent(self.eventName + "-rollover")
self.frame.addItem(self.leftButton)
self.frame.packItem(self.leftButton, GuiFrame.GuiFrame.UNDER,
self.title)
self.frame.packItem(self.leftButton, GuiFrame.GuiFrame.LEFT,
self.title)
self.rightButton = Button.Button(self.eventName + "-right", " > ",
scale, None, drawOrder, font)
self.rightButton.getGuiItem().setDownRolloverEvent(self.eventName +
"-right")
self.rightButton.getGuiItem().setUpRolloverEvent(self.eventName + "-rollover")
self.frame.addItem(self.rightButton)
self.frame.packItem(self.rightButton, GuiFrame.GuiFrame.UNDER,
self.title)
self.frame.packItem(self.rightButton, GuiFrame.GuiFrame.RIGHT,
self.title)
# listen for the scroll buttons
#self.accept(self.eventName + "-left", self.handleLeftButton)
#self.accept(self.eventName + "-right", self.handleRightButton)
# listen for keyboard hits
#self.setKeyFocus(0)
# set list to first element
self.setItem(self.item)
# refresh the frame
self.frame.recompute()
return None
def cleanup(self):
"""cleanup(self)
"""
# ignore events
self.ignore(self.eventName + "-left")
self.ignore(self.eventName + "-right")
self.ignore(self.eventName + "-rollover")
self.setKeyFocus(0)
# remove gui items
self.frame = None
self.items = None
self.label = None
self.title = None
self.itemSign = None
self.leftButton = None
self.rightButton = None
self.frame = None
return None
# accessing
def getTitle(self):
return self.name
def setTitle(self, name):
self.name = name
self.title.setText(name)
self.frame.recompute()
def getItemSign(self):
return self.itemSign
def getItem(self):
return self.items[self.item]
def setItem(self, item):
self.item = item
self.itemSign.setText(self.items[self.item])
def getEventName(self):
return self.eventName
def setEventName(self, eventName):
self.eventName = eventName
def getPos(self):
return self.frame.getPos()
def setPos(self, x, y):
self.frame.freeze()
self.frame.setPos(x, y)
self.frame.recompute()
self.frame.thaw()
def setScale(self, scale):
self.frame.freeze()
self.frame.setScale(scale)
self.frame.recompute()
self.frame.thaw()
def getKeyFocus(self):
return self.keyFocus
def setKeyFocus(self, focus):
self.keyFocus = focus
if (focus == 1):
# ignore keyboard hits
self.ignore("left-up")
self.ignore("right-up")
# listen for keyboard hits
self.accept("left-up", self.handleLeftArrow)
self.accept("right-up", self.handleRightArrow)
else:
# ignore keyboard hits
self.ignore("left-up")
self.ignore("right-up")
# actions
def recompute(self):
self.frame.recompute()
def manage(self):
# listen for the scroll buttons
self.accept(self.eventName + "-left", self.handleLeftButton)
self.accept(self.eventName + "-right", self.handleRightButton)
self.frame.manage()
self.setKeyFocus(0)
return None
def unmanage(self):
# ignore keyboard hits
self.ignore("left-up")
self.ignore("right-up")
# ignore events
self.ignore(self.eventName + "-left")
self.ignore(self.eventName + "-right")
self.ignore(self.eventName + "-rollover")
self.setKeyFocus(0)
self.frame.unmanage()
return None
def handleLeftButton(self):
# update the current item and the scroll label
self.item = self.item - 1
if (self.item < 0):
self.item = len(self.items) - 1
self.setItem(self.item)
messenger.send(self.eventName, [self.item])
def handleRightButton(self):
# update the current item and the scroll label
self.item = self.item + 1
if (self.item >= len(self.items)):
self.item = 0
self.setItem(self.item)
messenger.send(self.eventName, [self.item])
def handleLeftArrow(self):
# make the button toggle
self.leftButton.getGuiItem().down()
self.spawnButtonUpTask(self.leftButton)
# then act like a mouse click
self.handleLeftButton()
def handleRightArrow(self):
# make the button toggle
self.rightButton.getGuiItem().down()
self.spawnButtonUpTask(self.rightButton)
# then act like a mouse click
self.handleRightButton()
def spawnButtonUpTask(self, button):
def buttonUp(state):
state.button.getGuiItem().up()
return Task.done
task = Task.Task(buttonUp)
task.button = button
taskMgr.spawnTaskNamed(Task.doLater(.035, task, "buttonUp-later"),
"doLater-buttonUp-later")