class SegmentInfoDockArea(DockArea): segid2treenode = WeakValueDictionary() def __init__(self): DockArea.__init__(self) self.project_tree_dock = Dock(u"Project Tree", hideTitle=True) self.addDock(self.project_tree_dock, 'top') #'above', self.flowcharts_dock) self.project_tree = SegmentTreeWidget() self.project_tree_dock.addWidget(self.project_tree) self.properties_table = TableWidget(sortable=False, editable=False) self.properties_table.setFormat("%.3f",1) self.properties_table.setColumnCount(1) self.properties_table.contextMenu.clear() self.properties_table.horizontalHeader().hide() self.properties_dock = Dock("Selected Object Properties", widget=self.properties_table, hideTitle=True) self.addDock(self.properties_dock, 'bottom') MarkWriteMainWindow.instance().sigProjectChanged.connect( self.handleProjectChange) MarkWriteMainWindow.instance().sigSegmentCreated.connect( self.handleSegmentCreated) MarkWriteMainWindow.instance().sigSegmentRemoved.connect( self.handleSegmentRemoved) MarkWriteMainWindow.instance().sigActiveObjectChanged.connect( self.handleActiveObjectChanged) self.project_tree.currentItemChanged.connect( self.currentTreeItemChangedEvent) self.project_tree.itemDoubleClicked.connect( self.treeItemDoubleClickedEvent) self.project_tree.customContextMenuRequested.connect( self.rightClickTreeEvent) # self.project_tree.itemSelectionChanged.connect(self.handleItemSelectionChanged) self.project_tree.setExpandsOnDoubleClick(False) self.doNotSetActiveObject=False def updatePropertiesTableData(self, objwithprops, cleartable=False): if cleartable: self.properties_table.clear() self.properties_table.horizontalHeader().setResizeMode( QtGui.QHeaderView.Stretch) self.properties_table.setData(objwithprops.propertiesTableData()) else: i=0 for v in objwithprops.propertiesTableData().values(): self.properties_table.setRow(i,v) i+=1 # # Signal Handlers # def handleProjectChange(self, project): self.project_tree.clear() self.segid2treenode.clear() # Create Project Tree Node projecttreeitem = QtGui.QTreeWidgetItem([project.name]) projecttreeitem._pydat = proxy(project.segmenttree) self.segid2treenode[project.segmenttree.id] = projecttreeitem self.project_tree.addTopLevelItem(projecttreeitem) for seg in project.segmenttree.children: self.handleSegmentCreated(seg) def handleSegmentCreated(self, segment): #print '>>TREE.handleSegmentCreated:',segment self.doNotSetActiveObject = True segindex = segment.parent.getChildIndex(segment) parent_tree_node = self.segid2treenode[segment.parent.id] #parent_tree_node = self.project_tree.topLevelItem(0) segtreeitem = QtGui.QTreeWidgetItem([segment.name]) self.segid2treenode[segment.id] = segtreeitem segtreeitem._pydat = proxy(segment) parent_tree_node.insertChild(segindex, segtreeitem) #for i in self.project_tree.selectedItems(): # i.setSelected(False) #segtreeitem.setSelected(True) self.project_tree.setCurrentItem(segtreeitem) #print '<< TREE.handleSegmentCreated' self.doNotSetActiveObject = False for seg in segment.children: self.handleSegmentCreated(seg) def handleSegmentRemoved(self, segment, segment_index): self.doNotSetActiveObject = True parent_tree_node = self.segid2treenode[segment.parent.id] segmenttreeitem = parent_tree_node.child(segment_index) parent_tree_node.removeChild(segmenttreeitem) self.doNotSetActiveObject = False if MarkWriteMainWindow.instance(): MarkWriteMainWindow.instance().setActiveObject(segment.parent) def handleActiveObjectChanged(self,activeobj, prevactiveobj): #if activeobj != prevactiveobj: # print "Active Obj Changed:",activeobj, prevactiveobj if activeobj: self.updatePropertiesTableData(activeobj, activeobj!=prevactiveobj) if activeobj != prevactiveobj: if not isinstance(activeobj,PenDataSegmentCategory): #print "Deselecting Tree Node.." # set root node as current, otherwise if user tries to press on # prev selected segment, tree change event will not fire. if self.segid2treenode.has_key(0): self.project_tree.setCurrentItem(self.segid2treenode[0]) self.project_tree.clearSelection() #self.project_tree.setCurrentItem(None) else: #print "Settting tree node",activeobj,self.segid2treenode[activeobj.id] self.project_tree.setCurrentItem(self.segid2treenode[activeobj.id]) def rightClickTreeEvent(self, *args, **kwargs): # Show Segment name editing dialog segment = MarkWriteMainWindow.instance().activeobject #print "rightClickTreeEvent:",segment if segment: if isinstance(segment, PenDataSegmentCategory): if segment.locked is False: tag, ok = showSegmentNameDialog( MarkWriteMainWindow.instance().predefinedtags, default=segment.name) if len(tag) > 0 and ok: segment.name = tag self.project_tree.selectedItems()[0].setText(0, segment.name) def currentTreeItemChangedEvent(self, *args, **kwargs): current_tree_item, old_tree_widget = args #print ">> currentTreeItemChangedEvent:",current_tree_item, old_tree_widget # print " selected items:",self.project_tree.selectedItems() try: if current_tree_item is None: #passing in not obj sets activeObject to project.selectedtimeregion MarkWriteMainWindow.instance().setActiveObject() elif self.doNotSetActiveObject is False: self.project_tree.setCurrentItem(current_tree_item) selectedsegment = current_tree_item._pydat if selectedsegment.isRoot(): ao=MarkWriteMainWindow.instance().setActiveObject() else: ao=MarkWriteMainWindow.instance().setActiveObject(selectedsegment) #print "Set active object:",ao except Exception, e: #import traceback #traceback.print_exc() self.properties_table.clear()
class SegmentInfoDockArea(DockArea): segid2treenode = WeakValueDictionary() def __init__(self): DockArea.__init__(self) self.project_tree_dock = Dock(u"Project Tree", hideTitle=True) self.addDock(self.project_tree_dock, 'top') #'above', self.flowcharts_dock) self.project_tree = SegmentTreeWidget() self.project_tree_dock.addWidget(self.project_tree) self.properties_table = TableWidget(sortable=False, editable=False) self.properties_table.setFormat("%.3f", 1) self.properties_table.setColumnCount(1) self.properties_table.contextMenu.clear() self.properties_table.horizontalHeader().hide() self.properties_dock = Dock("Selected Object Properties", widget=self.properties_table, hideTitle=True) self.addDock(self.properties_dock, 'bottom') MarkWriteMainWindow.instance().sigProjectChanged.connect( self.handleProjectChange) MarkWriteMainWindow.instance().sigSegmentCreated.connect( self.handleSegmentCreated) MarkWriteMainWindow.instance().sigSegmentRemoved.connect( self.handleSegmentRemoved) MarkWriteMainWindow.instance().sigActiveObjectChanged.connect( self.handleActiveObjectChanged) self.project_tree.currentItemChanged.connect( self.currentTreeItemChangedEvent) self.project_tree.itemDoubleClicked.connect( self.treeItemDoubleClickedEvent) self.project_tree.customContextMenuRequested.connect( self.rightClickTreeEvent) # self.project_tree.itemSelectionChanged.connect(self.handleItemSelectionChanged) self.project_tree.setExpandsOnDoubleClick(False) self.doNotSetActiveObject = False def updatePropertiesTableData(self, objwithprops, cleartable=False): if cleartable: self.properties_table.clear() self.properties_table.horizontalHeader().setResizeMode( QtGui.QHeaderView.Stretch) self.properties_table.setData(objwithprops.propertiesTableData()) else: i = 0 for v in objwithprops.propertiesTableData().values(): self.properties_table.setRow(i, v) i += 1 # # Signal Handlers # def handleProjectChange(self, project): self.project_tree.clear() self.segid2treenode.clear() # Create Project Tree Node projecttreeitem = QtGui.QTreeWidgetItem([project.name]) projecttreeitem._pydat = proxy(project.segmenttree) self.segid2treenode[project.segmenttree.id] = projecttreeitem self.project_tree.addTopLevelItem(projecttreeitem) for seg in project.segmenttree.children: self.handleSegmentCreated(seg) def handleSegmentCreated(self, segment): #print '>>TREE.handleSegmentCreated:',segment self.doNotSetActiveObject = True segindex = segment.parent.getChildIndex(segment) parent_tree_node = self.segid2treenode[segment.parent.id] #parent_tree_node = self.project_tree.topLevelItem(0) segtreeitem = QtGui.QTreeWidgetItem([segment.name]) self.segid2treenode[segment.id] = segtreeitem segtreeitem._pydat = proxy(segment) parent_tree_node.insertChild(segindex, segtreeitem) #for i in self.project_tree.selectedItems(): # i.setSelected(False) #segtreeitem.setSelected(True) self.project_tree.setCurrentItem(segtreeitem) #print '<< TREE.handleSegmentCreated' self.doNotSetActiveObject = False for seg in segment.children: self.handleSegmentCreated(seg) def handleSegmentRemoved(self, segment, segment_index): self.doNotSetActiveObject = True parent_tree_node = self.segid2treenode[segment.parent.id] segmenttreeitem = parent_tree_node.child(segment_index) parent_tree_node.removeChild(segmenttreeitem) self.doNotSetActiveObject = False if MarkWriteMainWindow.instance(): MarkWriteMainWindow.instance().setActiveObject(segment.parent) def handleActiveObjectChanged(self, activeobj, prevactiveobj): #if activeobj != prevactiveobj: # print "Active Obj Changed:",activeobj, prevactiveobj if activeobj: self.updatePropertiesTableData(activeobj, activeobj != prevactiveobj) if activeobj != prevactiveobj: if not isinstance(activeobj, PenDataSegmentCategory): #print "Deselecting Tree Node.." # set root node as current, otherwise if user tries to press on # prev selected segment, tree change event will not fire. if self.segid2treenode.has_key(0): self.project_tree.setCurrentItem(self.segid2treenode[0]) self.project_tree.clearSelection() #self.project_tree.setCurrentItem(None) else: #print "Settting tree node",activeobj,self.segid2treenode[activeobj.id] self.project_tree.setCurrentItem( self.segid2treenode[activeobj.id]) def rightClickTreeEvent(self, *args, **kwargs): # Show Segment name editing dialog segment = MarkWriteMainWindow.instance().activeobject #print "rightClickTreeEvent:",segment if segment: if isinstance(segment, PenDataSegmentCategory): if segment.locked is False: tag, ok = showSegmentNameDialog( MarkWriteMainWindow.instance().predefinedtags, default=segment.name) if len(tag) > 0 and ok: segment.name = tag self.project_tree.selectedItems()[0].setText( 0, segment.name) def currentTreeItemChangedEvent(self, *args, **kwargs): current_tree_item, old_tree_widget = args #print ">> currentTreeItemChangedEvent:",current_tree_item, old_tree_widget # print " selected items:",self.project_tree.selectedItems() try: if current_tree_item is None: #passing in not obj sets activeObject to project.selectedtimeregion MarkWriteMainWindow.instance().setActiveObject() elif self.doNotSetActiveObject is False: self.project_tree.setCurrentItem(current_tree_item) selectedsegment = current_tree_item._pydat if selectedsegment.isRoot(): ao = MarkWriteMainWindow.instance().setActiveObject() else: ao = MarkWriteMainWindow.instance().setActiveObject( selectedsegment) #print "Set active object:",ao except Exception, e: #import traceback #traceback.print_exc() self.properties_table.clear()