From 26530f47ff13e20d46472c12abc7567a61c14e57 Mon Sep 17 00:00:00 2001 From: Arno Date: Sat, 25 Feb 2012 19:11:59 +0100 Subject: Make NewPicsDialog archive pictures Finally NewPicsDialog actually does something. Added another parameter to Helper::moveToArchive. If set to true, files will only be copied instead of moved. Default is false, not changing the expected behavior. --- newpicsdialog.cpp | 84 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 73 insertions(+), 11 deletions(-) (limited to 'newpicsdialog.cpp') diff --git a/newpicsdialog.cpp b/newpicsdialog.cpp index 4395399..cc85a1b 100644 --- a/newpicsdialog.cpp +++ b/newpicsdialog.cpp @@ -6,6 +6,7 @@ */ #include +#include #include #include #include @@ -24,17 +25,24 @@ #include "mappingtreewidget.h" #include "mappingtreemodel.h" -NewPicsDialog::NewPicsDialog(QWidget *parent) : QWidget(parent) { +NewPicsDialog::NewPicsDialog(QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f) { + //setup database + mDb = QSqlDatabase::database("treedb"); + 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)"); + //files widget mFilesWidget = new QWidget; mFilesV = new QTreeView; mFilesProxy = new QSortFilterProxyModel(this); - mFilesModel = new NewPicFilesModel(QStringList() << tr("Filename") << tr("Val.") << tr("Md5") << tr("Mime type") << tr("Full path"), this); + mFilesModel = new NewPicFilesModel(QStringList() << tr("Filename") << tr("Size") << tr("Val.") << tr("Md5") << tr("Mime type") << tr("Full path"), this); mFilesProxy->setSourceModel(mFilesModel); mFilesV->setModel(mFilesProxy); mFilesV->setSortingEnabled(true); mFilesV->setAlternatingRowColors(true); - mFilesV->setColumnHidden(1, true); + mFilesV->setColumnHidden(2, true); mAddFiles = new QPushButton(tr("Select...")); connect(mAddFiles, SIGNAL(clicked()), this, SLOT(addFiles())); mRemoveFiles = new QPushButton(tr("Remove")); @@ -52,32 +60,44 @@ NewPicsDialog::NewPicsDialog(QWidget *parent) : QWidget(parent) { mMappingWidget = new QWidget; mMappingTreeWidget = new MappingTreeWidget; mResultView = new MappingTreeResultView; - mResultModel = new MappingTreeResultModel(QStringList() << tr("Name"), this); + mResultModel = new MappingTreeResultModel(QStringList() << tr("Name") << tr("Id"), this); mResultView->setModel(mResultModel); mResultView->setAlternatingRowColors(true); + mResultView->setColumnHidden(1, true); mAddMapping = new QPushButton(tr(">>")); connect(mAddMapping, SIGNAL(clicked()), this, SLOT(addMapping())); mRemoveMapping = new QPushButton(tr("<<")); connect(mRemoveMapping, SIGNAL(clicked()), this, SLOT(removeMapping())); - QVBoxLayout *buttonLayout = new QVBoxLayout; - buttonLayout->addStretch(); - buttonLayout->addWidget(mAddMapping); - buttonLayout->addWidget(mRemoveMapping); - buttonLayout->addStretch(); + QVBoxLayout *mappingButtonLayout = new QVBoxLayout; + mappingButtonLayout->addStretch(); + mappingButtonLayout->addWidget(mAddMapping); + mappingButtonLayout->addWidget(mRemoveMapping); + mappingButtonLayout->addStretch(); QHBoxLayout *mappingLayout = new QHBoxLayout; mappingLayout->addWidget(mMappingTreeWidget); - mappingLayout->addLayout(buttonLayout); + mappingLayout->addLayout(mappingButtonLayout); mappingLayout->addWidget(mResultView); mMappingWidget->setLayout(mappingLayout); + //dialog buttons + 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 *dlgButtonLayout = new QHBoxLayout; + dlgButtonLayout->addStretch(); + dlgButtonLayout->addWidget(mCancel); + dlgButtonLayout->addWidget(mOk); + //put it together setMinimumWidth(600); setMinimumHeight(400); mTab = new QTabWidget; mTab->addTab(mFilesWidget, tr("Files")); mTab->addTab(mMappingWidget, tr("Mappings")); - QHBoxLayout *mainLayout = new QHBoxLayout; + QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(mTab); + mainLayout->addLayout(dlgButtonLayout); setLayout(mainLayout); } @@ -134,6 +154,43 @@ void NewPicsDialog::removeMapping(){ mResultModel->removeRows(firstIdx.row(), 1, firstIdx.parent()); } +void NewPicsDialog::accept(){ + QList files = mFilesModel->validFiles(); + if(files.isEmpty()){ + return QDialog::accept(); + } + QList mappingIds = mResultModel->mappingsIds(); + mDb.transaction(); + foreach(FileData d, files){ + mAddFileQ->bindValue(":fn", d.fileName); + mAddFileQ->bindValue(":md5", d.md5sum); + mAddFileQ->bindValue(":size", d.size); + mAddFileQ->bindValue(":format", d.mimeType); + if(mAddFileQ->exec()){ + QSqlQuery curPicIdQ("SELECT currval('pics_ipicsid__seq')", mDb); + QVariant picId; + while(curPicIdQ.next()){ + picId = curPicIdQ.value(0); + } + if(!picId.isValid()){ + mDb.rollback(); + return; + } + foreach(int mappingId, mappingIds){ + mAddMappingQ->bindValue(":picid", picId); + mAddMappingQ->bindValue(":mapid", mappingId); + if(!mAddMappingQ->exec()){ + mDb.rollback(); + return; + } + } + } + Helper::moveToArchive(d.fullPath, d.md5sum); + } + mDb.commit(); + return QDialog::accept(); +} + MappingTreeResultView::MappingTreeResultView(QWidget *parent) : QTreeView(parent) { } NewPicFilesModel::NewPicFilesModel(const QStringList &header, QObject *parent) : SmTreeModel(header, parent){ @@ -194,6 +251,9 @@ bool NewPicFilesModel::setData(const QModelIndex &index, const QVariant &value, if(role == FileNameRole){ item->setData(FileName, value); } + if(role == SizeRole){ + item->setData(Size, value); + } if(role == ValidRole){ item->setData(Valid, value); } @@ -250,6 +310,7 @@ void NewPicFilesModel::addFile(const QString &path){ insertRows(0, 1, QModelIndex()); QModelIndex inserted = index(0, 1, QModelIndex()); setData(inserted, fi.fileName(), FileNameRole); + setData(inserted, fi.size(), SizeRole); setData(inserted, valid, ValidRole); setData(inserted, md5, Md5SumRole); setData(inserted, mt, MimeTypeRole); @@ -273,6 +334,7 @@ QList NewPicFilesModel::validFiles() const { } FileData data; data.fileName = child->data(FileName).toString(); + data.size = child->data(Size).toInt(); data.valid = child->data(Valid).toBool(); data.md5sum = child->data(Md5Sum).toString(); data.mimeType = child->data(MimeType).toString(); -- cgit v1.2.3-70-g09d2