Synchronize selections between Scene and TreeView (closes #18)

This commit is contained in:
Mika Fischer
2011-06-16 20:17:33 +02:00
parent 681bf970f2
commit ec37d1c411
3 changed files with 40 additions and 4 deletions
+19 -4
View File
@@ -1,7 +1,7 @@
"""
The annotationmodel module contains the classes for the AnnotationModel.
"""
from PyQt4.QtGui import QTreeView, QSortFilterProxyModel, QAbstractItemView
from PyQt4.QtGui import QTreeView, QItemSelection, QItemSelectionModel, QSortFilterProxyModel, QAbstractItemView
from PyQt4.QtCore import QModelIndex, QPersistentModelIndex, QAbstractItemModel, QVariant, Qt, pyqtSignal
import os.path
import copy
@@ -505,15 +505,17 @@ class AnnotationSortFilterProxyModel(QSortFilterProxyModel):
#######################################################################################
class AnnotationTreeView(QTreeView):
selectedItemsChanged = pyqtSignal(object)
def __init__(self, parent=None):
super(AnnotationTreeView, self).__init__(parent)
self.setUniformRowHeights(True)
self.setSelectionMode(QTreeView.SingleSelection)
self.setSelectionMode(QTreeView.ExtendedSelection)
self.setSelectionBehavior(QTreeView.SelectItems)
self.setAllColumnsShowFocus(True)
self.setAlternatingRowColors(True)
self.setEditTriggers(QAbstractItemView.SelectedClicked)
#self.setEditTriggers(QAbstractItemView.SelectedClicked)
self.setSortingEnabled(True)
self.expanded.connect(self.onExpanded)
@@ -539,4 +541,17 @@ class AnnotationTreeView(QTreeView):
def rowsInserted(self, index, start, end):
QTreeView.rowsInserted(self, index, start, end)
self.resizeColumns()
# self.setCurrentIndex(index.child(end, 0))
def setSelectedItems(self, items):
block = self.blockSignals(True)
sel = QItemSelection()
for item in items:
sel.merge(QItemSelection(item.index(), item.index()), QItemSelectionModel.SelectCurrent)
self.selectionModel().clear()
self.selectionModel().select(sel, QItemSelectionModel.Select)
self.blockSignals(block)
def selectionChanged(self, selected, deselected):
items = [ self.model().itemFromIndex(index) for index in self.selectionModel().selectedIndexes()]
self.selectedItemsChanged.emit(items)
QTreeView.selectionChanged(self, selected, deselected)
+16
View File
@@ -52,6 +52,7 @@ class AnnotationScene(QGraphicsScene):
self.disconnect(self.model_, SIGNAL('rowsAboutToBeRemoved(QModelIndex,int,int)'), self.rowsAboutToBeRemoved)
self.disconnect(self.model_, SIGNAL('rowsRemoved(QModelIndex,int,int)'), self.rowsRemoved)
self.disconnect(self.model_, SIGNAL('modelReset()'), self.reset)
self.model_ = model
# connect new signals
@@ -178,6 +179,21 @@ class AnnotationScene(QGraphicsScene):
# selection mode
QGraphicsScene.mouseMoveEvent(self, event)
def onSelectionChanged(self):
model_items = [item.modelItem() for item in self.selectedItems()]
self.labeltool_.treeview().setSelectedItems(model_items)
def onSelectionChangedInTreeView(self, items):
block = self.blockSignals(True)
items = [self.itemFromIndex(item.index()) for item in items]
for item in self.items():
item.setSelected(False)
for item in items:
if item is not None:
item.setSelected(True)
self.blockSignals(block)
#
# key event handlers
#______________________________________________________________________________________________________
+5
View File
@@ -47,6 +47,8 @@ class MainWindow(QMainWindow):
self.setWindowTitle("%s - Unnamed[*]" % APP_NAME)
self.treeview.setModel(self.labeltool.model())
self.scene.setModel(self.labeltool.model())
self.selectionmodel = QItemSelectionModel(self.labeltool.model())
self.treeview.setSelectionModel(self.selectionmodel)
self.treeview.selectionModel().currentChanged.connect(self.labeltool.setCurrentImage)
def onCurrentImageChanged(self, index):
@@ -119,6 +121,9 @@ class MainWindow(QMainWindow):
self.treeview.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Preferred)
self.ui.dockInformation.setWidget(self.treeview)
self.scene.selectionChanged.connect(self.scene.onSelectionChanged)
self.treeview.selectedItemsChanged.connect(self.scene.onSelectionChangedInTreeView)
# Show the UI. It is important that this comes *after* the above
# adding of custom widgets, especially the central widget. Otherwise the
# dock widgets would be far to large.