summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArno <am@disconnect.de>2010-07-29 20:03:26 +0200
committerArno <am@disconnect.de>2010-07-29 20:03:26 +0200
commitd27a1ac45fddeeb4a0bc1220f3858534f5aeca37 (patch)
treef147bdfece2361e0e6c9aff134ba366ce057c805
parentff8fdb92b8c2dfaa4818150d75c32fc303b438cb (diff)
downloadSheMov-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.
-rw-r--r--archivetreeview.cpp49
-rw-r--r--archivetreeview.h3
-rw-r--r--seriestreewidget.cpp12
-rw-r--r--seriestreewidget.h3
4 files changed, 26 insertions, 41 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())){
diff --git a/archivetreeview.h b/archivetreeview.h
index 54f304f..24ef2f8 100644
--- a/archivetreeview.h
+++ b/archivetreeview.h
@@ -57,9 +57,6 @@ class ArchiveTreeView : public QWidget
MappingTableModel *mActorsModel;
MappingTableModel *mGenresModel;
- //lists
- QModelIndexList mSelectedItems;
-
//misc
QString mWindowTitle;
};
diff --git a/seriestreewidget.cpp b/seriestreewidget.cpp
index 7e5d41f..b5a48be 100644
--- a/seriestreewidget.cpp
+++ b/seriestreewidget.cpp
@@ -70,18 +70,6 @@ SeriesTreeWidget::SeriesTreeWidget(QWidget *parent) : QWidget(parent){
}
-QModelIndexList SeriesTreeWidget::mapToSource(const QModelIndexList &indexes) const{
- QModelIndexList retval;
- foreach(QModelIndex i, indexes){
- retval << mProxy->mapToSource(i);
- }
- return retval;
-}
-
-QModelIndex SeriesTreeWidget::mapToSource(const QModelIndex &index) const{
- return mProxy->mapToSource(index);
-}
-
void SeriesTreeWidget::newSeries(){
QList<QVariant> data;
data << tr("<New series>") << QVariant() << QVariant() << QVariant() << SeriesTreeModel::NewSeries;
diff --git a/seriestreewidget.h b/seriestreewidget.h
index fd850b4..578edef 100644
--- a/seriestreewidget.h
+++ b/seriestreewidget.h
@@ -28,8 +28,7 @@ class SeriesTreeWidget : public QWidget {
public:
explicit SeriesTreeWidget(QWidget *parent = 0);
SeriesTreeView *seriesTree() { return mView; }
- QModelIndexList mapToSource(const QModelIndexList &indexes) const;
- QModelIndex mapToSource(const QModelIndex &index) const;
+ SeriesTreeSortModel *seriesProxy() { return mProxy; }
public slots:
void newSeries();