diff --git a/direct/src/gui/DirectButton.py b/direct/src/gui/DirectButton.py index 25ee24485e..19115b96bf 100644 --- a/direct/src/gui/DirectButton.py +++ b/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 diff --git a/direct/src/gui/DirectEntry.py b/direct/src/gui/DirectEntry.py index e333bf1809..3275f7f9a9 100644 --- a/direct/src/gui/DirectEntry.py +++ b/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() + diff --git a/direct/src/gui/DirectGuiBase.py b/direct/src/gui/DirectGuiBase.py index 4e8ca29034..4335648c42 100644 --- a/direct/src/gui/DirectGuiBase.py +++ b/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']): diff --git a/direct/src/gui/DirectGuiGlobals.py b/direct/src/gui/DirectGuiGlobals.py index 8b26d87a60..bbf49bf4f8 100644 --- a/direct/src/gui/DirectGuiGlobals.py +++ b/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 diff --git a/direct/src/gui/DirectGuiTest.py b/direct/src/gui/DirectGuiTest.py index 1e9f47f2cd..041462b3e9 100644 --- a/direct/src/gui/DirectGuiTest.py +++ b/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() +