diff options
author | Arno <am@disconnect.de> | 2012-03-17 11:48:24 +0100 |
---|---|---|
committer | Arno <am@disconnect.de> | 2012-03-17 11:48:24 +0100 |
commit | 6b8c2cf35525c62b1e7a0279a7ebaa175848d268 (patch) | |
tree | 762291d670475cf7dcd95d8a2f2fc67ac63ea73b | |
parent | 77645a5dcfcb968cf5a3e4d43b4e93c12710f79e (diff) | |
download | SheMov-6b8c2cf35525c62b1e7a0279a7ebaa175848d268.tar.gz SheMov-6b8c2cf35525c62b1e7a0279a7ebaa175848d268.tar.bz2 SheMov-6b8c2cf35525c62b1e7a0279a7ebaa175848d268.zip |
Make nodes with children selectable in picture widget
This was a tough one. Lost in recursion. When selecting nodes with
children in the picture widget, all files having this node as mapping
parent are shown.
Had to make some changes to SmTreeModel::findRecursive for this. I hope
I didn't break anything. If I did, I'll fix it :)
Also disposed of some comments and unused member variables.
-rw-r--r-- | mappingtreemodel.cpp | 27 | ||||
-rw-r--r-- | mappingtreemodel.h | 2 | ||||
-rw-r--r-- | pictureswidget.cpp | 58 | ||||
-rw-r--r-- | pictureswidget.h | 11 | ||||
-rw-r--r-- | smtreemodel.cpp | 12 |
5 files changed, 77 insertions, 33 deletions
diff --git a/mappingtreemodel.cpp b/mappingtreemodel.cpp index b2ca982..5ab6068 100644 --- a/mappingtreemodel.cpp +++ b/mappingtreemodel.cpp @@ -109,6 +109,15 @@ QVariant MappingTreeModel::data(const QModelIndex &index, int role) const{ return SmTreeModel::data(index, role); } +QList<QVariant> MappingTreeModel::childList(const QVariant &value, int column) const{ + QModelIndex itemIdx = findRecursive(value, column, createIndex(0, 0, root())); + SmTreeItem *item = static_cast<SmTreeItem*>(itemIdx.internalPointer()); + if(item->childCount()){ + return getChildListRecursive(item, column); + } + return QList<QVariant>() << value; +} + QModelIndex MappingTreeModel::indexFromPath(QString &path, int column) const{ QStringList items = path.split("/"); if(items.isEmpty() || column >= NumFields){ @@ -318,7 +327,8 @@ void MappingTreeModel::populate(){ SmTreeItem *rootItem = new SmTreeItem(NumFields); SmTreeItem *firstChild = new SmTreeItem(NumFields, rootItem); firstChild->setData(Name, mappingTypeNameFromId(mType)); - firstChild->setData(Id, mType); + //no real id needed... conflicts with mapping ids! + firstChild->setData(Id, 0); rootItem->appendChild(firstChild); //collect children recursive while(mTypeParentsQ->next()){ @@ -379,6 +389,21 @@ QStringList MappingTreeModel::getPathsRecursive(SmTreeItem *parent) const{ return retval; } +QList<QVariant> MappingTreeModel::getChildListRecursive(SmTreeItem *item, int column) const{ + QList<QVariant> retval; + if(!item){ + return retval; + } + for(int i = 0; i < item->childCount(); ++i){ + if(item->child(i)->childCount()){ + retval << getChildListRecursive(item->child(i), column); + }else{ + retval << item->child(i)->data(column); + } + } + return retval; +} + QString MappingTreeModel::basePath(SmTreeItem *item) const{ QStringList pItems; SmTreeItem *cur = item; diff --git a/mappingtreemodel.h b/mappingtreemodel.h index 411a0b2..50843ba 100644 --- a/mappingtreemodel.h +++ b/mappingtreemodel.h @@ -34,6 +34,7 @@ class MappingTreeModel : public SmTreeModel { //data QVariant data(const QModelIndex &index, int role) const; + QList<QVariant> childList(const QVariant &value, int column = 0) const; QModelIndex indexFromPath(QString &path, int column = 0) const; bool setData(const QModelIndex &index, const QVariant &value, int role); void move(const QModelIndex &source, const QModelIndex &dest); @@ -63,6 +64,7 @@ class MappingTreeModel : public SmTreeModel { void getMappingTypes(); void getChildrenRecursive(SmTreeItem *item); QStringList getPathsRecursive(SmTreeItem *parent) const; + QList<QVariant> getChildListRecursive(SmTreeItem *item, int column) const; QString basePath(SmTreeItem *item) const; int lowerBound(SmTreeItem *item, const QVariant &value, int column = 0) const; QList<MappingData> mappingData(SmTreeItem *item); diff --git a/pictureswidget.cpp b/pictureswidget.cpp index 8492dd2..f274425 100644 --- a/pictureswidget.cpp +++ b/pictureswidget.cpp @@ -245,14 +245,14 @@ void PictureView::setFileMappings(){ } PicFilesModel::PicFilesModel(const QStringList &headers, QObject *parent) : SmTreeModel(headers, parent) { + //conjure up model + mMappingTreeModel = static_cast<MappingTreeModel*>(SmGlobals::instance()->model("MappingTree")); + //setup database mDb = QSqlDatabase::database("treedb"); - mPopulateQ = new QSqlQuery(mDb); - mPopulateQ->prepare("SELECT pics.tfilename, pics.isize, pics.tformat, pics.dtadded, pics.cmd5sum, pics.ipicsid FROM pics, pics_mappings WHERE pics_mappings.imapping_id = :mapid AND pics_mappings.ipics_id = pics.ipicsid ORDER BY pics.tfilename"); + mPopulateQS = QString("SELECT DISTINCT(pics.ipicsid), pics.tfilename, pics.isize, pics.tformat, pics.dtadded, pics.cmd5sum FROM pics, pics_mappings WHERE pics_mappings.imapping_id IN (%1) AND pics_mappings.ipics_id = pics.ipicsid ORDER BY pics.tfilename"); mDeleteFileQ = new QSqlQuery(mDb); mDeleteFileQ->prepare("DELETE FROM pics WHERE ipicsid = :id"); - mCurMappingIdsQ = new QSqlQuery(mDb); - mCurMappingIdsQ->prepare("SELECT DISTINCT(pics_mappings.imapping_id) FROM pics_mappings, pics WHERE pics_mappings.ipics_id IN (SELECT ipicsid FROM pics, pics_mappings WHERE pics_mappings.imapping_id = :mid AND pics_mappings.ipics_id = pics.ipicsid)"); mCurMappingIdsQS = QString("SELECT DISTINCT(pics_mappings.imapping_id) FROM pics_mappings, pics WHERE pics_mappings.ipics_id IN (%1)"); mDeleteMappingsQ = new QSqlQuery(mDb); mDeleteMappingsQ->prepare("DELETE FROM pics_mappings WHERE ipics_id = :id"); @@ -262,6 +262,22 @@ PicFilesModel::PicFilesModel(const QStringList &headers, QObject *parent) : SmTr mAllFilesQ->prepare("SELECT pics.tfilename, pics.isize, pics.tformat, pics.dtadded, pics.cmd5sum, pics.ipicsid FROM pics"); } +PicFilesModel::~PicFilesModel(){ + delete mDeleteFileQ; + delete mDeleteMappingsQ; + delete mAddMappingsQ; + delete mAllFilesQ; + mDb = QSqlDatabase::database(); +} + +void PicFilesModel::setMapping(int mappingId){ + QList<QVariant> ids = mMappingTreeModel->childList(mappingId, MappingTreeModel::Id); + mMappingIds.clear(); + foreach(QVariant i, ids){ + mMappingIds << i.toInt(); + } +} + QList<int> PicFilesModel::mappingIds(const QList<QVariant> &fileIds){ QList<int> retval; QStringList ids; @@ -384,23 +400,21 @@ bool PicFilesModel::changeMappings(const QList<int> &fileIds, const QList<int> & void PicFilesModel::populate(){ SmTreeItem *root = new SmTreeItem(NumFields); - mPopulateQ->bindValue(":mapid", mMappingId); - if(mPopulateQ->exec()){ - while(mPopulateQ->next()){ - QList<QVariant> data; - data << mPopulateQ->value(0) << mPopulateQ->value(1) << mPopulateQ->value(2); // Filename, size and Mime type - data << Helper::createArchivePath(mPopulateQ->value(0).toString(), mPopulateQ->value(4).toString()); // full path; - data << mPopulateQ->value(5) << mPopulateQ->value(3) << mPopulateQ->value(4); //Id, added and md5 - QLocale l; - data << l.toString(mPopulateQ->value(1).toInt()); - SmTreeItem *child = new SmTreeItem(data, root); - root->appendChild(child); - } - mCurMappingsIds.clear(); - mCurMappingIdsQ->bindValue(":mid", mMappingId); - while(mCurMappingIdsQ->next()){ - mCurMappingsIds << mCurMappingIdsQ->value(0).toInt(); - } - setRoot(root); + QStringList idList; + foreach(int id, mMappingIds){ + idList << QString::number(id); + } + QString query = mPopulateQS.arg(idList.join(",")); + QSqlQuery q(query, mDb); + while(q.next()){ + QList<QVariant> data; + data << q.value(1) << q.value(2) << q.value(3); // Filename, size and Mime type + data << Helper::createArchivePath(q.value(1).toString(), q.value(5).toString()); // full path; + data << q.value(0) << q.value(4) << q.value(5); //Id, added and md5 + QLocale l; + data << l.toString(q.value(2).toInt()); //sizedisplay + SmTreeItem *child = new SmTreeItem(data, root); + root->appendChild(child); } + setRoot(root); } diff --git a/pictureswidget.h b/pictureswidget.h index 40c1874..41df3b8 100644 --- a/pictureswidget.h +++ b/pictureswidget.h @@ -19,6 +19,7 @@ class PictureView; class MappingTreeWidget; class MappingEditWidget; class MappingEditDialog; +class MappingTreeModel; class QSqlQuery; class PicFilesModel; class QSortFilterProxyModel; @@ -103,7 +104,8 @@ class PicFilesModel : public SmTreeModel { enum Fields { FileName = 0, Size = 1, MimeType = 2, FullPath = 3, Id = 4, Added = 5, Md5Sum = 6, SizeDisplay = 7 }; enum { NumFields = 8 }; explicit PicFilesModel(const QStringList &headers, QObject *parent = 0); - void setMapping(int mappingId) { mMappingId = mappingId; } + ~PicFilesModel(); + void setMapping(int mappingId); QList<int> mappingIds(const QList<QVariant> &fileIds); //some data @@ -119,15 +121,14 @@ class PicFilesModel : public SmTreeModel { private: QSqlDatabase mDb; - QSqlQuery *mPopulateQ; + MappingTreeModel *mMappingTreeModel; + QString mPopulateQS; QSqlQuery *mDeleteFileQ; - QSqlQuery *mCurMappingIdsQ; QSqlQuery *mDeleteMappingsQ; QSqlQuery *mAddMappingsQ; QSqlQuery *mAllFilesQ; QString mCurMappingIdsQS; - int mMappingId; - QList<int> mCurMappingsIds; + QList<int> mMappingIds; }; #endif // PICTURESWIDGET_H diff --git a/smtreemodel.cpp b/smtreemodel.cpp index 802eebc..7df30d3 100644 --- a/smtreemodel.cpp +++ b/smtreemodel.cpp @@ -145,21 +145,23 @@ QModelIndex SmTreeModel::find(const QVariant &value, int column, const QModelInd QModelIndex SmTreeModel::findRecursive(const QVariant &value, int column, const QModelIndex &parent) const{ SmTreeItem *parentItem = 0; if(!parent.isValid()){ - //return QModelIndex(); parentItem = mRootItem; }else{ parentItem = static_cast<SmTreeItem*>(parent.internalPointer()); } + if(parentItem->data(column) == value){ + return parent; + } for(int i = 0; i < parentItem->childCount(); ++i){ SmTreeItem *child = parentItem->child(i); + if(child->data(column) == value){ + return createIndex(i, column, child); + } if(child->childCount()){ return findRecursive(value, column, createIndex(i, column, child)); } - if(child->data(column) == value){ - return createIndex(i, column, child); - } } - QModelIndex next = index(parent.row() + 1, column, parent.parent()); + QModelIndex next = index(parent.row() + 1, column, parent.parent()); if(!next.isValid()){ return QModelIndex(); } |