| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232 |
- from ShowBaseGlobal import *
- import PandaObject
- import Frame
- import GuiFrame
- import Button
- import GuiLabel
- import Sign
- font = (loader.loadModelOnce("phase_3/models/fonts/ttf-comic")).node()
- class ScrollingLabel(PandaObject.PandaObject):
- # special methods
- def __init__(self, name, itemList):
- 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
- # create the new title
- label = GuiLabel.GuiLabel.makeSimpleTextLabel(self.name, font)
- label.setForegroundColor(1., 0., 0., 1.)
- label.setBackgroundColor(1., 1., 1., 0.)
- label.thaw()
- self.title = Sign.Sign(self.name, label)
- self.frame.addItem(self.title)
- longest = self.items[0]
- for item in self.items:
- if len(item) > len(longest):
- longest = item
-
- label = GuiLabel.GuiLabel.makeSimpleTextLabel(longest, font)
- label.setForegroundColor(0., 0., 0., 1.)
- label.setBackgroundColor(1., 1., 1., 1.)
- label.thaw()
- self.itemSign = Sign.Sign(longest, label)
- 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)
- # make the title and label the same length
- self.frame.makeWideAsWidest()
-
- # create the scroll buttons
- self.leftButton = Button.Button(self.eventName + "-left", " < ")
- 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", " > ")
- 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 setPos(self, x, y):
- self.frame.setPos(x, y)
- self.frame.recompute()
- def setScale(self, scale):
- self.frame.setScale(scale)
- self.frame.recompute()
- 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")
-
-
|