diff options
author | Arno <am@disconnect.de> | 2012-03-03 06:36:22 +0100 |
---|---|---|
committer | Arno <am@disconnect.de> | 2012-03-03 06:36:22 +0100 |
commit | 5d1e566d275b47fa590fb9e9879b9a1f970fc3ba (patch) | |
tree | 5d1f2d6f68de9318f21bb1a6145944b833aa883e | |
parent | 08861cc269ba6126ec7fa3bfad4f946fb60d3d98 (diff) | |
download | SheMov-5d1e566d275b47fa590fb9e9879b9a1f970fc3ba.tar.gz SheMov-5d1e566d275b47fa590fb9e9879b9a1f970fc3ba.tar.bz2 SheMov-5d1e566d275b47fa590fb9e9879b9a1f970fc3ba.zip |
Impement editing of picture mappings
Make it possible to edit picture mappings on archived pictures.
-rw-r--r-- | mappingtreemodel.cpp | 4 | ||||
-rw-r--r-- | mappingtreemodel.h | 1 | ||||
-rw-r--r-- | mappingtreewidget.cpp | 32 | ||||
-rw-r--r-- | mappingtreewidget.h | 13 | ||||
-rw-r--r-- | pictureswidget.cpp | 51 | ||||
-rw-r--r-- | pictureswidget.h | 9 | ||||
-rw-r--r-- | shemov.cpp | 3 | ||||
-rw-r--r-- | shemov.h | 2 |
8 files changed, 114 insertions, 1 deletions
diff --git a/mappingtreemodel.cpp b/mappingtreemodel.cpp index ec60da4..4a9e5aa 100644 --- a/mappingtreemodel.cpp +++ b/mappingtreemodel.cpp @@ -477,6 +477,10 @@ QList<int> MappingTreeResultModel::mappingsIds() const { return mappingIdsRecursive(root()); } +void MappingTreeResultModel::clearData(){ + setRoot(new SmTreeItem(NumFields)); +} + int MappingTreeResultModel::hasChild(SmTreeItem *item, const QVariant &name, int column) const{ for(int i = 0; i < item->childCount(); ++i){ if(item->child(i)->data(column) == name){ diff --git a/mappingtreemodel.h b/mappingtreemodel.h index 1c35db9..5e9140a 100644 --- a/mappingtreemodel.h +++ b/mappingtreemodel.h @@ -99,6 +99,7 @@ class MappingTreeResultModel : public SmTreeModel { bool setData(const QModelIndex &index, const QVariant &value, int role); QModelIndex insertChild(const QVariant &data, int id, SmTreeItem *parent); QList<int> mappingsIds() const; + void clearData(); public slots: void addItem(const MappingData &data); diff --git a/mappingtreewidget.cpp b/mappingtreewidget.cpp index 67ccd87..22a9757 100644 --- a/mappingtreewidget.cpp +++ b/mappingtreewidget.cpp @@ -297,3 +297,35 @@ void MappingEditWidget::removeMapping(){ QModelIndex firstIdx = sel.first(); mResultModel->removeRows(firstIdx.row(), 1, firstIdx.parent()); } + +void MappingEditWidget::setMappings(const QList<int> &mappings){ + if(mappings.isEmpty()){ + return; + } + MappingTreeModel *mModel = static_cast<MappingTreeModel*>(SmGlobals::instance()->model("MappingTree")); + mResultModel->clearData(); + foreach(int i, mappings){ + MappingData curData = mModel->mappingDataFromId(i); + if(curData.id != -1){ + mResultModel->addItem(curData); + } + } + mMappingResult->expandAll(); +} + +MappingEditDialog::MappingEditDialog(QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f){ + mEditWidget = new MappingEditWidget; + mOk = new QPushButton(tr("Ok")); + connect(mOk, SIGNAL(clicked()), this, SLOT(accept())); + mCancel = new QPushButton(tr("Cancel")); + connect(mCancel, SIGNAL(clicked()), this, SLOT(reject())); + + QHBoxLayout *buttonLayout = new QHBoxLayout; + buttonLayout->addStretch(); + buttonLayout->addWidget(mOk); + buttonLayout->addWidget(mCancel); + QVBoxLayout *mainLayout = new QVBoxLayout; + mainLayout->addWidget(mEditWidget); + mainLayout->addLayout(buttonLayout); + setLayout(mainLayout); +} diff --git a/mappingtreewidget.h b/mappingtreewidget.h index f8c463b..e110d6e 100644 --- a/mappingtreewidget.h +++ b/mappingtreewidget.h @@ -87,6 +87,7 @@ class MappingEditWidget : public QWidget { public slots: void addMapping(); void removeMapping(); + void setMappings(const QList<int> &mappings); private: MappingTreeWidget *mMappingTree; @@ -96,4 +97,16 @@ class MappingEditWidget : public QWidget { QPushButton *mRemoveMapping; }; +class MappingEditDialog : public QDialog { + Q_OBJECT + public: + explicit MappingEditDialog(QWidget *parent, Qt::WindowFlags f = 0); + MappingEditWidget *editWidget() const { return mEditWidget; } + + private: + MappingEditWidget *mEditWidget; + QPushButton *mOk; + QPushButton *mCancel; +}; + #endif // MAPPINGTREEWIDGET_H diff --git a/pictureswidget.cpp b/pictureswidget.cpp index 29b6094..6b587d7 100644 --- a/pictureswidget.cpp +++ b/pictureswidget.cpp @@ -34,11 +34,16 @@ PicturesWidget::PicturesWidget(QWidget *parent) : QWidget(parent) { mPictureView = new PictureView; connect(mMappingTree, SIGNAL(mappingChanged(int)), mPictureView, SLOT(mappingChanged(int))); connect(mPictureView, SIGNAL(newFileMappigs()), this, SLOT(setMappingColors())); + connect(mPictureView, SIGNAL(editPicsMappings()), this, SLOT(editMappings())); splitter->addWidget(mMappingTree); splitter->addWidget(mPictureView); splitter->setStretchFactor(0, 1); splitter->setStretchFactor(1, 3); + //mis + mEditDialog = new MappingEditDialog(this); + //connect() + //put it all togehter QHBoxLayout *mainLayout = new QHBoxLayout; mainLayout->addWidget(splitter); @@ -50,6 +55,25 @@ void PicturesWidget::setMappingColors(){ mtm->setSelectedMappings(mPictureView->fileMappings()); } +void PicturesWidget::editMappings(){ + QList<int> currentMappings = mPictureView->fileMappings(); + mEditDialog->editWidget()->setMappings(currentMappings); + int retval = mEditDialog->exec(); + if(retval == QDialog::Accepted){ + QList<int> selMappings = mEditDialog->editWidget()->mappingIds(); + if(selMappings.isEmpty()){ + QMessageBox::critical(this, tr("Error"), tr("No mappings selected! Cowardly bailing out.")); + return; + } + QModelIndexList selectedFids = mPictureView->selectionModel()->selectedRows(PicFilesModel::Id); + QList<int> fileIds; + foreach(QModelIndex idx, selectedFids){ + fileIds << idx.data().toInt(); + } + mPictureView->filesModel()->changeMappings(fileIds, selMappings); + } +} + PictureView::PictureView(QWidget *parent) : QTreeView(parent) { //setup model mModel = new PicFilesModel(QStringList() << tr("Filename") << tr("SizeNum") << tr("Format") << tr("Full Path") << tr("Id") << tr("Added") << tr("Md5Sum") << tr("Size"), this); @@ -178,6 +202,10 @@ PicFilesModel::PicFilesModel(const QStringList &headers, QObject *parent) : SmTr 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"); + mAddMappingsQ = new QSqlQuery(mDb); + mAddMappingsQ->prepare("INSERT INTO pics_mappings(ipics_id, imapping_id) VALUES(:pid, :id)"); } QList<int> PicFilesModel::mappingIds(const QList<QVariant> &fileIds){ @@ -248,6 +276,29 @@ void PicFilesModel::removeFiles(const QList<QPersistentModelIndex> &files){ } } +bool PicFilesModel::changeMappings(const QList<int> &fileIds, const QList<int> &mappingIds){ + mDb.transaction(); + foreach(int fid, fileIds){ + mDeleteMappingsQ->bindValue(":id", fid); + if(!mDeleteMappingsQ->exec()){ + goto error; + } + foreach(int mid, mappingIds){ + mAddMappingsQ->bindValue(":pid", fid); + mAddMappingsQ->bindValue(":id", mid); + if(!mAddMappingsQ->exec()){ + goto error; + } + } + } + mDb.commit(); + return true; + + error: + mDb.rollback(); + return false; +} + void PicFilesModel::populate(){ SmTreeItem *root = new SmTreeItem(NumFields); mPopulateQ->bindValue(":mapid", mMappingId); diff --git a/pictureswidget.h b/pictureswidget.h index b8a7b40..8be7a24 100644 --- a/pictureswidget.h +++ b/pictureswidget.h @@ -16,6 +16,8 @@ class PictureView; class MappingTreeWidget; +class MappingEditWidget; +class MappingEditDialog; class QSqlQuery; class PicFilesModel; class QSortFilterProxyModel; @@ -31,10 +33,12 @@ class PicturesWidget : public QWidget { private slots: void setMappingColors(); + void editMappings(); private: MappingTreeWidget *mMappingTree; PictureView *mPictureView; + MappingEditDialog *mEditDialog; }; class PictureView : public QTreeView { @@ -42,6 +46,7 @@ class PictureView : public QTreeView { public: explicit PictureView(QWidget *parent = 0); QList<int> fileMappings() { return mFilesMappings; } + PicFilesModel *filesModel() { return mModel; } public slots: void mappingChanged(int mapping); @@ -57,6 +62,7 @@ class PictureView : public QTreeView { signals: void newFileMappigs(); + void editPicsMappings(); private: HoverWindow *mHoverWin; @@ -81,6 +87,7 @@ class PicFilesModel : public SmTreeModel { Qt::ItemFlags flags(const QModelIndex &) const { return Qt::ItemIsEnabled | Qt::ItemIsSelectable; } QVariant data(const QModelIndex &index, int role) const; void removeFiles(const QList<QPersistentModelIndex> &files); + bool changeMappings(const QList<int> &fileIds, const QList<int> &mappingIds); public slots: void populate(); @@ -90,6 +97,8 @@ class PicFilesModel : public SmTreeModel { QSqlQuery *mPopulateQ; QSqlQuery *mDeleteFileQ; QSqlQuery *mCurMappingIdsQ; + QSqlQuery *mDeleteMappingsQ; + QSqlQuery *mAddMappingsQ; QString mCurMappingIdsQS; int mMappingId; QList<int> mCurMappingsIds; @@ -608,6 +608,9 @@ void SheMov::createActions(){ mDeletePicFromA = new QAction(tr("Delete..."), this); mPicWidget->picView()->addAction(mDeletePicFromA); connect(mDeletePicFromA, SIGNAL(triggered()), mPicWidget->picView(), SLOT(deletePics())); + mEditPicsMappingsA = new QAction(tr("Edit mappings..."), this); + mPicWidget->picView()->addAction(mEditPicsMappingsA); + connect(mEditPicsMappingsA, SIGNAL(triggered()), mPicWidget->picView(), SIGNAL(editPicsMappings())); // misc mOpenWithMapperFS = new QSignalMapper(this); @@ -168,7 +168,7 @@ class SheMov : public QMainWindow { //PictureWidget Actions QAction *mDeletePicFromA; - QAction *mEditPicsAttrsA; + QAction *mEditPicsMappingsA; //EndActions QSignalMapper *mRenameMapper; |