From d27a1ac45fddeeb4a0bc1220f3858534f5aeca37 Mon Sep 17 00:00:00 2001 From: Arno Date: Thu, 29 Jul 2010 20:03:26 +0200 Subject: 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. --- archivetreeview.cpp | 49 +++++++++++++++++++++++++------------------------ 1 file changed, 25 insertions(+), 24 deletions(-) (limited to 'archivetreeview.cpp') 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 selectedPartIds; - QModelIndexList realSel = mSeriesWidget->mapToSource(mSelectedItems); - foreach(QModelIndex i, realSel){ - if(i.data(SeriesTreeModel::TypeRole).toInt() == SeriesTreeModel::Series){ - QList 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 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())){ -- cgit v1.2.3-70-g09d2