diff options
author | Arno <am@disconnect.de> | 2012-10-27 13:02:16 +0200 |
---|---|---|
committer | Arno <am@disconnect.de> | 2012-10-27 13:02:16 +0200 |
commit | dc7cc269a4fffe43bdac2ae2dc6548fbd1e3bb5e (patch) | |
tree | 30de1f390ad33f067ba1cb9872f994df620fd8c6 | |
parent | a4054f1c7b38e5996081efd7583c06ebf7758e61 (diff) | |
download | SheMov-dc7cc269a4fffe43bdac2ae2dc6548fbd1e3bb5e.tar.gz SheMov-dc7cc269a4fffe43bdac2ae2dc6548fbd1e3bb5e.tar.bz2 SheMov-dc7cc269a4fffe43bdac2ae2dc6548fbd1e3bb5e.zip |
Fix archiving pictures
Well, what can I say. Lost in recursion and parent pointers. This commit
actually boils down to using the proper database tables and inserting
the right values. 'Nuff said...
-rw-r--r-- | mappingtreemodel.cpp | 53 | ||||
-rw-r--r-- | mappingtreemodel.h | 16 | ||||
-rw-r--r-- | mappingtreewidget.cpp | 18 | ||||
-rw-r--r-- | mappingtreewidget.h | 3 | ||||
-rw-r--r-- | newpicsdialog.cpp | 8 | ||||
-rw-r--r-- | picfilesmodel.cpp | 10 | ||||
-rw-r--r-- | picfilesmodel.h | 2 | ||||
-rw-r--r-- | pictureswidget.cpp | 4 |
8 files changed, 64 insertions, 50 deletions
diff --git a/mappingtreemodel.cpp b/mappingtreemodel.cpp index 07e3a24..2c636e6 100644 --- a/mappingtreemodel.cpp +++ b/mappingtreemodel.cpp @@ -123,6 +123,9 @@ QVariant MappingTreeModel::data(const QModelIndex &index, int role) const{ if(role == MyIdRole){ return item->data(MyId); } + if(role == ParentIdRole){ + return item->data(ParentId); + } return SmTreeModel::data(index, role); } @@ -302,11 +305,13 @@ bool MappingTreeModel::deleteChild(const QModelIndex &idx){ } MappingData MappingTreeModel::mappingDataFromIndex(QModelIndex &idx) const{ - MappingData retval = { -1, QString(), QList<QStringList>() }; + MappingData retval = { -1, -1, -1, QString(), QList<QStringList>() }; if(!idx.isValid()){ return retval; } - retval.id = idx.data(MappingTreeModel::MyIdRole).toInt(); + retval.mappingId = idx.data(MappingTreeModel::MappingIdRole).toInt(); + retval.parentId = idx.data(MappingTreeModel::ParentIdRole).toInt(); + retval.myId = idx.data(MappingTreeModel::MyIdRole).toInt(); retval.name = idx.data(MappingTreeModel::NameRole).toString(); retval.path << path(idx); return retval; @@ -480,8 +485,16 @@ bool MappingTreeResultModel::setData(const QModelIndex &index, const QVariant &v item->setData(Name, value); return true; } - if(role == IdRole){ - item->setData(Id, value); + if(role == MappingIdRole){ + item->setData(MappingId, value); + return true; + } + if(role == ParentIdRole){ + item->setData(ParentId, value); + return true; + } + if(role == MyIdRole){ + item->setData(MyId, value); return true; } return SmTreeModel::setData(index, value, role); @@ -499,18 +512,22 @@ void MappingTreeResultModel::addItem(const MappingData &data){ continue; }else{ //insert child - int id = -1; + int mappingId = -1; + int parentId = -1; + int myId = -1; if(i == p.count() - 1){ - id = data.id; + mappingId = data.mappingId; + parentId = data.parentId; + myId = data.myId; } - QModelIndex curIdx = insertChild(p.at(i), id, curItem); + QModelIndex curIdx = insertChild(p.at(i), mappingId, parentId, myId, curItem); curItem = itemAt(curIdx); } } } } -QModelIndex MappingTreeResultModel::insertChild(const QVariant &data, int id, SmTreeItem *parent){ +QModelIndex MappingTreeResultModel::insertChild(const QVariant &data, int mappingId, int parentId, int myId, SmTreeItem *parent){ QModelIndex parentIdx; int row = parent->childCount(); if(parent != root()){ @@ -524,12 +541,14 @@ QModelIndex MappingTreeResultModel::insertChild(const QVariant &data, int id, Sm insertRows(row, 1, parentIdx); QModelIndex newIdx = index(row, 0, parentIdx); setData(newIdx, data, NameRole); - setData(newIdx, id, IdRole); + setData(newIdx, mappingId, MappingIdRole); + setData(newIdx, myId, MyIdRole); + setData(newIdx, parentId, ParentIdRole); return newIdx; } -QList<int> MappingTreeResultModel::mappingsIds() const { - return mappingIdsRecursive(root()); +QList<QVariant> MappingTreeResultModel::columnValues(int column) const { + return columnValuesRecursive(root(), column); } void MappingTreeResultModel::clearData(){ @@ -545,18 +564,18 @@ int MappingTreeResultModel::hasChild(SmTreeItem *item, const QVariant &name, int return -1; } -QList<int> MappingTreeResultModel::mappingIdsRecursive(SmTreeItem *parent) const { - QList<int> retval; +QList<QVariant> MappingTreeResultModel::columnValuesRecursive(SmTreeItem *parent, int column) const { + QList<QVariant> retval; if(!parent->childCount()){ return retval; } for(int i = 0; i < parent->childCount(); ++i){ SmTreeItem *child = parent->child(i); - int id = child->data(Id).toInt(); - if(id != -1){ - retval << id; + QVariant value = child->data(column); + if(value.canConvert(QVariant::Int) && (value.toInt() != -1)){ + retval << value; } - retval << mappingIdsRecursive(child); + retval << columnValuesRecursive(child, column); } return retval; } diff --git a/mappingtreemodel.h b/mappingtreemodel.h index 38c0c7b..a4a1ae8 100644 --- a/mappingtreemodel.h +++ b/mappingtreemodel.h @@ -96,16 +96,16 @@ class MappingTreeModel : public SmTreeModel { class MappingTreeResultModel : public SmTreeModel { Q_OBJECT public: - enum Roles { NameRole = Qt::UserRole + 1, IdRole = Qt::UserRole + 2 }; - enum Fields { Name = 0, Id = 1 }; - enum { NumFields = 2 }; + enum Roles { NameRole = Qt::UserRole + 1, MappingIdRole = Qt::UserRole + 2, ParentIdRole = Qt::UserRole + 3, MyIdRole = Qt::UserRole + 4 }; + enum Fields { Name = 0, MappingId = 1, ParentId = 2, MyId = 3 }; + enum { NumFields = 4 }; explicit MappingTreeResultModel(const QStringList &headers, QObject *parent = 0); //data + flags Qt::ItemFlags flags(const QModelIndex &index) const; bool setData(const QModelIndex &index, const QVariant &value, int role); - QModelIndex insertChild(const QVariant &data, int id, SmTreeItem *parent); - QList<int> mappingsIds() const; + QModelIndex insertChild(const QVariant &data, int mappingId, int parentId, int myId, SmTreeItem *parent); + QList<QVariant> columnValues(int column) const; void clearData(); public slots: @@ -113,11 +113,13 @@ class MappingTreeResultModel : public SmTreeModel { private: int hasChild(SmTreeItem *item, const QVariant &name, int column = 0) const; - QList<int> mappingIdsRecursive(SmTreeItem *parent) const; + QList<QVariant> columnValuesRecursive(SmTreeItem *parent, int column) const; }; struct MappingData { - int id; + int mappingId; + int parentId; + int myId; QString name; QList<QStringList> path; }; diff --git a/mappingtreewidget.cpp b/mappingtreewidget.cpp index 31a7c8e..e9d0c93 100644 --- a/mappingtreewidget.cpp +++ b/mappingtreewidget.cpp @@ -94,7 +94,7 @@ MappingTreeWidget::MappingTreeWidget(QWidget *parent) : QWidget(parent){ } MappingData MappingTreeWidget::selectedItem() const { - MappingData retval = { -1, QString(), QList<QStringList>() }; + MappingData retval = { -1, -1, -1, QString(), QList<QStringList>() }; QModelIndex sel = selected(); if(!sel.isValid()){ return retval; @@ -270,10 +270,12 @@ MappingEditWidget::MappingEditWidget(QWidget *parent) : QWidget(parent){ //the views mMappingTree = new MappingTreeWidget; mMappingResult = new MappingTreeResultView; - mResultModel = new MappingTreeResultModel(QStringList() << tr("Name") << tr("Id"), this); + mResultModel = new MappingTreeResultModel(QStringList() << tr("Name") << tr("MappingId") << tr("ParentId") << tr("MyId"), this); mMappingResult->setModel(mResultModel); mMappingResult->setAlternatingRowColors(true); mMappingResult->setColumnHidden(1, true); + mMappingResult->setColumnHidden(2, true); + mMappingResult->setColumnHidden(3, true); //buttons mAddMapping = new QPushButton(tr(">>")); @@ -294,15 +296,8 @@ MappingEditWidget::MappingEditWidget(QWidget *parent) : QWidget(parent){ setLayout(mainLayout); } -QList<int> MappingEditWidget::mappingIds() const { - return mResultModel->mappingsIds(); -} - void MappingEditWidget::addMapping(){ MappingData selected = mMappingTree->selectedItem(); - if(selected.id == -1){ - return; - } mResultModel->addItem(selected); mMappingResult->expandAll(); } @@ -320,14 +315,9 @@ void MappingEditWidget::setMappings(const QList<MappingData> &mappings){ if(mappings.isEmpty()){ return; } - //MappingTreeModel *mModel = static_cast<MappingTreeModel*>(SmGlobals::instance()->model("MappingTree")); mResultModel->clearData(); foreach(MappingData d, mappings){ mResultModel->addItem(d); - /*MappingData curData = mModel->mappingDataFromId(i); - if(curData.id != -1){ - mResultModel->addItem(curData); - }*/ } mMappingResult->expandAll(); } diff --git a/mappingtreewidget.h b/mappingtreewidget.h index 600c6d5..50bbddf 100644 --- a/mappingtreewidget.h +++ b/mappingtreewidget.h @@ -23,6 +23,7 @@ class QStringListModel; class QAction; class MappingTreeResultModel; +// defined in mappingtreemodel.h struct MappingData; class MappingTreeWidget : public QWidget { @@ -84,7 +85,7 @@ class MappingEditWidget : public QWidget { Q_OBJECT public: explicit MappingEditWidget(QWidget *parent = 0); - QList<int> mappingIds() const; + const MappingTreeResultModel *model() const { return mResultModel; } public slots: void addMapping(); diff --git a/newpicsdialog.cpp b/newpicsdialog.cpp index 822065a..0ededef 100644 --- a/newpicsdialog.cpp +++ b/newpicsdialog.cpp @@ -40,7 +40,7 @@ void NewPicsDialog::setupDlg(){ mAddFileQ = new QSqlQuery(mDb); mAddFileQ->prepare("INSERT INTO pics (tfilename, cmd5sum, isize, tformat) VALUES(:fn, :md5, :size, :format)"); mAddMappingQ = new QSqlQuery(mDb); - mAddMappingQ->prepare("INSERT INTO pics_mappings (ipics_id, imapping_id) VALUES(:picid, :mapid)"); + mAddMappingQ->prepare("INSERT INTO pics_mappings2 (ipics_id, imappings_parents_id) VALUES(:picid, :mapid)"); //files widget mFilesWidget = new QWidget; @@ -138,7 +138,7 @@ void NewPicsDialog::accept(){ if(files.isEmpty()){ return QDialog::accept(); } - QList<int> mappingIds = mMappingEditWidget->mappingIds(); + QList<QVariant> parentIds = mMappingEditWidget->model()->columnValues(MappingTreeResultModel::MyId); mDb.transaction(); foreach(FileData d, files){ mAddFileQ->bindValue(":fn", d.fileName); @@ -155,9 +155,9 @@ void NewPicsDialog::accept(){ mDb.rollback(); return; } - foreach(int mappingId, mappingIds){ + foreach(QVariant myId, parentIds){ mAddMappingQ->bindValue(":picid", picId); - mAddMappingQ->bindValue(":mapid", mappingId); + mAddMappingQ->bindValue(":mapid", myId); if(!mAddMappingQ->exec()){ mDb.rollback(); return; diff --git a/picfilesmodel.cpp b/picfilesmodel.cpp index cab7235..56d9522 100644 --- a/picfilesmodel.cpp +++ b/picfilesmodel.cpp @@ -135,16 +135,16 @@ void PicFilesModel::removeFiles(const QList<QPersistentModelIndex> &files){ } } -bool PicFilesModel::changeMappings(const QList<int> &fileIds, const QList<int> &mappingIds){ +bool PicFilesModel::changeMappings(const QList<int> &fileIds, const QList<QVariant> &parentIds){ mDb.transaction(); foreach(int fid, fileIds){ mDeleteMappingsQ->bindValue(":id", fid); if(!mDeleteMappingsQ->exec()){ goto error; } - foreach(int mid, mappingIds){ + foreach(QVariant pid, parentIds){ mAddMappingsQ->bindValue(":pid", fid); - mAddMappingsQ->bindValue(":id", mid); + mAddMappingsQ->bindValue(":id", pid); if(!mAddMappingsQ->exec()){ goto error; } @@ -172,7 +172,9 @@ QList<MappingData> PicFilesModel::mappingDataFromFiles(const QList<int> fileIds) foreach(int pId, parentIds){ QModelIndex curIdx = mMappingTreeModel->findRecursive(pId, MappingTreeModel::MyId, mMappingTreeModel->rootIndex()); MappingData curData; - curData.id = curIdx.data(MappingTreeModel::MyIdRole).toInt(); + //curData.id = curIdx.data(MappingTreeModel::MyIdRole).toInt(); + curData.mappingId = curIdx.data(MappingTreeModel::MappingIdRole).toInt(); + curData.parentId = curIdx.data(MappingTreeModel::ParentIdRole).toInt(); curData.name = curIdx.data(MappingTreeModel::NameRole).toString(); curData.path << mMappingTreeModel->path(curIdx); //.join("/"); retval << curData; diff --git a/picfilesmodel.h b/picfilesmodel.h index 146fbfc..a27372d 100644 --- a/picfilesmodel.h +++ b/picfilesmodel.h @@ -27,7 +27,7 @@ class PicFilesModel : public SmTreeModel { QList<QVariant> dataList(const QModelIndex &idx) const; QList<QList<QVariant> > allFiles() const; void removeFiles(const QList<QPersistentModelIndex> &files); - bool changeMappings(const QList<int> &fileIds, const QList<int> &mappingIds); + bool changeMappings(const QList<int> &fileIds, const QList<QVariant> &parentIds); QList<MappingData> mappingDataFromFile(int fileId) const; QList<MappingData> mappingDataFromFiles(const QList<int> fileIds) const; diff --git a/pictureswidget.cpp b/pictureswidget.cpp index 99091c9..92b0490 100644 --- a/pictureswidget.cpp +++ b/pictureswidget.cpp @@ -85,7 +85,7 @@ void PicturesWidget::editMappings(){ mEditDialog->editWidget()->setMappings(mappings); int retval = mEditDialog->exec(); if(retval == QDialog::Accepted){ - QList<int> selMappings = mEditDialog->editWidget()->mappingIds(); + QList<QVariant> selMappings = mEditDialog->editWidget()->model()->columnValues(MappingTreeResultModel::ParentId); if(selMappings.isEmpty()){ QMessageBox::critical(this, tr("Error"), tr("No mappings selected! Cowardly bailing out.")); return; @@ -102,7 +102,7 @@ void PicturesWidget::editMappings(){ void PicturesWidget::constructWindowTitle(){ QString windowTitle = mWindowTitleBase; MappingData selected = mMappingTree->selectedItem(); - if(selected.id != -1){ + if(!selected.path.isEmpty()){ windowTitle = QString("%1 - [%2]").arg(mWindowTitleBase).arg(selected.path.first().join("/")); mPictureView->setHoverWinVisible(false); } |