Mike Goslin 25 лет назад
Родитель
Сommit
1e4f7df0ae
2 измененных файлов с 217 добавлено и 202 удалено
  1. 203 201
      direct/src/gui/ScrollingLabel.py
  2. 14 1
      direct/src/showbase/Loader.py

+ 203 - 201
direct/src/gui/ScrollingLabel.py

@@ -1,201 +1,203 @@
-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 = []
-        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.)
-        self.title = Sign.Sign(self.name, label)
-        self.frame.addItem(self.title)
-        
-        # create a sign for each item in itemList
-        for item in itemList:
-            thisLabel = GuiLabel.GuiLabel.makeSimpleTextLabel(item, font)
-            thisLabel.setForegroundColor(0., 0., 0., 1.)
-            thisLabel.setBackgroundColor(1., 1., 1., 1.)
-            thisSign = Sign.Sign(item, thisLabel)
-            self.items.append(thisSign)
-            # add each item temporarily
-            self.frame.addItem(thisSign)
-
-        # make all labels the same width
-        self.frame.makeWideAsWidest()
-
-        # remove all labels except the first
-        for itemNum in range(1, len(self.items)):
-            self.frame.removeItem(self.items[itemNum])
-
-        # pack the first label under the name 
-        self.frame.packItem(self.items[self.item], GuiFrame.GuiFrame.UNDER,
-                            self.title)
-        self.frame.packItem(self.items[self.item], GuiFrame.GuiFrame.ALIGNLEFT,
-                            self.title)
-
-        # create the scroll buttons
-        self.leftButton = Button.Button(self.name + "-left", " < ")
-        self.leftButton.getGuiItem().setDownRolloverEvent(self.name + "-left")
-        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.name + "-right", " > ")
-        self.rightButton.getGuiItem().setDownRolloverEvent(self.name +
-                                                           "-right")    
-        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.name + "-left", self.handleLeftButton)
-        self.accept(self.name + "-right", self.handleRightButton)
-        # listen for keyboard hits
-        self.setKeyFocus(1)
-        
-        # refresh the frame
-        self.frame.recompute()
-
-
-    def cleanup(self):
-        # remove gui items
-        del(self.frame)
-        for item in self.items:
-            del(item)
-
-        # ignore events
-        self.ignore(self.name + "-left")
-        self.ignore(self.name + "-right")
-        self.setKeyFocus(0)
-        
-    # accessing
-    def getTitle(self):
-        return self.name
-
-    def setTitle(self, name):
-        self.name = name
-        self.title.setText(name)
-        self.frame.recompute()
-        
-    def getItem(self):
-        return self.items[self.item]
-
-    def setItem(self, item):
-        self.frame.removeItem(self.items[self.item])
-        self.item = item
-        self.addItem()
-        
-    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):
-            # 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):
-        self.frame.manage()
-
-    def unmanage(self):
-        self.frame.unmanage()
-        
-    def handleLeftButton(self):
-        # update the current item and the scroll label
-        self.frame.removeItem(self.items[self.item])
-        self.item = self.item - 1
-        if (self.item < 0):
-            self.item = len(self.items) - 1
-        self.addItem()
-
-    def handleRightButton(self):
-        # update the current item and the scroll label
-        self.frame.removeItem(self.items[self.item])
-        self.item = self.item + 1
-        if (self.item >= len(self.items)):
-            self.item = 0
-        self.addItem()
-
-    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")
-    
-    def addItem(self):
-        self.frame.addItem(self.items[self.item])
-        self.frame.packItem(self.items[self.item], GuiFrame.GuiFrame.UNDER,
-                            self.title)
-        self.frame.packItem(self.items[self.item], GuiFrame.GuiFrame.ALIGNLEFT,
-                            self.title)
-        self.items[self.item].manage()
-        self.frame.recompute()
-        messenger.send(self.eventName, [self.item])
-
-    
-
-
-
-
-
+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 = []
+        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.)
+        self.title = Sign.Sign(self.name, label)
+        self.frame.addItem(self.title)
+        
+        # create a sign for each item in itemList
+        for item in itemList:
+            thisLabel = GuiLabel.GuiLabel.makeSimpleTextLabel(item, font)
+            thisLabel.setForegroundColor(0., 0., 0., 1.)
+            thisLabel.setBackgroundColor(1., 1., 1., 1.)
+            thisSign = Sign.Sign(item, thisLabel)
+            self.items.append(thisSign)
+            # add each item temporarily
+            self.frame.addItem(thisSign)
+
+        # make all labels the same width
+        self.frame.makeWideAsWidest()
+
+        # remove all labels except the first
+        for itemNum in range(1, len(self.items)):
+            self.frame.removeItem(self.items[itemNum])
+
+        # pack the first label under the name 
+        self.frame.packItem(self.items[self.item], GuiFrame.GuiFrame.UNDER,
+                            self.title)
+        self.frame.packItem(self.items[self.item], GuiFrame.GuiFrame.ALIGNLEFT,
+                            self.title)
+
+        # create the scroll buttons
+        self.leftButton = Button.Button(self.name + "-left", " < ")
+        self.leftButton.getGuiItem().setDownRolloverEvent(self.name + "-left")
+        self.leftButton.getGuiItem().setUpRolloverEvent(self.name + "-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.name + "-right", " > ")
+        self.rightButton.getGuiItem().setDownRolloverEvent(self.name +
+                                                           "-right")    
+        self.rightButton.getGuiItem().setUpRolloverEvent(self.name + "-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.name + "-left", self.handleLeftButton)
+        self.accept(self.name + "-right", self.handleRightButton)
+        # listen for keyboard hits
+        self.setKeyFocus(1)
+        
+        # refresh the frame
+        self.frame.recompute()
+
+
+    def cleanup(self):
+        # remove gui items
+        del(self.frame)
+        for item in self.items:
+            del(item)
+
+        # ignore events
+        self.ignore(self.name + "-left")
+        self.ignore(self.name + "-right")
+        self.setKeyFocus(0)
+        
+    # accessing
+    def getTitle(self):
+        return self.name
+
+    def setTitle(self, name):
+        self.name = name
+        self.title.setText(name)
+        self.frame.recompute()
+        
+    def getItem(self):
+        return self.items[self.item]
+
+    def setItem(self, item):
+        self.frame.removeItem(self.items[self.item])
+        self.item = item
+        self.addItem()
+        
+    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):
+            # 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):
+        self.frame.manage()
+
+    def unmanage(self):
+        self.frame.unmanage()
+        
+    def handleLeftButton(self):
+        # update the current item and the scroll label
+        self.frame.removeItem(self.items[self.item])
+        self.item = self.item - 1
+        if (self.item < 0):
+            self.item = len(self.items) - 1
+        self.addItem()
+
+    def handleRightButton(self):
+        # update the current item and the scroll label
+        self.frame.removeItem(self.items[self.item])
+        self.item = self.item + 1
+        if (self.item >= len(self.items)):
+            self.item = 0
+        self.addItem()
+
+    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")
+    
+    def addItem(self):
+        self.frame.addItem(self.items[self.item])
+        self.frame.packItem(self.items[self.item], GuiFrame.GuiFrame.UNDER,
+                            self.title)
+        self.frame.packItem(self.items[self.item], GuiFrame.GuiFrame.ALIGNLEFT,
+                            self.title)
+        self.items[self.item].manage()
+        self.frame.recompute()
+        messenger.send(self.eventName, [self.item])
+
+    
+
+
+
+
+

+ 14 - 1
direct/src/showbase/Loader.py

@@ -32,7 +32,7 @@ class Loader:
         else:
             nodePath = None
         return nodePath
-    
+
     def loadModelOnce(self, modelPath):
         """loadModelOnce(self, string)
         Attempt to load a model from modelPool, if not present
@@ -58,6 +58,11 @@ class Loader:
             return (nodePath.copyTo(self.__base.hidden))
         else:
             return None
+
+    def unloadModel(self, modelPath):
+	"""unloadModel(self, string)
+	Loader.notify.info("Unloading model: %s" % (modelPath))
+	ModelPool.releaseModel(modelPath)
             
     # texture loading funcs
     def loadTexture(self, texturePath):
@@ -68,6 +73,10 @@ class Loader:
         texture = TexturePool.loadTexture(texturePath)
         return texture
 
+    def unloadTexture(self, texture):
+	"""unloadTexture(self, texture)
+	TexturePool.releaseTexture(texture)
+
     # sound loading funcs
     def loadSound(self, soundPath):
         """loadSound(self, string)
@@ -77,6 +86,10 @@ class Loader:
         sound = AudioPool.loadSound(soundPath)
         return sound
 
+    def unloadSound(self, sound):
+	"""unloadSound(self, sound)
+	AudioPool.releaseSound(sound)
+