Răsfoiți Sursa

*** empty log message ***

gregw 25 ani în urmă
părinte
comite
d7ef955fb4
4 a modificat fișierele cu 125 adăugiri și 45 ștergeri
  1. 11 5
      direct/src/actor/Actor.py
  2. 20 10
      direct/src/gui/Frame.py
  3. 2 3
      direct/src/gui/PickList.py
  4. 92 27
      direct/src/gui/ScrollingLabel.py

+ 11 - 5
direct/src/actor/Actor.py

@@ -751,16 +751,22 @@ class Actor(PandaObject, NodePath):
         return None
         return None
 
 
             
             
-    def loadModel(self, modelPath, partName="modelRoot", lodName="lodRoot"):
-        """loadModel(self, string, string="modelRoot", string="base")
+    def loadModel(self, modelPath, partName="modelRoot", lodName="lodRoot",
+                  copy = 1):
+        """loadModel(self, string, string="modelRoot", string="lodRoot",
+        bool = 0)
         Actor model loader. Takes a model name (ie file path), a part
         Actor model loader. Takes a model name (ie file path), a part
         name(defaults to "modelRoot") and an lod name(defaults to "lodRoot").
         name(defaults to "modelRoot") and an lod name(defaults to "lodRoot").
+        If copy is set to 0, do a lodModelOnce instead of a loadModelCopy.
         """
         """
-        Actor.notify.info("in loadModel: %s , part: %s, lod: %s" % \
-            (modelPath, partName, lodName))
+        Actor.notify.info("in loadModel: %s , part: %s, lod: %s, copy: %s" % \
+            (modelPath, partName, lodName, copy))
 
 
         # load the model and extract its part bundle
         # load the model and extract its part bundle
-        model = loader.loadModelCopy(modelPath)
+        if (copy):
+            model = loader.loadModelCopy(modelPath)
+        else:
+            model = loader.loadModelOnce(modelPath)
         bundle = NodePath(model, "**/+PartBundleNode")
         bundle = NodePath(model, "**/+PartBundleNode")
         if (bundle.isEmpty()):
         if (bundle.isEmpty()):
             Actor.notify.warning("%s is not a character!" % (modelPath))
             Actor.notify.warning("%s is not a character!" % (modelPath))

+ 20 - 10
direct/src/gui/Frame.py

@@ -22,7 +22,7 @@ class Frame:
         del(self.frame)
         del(self.frame)
         
         
     def __str__(self):
     def __str__(self):
-        return "Frame: %s = %s" % self.name, self.items
+        return "Frame: %s = %s" % (self.name, self.items)
 
 
     # accessing
     # accessing
     def getName(self):
     def getName(self):
@@ -52,6 +52,9 @@ class Frame:
 
 
     def recompute(self):
     def recompute(self):
         self.frame.recompute()
         self.frame.recompute()
+
+    def clearAllPacking(self):
+        self.frame.clearAllPacking()
         
         
     # content functions
     # content functions
     def addItem(self, item):
     def addItem(self, item):
@@ -68,18 +71,23 @@ class Frame:
     def printItems(self):
     def printItems(self):
         print "frame items: %s" % (self.items)
         print "frame items: %s" % (self.items)
         
         
-    def packItem(self, itemNum, relation, otherItemNum):
-        self.frame.packItem(self.items[itemNum].getGuiItem(), relation,
-                            self.items[otherItemNum].getGuiItem(), self.offset)
-
+    def packItem(self, item, relation, otherItem):
+        if (item in self.items) and (otherItem in self.items):
+            self.frame.packItem(item.getGuiItem(), relation,
+                                otherItem.getGuiItem(), self.offset)
+        else:
+            print "warning: tried to pack item that aren't in frame"
+            
     # convenience functions
     # convenience functions
     def makeVertical(self):
     def makeVertical(self):
         # remove any previous packing
         # remove any previous packing
         self.frame.clearAllPacking()
         self.frame.clearAllPacking()
         # make each item (except first) align under the last
         # make each item (except first) align under the last
-        for itemNum in range(1, len(self.items)):
-            self.packItem(itemNum, GuiFrame.GuiFrame.UNDER, itemNum - 1)
-            self.packItem(itemNum, GuiFrame.GuiFrame.ALIGNLEFT, itemNum - 1)
+        for itemNum in range(1, len(self.items)):            
+            self.packItem(self.items[itemNum], GuiFrame.GuiFrame.UNDER,
+                          self.items[itemNum - 1])
+            self.packItem(self.items[itemNum], GuiFrame.GuiFrame.ALIGNLEFT,
+                          self.items[itemNum - 1])
         self.frame.recompute()
         self.frame.recompute()
             
             
     def makeHorizontal(self):
     def makeHorizontal(self):
@@ -87,8 +95,10 @@ class Frame:
         self.frame.clearAllPacking()
         self.frame.clearAllPacking()
         # make each item (except first) align right of the last
         # make each item (except first) align right of the last
         for itemNum in range(1, len(self.items)):
         for itemNum in range(1, len(self.items)):
-            self.packItem(itemNum, GuiFrame.GuiFrame.RIGHT, itemNum - 1)
-            self.packItem(itemNum, GuiFrame.GuiFrame.ALIGNABOVE, itemNum - 1)
+            self.packItem(self.items[itemNum], GuiFrame.GuiFrame.RIGHT,
+                          self.items[itemNum - 1])
+            self.packItem(self.items[itemNum], GuiFrame.GuiFrame.ALIGNABOVE,
+                          self.items[itemNum - 1])
         self.frame.recompute()
         self.frame.recompute()
             
             
     def makeWideAsWidest(self):
     def makeWideAsWidest(self):

+ 2 - 3
direct/src/gui/PickList.py

@@ -126,8 +126,6 @@ class PickList(PandaObject.PandaObject):
         for choice in self.choiceList:
         for choice in self.choiceList:
             if not (self.choiceList.index(choice) == self.choice):
             if not (self.choiceList.index(choice) == self.choice):
                 choice.getGuiItem().exit()
                 choice.getGuiItem().exit()
-	# throw a rollover event
-	messenger.send(self.name + "-rollover")
 
 
     def __exitChoice(self):
     def __exitChoice(self):
         # reset choice when mouse exits a button
         # reset choice when mouse exits a button
@@ -148,10 +146,11 @@ class PickList(PandaObject.PandaObject):
                 task = Task.Task(buttonUp)
                 task = Task.Task(buttonUp)
                 task.choice = self.choiceList[self.choice]
                 task.choice = self.choiceList[self.choice]
                 taskMgr.spawnTaskNamed(Task.doLater(.035, task,
                 taskMgr.spawnTaskNamed(Task.doLater(.035, task,
-                                                    "buttonUp-Later"),
+                                                    "buttonUp-later"),
                                    "doLater-buttonUp-later")
                                    "doLater-buttonUp-later")
             # let everyone know a choice was made                
             # let everyone know a choice was made                
             messenger.send(self.eventName, [self.choice])
             messenger.send(self.eventName, [self.choice])
 
 
 
 
 
 
+

+ 92 - 27
direct/src/gui/ScrollingLabel.py

@@ -19,21 +19,21 @@ class ScrollingLabel(PandaObject.PandaObject):
         self.frame.setOffset(0.015)
         self.frame.setOffset(0.015)
         self.item = 0
         self.item = 0
         self.items = []
         self.items = []
-        
-        # display the name of the scrolling label
+        self.keyFocus = 1
+
+        # create the new title
         label = GuiLabel.GuiLabel.makeSimpleTextLabel(self.name, font)
         label = GuiLabel.GuiLabel.makeSimpleTextLabel(self.name, font)
         label.setForegroundColor(1., 0., 0., 1.)
         label.setForegroundColor(1., 0., 0., 1.)
         label.setBackgroundColor(1., 1., 1., 0.)
         label.setBackgroundColor(1., 1., 1., 0.)
-        name = Sign.Sign(self.name, label)
-        self.frame.addItem(name)
+        self.title = Sign.Sign(self.name, label)
+        self.frame.addItem(self.title)
         
         
         # create a sign for each item in itemList
         # create a sign for each item in itemList
         for 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)
-            thisSign = Button.Button(item)
+            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)
             self.items.append(thisSign)
             # add each item temporarily
             # add each item temporarily
             self.frame.addItem(thisSign)
             self.frame.addItem(thisSign)
@@ -46,24 +46,34 @@ class ScrollingLabel(PandaObject.PandaObject):
             self.frame.removeItem(self.items[itemNum])
             self.frame.removeItem(self.items[itemNum])
 
 
         # pack the first label under the name 
         # pack the first label under the name 
-        self.frame.packItem(1, GuiFrame.GuiFrame.UNDER, 0)
+        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
         # create the scroll buttons
-        leftButton = Button.Button(self.name + "-left", " < ")
-        leftButton.getGuiItem().setDownRolloverEvent(self.name + "-left")
-        self.frame.addItem(leftButton)
-        self.frame.packItem(2, GuiFrame.GuiFrame.UNDER ,0)
-        self.frame.packItem(2, GuiFrame.GuiFrame.LEFT ,0)        
-        rightButton = Button.Button(self.name + "-right", " > ")
-        rightButton.getGuiItem().setDownRolloverEvent(self.name + "-right")    
-        self.frame.addItem(rightButton)
-        self.frame.packItem(3, GuiFrame.GuiFrame.UNDER ,0)
-        self.frame.packItem(3, GuiFrame.GuiFrame.RIGHT ,0)        
+        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
         # listen for the scroll buttons
         self.accept(self.name + "-left", self.handleLeftButton)
         self.accept(self.name + "-left", self.handleLeftButton)
         self.accept(self.name + "-right", self.handleRightButton)
         self.accept(self.name + "-right", self.handleRightButton)
-
+        # listen for keyboard hits
+        self.setKeyFocus(1)
+        
         # refresh the frame
         # refresh the frame
         self.frame.recompute()
         self.frame.recompute()
 
 
@@ -77,14 +87,25 @@ class ScrollingLabel(PandaObject.PandaObject):
         # ignore events
         # ignore events
         self.ignore(self.name + "-left")
         self.ignore(self.name + "-left")
         self.ignore(self.name + "-right")
         self.ignore(self.name + "-right")
-
+        self.setKeyFocus(0)
+        
     # accessing
     # accessing
-    def getName(self):
+    def getTitle(self):
         return self.name
         return self.name
 
 
+    def setTitle(self, name):
+        self.name = name
+        self.title.setText(name)
+        self.frame.recompute()
+        
     def getItem(self):
     def getItem(self):
-        return self.item
+        return self.items[self.item]
 
 
+    def setItem(self, item):
+        self.frame.removeItem(self.items[self.item])
+        self.item = item
+        self.addItem()
+        
     def getEventName(self):
     def getEventName(self):
         return self.eventName
         return self.eventName
 
 
@@ -93,12 +114,30 @@ class ScrollingLabel(PandaObject.PandaObject):
 
 
     def setPos(self, x, y):
     def setPos(self, x, y):
         self.frame.setPos(x, y)
         self.frame.setPos(x, y)
+        self.frame.recompute()
 
 
     def setScale(self, scale):
     def setScale(self, scale):
         self.frame.setScale(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
     # actions
+    def recompute(self):
+        self.frame.recompute()
+        
     def manage(self):
     def manage(self):
         self.frame.manage()
         self.frame.manage()
 
 
@@ -121,12 +160,38 @@ class ScrollingLabel(PandaObject.PandaObject):
             self.item = 0
             self.item = 0
         self.addItem()
         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):
     def addItem(self):
         self.frame.addItem(self.items[self.item])
         self.frame.addItem(self.items[self.item])
-        self.frame.packItem(3, GuiFrame.GuiFrame.UNDER, 0)
+        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.items[self.item].manage()
         self.frame.recompute()
         self.frame.recompute()
-        messenger.send(self.eventName + str(self.item))
+        messenger.send(self.eventName, [self.item])