summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mappingtreemodel.cpp4
-rw-r--r--mappingtreemodel.h1
-rw-r--r--mappingtreewidget.cpp32
-rw-r--r--mappingtreewidget.h13
-rw-r--r--pictureswidget.cpp51
-rw-r--r--pictureswidget.h9
-rw-r--r--shemov.cpp3
-rw-r--r--shemov.h2
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;
diff --git a/shemov.cpp b/shemov.cpp
index 30f7561..2fe4d42 100644
--- a/shemov.cpp
+++ b/shemov.cpp
@@ -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);
diff --git a/shemov.h b/shemov.h
index 798d16c..ce8af30 100644
--- a/shemov.h
+++ b/shemov.h
@@ -168,7 +168,7 @@ class SheMov : public QMainWindow {
//PictureWidget Actions
QAction *mDeletePicFromA;
- QAction *mEditPicsAttrsA;
+ QAction *mEditPicsMappingsA;
//EndActions
QSignalMapper *mRenameMapper;