diff options
author | Arno <am@disconnect.de> | 2010-06-24 21:26:44 +0200 |
---|---|---|
committer | Arno <am@disconnect.de> | 2010-06-24 21:26:44 +0200 |
commit | 7ad391f932c9ec33cccf49eff8996ccaf2d303d5 (patch) | |
tree | 0d6afdf4c4d69505a122c842424f9f9def7a7a8c | |
parent | 32243b83a02e479e772d7d6fd94ddc35fd7d6880 (diff) | |
download | SheMov-7ad391f932c9ec33cccf49eff8996ccaf2d303d5.tar.gz SheMov-7ad391f932c9ec33cccf49eff8996ccaf2d303d5.tar.bz2 SheMov-7ad391f932c9ec33cccf49eff8996ccaf2d303d5.zip |
Made FilesTreeWidget work
It wasn't as easy as I thought. Quite big changes:
1. I changed the query for setIds in FilesTreeModel. Initially it
executed a database query for every id. Changed it to WHERE
seriespart_id IN (ids). I didn't have a chance to test the first
version, but this one is blazing fast.
2. Fixed a recursio ad infinitum in FilesTreeModel. This happens if you
call data() from data(). Either use the *item or use a role different
from what you've been called.
3. Introduce a new function in SeriesTreeModel: QList<QVariant>
childrenColumnList. It returns a QList from the children values of the
given column.
4. Lot's of UI changes. Hide unneded columns, align the remaining ones
properly.
What doesn't work:
we can't let the database do the sorting of files. We need a proxy for
this.
-rw-r--r-- | archivetreeview.cpp | 50 | ||||
-rw-r--r-- | archivetreeview.h | 11 | ||||
-rw-r--r-- | filestreemodel.cpp | 83 | ||||
-rw-r--r-- | filestreemodel.h | 1 | ||||
-rw-r--r-- | filestreewidget.cpp | 8 | ||||
-rw-r--r-- | seriestreemodel.cpp | 14 | ||||
-rw-r--r-- | seriestreemodel.h | 1 | ||||
-rw-r--r-- | seriestreewidget.cpp | 8 | ||||
-rw-r--r-- | seriestreewidget.h | 1 | ||||
-rw-r--r-- | smmodelsingleton.cpp | 2 |
10 files changed, 129 insertions, 50 deletions
diff --git a/archivetreeview.cpp b/archivetreeview.cpp index d59d723..211aa37 100644 --- a/archivetreeview.cpp +++ b/archivetreeview.cpp @@ -11,6 +11,7 @@ #include <QVBoxLayout> #include <QItemSelectionModel> #include <QAbstractItemModel> +#include <QItemSelection> #include "archivetreeview.h" #include "smmodelsingleton.h" @@ -18,18 +19,22 @@ #include "seriestreewidget.h" #include "filestreewidget.h" #include "filestreemodel.h" +#include "seriestreemodel.h" ArchiveTreeView::ArchiveTreeView(QWidget *parent) : QWidget(parent){ // series view mSeriesWidget = new SeriesTreeWidget; QItemSelectionModel *selModel = mSeriesWidget->seriesTree()->selectionModel(); - connect(selModel, SIGNAL(currentChanged(QModelIndex,QModelIndex)), this, SLOT(currentChanged())); + connect(selModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(currentChanged(QItemSelection,QItemSelection))); + mSeriesModel = static_cast<SeriesTreeModel*>(SmModelSingleton::instance()->model("SeriesModel")); // files view mFilesWidget = new FilesTreeWidget; - QAbstractItemModel *filesModel = SmModelSingleton::instance()->model("FilesTreeModel"); + QAbstractItemModel *filesModel = SmModelSingleton::instance()->model("FilesModel"); mFilesModel = static_cast<FilesTreeModel*>(filesModel); - + for(int i = 5; i < 11; ++i){ + mFilesWidget->filesTree()->setColumnHidden(i, true); + } // layout QHBoxLayout *mainLayout = new QHBoxLayout; @@ -40,13 +45,42 @@ ArchiveTreeView::ArchiveTreeView(QWidget *parent) : QWidget(parent){ setLayout(mainLayout); } -void ArchiveTreeView::currentChanged(){ - QModelIndexList sel = mSeriesWidget->seriesTree()->selectionModel()->selectedRows(); - if(sel.isEmpty()){ +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; + } + } + if(mSelectedItems.isEmpty()){ return; } - mSelectedPartIds.clear(); - foreach(QModelIndex i, sel){ + 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; + } + } + } + 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); + mFilesWidget->filesTree()->resizeColumnToContents(1); + mFilesWidget->filesTree()->resizeColumnToContents(2); + mFilesWidget->filesTree()->resizeColumnToContents(3); } diff --git a/archivetreeview.h b/archivetreeview.h index 613bdc6..9958138 100644 --- a/archivetreeview.h +++ b/archivetreeview.h @@ -9,12 +9,14 @@ #define ARCHIVETREEVIEW_H #include <QWidget> -#include <QList> +#include <QModelIndexList> class SmUberModel; class SeriesTreeWidget; class FilesTreeWidget; class FilesTreeModel; +class SeriesTreeModel; +class QItemSelection; class ArchiveTreeView : public QWidget { @@ -25,14 +27,17 @@ class ArchiveTreeView : public QWidget FilesTreeWidget *filesWidget() { return mFilesWidget; } private slots: - void currentChanged(); + void currentChanged(const QItemSelection &selected, const QItemSelection &deselected); private: //widgets SeriesTreeWidget *mSeriesWidget; FilesTreeWidget *mFilesWidget; - QList<int> mSelectedPartIds; FilesTreeModel *mFilesModel; + SeriesTreeModel *mSeriesModel; + + //lists + QModelIndexList mSelectedItems; }; #endif diff --git a/filestreemodel.cpp b/filestreemodel.cpp index 27d93df..87c1e8d 100644 --- a/filestreemodel.cpp +++ b/filestreemodel.cpp @@ -15,8 +15,6 @@ FilesTreeModel::FilesTreeModel(QStringList &headers, QObject *parent) : SmTreeModel(headers, parent){ mDb = QSqlDatabase::database("treedb"); - mFilesQuery = new QSqlQuery(mDb); - mFilesQuery->prepare("SELECT iseriespart_id, tfilename, cmd5sum, bisize, idvd, sifiletype, sifileno, siquality, ifiles_id FROM files where iseriesparts_id = :id ORDER BY tfilename, sifileno"); mUpdateDvdQuery = new QSqlQuery(mDb); mUpdateDvdQuery->prepare("UPDATE files SET idvd = :dvd WHERE ifiles_id = :id"); mUpdateQualityQuery = new QSqlQuery(mDb); @@ -24,7 +22,6 @@ FilesTreeModel::FilesTreeModel(QStringList &headers, QObject *parent) : SmTreeMo } FilesTreeModel::~FilesTreeModel(){ - delete mFilesQuery; delete mUpdateDvdQuery; mDb = QSqlDatabase(); } @@ -38,39 +35,40 @@ void FilesTreeModel::setIds(const QList<int> &seriesPartIds){ covers->setData(FileName, tr("Covers")); root->appendChild(covers); QLocale l; + QStringList ids; foreach(int s, seriesPartIds){ - mFilesQuery->bindValue(":id", s); - if(mFilesQuery->exec()){ - while(mFilesQuery->next()){ - QList<QVariant> data; - data << mFilesQuery->value(1); //filename - data << mFilesQuery->value(6); //partno - data << l.toString(mFilesQuery->value(3).toLongLong()); //displaysize - data << mFilesQuery->value(7); //quality - data << mFilesQuery->value(4); //dvdno - data << Helper::createArchivePath(mFilesQuery->value(1).toString(), mFilesQuery->value(2).toString()); //fullpath - data << mFilesQuery->value(3); //size - data << mFilesQuery->value(5); //filetype - data << mFilesQuery->value(2); //md5sum - data << mFilesQuery->value(0); //seriesparts_id - data << mFilesQuery->value(8); //files_id - switch(mFilesQuery->value(5).toInt()){ - case Movie:{ - SmTreeItem *item = new SmTreeItem(data, files); - files->appendChild(item); - break; - } - case FrontCover: - case BackCover: - case GeneralCover:{ - SmTreeItem *item = new SmTreeItem(data, covers); - covers->appendChild(item); - break; - } - default: - ; - } + ids << QString::number(s); + } + QString query = QString("SELECT iseriespart_id, tfilename, cmd5sum, bisize, idvd, sifiletype, sifileno, siquality, ifiles_id FROM files WHERE iseriespart_id IN (%1) ORDER BY tfilename, sifileno ASC").arg(ids.join(",")); + QSqlQuery filesQuery(query, mDb); + while(filesQuery.next()){ + QList<QVariant> data; + data << filesQuery.value(1); //filename + data << filesQuery.value(6); //partno + data << l.toString(filesQuery.value(3).toLongLong()); //displaysize + data << filesQuery.value(7); //quality + data << filesQuery.value(4); //dvdno + data << Helper::createArchivePath(filesQuery.value(1).toString(), filesQuery.value(2).toString()); //fullpath + data << filesQuery.value(3); //size + data << filesQuery.value(5); //filetype + data << filesQuery.value(2); //md5sum + data << filesQuery.value(0); //seriesparts_id + data << filesQuery.value(8); //files_id + switch(filesQuery.value(5).toInt()){ + case Movie:{ + SmTreeItem *item = new SmTreeItem(data, files); + files->appendChild(item); + break; } + case FrontCover: + case BackCover: + case GeneralCover:{ + SmTreeItem *item = new SmTreeItem(data, covers); + covers->appendChild(item); + break; + } + default: + ; } } setRoot(root); @@ -85,10 +83,13 @@ QVariant FilesTreeModel::data(const QModelIndex &index, int role) const{ if(role == Qt::DisplayRole){ if(index.column() == DvdNo){ - if(index.data().toInt() == -1){ + if(index.data(FileTypeRole) == QVariant()){ + return QVariant(); + } + if(item->data(DvdNo).toInt() == -1){ return QString(tr("(local)")); }else{ - QString retval = QString(tr("DVD #%1")).arg(index.data().toInt()); + QString retval = QString(tr("DVD #%1")).arg(item->data(DvdNo).toInt()); return retval; } } @@ -102,6 +103,11 @@ QVariant FilesTreeModel::data(const QModelIndex &index, int role) const{ return QIcon(":/dildo.png"); } } + if(role == Qt::TextAlignmentRole){ + if(index.column() > 0 && index.column() < 4){ + return Qt::AlignRight; + } + } if(role == FileNameRole){ return item->data(FileName); } @@ -168,9 +174,12 @@ bool FilesTreeModel::setData(const QModelIndex &index, const QVariant &value, in } Qt::ItemFlags FilesTreeModel::flags(const QModelIndex &index) const{ - if(!index.isValid() || index.data(FileTypeRole) == QVariant()){ + if(!index.isValid()){ return 0; } + if(index.data(FileTypeRole) == QVariant()){ + return Qt::ItemIsEnabled; + } Qt::ItemFlags retval = Qt::ItemIsEnabled | Qt::ItemIsSelectable; if(index.column() == DvdNo || index.column() == Quality){ return retval | Qt::ItemIsEditable; diff --git a/filestreemodel.h b/filestreemodel.h index 0db1f39..97ae239 100644 --- a/filestreemodel.h +++ b/filestreemodel.h @@ -32,7 +32,6 @@ class FilesTreeModel : public SmTreeModel { private: QSqlDatabase mDb; - QSqlQuery *mFilesQuery; QSqlQuery *mUpdateDvdQuery; QSqlQuery *mUpdateQualityQuery; }; diff --git a/filestreewidget.cpp b/filestreewidget.cpp index 5b1211d..e8afe7c 100644 --- a/filestreewidget.cpp +++ b/filestreewidget.cpp @@ -5,14 +5,22 @@ 2 of the License, or (at your option) any later version. */ +#include <QHBoxLayout> + #include "filestreewidget.h" #include "smmodelsingleton.h" #include "filestreemodel.h" FilesTreeWidget::FilesTreeWidget(QWidget *parent) : QWidget(parent){ + //the view mView = new FilesTreeView; mModel = static_cast<FilesTreeModel*>(SmModelSingleton::instance()->model("FilesModel")); mView->setModel(mModel); + + //layout + QHBoxLayout *mainLayout = new QHBoxLayout; + mainLayout->addWidget(mView); + setLayout(mainLayout); } FilesTreeView::FilesTreeView(QWidget *parent) : QTreeView(parent) {} diff --git a/seriestreemodel.cpp b/seriestreemodel.cpp index 122c163..2cda1d0 100644 --- a/seriestreemodel.cpp +++ b/seriestreemodel.cpp @@ -141,6 +141,19 @@ bool SeriesTreeModel::setData(const QModelIndex &index, const QVariant &value, i return false; } +QList<QVariant> SeriesTreeModel::childrenColumnList(const QModelIndex &parent, int column) const{ + if(!parent.isValid()){ + return QList<QVariant>(); + } + SmTreeItem *item = static_cast<SmTreeItem*>(parent.internalPointer()); + QList<QVariant> retval; + for(int i = 0; i < item->childCount(); ++i){ + SmTreeItem *child = item->child(i); + retval << child->data(column); + } + return retval; +} + QModelIndex SeriesTreeModel::findValue(const QVariant &value, const QModelIndex &parent, int column) const{ SmTreeItem *parentItem = root(); if(parent != QModelIndex()){ @@ -199,6 +212,7 @@ QFileInfoList SeriesTreeModel::findMovies(const QModelIndexList &from) const{ return retval; } + bool SeriesTreeModel::deleteFromSeries(const QModelIndex &what){ int nodeType = what.data(TypeRole).toInt(); QSqlQuery *query = 0; diff --git a/seriestreemodel.h b/seriestreemodel.h index 6d88535..67be97c 100644 --- a/seriestreemodel.h +++ b/seriestreemodel.h @@ -29,6 +29,7 @@ class SeriesTreeModel : public SmTreeModel { Qt::ItemFlags flags(const QModelIndex &index) const; QVariant data(const QModelIndex &index, int role) const; bool setData(const QModelIndex &index, const QVariant &value, int role); + QList<QVariant> childrenColumnList(const QModelIndex &parent, int column) const; //find QModelIndex findValue(const QVariant &value, const QModelIndex &parent = QModelIndex(), int column = 0) const; diff --git a/seriestreewidget.cpp b/seriestreewidget.cpp index 5415655..a8e13d4 100644 --- a/seriestreewidget.cpp +++ b/seriestreewidget.cpp @@ -60,6 +60,14 @@ 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; +} + void SeriesTreeWidget::newSeries(){ QList<QVariant> data; data << tr("<New series>") << QVariant() << QVariant() << QVariant() << SeriesTreeModel::NewSeries; diff --git a/seriestreewidget.h b/seriestreewidget.h index 972d7d9..bfeedf6 100644 --- a/seriestreewidget.h +++ b/seriestreewidget.h @@ -24,6 +24,7 @@ class SeriesTreeWidget : public QWidget { public: explicit SeriesTreeWidget(QWidget *parent = 0); SeriesTreeView *seriesTree() { return mView; } + QModelIndexList mapToSource(const QModelIndexList &indexes) const; public slots: void newSeries(); diff --git a/smmodelsingleton.cpp b/smmodelsingleton.cpp index d850c9d..08cbbba 100644 --- a/smmodelsingleton.cpp +++ b/smmodelsingleton.cpp @@ -46,7 +46,7 @@ QAbstractItemModel *SmModelSingleton::model(const QString &which){ } }else if(which == "FilesModel"){ if(!mModels.contains(which)){ - QStringList headers = QStringList() << tr("Name") << tr("P") << tr("Size") << tr("Q") << tr("DvdNo") << tr("Full Path") << tr("Size") << tr("Type") << tr("Md5 sum") << tr("Series part ID") << tr("File ID"); + QStringList headers = QStringList() << tr("Name") << tr("Part") << tr("Size") << tr("Qual.") << tr("Dvd") << tr("Full Path") << tr("Size") << tr("Type") << tr("Md5 sum") << tr("Series part ID") << tr("File ID"); FilesTreeModel *model = new FilesTreeModel(headers); mModels.insert(which, model); } |