diff options
author | Arno <am@disconnect.de> | 2010-07-29 20:03:26 +0200 |
---|---|---|
committer | Arno <am@disconnect.de> | 2010-07-29 20:03:26 +0200 |
commit | d27a1ac45fddeeb4a0bc1220f3858534f5aeca37 (patch) | |
tree | f147bdfece2361e0e6c9aff134ba366ce057c805 /archivetreeview.cpp | |
parent | ff8fdb92b8c2dfaa4818150d75c32fc303b438cb (diff) | |
download | SheMov-d27a1ac45fddeeb4a0bc1220f3858534f5aeca37.tar.gz SheMov-d27a1ac45fddeeb4a0bc1220f3858534f5aeca37.tar.bz2 SheMov-d27a1ac45fddeeb4a0bc1220f3858534f5aeca37.zip |
Fix selection madness in ArchiveTreeWidget
First try on fixing this. Still use
QItemSelectionModel::selectionChanged, but ignore the QItemSelections.
Use QItemSelectionModel::selectedRows() instead and compute the
seriesPartIds on every change. Hopefully this guarantees having valid
QModelIndexes all the time.
This fix also obsoletes the quite awkward function
SeriesTreeWidget::mapToSource(). Make the QSortProxyModel of
SeriesTreeWidget available through SeriesTreeWidget::seriesProxy()
instead.
Diffstat (limited to 'archivetreeview.cpp')
-rw-r--r-- | archivetreeview.cpp | 49 |
1 files changed, 25 insertions, 24 deletions
diff --git a/archivetreeview.cpp b/archivetreeview.cpp index 412591b..1ae3cc8 100644 --- a/archivetreeview.cpp +++ b/archivetreeview.cpp @@ -100,37 +100,38 @@ void ArchiveTreeView::setFileViewMode(int mode){ } void ArchiveTreeView::currentChanged(const QItemSelection &selected, const QItemSelection &deselected){ - foreach(QModelIndex i, deselected.indexes()){ - mSelectedItems.removeAll(i); - } - foreach(QModelIndex i, selected.indexes()){ - if(!mSelectedItems.contains(i)){ - mSelectedItems << i; - } - } + Q_UNUSED(selected); + Q_UNUSED(deselected); + + QModelIndexList selectedSeries = mSeriesWidget->seriesTree()->selectionModel()->selectedRows(); mFilesWidget->resetSize(); - if(mSelectedItems.isEmpty()){ + if(selectedSeries.isEmpty()){ return; } + QList<int> selectedPartIds; - QModelIndexList realSel = mSeriesWidget->mapToSource(mSelectedItems); - foreach(QModelIndex i, realSel){ - if(i.data(SeriesTreeModel::TypeRole).toInt() == SeriesTreeModel::Series){ - QList<QVariant> ids = mSeriesModel->childrenColumnList(i, SeriesTreeModel::SeriesPartId); - foreach(QVariant id, ids){ - int thisId = id.toInt(); - if(!selectedPartIds.contains(thisId)){ - selectedPartIds << thisId; + SeriesTreeSortModel *proxy = mSeriesWidget->seriesProxy(); + foreach(QModelIndex i, selectedSeries){ + QModelIndex real = proxy->mapToSource(i); + if(real.isValid()){ + int type = real.data(SeriesTreeModel::TypeRole).toInt(); + if(type == SeriesTreeModel::Series){ + QList<QVariant> childIds = mSeriesModel->childrenColumnList(real, SeriesTreeModel::SeriesPartId); + foreach(QVariant id, childIds){ + int realId = id.toInt(); + if(!selectedPartIds.contains(realId)){ + selectedPartIds << realId; + } + } + }else if(type == SeriesTreeModel::Part){ + int realId = i.data(SeriesTreeModel::SeriesPartIdRole).toInt(); + if(!selectedPartIds.contains(realId)){ + selectedPartIds << realId; } - } - } - if(i.data(SeriesTreeModel::TypeRole).toInt() == SeriesTreeModel::Part){ - int thisId = i.data(SeriesTreeModel::SeriesPartIdRole).toInt(); - if(!selectedPartIds.contains(thisId)){ - selectedPartIds << thisId; } } } + mFilesModel->setIds(selectedPartIds); mFilesWidget->filesTree()->expandAll(); mFilesWidget->filesTree()->resizeColumnToContents(0); @@ -168,7 +169,7 @@ void ArchiveTreeView::playSelected(const QString &preferred){ } QStringList files; foreach(QModelIndex idx, selected){ - QModelIndex real = mSeriesWidget->mapToSource(idx); + QModelIndex real = mSeriesWidget->seriesProxy()->mapToSource(idx); QFileInfoList movies = mSeriesModel->findSortedMovies(real); foreach(QFileInfo fi, movies){ if(!files.contains(fi.absoluteFilePath())){ |