diff options
-rw-r--r-- | helper.cpp | 9 | ||||
-rw-r--r-- | helper.h | 2 | ||||
-rw-r--r-- | mappingtreemodel.cpp | 43 | ||||
-rw-r--r-- | mappingtreemodel.h | 12 | ||||
-rw-r--r-- | mappingtreewidget.cpp | 7 | ||||
-rw-r--r-- | newpicsdialog.cpp | 84 | ||||
-rw-r--r-- | newpicsdialog.h | 19 | ||||
-rw-r--r-- | shemov.cpp | 8 |
8 files changed, 149 insertions, 35 deletions
@@ -88,7 +88,7 @@ namespace Helper { return retval; } - const QString moveToArchive(const QString &path, const QString &md5){ + const QString moveToArchive(const QString &path, const QString &md5, bool copy){ QFileInfo info(path); if(!info.exists()){ return QString(); @@ -104,7 +104,12 @@ namespace Helper { if(!destDir.exists()){ QDir::root().mkpath(destFile.absolutePath()); } - bool success = QFile::rename(path, destFile.absoluteFilePath()); + bool success = false; + if(copy){ + success = QFile::copy(path, destFile.absoluteFilePath()); + }else{ + success = QFile::rename(path, destFile.absoluteFilePath()); + } if(success){ return destFile.absoluteFilePath(); } @@ -21,7 +21,7 @@ class QPixmap; namespace Helper { const QString mimeType(const QString &path); const QString md5Sum(const QString &path); - const QString moveToArchive(const QString &path, const QString &md5); + const QString moveToArchive(const QString &path, const QString &md5, bool copy = false); bool removeFromArchive(const QString &filename, const QString &md5); const QString createArchivePath(const QString &path, const QString &md5, bool withMd5 = false); QPair<QString, QStringList> programData(const QString &prefix, const QString &preferred = QString()); diff --git a/mappingtreemodel.cpp b/mappingtreemodel.cpp index d64cb52..a79661e 100644 --- a/mappingtreemodel.cpp +++ b/mappingtreemodel.cpp @@ -202,6 +202,14 @@ bool MappingTreeModel::deleteChild(const QModelIndex &idx){ return false; } +int MappingTreeModel::childCount(const QModelIndex &idx) const{ + if(!idx.isValid()){ + return 0; + } + SmTreeItem *item = itemAt(idx); + return item->childCount(); +} + void MappingTreeModel::populate(){ if(mType == -1){ return; @@ -273,11 +281,15 @@ Qt::ItemFlags MappingTreeResultModel::flags(const QModelIndex &index) const { } bool MappingTreeResultModel::setData(const QModelIndex &index, const QVariant &value, int role){ + SmTreeItem *item = itemAt(index); if(role == NameRole){ - SmTreeItem *item = itemAt(index); item->setData(Name, value); return true; } + if(role == IdRole){ + item->setData(Id, value); + return true; + } return SmTreeModel::setData(index, value, role); } @@ -291,13 +303,17 @@ void MappingTreeResultModel::addItem(const MappingData &data){ continue; }else{ //insert child - QModelIndex curIdx = insertChild(data.path.at(i), curItem); + int id = -1; + if(i == data.path.count() - 1){ + id = data.id; + } + QModelIndex curIdx = insertChild(data.path.at(i), id, curItem); curItem = itemAt(curIdx); } } } -QModelIndex MappingTreeResultModel::insertChild(const QVariant &data, SmTreeItem *parent){ +QModelIndex MappingTreeResultModel::insertChild(const QVariant &data, int id, SmTreeItem *parent){ QModelIndex parentIdx; int row = parent->childCount(); if(parent != root()){ @@ -311,9 +327,14 @@ QModelIndex MappingTreeResultModel::insertChild(const QVariant &data, SmTreeItem insertRows(row, 1, parentIdx); QModelIndex newIdx = index(row, 0, parentIdx); setData(newIdx, data, NameRole); + setData(newIdx, id, IdRole); return newIdx; } +QList<int> MappingTreeResultModel::mappingsIds() const { + return mappingIdsRecursive(root()); +} + 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){ @@ -322,3 +343,19 @@ int MappingTreeResultModel::hasChild(SmTreeItem *item, const QVariant &name, int } return -1; } + +QList<int> MappingTreeResultModel::mappingIdsRecursive(SmTreeItem *parent) const { + QList<int> 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; + } + retval << mappingIdsRecursive(child); + } + return retval; +} diff --git a/mappingtreemodel.h b/mappingtreemodel.h index a37e364..e55f609 100644 --- a/mappingtreemodel.h +++ b/mappingtreemodel.h @@ -39,6 +39,7 @@ class MappingTreeModel : public SmTreeModel { bool deleteMappingType(int typeId); bool addChild(const QVariant &name, const QModelIndex &parent); bool deleteChild(const QModelIndex &idx); + int childCount(const QModelIndex &idx) const; public slots: void populate(); @@ -74,22 +75,23 @@ class MappingTreeModel : public SmTreeModel { class MappingTreeResultModel : public SmTreeModel { Q_OBJECT public: - enum Roles { NameRole = Qt::UserRole + 1 }; - enum Fields { Name = 0 }; - enum { NumFields = 1 }; + enum Roles { NameRole = Qt::UserRole + 1, IdRole = Qt::UserRole + 2 }; + enum Fields { Name = 0, Id = 1 }; + enum { NumFields = 2 }; 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, SmTreeItem *parent); + QModelIndex insertChild(const QVariant &data, int id, SmTreeItem *parent); + QList<int> mappingsIds() const; public slots: void addItem(const MappingData &data); - private: int hasChild(SmTreeItem *item, const QVariant &name, int column = 0) const; + QList<int> mappingIdsRecursive(SmTreeItem *parent) const; }; struct MappingData { diff --git a/mappingtreewidget.cpp b/mappingtreewidget.cpp index db8f649..00f4738 100644 --- a/mappingtreewidget.cpp +++ b/mappingtreewidget.cpp @@ -101,7 +101,12 @@ MappingData MappingTreeWidget::selectedItem() const { if(!sel.isValid()){ retval.id = -1; }else{ - retval.id = sel.data(MappingTreeModel::IdRole).toInt(); + QModelIndex real = mProxy->mapToSource(sel); + if(mModel->childCount(real)){ + retval.id = -1; + }else{ + retval.id = sel.data(MappingTreeModel::IdRole).toInt(); + } retval.name = sel.data(MappingTreeModel::NameRole).toString(); QStringList p; QModelIndex parent = sel; diff --git a/newpicsdialog.cpp b/newpicsdialog.cpp index 4395399..cc85a1b 100644 --- a/newpicsdialog.cpp +++ b/newpicsdialog.cpp @@ -6,6 +6,7 @@ */ #include <QFileInfo> +#include <QSqlDatabase> #include <QSqlQuery> #include <QLabel> #include <QTreeView> @@ -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<FileData> files = mFilesModel->validFiles(); + if(files.isEmpty()){ + return QDialog::accept(); + } + QList<int> 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<FileData> 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(); diff --git a/newpicsdialog.h b/newpicsdialog.h index 9a11675..ea9a0bc 100644 --- a/newpicsdialog.h +++ b/newpicsdialog.h @@ -8,7 +8,7 @@ #ifndef NEWPICSDIALOG_H #define NEWPICSDIALOG_H -#include <QWidget> +#include <QDialog> #include <QSqlDatabase> #include <QTreeView> @@ -27,16 +27,17 @@ class MappingTreeResultModel; struct FileData; -class NewPicsDialog : public QWidget { +class NewPicsDialog : public QDialog { Q_OBJECT public: - explicit NewPicsDialog(QWidget *parent = 0); + explicit NewPicsDialog(QWidget *parent = 0, Qt::WindowFlags f = 0); public slots: void addFiles(); void removeFiles(); void addMapping(); void removeMapping(); + void accept(); private: QTabWidget *mTab; @@ -52,6 +53,11 @@ class NewPicsDialog : public QWidget { QPushButton *mRemoveMapping; MappingTreeResultView *mResultView; MappingTreeResultModel *mResultModel; + QPushButton *mOk; + QPushButton *mCancel; + QSqlDatabase mDb; + QSqlQuery *mAddFileQ; + QSqlQuery *mAddMappingQ; }; class MappingTreeResultView : public QTreeView { @@ -63,9 +69,9 @@ class MappingTreeResultView : public QTreeView { class NewPicFilesModel : public SmTreeModel { Q_OBJECT public: - enum Roles { FileNameRole = Qt::UserRole + 1, ValidRole = Qt::UserRole + 2, Md5SumRole = Qt::UserRole + 3, MimeTypeRole = Qt::UserRole + 4, FullPathRole = Qt::UserRole + 5 }; - enum Fields { FileName = 0, Valid = 1, Md5Sum = 2, MimeType = 3, FullPath = 4 }; - enum { NumFields = 5 }; + enum Roles { FileNameRole = Qt::UserRole + 1, SizeRole = Qt::UserRole + 2, ValidRole = Qt::UserRole + 3, Md5SumRole = Qt::UserRole + 4, MimeTypeRole = Qt::UserRole + 5, FullPathRole = Qt::UserRole + 6 }; + enum Fields { FileName = 0, Size = 1, Valid = 2, Md5Sum = 3, MimeType = 4, FullPath = 5 }; + enum { NumFields = 6 }; explicit NewPicFilesModel(const QStringList &header, QObject *parent = 0); ~NewPicFilesModel(); @@ -86,6 +92,7 @@ class NewPicFilesModel : public SmTreeModel { struct FileData { QString fileName; + int size; bool valid; QString md5sum; QString mimeType; @@ -1035,10 +1035,6 @@ void SheMov::mappingEditor(){ } void SheMov::newPicsDialog(){ - QDialog dlg(this); - QHBoxLayout *dlgLayout = new QHBoxLayout; - NewPicsDialog *npd = new NewPicsDialog; - dlgLayout->addWidget(npd); - dlg.setLayout(dlgLayout); - dlg.exec(); + NewPicsDialog npd(this); + npd.exec(); } |