From 887c2cd696c54af0cd6fdd54950d006626afeacc Mon Sep 17 00:00:00 2001 From: Arno Date: Sun, 30 Sep 2012 04:34:22 +0200 Subject: Foremost a fix for SmTreeModel Not working again, but I eventually have to commit the changes. Fixes to SmTreeModel: * Fix SmTreeModel::index(). The previous comment was quite valid. I'm surprised that it worked at all. I have no clue why to return an invalid QModelIndex if the column isn't 0. Now an index with any valid column number can be created. * Fix SmTreeModel::parent(). Again, why shouldn't we create a parent index with a column other than 0? No idea... * Fix SmTreeModel::headerData(). Add some sanity checks. * Fix SmTreeModel::findRecursive(). Well, what is there to say. It never worked for models with a depth > 1, but obviously it didn't really matter until now. To make it work I had to change SmTreeItem as well. SmTreeItem::next() returns the next valid parent/sibling, or 0 if there isn't one. There may be some fallout from these changes, but they're yet to be seen. Changes to PictureView: * fix selecting an item according to the new datasbase layout * same goes for editing items. If an update actually works has to be checked. Overall, it's an intermediate commit that should have been a sane series of commits. Can't be changed now... --- pictureswidget.cpp | 49 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 45 insertions(+), 4 deletions(-) (limited to 'pictureswidget.cpp') diff --git a/pictureswidget.cpp b/pictureswidget.cpp index d5caa76..bc4b143 100644 --- a/pictureswidget.cpp +++ b/pictureswidget.cpp @@ -72,8 +72,13 @@ void PicturesWidget::readSettings(){ } void PicturesWidget::editMappings(){ - QList currentMappings = mPictureView->fileMappings(); - mEditDialog->editWidget()->setMappings(currentMappings); + QModelIndexList selectedFids = mPictureView->selectionModel()->selectedRows(PicFilesModel::Id); + QList fileIds; + foreach(QModelIndex idx, selectedFids){ + fileIds << idx.data().toInt(); + } + QList mappings = mPictureView->filesModel()->mappingDataFromFiles(fileIds); + mEditDialog->editWidget()->setMappings(mappings); int retval = mEditDialog->exec(); if(retval == QDialog::Accepted){ QList selMappings = mEditDialog->editWidget()->mappingIds(); @@ -272,12 +277,14 @@ PicFilesModel::PicFilesModel(const QStringList &headers, QObject *parent) : SmTr //setup database mDb = QSqlDatabase::database("treedb"); mPopulateQS = QString("SELECT DISTINCT(pics.ipicsid), pics.tfilename, pics.isize, pics.tformat, pics.dtadded, pics.cmd5sum FROM pics, pics_mappings2 WHERE pics_mappings2.imappings_parents_id IN (%1) AND pics_mappings2.ipics_id = pics.ipicsid ORDER BY pics.tfilename"); + mMappingsQS = QString("SELECT DISTINCT(pics_mappings2.imappings_parents_id) FROM pics_mappings2, pics WHERE pics_mappings2.ipics_id IN (%1)"); mDeleteFileQ = new QSqlQuery(mDb); mDeleteFileQ->prepare("DELETE FROM pics WHERE ipicsid = :id"); mDeleteMappingsQ = new QSqlQuery(mDb); - mDeleteMappingsQ->prepare("DELETE FROM pics_mappings WHERE ipics_id = :id"); + mDeleteMappingsQ->prepare("DELETE FROM pics_mappings2 WHERE ipics_id = :id"); mAddMappingsQ = new QSqlQuery(mDb); - mAddMappingsQ->prepare("INSERT INTO pics_mappings(ipics_id, imapping_id) VALUES(:pid, :id)"); + mAddMappingsQ->prepare("INSERT INTO pics_mappings2(ipics_id, imapping_id) VALUES(:pid, :id)"); + } PicFilesModel::~PicFilesModel(){ @@ -399,6 +406,40 @@ bool PicFilesModel::changeMappings(const QList &fileIds, const QList & return false; } +QList PicFilesModel::mappingDataFromFiles(const QList fileIds) const{ + QList parentIds = mappingPIdsFromFiles(fileIds); + if(parentIds.isEmpty()){ + return QList(); + } + QList retval; + foreach(int pId, parentIds){ + QModelIndex curIdx = mMappingTreeModel->findRecursive(pId, MappingTreeModel::MapParentId, mMappingTreeModel->rootIndex()); + MappingData curData; + curData.id = curIdx.data(MappingTreeModel::IdRole).toInt(); + curData.name = curIdx.data(MappingTreeModel::NameRole).toString(); + curData.path = mMappingTreeModel->path(curIdx); + retval << curData; + } + return retval; +} + +QList PicFilesModel::mappingPIdsFromFiles(QList fileIds) const{ + if(fileIds.isEmpty()){ + return QList(); + } + QStringList idList; + foreach(int id, fileIds){ + idList << QString::number(id); + } + QString query = mMappingsQS.arg(idList.join(",")); + QSqlQuery q(query, mDb); + QList retval; + while(q.next()){ + retval << q.value(0).toInt(); + } + return retval; +} + void PicFilesModel::populate(){ SmTreeItem *root = new SmTreeItem(NumFields); QStringList idList; -- cgit v1.2.3-70-g09d2