Browse Source

*** empty log message ***

Mark Mine 24 years ago
parent
commit
f60b899fda

+ 6 - 0
direct/src/gui/DirectButton.py

@@ -1,5 +1,11 @@
 from DirectFrame import *
 
+# DirectButton States:
+BUTTON_READY_STATE     = PGButton.SReady       # 0
+BUTTON_DEPRESSED_STATE = PGButton.SDepressed   # 1
+BUTTON_ROLLOVER_STATE  = PGButton.SRollover    # 2
+BUTTON_INACTIVE_STATE  = PGButton.SInactive    # 3
+
 class DirectButton(DirectFrame):
     """
     DirectButton(parent) - Create a DirectGuiWidget which responds

+ 35 - 8
direct/src/gui/DirectEntry.py

@@ -1,5 +1,10 @@
 from DirectFrame import *
 
+# DirectEntry States:
+ENTRY_FOCUS_STATE    = PGEntry.SFocus      # 0
+ENTRY_NO_FOCUS_STATE = PGEntry.SNoFocus    # 1
+ENTRY_INACTIVE_STATE = PGEntry.SInactive   # 2
+
 class DirectEntry(DirectFrame):
     """
     DirectEntry(parent) - Create a DirectGuiWidget which responds
@@ -18,12 +23,16 @@ class DirectEntry(DirectFrame):
         # State transitions happen automatically based upon mouse interaction
         optiondefs = (
             # Define type of DirectGuiWidget
-            ('pgFunc',          PGEntry,   None),
-            ('numStates',       3,         None),
-            ('font',     getDefaultFont(), self.setFont),
-            ('width',           10,        self.setup),
-            ('numLines',        5,         self.setup),
-            ('contents',        '',        self.setContents),
+            ('pgFunc',          PGEntry,          None),
+            ('numStates',       3,                None),
+            ('font',            getDefaultFont(), self.setFont),
+            ('width',           10,               self.setup),
+            ('numLines',        5,                self.setup),
+            ('focus',           0,                self.setFocus),
+            ('initialText',     '',               INITOPT),
+            # Command to be called on hitting Enter
+            ('command',        None,       None),
+            ('extraArgs',      [],         None),
             # Sounds to be used for button events
             ('rolloverSound',   getDefaultRolloverSound(), self.setRolloverSound),
             )
@@ -33,17 +42,24 @@ class DirectEntry(DirectFrame):
         # Initialize superclasses
         DirectFrame.__init__(self, parent)
 
+        # Bind command function
+        self.bind(ACCEPT, self.commandFunc)
+
         # Call option initialization functions
         self.initialiseoptions(DirectEntry)
 
+        # Update entry if init text specified
+        if self['initialText']:
+            self.guiItem.setText(self['initialText'])
+
     def setup(self):
         self.node().setup(self['width'], self['numLines'])
 
     def setFont(self):
         self.guiItem.getTextNode().setFont(self['font'])
 
-    def setContents(self):
-        self.guiItem.setText(self['contents'])
+    def setFocus(self):
+        PGEntry.setFocus(self.guiItem, self['focus'])
 
     def setRolloverSound(self):
         if base.wantSfx:
@@ -53,4 +69,15 @@ class DirectEntry(DirectFrame):
             else:
                 self.guiItem.clearSound(ENTER + self.guiId)
 
+    def commandFunc(self, event):
+        if self['command']:
+            # Pass any extra args to command
+            apply(self['command'], [self.get()] + self['extraArgs'])
+            
+    def set(self, text):
+        self.guiItem.setText(text)
+
+    def get(self):
+        return self.guiItem.getText()
+
 

+ 17 - 7
direct/src/gui/DirectGuiBase.py

@@ -827,18 +827,23 @@ class DirectGuiWidget(DirectGuiBase, NodePath):
                 # To force an update of the button
                 self.guiItem.getStateDef(0)
             # Clear out frame before computing bounds
-            self.stateNodePath[0].calcTightBounds(self.ll, self.ur)
-            # Scale bounds to give a pad around graphics
-            self.bounds = (self.ll[0] - self['pad'][0],
-                           self.ur[0] + self['pad'][0],
-                           self.ll[2] - self['pad'][1],
-                           self.ur[2] + self['pad'][1])
+            self.getBounds()
             # Restore frame style if necessary
             if (frameType != PGFrameStyle.TNone):
                 self.frameStyle[0].setType(frameType)
                 self.guiItem.setFrameStyle(0, self.frameStyle[0])
         # Set frame to new dimensions
-        self.guiItem.setFrame(self.bounds[0], self.bounds[1],self.bounds[2], self.bounds[3])
+        self.guiItem.setFrame(self.bounds[0], self.bounds[1],
+                              self.bounds[2], self.bounds[3])
+
+    def getBounds(self, state = 0):
+        self.stateNodePath[state].calcTightBounds(self.ll, self.ur)
+        # Scale bounds to give a pad around graphics
+        self.bounds = (self.ll[0] - self['pad'][0],
+                       self.ur[0] + self['pad'][0],
+                       self.ll[2] - self['pad'][1],
+                       self.ur[2] + self['pad'][1])
+        return self.bounds
 
     def getWidth(self):
         return self.bounds[1] - self.bounds[0] 
@@ -846,6 +851,11 @@ class DirectGuiWidget(DirectGuiBase, NodePath):
     def getHeight(self):
         return self.bounds[3] - self.bounds[2]
 
+    def getCenter(self):
+        x = self.bounds[0] + (self.bounds[1] - self.bounds[0])/2.0
+        y = self.bounds[2] + (self.bounds[3] - self.bounds[2])/2.0
+        return (x,y)
+
     def updateFrameStyle(self):
         if not self.fInit:
             for i in range(self['numStates']):

+ 3 - 0
direct/src/gui/DirectGuiGlobals.py

@@ -48,6 +48,9 @@ B3PRESS = PGButton.getPressPrefix() + MouseButton.three().getName() + '-'
 B1RELEASE = PGButton.getReleasePrefix() + MouseButton.one().getName() + '-'  
 B2RELEASE = PGButton.getReleasePrefix() + MouseButton.two().getName() + '-'  
 B3RELEASE = PGButton.getReleasePrefix() + MouseButton.three().getName() + '-'
+# For DirectEntry widgets
+OVERFLOW = PGEntry.getOverflowPrefix()
+ACCEPT = PGEntry.getAcceptPrefix() + KeyboardButton.enter().getName() + '-'
 
 # For setting the sorting order of a widget's visible components
 IMAGE_SORT_INDEX = 10

+ 24 - 0
direct/src/gui/DirectGuiTest.py

@@ -80,3 +80,27 @@ for i in range(10):
     
     # To get rid of button and clear out hooks call:
     # db.destroy()
+
+# DIRECT ENTRY EXAMPLE
+def printEntryText(text):
+    print 'Text:', text
+
+# Here we create an entry, and specify everything up front
+# CALL de1.get() and de1.set('new text') to get and set entry contents
+de1 = DirectEntry(initialText = 'Hello, how are you?',
+                  image = 'phase_3/maps/hotel-room.jpg',
+                  image_pos = (4.55, 0, -1.65),
+                  image_scale = (5.5, 1, 2.55),
+                  command = printEntryText,
+                  pos = (-1.1875, 0, 0.879167),
+                  scale = 0.0707855,
+                  )
+
+# NOTE: There are some utility functions which help you get size
+# of a direct gui widget.  These can be used to position and scale an
+# image after you've created the entry.  scale = (width/2, 1, height/2)
+print 'BOUNDS:', de1.getBounds()
+print 'WIDTH:', de1.getWidth()
+print 'HEIGHT:', de1.getHeight()
+print 'CENTER:', de1.getCenter()
+