summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--helper.cpp9
-rw-r--r--helper.h2
-rw-r--r--mappingtreemodel.cpp43
-rw-r--r--mappingtreemodel.h12
-rw-r--r--mappingtreewidget.cpp7
-rw-r--r--newpicsdialog.cpp84
-rw-r--r--newpicsdialog.h19
-rw-r--r--shemov.cpp8
8 files changed, 149 insertions, 35 deletions
diff --git a/helper.cpp b/helper.cpp
index 80a8bc2..30d5fff 100644
--- a/helper.cpp
+++ b/helper.cpp
@@ -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();
}
diff --git a/helper.h b/helper.h
index 8c9482e..8a1f0d4 100644
--- a/helper.h
+++ b/helper.h
@@ -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;
diff --git a/shemov.cpp b/shemov.cpp
index 09d4f03..1006cab 100644
--- a/shemov.cpp
+++ b/shemov.cpp
@@ -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();
}