Exemple #1
0
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()