From c5f0f39804767e32af47660628781f1cfd3fbd63 Mon Sep 17 00:00:00 2001 From: Mark Mine Date: Tue, 13 Aug 2002 17:55:43 +0000 Subject: [PATCH] Fix to lack of cancel. Adjust alignment of popup --- direct/src/gui/DirectOptionMenu.py | 38 ++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/direct/src/gui/DirectOptionMenu.py b/direct/src/gui/DirectOptionMenu.py index 878d7af3d7..a1d7526de8 100644 --- a/direct/src/gui/DirectOptionMenu.py +++ b/direct/src/gui/DirectOptionMenu.py @@ -31,9 +31,6 @@ class DirectOptionMenu(DirectButton): self.defineoptions(kw, optiondefs) # Initialize superclasses DirectButton.__init__(self, parent) - # This is created when you set the menu's items - self.popupMenu = None - self.selectedIndex = None # Record any user specified frame size self.initFrameSize = self['frameSize'] # Create a small rectangular marker to distinguish this button @@ -49,10 +46,19 @@ class DirectOptionMenu(DirectButton): # Make popup marker have the same click sound self.popupMarker.guiItem.setSound( B1PRESS + self.popupMarker.guiId,self['clickSound']) + # Create an invisible frame to hold cancel frame and popup frame + # Used to reparent menu and cancel frame to render so that its drawn + # on top of everything + self.reparentFrame = self.createcomponent( + 'reparentFrame', (), None, + DirectFrame, (self,)) + # This is created when you set the menu's items + self.popupMenu = None + self.selectedIndex = None # A big screen encompassing frame to catch the cancel clicks self.cancelFrame = self.createcomponent( 'cancelframe', (), None, - DirectFrame, (self,), + DirectFrame, (self.reparentFrame,), frameSize = (-1,1,-1,1), relief = None) self.cancelFrame.bind(B1PRESS, self.hidePopupMenu) @@ -73,7 +79,8 @@ class DirectOptionMenu(DirectButton): self.destroycomponent('popupMenu') # Create new component self.popupMenu = self.createcomponent('popupMenu', (), None, - DirectFrame, (self,), + DirectFrame, + (self.reparentFrame,), relief = 'raised', ) if not self['items']: @@ -160,6 +167,12 @@ class DirectOptionMenu(DirectButton): Adjust popup position if default position puts it outside of visible screen region """ + # Show the menu + self.reparentFrame.reparentTo(aspect2d) + self.popupMenu.show() + # Make sure its at the right scale + self.popupMenu.setScale(self, VBase3(1)) + # Compute bounds b = self.getBounds() fb = self.popupMenu.getBounds() # Where did the user click his mouse? @@ -169,9 +182,10 @@ class DirectOptionMenu(DirectButton): else: # If no mouse watcher, use midpoint of menu button xPos = (b[1] - b[0])/2.0 - fb[0] - self.popupMenu.setX(xPos) + self.popupMenu.setX(self, xPos) # Try to set height to line up selected item with button - self.popupMenu.setZ((self.selectedIndex + 1)*self.maxHeight - fb[3]) + self.popupMenu.setZ( + self, self.minZ + (self.selectedIndex + 1)*self.maxHeight) # Make sure the whole popup menu is visible pos = self.popupMenu.getPos(render2d) scale = self.popupMenu.getScale(render2d) @@ -189,8 +203,6 @@ class DirectOptionMenu(DirectButton): elif maxZ > 1.0: # Menu too high, move it down self.popupMenu.setZ(render2d, pos[2] + (1.0 - maxZ)) - # Show the menu in its new position - self.popupMenu.show() # Also display cancel frame to catch clicks outside of the popup self.cancelFrame.show() # Position and scale cancel frame to fill entire window @@ -199,6 +211,7 @@ class DirectOptionMenu(DirectButton): def hidePopupMenu(self, event = None): """ Put away popup and cancel frame """ + self.reparentFrame.reparentTo(self) self.popupMenu.hide() self.cancelFrame.hide() @@ -243,7 +256,12 @@ class DirectOptionMenu(DirectButton): """ pass - + def destroy(self): + """ + Make sure you clean up popup menu + """ + self.reparentFrame.reparentTo(self) + DirectGuiBase.destroy(self)