예제 #1
0
파일: buttonlist.py 프로젝트: colshag/ANW
   def __init__(self, parent=None, frameSize=(.8,1.2), buttonTextColor=(1,1,1,1),
                font=None, itemScale=.045, itemTextScale=0.85, itemTextZ=0,
                command=None, contextMenu=None, autoFocus=0,
                colorChange=1, colorChangeDuration=1, newItemColor=globals.colors['guiblue1'],
                rolloverColor=globals.colors['guiyellow'],
                suppressMouseWheel=1, modifier='control'):
       self.mode = None
       self.focusButton=None
       self.command=command
       self.contextMenu=contextMenu
       self.autoFocus=autoFocus
       self.colorChange=colorChange
       self.colorChangeDuration=colorChangeDuration*.5
       self.newItemColor=newItemColor
       self.rolloverColor=rolloverColor
       self.rightClickTextColors=(Vec4(0,1,0,1),Vec4(0,35,100,1))
       self.font=font
       if font:
          self.fontHeight=font.getLineHeight()
       else:
          self.fontHeight=TextNode.getDefaultFont().getLineHeight()
       self.fontHeight*=1.2 # let's enlarge font height a little
       self.xtraSideSpace=.2*self.fontHeight
       self.itemTextScale=itemTextScale
       self.itemTextZ=itemTextZ
       self.buttonTextColor=buttonTextColor
       self.suppressMouseWheel=suppressMouseWheel
       self.modifier=modifier
       self.buttonsList=[]
       self.numItems=0
       self.__eventReceivers={}
       # DirectScrolledFrame to hold items
       self.itemScale=itemScale
       self.itemVertSpacing=self.fontHeight*self.itemScale
       self.frameWidth,self.frameHeight=frameSize
       # I set canvas' Z size smaller than the frame to avoid the auto-generated vertical slider bar
       self.childrenFrame = DirectScrolledFrame(
                    parent=parent,pos=(-self.frameWidth*.5,0,.5*self.frameHeight), relief=DGG.GROOVE,
                    state=DGG.NORMAL, # to create a mouse watcher region
                    frameSize=(0, self.frameWidth, -self.frameHeight, 0), frameColor=(0,0,0,.7),
                    canvasSize=(0, 0, -self.frameHeight*.5, 0), borderWidth=(0.01,0.01),
                    manageScrollBars=0, enableEdit=0, suppressMouse=0, sortOrder=1000 )
       # the real canvas is "self.childrenFrame.getCanvas()",
       # but if the frame is hidden since the beginning,
       # no matter how I set the canvas Z pos, the transform would be resistant,
       # so just create a new node under the canvas to be my canvas
       self.canvas=self.childrenFrame.getCanvas().attachNewNode('myCanvas')
       # slider background
       SliderBG=DirectFrame( parent=self.childrenFrame,frameSize=(-.025,.025,-self.frameHeight,0),
                    frameColor=(0,0,0,.7), pos=(-.03,0,0),enableEdit=0, suppressMouse=0)
       # slider thumb track
       sliderTrack = DirectFrame( parent=SliderBG, relief=DGG.FLAT, #state=DGG.NORMAL,
                    frameColor=(1,1,1,.2), frameSize=(-.015,.015,-self.frameHeight+.01,-.01),
                    enableEdit=0, suppressMouse=0)
       # page up
       self.pageUpRegion=DirectFrame( parent=SliderBG, relief=DGG.FLAT, state=DGG.NORMAL,
                    frameColor=(1,.8,.2,.1), frameSize=(-.015,.015,0,0),
                    enableEdit=0, suppressMouse=0)
       self.pageUpRegion.setAlphaScale(0)
       self.pageUpRegion.bind(DGG.B1PRESS,self.__startScrollPage,[-1])
       self.pageUpRegion.bind(DGG.WITHIN,self.__continueScrollUp)
       self.pageUpRegion.bind(DGG.WITHOUT,self.__suspendScrollUp)
       # page down
       self.pageDnRegion=DirectFrame( parent=SliderBG, relief=DGG.FLAT, state=DGG.NORMAL,
                    frameColor=(1,.8,.2,.1), frameSize=(-.015,.015,0,0),
                    enableEdit=0, suppressMouse=0)
       self.pageDnRegion.setAlphaScale(0)
       self.pageDnRegion.bind(DGG.B1PRESS,self.__startScrollPage,[1])
       self.pageDnRegion.bind(DGG.WITHIN,self.__continueScrollDn)
       self.pageDnRegion.bind(DGG.WITHOUT,self.__suspendScrollDn)
       self.pageUpDnSuspended=[0,0]
       # slider thumb
       self.vertSliderThumb=DirectButton(parent=SliderBG, relief=DGG.FLAT,
                    frameColor=(1,1,1,.6), frameSize=(-.015,.015,0,0),
                    enableEdit=0, suppressMouse=0, rolloverSound=None, clickSound=None)
       self.vertSliderThumb.bind(DGG.B1PRESS,self.__startdragSliderThumb)
       self.vertSliderThumb.bind(DGG.WITHIN,self.__enteringThumb)
       self.vertSliderThumb.bind(DGG.WITHOUT,self.__exitingThumb)
       self.oldPrefix=base.buttonThrowers[0].node().getPrefix()
       self.sliderThumbDragPrefix='draggingSliderThumb-'
       # GOD & I DAMN IT !!!
       # These things below don't work well if the canvas has a lot of buttons.
       # So I end up checking the mouse region every frame by myself using a continuous task.
 #       self.accept(DGG.WITHIN+self.childrenFrame.guiId,self.__enteringFrame)
 #       self.accept(DGG.WITHOUT+self.childrenFrame.guiId,self.__exitingFrame)
       self.isMouseInRegion=False
       self.mouseOutInRegionCommand=(self.__exitingFrame,self.__enteringFrame)
       taskMgr.doMethodLater(.2,self.__getFrameRegion,'getFrameRegion')