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)
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)
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()