Ejemplo n.º 1
0
  def render(self):
    ''' traverse the tree and update the visuals according to it
    '''
    for treeItem in self.treeStructure.getRec():
      # create nodes that have no visual elements
      if not treeItem in self.treeStructureNodes:
        treeNode = self.childrenCanvas.attachNewNode('')
        
        hor=self.horizontalTreeLine.instanceUnderNode(treeNode,'')
        vert=self.verticalTreeLine.instanceUnderNode(treeNode,'')
        vert.setZ(0.007)
        hor.setPos(-1.5*self.itemIndent,0,self.itemScale*.25)
        vert.setX(-.5*self.itemIndent)
        
        nodeButton = DirectButton(
            parent=treeNode,
            scale=self.itemScale,
            relief=DGG.FLAT,
            text_scale=self.itemTextScale,
            text_align=TextNode.ALeft,
            text=treeItem.name,
            rolloverSound=None,
            #clickSound=None,
          )
        nodeButton.bind(DGG.B1PRESS,treeItem.button1press)
        nodeButton.bind(DGG.B2PRESS,treeItem.button2press)
        nodeButton.bind(DGG.B3PRESS,treeItem.button3press)
        
        #treeButton = None
        #if len(treeItem.childrens) > 0:
        treeButton = DirectButton(
            parent=nodeButton,
            frameColor=(1,1,1,1),
            frameSize=(-.4,.4,-.4,.4),
            pos=(-.5*self.itemIndent/self.itemScale,0,.25),
            text='',
            text_pos=(-.1,-.22),
            text_scale=(1.6,1),
            text_fg=(0,0,0,1),
            enableEdit=0,
            command=treeItem.setOpen,
            sortOrder=1000,
            rolloverSound=None,
            #clickSound=None,
          )
        

        self.treeStructureNodes[treeItem] = [treeNode, nodeButton, treeButton, hor, vert]
    
    # destroy nodes no more used
    for treeItem in self.treeStructureNodes.keys()[:]:
      #treeItem = self.treeStructureNodes[treeName]
      if treeItem not in self.treeStructure.getRec():
        treeNode, nodeButton, treeButton, hor, vert = self.treeStructureNodes[treeItem]
        #nodeButton['text']=''
        nodeButton.unbind(DGG.B1PRESS)
        nodeButton.unbind(DGG.B2PRESS)
        nodeButton.unbind(DGG.B3PRESS)
        #nodeButton.detachNode()
        #nodeButton.removeNode()
        nodeButton.destroy()
        if treeButton:
          #treeButton['text']=''
          #treeButton['command']=None
          treeButton.detachNode()
          treeButton.removeNode()
        hor.detachNode()
        hor.removeNode()
        vert.detachNode()
        vert.removeNode()
        treeItem.destroy()
        #treeNode.detachNode()
        treeNode.removeNode()
        #treeNode.destroy()
        del self.treeStructureNodes[treeItem]
    
    frameHeight = len(self.treeStructureNodes) * self.verticalSpacing
    self.childrenFrame['canvasSize'] = (0, self.frameWidth-self.itemScale*2, 0, frameHeight)
    self.childrenCanvas.setZ(frameHeight-1)
Ejemplo n.º 2
0
    def render(self):
        ''' traverse the tree and update the visuals according to it
    '''
        for treeItem in self.treeStructure.getRec():
            # create nodes that have no visual elements
            if not treeItem in self.treeStructureNodes:
                treeNode = self.childrenCanvas.attachNewNode('')

                hor = self.horizontalTreeLine.instanceUnderNode(treeNode, '')
                vert = self.verticalTreeLine.instanceUnderNode(treeNode, '')
                vert.setZ(0.007)
                hor.setPos(-1.5 * self.itemIndent, 0, self.itemScale * .25)
                vert.setX(-.5 * self.itemIndent)

                nodeButton = DirectButton(
                    parent=treeNode,
                    scale=self.itemScale,
                    relief=DGG.FLAT,
                    text_scale=self.itemTextScale,
                    text_align=TextNode.ALeft,
                    text=treeItem.name,
                    rolloverSound=None,
                    #clickSound=None,
                )
                nodeButton.bind(DGG.B1PRESS, treeItem.button1press)
                nodeButton.bind(DGG.B2PRESS, treeItem.button2press)
                nodeButton.bind(DGG.B3PRESS, treeItem.button3press)

                #treeButton = None
                #if len(treeItem.childrens) > 0:
                treeButton = DirectButton(
                    parent=nodeButton,
                    frameColor=(1, 1, 1, 1),
                    frameSize=(-.4, .4, -.4, .4),
                    pos=(-.5 * self.itemIndent / self.itemScale, 0, .25),
                    text='',
                    text_pos=(-.1, -.22),
                    text_scale=(1.6, 1),
                    text_fg=(0, 0, 0, 1),
                    enableEdit=0,
                    command=treeItem.setOpen,
                    sortOrder=1000,
                    rolloverSound=None,
                    #clickSound=None,
                )

                self.treeStructureNodes[treeItem] = [
                    treeNode, nodeButton, treeButton, hor, vert
                ]

        # destroy nodes no more used
        for treeItem in self.treeStructureNodes.keys()[:]:
            #treeItem = self.treeStructureNodes[treeName]
            if treeItem not in self.treeStructure.getRec():
                treeNode, nodeButton, treeButton, hor, vert = self.treeStructureNodes[
                    treeItem]
                #nodeButton['text']=''
                nodeButton.unbind(DGG.B1PRESS)
                nodeButton.unbind(DGG.B2PRESS)
                nodeButton.unbind(DGG.B3PRESS)
                #nodeButton.detachNode()
                #nodeButton.removeNode()
                nodeButton.destroy()
                if treeButton:
                    #treeButton['text']=''
                    #treeButton['command']=None
                    treeButton.detachNode()
                    treeButton.removeNode()
                hor.detachNode()
                hor.removeNode()
                vert.detachNode()
                vert.removeNode()
                treeItem.destroy()
                #treeNode.detachNode()
                treeNode.removeNode()
                #treeNode.destroy()
                del self.treeStructureNodes[treeItem]

        frameHeight = len(self.treeStructureNodes) * self.verticalSpacing
        self.childrenFrame['canvasSize'] = (0, self.frameWidth -
                                            self.itemScale * 2, 0, frameHeight)
        self.childrenCanvas.setZ(frameHeight - 1)
Ejemplo n.º 3
0
class DirectSidebar(DirectFrame):
    def __init__(
            self,
            parent=None,
            frameSize=(1, 1),
            dragbarSize=0.05,
            align=ALIGN_LEFT | ALIGN_TOP,
            orientation=HORIZONTAL,
            opendir=RIGHT_OR_DOWN,
            pos=Vec3(0, 0, 0),
            text='',
            toggleFunc=None,
            frameColor=(1, 1, 1, 1),
    ):
        if parent is None:
            parent = aspect2d
        self.dragbarSize = dragbarSize
        self.align = align
        self.orientation = orientation
        self.opendir = opendir
        self.pos = pos
        self.frameSize = frameSize
        self.toggleFunc = toggleFunc

        self.collapsed = False

        DirectFrame.__init__(
            self,
            parent=parent,
            frameSize=(0, frameSize[0], 0, frameSize[1]),
            frameColor=frameColor,
            suppressMouse=1,
        )
        self.initialiseoptions(DirectSidebar)
        self.resetFrameSize()

        self.collapseButton = DirectButton(
            parent=parent,
            borderWidth=(0, 0),
            relief=DGG.FLAT,
            command=self.toggleCollapsed,
        )
        self.label = DirectLabel(parent=self.collapseButton,
                                 scale=0.04,
                                 text=text,
                                 text_align=TextNode.ACenter,
                                 frameColor=(0, 0, 0, 0))
        if self.orientation == HORIZONTAL:
            self.label.setPos(Vec3(frameSize[0] / 2., 0, 0.015))
        if self.orientation == VERTICAL:
            self.label.setPos(Vec3(0.035, 0, frameSize[1] / 2.))
            self.label.setR(-90)

        self.accept('window-event', self.update)
        self.update()

    def destroy(self):
        self.label.detachNode()
        self.collapseButton.detachNode()
        self.detachNode()
        self.ignoreAll()  #'window-event', self.update)

    def __del__(self):
        self.destroy()

    def update(self, args=None):
        aspectRatio = base.getAspectRatio()
        framePos = Vec3(self.pos[0], 0, self.pos[2])

        if self.align & ALIGN_LEFT:
            framePos += Vec3(-aspectRatio, 0, 0)
        if self.align & ALIGN_RIGHT:
            framePos += Vec3(aspectRatio, 0, 0)
        if self.align & ALIGN_TOP:
            framePos += Vec3(0, 0, 1 - self.frameSize[1])
        if self.align & ALIGN_BOTTOM:
            framePos += Vec3(0, 0, -1)

        if self.orientation == HORIZONTAL:
            if self.align & ALIGN_RIGHT:  # a small help for the user
                framePos -= Vec3(self.frameSize[0], 0, 0)
            buttonSize = (0, self.frameSize[0], 0, self.dragbarSize)
            if self.opendir == RIGHT_OR_DOWN:  # correct
                if self.collapsed:
                    buttonPos = framePos + Vec3(
                        0, 0, self.frameSize[1] - self.dragbarSize)
                else:
                    buttonPos = framePos + Vec3(0, 0, -self.dragbarSize)
            elif self.opendir == LEFT_OR_UP:
                if self.collapsed:
                    buttonPos = framePos
                else:
                    buttonPos = framePos + Vec3(0, 0, self.frameSize[1])

        elif self.orientation == VERTICAL:
            buttonSize = (0, self.dragbarSize, 0, self.frameSize[1])
            if self.opendir == RIGHT_OR_DOWN:
                if self.collapsed:
                    buttonPos = framePos
                else:
                    buttonPos = framePos + Vec3(self.frameSize[0], 0, 0)
            elif self.opendir == LEFT_OR_UP:
                framePos -= Vec3(self.frameSize[0], 0,
                                 0)  # a small help for the user
                if self.collapsed:
                    buttonPos = framePos + Vec3(
                        self.frameSize[0] - self.dragbarSize, 0, 0)
                else:
                    buttonPos = framePos

        if self.collapsed:
            self.hide()
        else:
            self.show()

        self.setPos(framePos)
        self.collapseButton.setPos(buttonPos)
        self.collapseButton['frameSize'] = buttonSize

    def toggleCollapsed(self, state=None):
        if state is None:
            state = not self.collapsed
        self.collapsed = state
        if self.toggleFunc:
            try:
                self.toggleFunc(state)
            except:
                traceback.print_exc()
        self.update()
class DirectSidebar(DirectFrame):
  def __init__(
        self,
        parent=None,
        frameSize=(1, 1),
        dragbarSize=0.05,
        align=ALIGN_LEFT|ALIGN_TOP,
        orientation=HORIZONTAL,
        opendir=RIGHT_OR_DOWN,
        pos=Vec3(0,0,0),
        text='',
        toggleFunc=None,
        frameColor=(1,1,1,1),
      ):
    if parent is None:
      parent=aspect2d
    self.dragbarSize=dragbarSize
    self.align=align
    self.orientation=orientation
    self.opendir=opendir
    self.pos=pos
    self.frameSize=frameSize
    self.toggleFunc=toggleFunc
    
    self.collapsed=False
    
    DirectFrame.__init__(
        self, parent=parent,
        frameSize=(0,frameSize[0],0,frameSize[1]),
        frameColor=frameColor,
        suppressMouse=1,
      )
    self.initialiseoptions(DirectSidebar)
    self.resetFrameSize()
    
    self.collapseButton = DirectButton(
        parent=parent, 
        borderWidth=(0, 0),
        relief=DGG.FLAT,
        command=self.toggleCollapsed,
      )
    self.label = DirectLabel(
        parent=self.collapseButton,
        scale=0.04,
        text=text,
        text_align=TextNode.ACenter,
        frameColor=(0,0,0,0)
      )
    if self.orientation == HORIZONTAL:
      self.label.setPos(Vec3(frameSize[0]/2.,0,0.015))
    if self.orientation == VERTICAL:
      self.label.setPos(Vec3(0.035,0,frameSize[1]/2.))
      self.label.setR(-90)
    
    self.accept('window-event', self.update)
    self.update()
  
  def destroy(self):
    self.label.detachNode()
    self.collapseButton.detachNode()
    self.detachNode()
    self.ignoreAll()#'window-event', self.update)
  
  def __del__(self):
    self.destroy()
  
  def update(self, args=None):
    aspectRatio=base.getAspectRatio()
    framePos=Vec3(self.pos[0],0,self.pos[2])
    
    if self.align & ALIGN_LEFT:
      framePos+=Vec3(-aspectRatio,0,0)
    if self.align & ALIGN_RIGHT:
      framePos+=Vec3(aspectRatio,0,0)
    if self.align & ALIGN_TOP:
      framePos+=Vec3(0,0,1-self.frameSize[1])
    if self.align & ALIGN_BOTTOM:
      framePos+=Vec3(0,0,-1)
    
    if self.orientation == HORIZONTAL:
      if self.align & ALIGN_RIGHT: # a small help for the user
        framePos-=Vec3(self.frameSize[0],0,0)
      buttonSize=(0,self.frameSize[0],0,self.dragbarSize)
      if self.opendir == RIGHT_OR_DOWN: # correct
        if self.collapsed:
          buttonPos=framePos+Vec3(0,0,self.frameSize[1]-self.dragbarSize)
        else:
          buttonPos=framePos+Vec3(0,0,-self.dragbarSize)
      elif self.opendir == LEFT_OR_UP:
        if self.collapsed:
          buttonPos=framePos
        else:
          buttonPos=framePos+Vec3(0,0,self.frameSize[1])
    
    elif self.orientation == VERTICAL:
      buttonSize=(0,self.dragbarSize,0,self.frameSize[1])
      if self.opendir == RIGHT_OR_DOWN:
        if self.collapsed:
          buttonPos=framePos
        else:
          buttonPos=framePos+Vec3(self.frameSize[0],0,0)
      elif self.opendir == LEFT_OR_UP:
        framePos-=Vec3(self.frameSize[0],0,0) # a small help for the user
        if self.collapsed:
          buttonPos=framePos+Vec3(self.frameSize[0]-self.dragbarSize,0,0)
        else:
          buttonPos=framePos
    
    if self.collapsed:
      self.hide()
    else:
      self.show()
    
    self.setPos(framePos)
    self.collapseButton.setPos(buttonPos)
    self.collapseButton['frameSize']=buttonSize
  
  def toggleCollapsed(self,state=None):
    if state is None:
      state=not self.collapsed
    self.collapsed=state
    if self.toggleFunc:
      try:
        self.toggleFunc(state)
      except:
        traceback.print_exc()
    self.update()