diff options
-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(); } |