diff options
author | Arno <am@disconnect.de> | 2013-08-22 07:43:20 +0200 |
---|---|---|
committer | Arno <am@disconnect.de> | 2013-08-22 07:43:20 +0200 |
commit | 369c14264c664b38049ac081cf60b8485a4042cb (patch) | |
tree | 5e77075e82d5d0caf7f0a7743a9a69f42ac9df9e | |
parent | cd2d39368e2319eb7c949439e9688bf8319ec0a3 (diff) | |
download | SheMov-369c14264c664b38049ac081cf60b8485a4042cb.tar.gz SheMov-369c14264c664b38049ac081cf60b8485a4042cb.tar.bz2 SheMov-369c14264c664b38049ac081cf60b8485a4042cb.zip |
Give Pictures some love!
* Show and archive size of pictures
* Fix SqlQueries in PicFilesModel: removeFiles and changeMappings
* use delegate in PictureView
-rw-r--r-- | helper.cpp | 9 | ||||
-rw-r--r-- | helper.h | 1 | ||||
-rw-r--r-- | newpicsdialog.cpp | 41 | ||||
-rw-r--r-- | newpicsdialog.h | 8 | ||||
-rw-r--r-- | picfilesmodel.cpp | 56 | ||||
-rw-r--r-- | picfilesmodel.h | 9 | ||||
-rw-r--r-- | pictureswidget.cpp | 20 | ||||
-rw-r--r-- | smdirwatcher.cpp | 3 | ||||
-rw-r--r-- | smglobals.cpp | 2 |
9 files changed, 91 insertions, 58 deletions
@@ -290,6 +290,15 @@ namespace Helper { return retval.scaledToWidth(640); } + QVariant picSize(const QString &path){ + QPixmap pm(path); + if(!pm.isNull()){ + QString retval = QString("%1x%2").arg(QString::number(pm.width())).arg(QString::number(pm.height())); + return retval; + } + return QVariant(); + } + Duration::Duration() : mHours(0), mMinutes(0), mSeconds(0) {} Duration::Duration(qint64 seconds){ @@ -37,6 +37,7 @@ namespace Helper { QJsonDocument streamData(const QString &path); QPixmap preview(const QString &path); QImage snapshot(const QString &path, int where); + QVariant picSize(const QString &path); class Duration { public: Duration(); diff --git a/newpicsdialog.cpp b/newpicsdialog.cpp index 2d56ddc..d4f247c 100644 --- a/newpicsdialog.cpp +++ b/newpicsdialog.cpp @@ -7,16 +7,18 @@ #include <QSqlQuery> #include <QSortFilterProxyModel> -#include <QtWidgets/QPushButton> +#include <QPushButton> #include <QSettings> -#include <QtWidgets/QFileDialog> -#include <QtWidgets/QVBoxLayout> +#include <QFileDialog> +#include <QVBoxLayout> +#include <QHeaderView> #include "newpicsdialog.h" #include "smtreeitem.h" #include "helper.h" #include "mappingtreewidget.h" #include "mappingtreemodel.h" +#include "delegates.h" #include "smglobals.h" NewPicsDialog::NewPicsDialog(QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f) { @@ -28,11 +30,14 @@ void NewPicsDialog::setupDlg(){ mFilesWidget = new QWidget; mFilesV = new SmTreeView; mFilesProxy = new QSortFilterProxyModel(this); - mFilesModel = new NewPicFilesModel(QStringList() << tr("Filename") << tr("Size") << 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") << tr("Pic. Size"), this); mFilesProxy->setSourceModel(mFilesModel); mFilesV->setModel(mFilesProxy); mFilesV->setSortingEnabled(true); - mFilesV->setColumnHidden(2, true); + mFilesV->setColumnHidden(NewPicFilesModel::Valid, true); + mFilesV->setItemDelegateForColumn(NewPicFilesModel::Size, new SizeDelegate(this)); + mFilesV->header()->moveSection(6, 2); //move picsize to front + mFilesV->header()->moveSection(5, 3); //move mime type to front mFilesV->setAlternatingRowColors(true); mAddFiles = new QPushButton(tr("Select...")); connect(mAddFiles, SIGNAL(clicked()), this, SLOT(selectFiles())); @@ -137,7 +142,7 @@ void NewPicsDialog::accept(){ } QList<QVariant> mappingParentsIds = mMappingEditWidget->model()->columnValues(MappingTreeResultModel::MappingId); QSqlQuery addFileQ(mDb); - addFileQ.prepare("INSERT INTO pics (tfilename, cmd5sum, isize, tformat) VALUES(:fn, :md5, :size, :format)"); + addFileQ.prepare("INSERT INTO pics (tfilename, cmd5sum, isize, tformat, cpicsize) VALUES(:fn, :md5, :size, :format, :picsize)"); QSqlQuery addMappingQ(mDb); addMappingQ.prepare("INSERT INTO pics_mappings(ipics_id, imappings_parents_id) VALUES((SELECT ipicsid FROM pics where cmd5sum = :md5), :mapid)"); foreach(FileData d, files){ @@ -145,6 +150,7 @@ void NewPicsDialog::accept(){ addFileQ.bindValue(":md5", d.md5sum); addFileQ.bindValue(":size", d.size); addFileQ.bindValue(":format", d.mimeType); + addFileQ.bindValue(":picsize", d.picSize); if(addFileQ.exec()){ foreach(QVariant mpid, mappingParentsIds){ addMappingQ.bindValue(":mapid", mpid); @@ -162,8 +168,6 @@ void NewPicsDialog::accept(){ NewPicFilesModel::NewPicFilesModel(const QStringList &header, QObject *parent) : SmTreeModel(header, parent){ mDb = QSqlDatabase::database("treedb"); - mMd5Query = new QSqlQuery(mDb); - mMd5Query->prepare("SELECT COUNT(*) FROM pics WHERE cmd5sum = :md5"); } Qt::ItemFlags NewPicFilesModel::flags(const QModelIndex &index) const{ @@ -191,6 +195,9 @@ QVariant NewPicFilesModel::data(const QModelIndex &index, int role) const{ if(role == FullPathRole){ return item->data(FullPath); } + if(role == PicSizeRole){ + return item->data(PicSize); + } if(role == Qt::DecorationRole && index.column() == 0){ bool valid = item->data(Valid).toBool(); if(valid){ @@ -228,6 +235,9 @@ bool NewPicFilesModel::setData(const QModelIndex &index, const QVariant &value, if(role == FullPathRole){ item->setData(FullPath, value); } + if(role == PicSizeRole){ + item->setData(PicSize, value); + } return true; } @@ -249,6 +259,8 @@ void NewPicFilesModel::setFiles(const QStringList &paths) { valid = false; } fileData << fi.fileName() << valid << md5 << mt << fi.absoluteFilePath(); + QVariant picSize = Helper::picSize(fi.absoluteFilePath()); + fileData << picSize; SmTreeItem *newFile = new SmTreeItem(fileData, rootItem); rootItem->appendChild(newFile); } @@ -269,6 +281,7 @@ void NewPicFilesModel::addFile(const QString &path){ if(haveMd5(md5)){ valid = false; } + QVariant picSize = Helper::picSize(fi.absoluteFilePath()); insertRows(0, 1, QModelIndex()); QModelIndex inserted = index(0, 1, QModelIndex()); setData(inserted, fi.fileName(), FileNameRole); @@ -277,6 +290,7 @@ void NewPicFilesModel::addFile(const QString &path){ setData(inserted, md5, Md5SumRole); setData(inserted, mt, MimeTypeRole); setData(inserted, fi.absoluteFilePath(), FullPathRole); + setData(inserted, picSize, PicSizeRole); } void NewPicFilesModel::removeFile(const QModelIndex &idx){ @@ -301,6 +315,7 @@ QList<FileData> NewPicFilesModel::validFiles() const { data.md5sum = child->data(Md5Sum).toString(); data.mimeType = child->data(MimeType).toString(); data.fullPath = child->data(FullPath).toString(); + data.picSize = child->data(PicSize).toString(); retval << data; } return retval; @@ -312,11 +327,13 @@ void NewPicFilesModel::clear(){ } bool NewPicFilesModel::haveMd5(const QString &md5) const { - mMd5Query->bindValue(":md5", md5); - mMd5Query->exec(); + QSqlQuery md5Query(mDb); + md5Query.prepare("SELECT COUNT(*) FROM pics WHERE cmd5sum = :md5"); + md5Query.bindValue(":md5", md5); + md5Query.exec(); int count = 0; - while(mMd5Query->next()){ - count = mMd5Query->value(0).toInt(); + while(md5Query.next()){ + count = md5Query.value(0).toInt(); } return ((count > 0) ? true : false); } diff --git a/newpicsdialog.h b/newpicsdialog.h index f706ee8..baae31e 100644 --- a/newpicsdialog.h +++ b/newpicsdialog.h @@ -54,9 +54,9 @@ class NewPicsDialog : public QDialog { class NewPicFilesModel : public SmTreeModel { Q_OBJECT public: - 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 }; + 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, PicSizeRole = Qt::UserRole + 7 }; + enum Fields { FileName = 0, Size = 1, Valid = 2, Md5Sum = 3, MimeType = 4, FullPath = 5, PicSize = 6 }; + enum { NumFields = 7 }; explicit NewPicFilesModel(const QStringList &header, QObject *parent = 0); //data @@ -74,7 +74,6 @@ class NewPicFilesModel : public SmTreeModel { private: bool haveMd5(const QString &md5) const; QSqlDatabase mDb; - QSqlQuery *mMd5Query; }; struct FileData { @@ -84,6 +83,7 @@ struct FileData { QString md5sum; QString mimeType; QString fullPath; + QString picSize; }; #endif // NEWPICSDIALOG_H diff --git a/picfilesmodel.cpp b/picfilesmodel.cpp index cb54503..21344dc 100644 --- a/picfilesmodel.cpp +++ b/picfilesmodel.cpp @@ -21,15 +21,8 @@ PicFilesModel::PicFilesModel(const QStringList &headers, QObject *parent) : SmTr //setup database mDb = QSqlDatabase::database("treedb"); - mPopulateQS = QString("SELECT DISTINCT(pics.ipicsid), pics.tfilename, pics.isize, pics.tformat, pics.dtadded, pics.cmd5sum FROM pics, pics_mappings WHERE pics_mappings.imappings_parents_id IN (%1) AND pics_mappings.ipics_id = pics.ipicsid ORDER BY pics.tfilename"); + mPopulateQS = QString("SELECT DISTINCT(pics.ipicsid), pics.tfilename, pics.isize, pics.tformat, pics.dtadded, pics.cmd5sum, pics.cpicsize FROM pics, pics_mappings WHERE pics_mappings.imappings_parents_id IN (%1) AND pics_mappings.ipics_id = pics.ipicsid ORDER BY pics.tfilename"); mMappingsQS = QString("SELECT DISTINCT(pics_mappings.imappings_parents_id) FROM pics_mappings, pics WHERE pics_mappings.ipics_id IN (%1)"); - mDeleteFileQ = new QSqlQuery(mDb); - mDeleteFileQ->prepare("DELETE FROM pics WHERE ipicsid = :id"); - 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, imappings_parents_id) VALUES(:pid, :id)"); - } void PicFilesModel::setMapping(int pMapId){ @@ -47,7 +40,7 @@ QVariant PicFilesModel::data(const QModelIndex &index, int role) const { } } if(role == Qt::ForegroundRole){ - if(index.column() == SizeDisplay){ + if(index.column() == Size){ int fileSize = index.data(SizeRole).toInt(); if(fileSize > 1024 * 1024 * 1024){ return QColor(Qt::red); @@ -78,8 +71,8 @@ QVariant PicFilesModel::data(const QModelIndex &index, int role) const { if(role == Md5SumRole){ return item->data(Md5Sum); } - if(role == SizeDisplayRole){ - return item->data(SizeDisplay); + if(role == PicSizeRole){ + return item->data(PicSize); } return SmTreeModel::data(index, role); } @@ -118,27 +111,43 @@ QList<QList<QVariant> > PicFilesModel::allFiles() const { return retval; } -void PicFilesModel::removeFiles(const QList<QPersistentModelIndex> &files){ - foreach(QPersistentModelIndex pi, files){ - mDeleteFileQ->bindValue(":id", pi.data(IdRole)); - if(mDeleteFileQ->exec()){ - QFile::remove(pi.data(FullPathRole).toString()); - removeRows(pi.row(), 1, QModelIndex()); +void PicFilesModel::removeFiles(const QList<QPair<int, QString> > &files){ + QSqlQuery deleteFile(mDb); + deleteFile.prepare("DELETE FROM pics WHERE ipicsid = :id"); + QList<int> success; + // remove from model + for(int i = 0; i < files.size(); ++i){ + QPair<int, QString> cur = files.at(i); + deleteFile.bindValue(":id", cur.first); + if(deleteFile.exec()){ + success << cur.first; + QFile::remove(cur.second); + } + } + // remove from view + foreach(int id, success){ + QModelIndex idx = find(id, Id); + if(idx.isValid()){ + removeRows(idx.row(), 1, QModelIndex()); } } } bool PicFilesModel::changeMappings(const QList<int> &fileIds, const QList<QVariant> &parentIds){ mDb.transaction(); + QSqlQuery deleteMappingsQ(mDb); + deleteMappingsQ.prepare("DELETE FROM pics_mappings WHERE ipics_id = :id"); + QSqlQuery addMappingsQ(mDb); + addMappingsQ.prepare("INSERT INTO pics_mappings(ipics_id, imappings_parents_id) VALUES(:pid, :id)"); foreach(int fid, fileIds){ - mDeleteMappingsQ->bindValue(":id", fid); - if(!mDeleteMappingsQ->exec()){ + deleteMappingsQ.bindValue(":id", fid); + if(!deleteMappingsQ.exec()){ goto error; } foreach(QVariant pid, parentIds){ - mAddMappingsQ->bindValue(":pid", fid); - mAddMappingsQ->bindValue(":id", pid); - if(!mAddMappingsQ->exec()){ + addMappingsQ.bindValue(":pid", fid); + addMappingsQ.bindValue(":id", pid); + if(!addMappingsQ.exec()){ goto error; } } @@ -204,8 +213,7 @@ void PicFilesModel::populate(){ data << q.value(1) << q.value(2) << q.value(3); // Filename, size and Mime type data << Helper::createArchivePath(q.value(1).toString(), q.value(5).toString()); // full path; data << q.value(0) << q.value(4) << q.value(5); //Id, added and md5 - QLocale l; - data << l.toString(q.value(2).toInt()); //sizedisplay + data << q.value(6); // picsize SmTreeItem *child = new SmTreeItem(data, root); root->appendChild(child); } diff --git a/picfilesmodel.h b/picfilesmodel.h index 6a033c1..a538f75 100644 --- a/picfilesmodel.h +++ b/picfilesmodel.h @@ -14,8 +14,8 @@ class PicFilesModel : public SmTreeModel { Q_OBJECT public: - enum Roles { FileNameRole = Qt::UserRole + 1, SizeRole = Qt::UserRole + 2, MimeTypeRole = Qt::UserRole + 3, FullPathRole = Qt::UserRole + 4, IdRole = Qt::UserRole + 5, AddedRole = Qt::UserRole + 6, Md5SumRole = Qt::UserRole + 7, SizeDisplayRole = Qt::UserRole + 8 }; - enum Fields { FileName = 0, Size = 1, MimeType = 2, FullPath = 3, Id = 4, Added = 5, Md5Sum = 6, SizeDisplay = 7 }; + enum Roles { FileNameRole = Qt::UserRole + 1, SizeRole = Qt::UserRole + 2, MimeTypeRole = Qt::UserRole + 3, FullPathRole = Qt::UserRole + 4, IdRole = Qt::UserRole + 5, AddedRole = Qt::UserRole + 6, Md5SumRole = Qt::UserRole + 7, PicSizeRole = Qt::UserRole + 8 }; + enum Fields { FileName = 0, Size = 1, MimeType = 2, FullPath = 3, Id = 4, Added = 5, Md5Sum = 6, PicSize = 7 }; enum { NumFields = 8 }; explicit PicFilesModel(const QStringList &headers, QObject *parent = 0); void setMapping(int pMapId); @@ -25,7 +25,7 @@ class PicFilesModel : public SmTreeModel { QVariant data(const QModelIndex &index, int role) const; QList<QVariant> dataList(const QModelIndex &idx) const; QList<QList<QVariant> > allFiles() const; - void removeFiles(const QList<QPersistentModelIndex> &files); + void removeFiles(const QList<QPair<int, QString> > &files); bool changeMappings(const QList<int> &fileIds, const QList<QVariant> &parentIds); QList<MappingData> mappingDataFromFile(int fileId) const; QList<MappingData> mappingDataFromFiles(const QList<int> fileIds) const; @@ -39,9 +39,6 @@ class PicFilesModel : public SmTreeModel { MappingTreeModel *mMappingTreeModel; QString mPopulateQS; QString mMappingsQS; - QSqlQuery *mDeleteFileQ; - QSqlQuery *mDeleteMappingsQ; - QSqlQuery *mAddMappingsQ; QList<int> mMappingIds; }; diff --git a/pictureswidget.cpp b/pictureswidget.cpp index 287c493..9c9d393 100644 --- a/pictureswidget.cpp +++ b/pictureswidget.cpp @@ -5,21 +5,21 @@ 2 of the License, or (at your option) any later version. */ -#include <QtWidgets/QSplitter> -#include <QtWidgets/QHBoxLayout> +#include <QSplitter> +#include <QHBoxLayout> #include <QSqlQuery> #include <QSortFilterProxyModel> #include <QLocale> #include <QHideEvent> #include <QHoverEvent> #include <QEvent> -#include <QtWidgets/QHeaderView> +#include <QHeaderView> #include <QSettings> -#include <QtWidgets/QMessageBox> -#include <QtWidgets/QMenu> +#include <QMessageBox> +#include <QMenu> #include <QFile> #include <QSettings> -#include <QtWidgets/QActionGroup> +#include <QActionGroup> #include <QHash> #include "pictureswidget.h" @@ -29,6 +29,7 @@ #include "helper.h" #include "hoverwindow.h" #include "mappingtreemodel.h" +#include "delegates.h" #include "smglobals.h" PicturesWidget::PicturesWidget(QWidget *parent) : QWidget(parent), mWindowTitleBase(tr("Picture archive")), mPicViewerA(0) { @@ -36,6 +37,7 @@ PicturesWidget::PicturesWidget(QWidget *parent) : QWidget(parent), mWindowTitleB QSplitter *splitter = new QSplitter; mMappingTree = new MappingTreeWidget; mPictureView = new PictureView; + mPictureView->setItemDelegateForColumn(PicFilesModel::Size, new SizeDelegate(this)); connect(mMappingTree, SIGNAL(mappingChanged(int)), mPictureView, SLOT(mappingChanged(int))); //change window title when mapping selection changes connect(mMappingTree, SIGNAL(mappingChanged(int)), this, SLOT(constructWindowTitle())); @@ -174,11 +176,11 @@ void PictureView::deletePics(){ if(retval == QMessageBox::No){ return; } - QList<QPersistentModelIndex> real; + QList<QPair<int, QString> > files; foreach(QModelIndex i, sel){ - real << QPersistentModelIndex(mProxy->mapToSource(i)); + files << qMakePair(i.data(PicFilesModel::IdRole).toInt(), i.data(PicFilesModel::FullPathRole).toString()); } - mModel->removeFiles(real); + mModel->removeFiles(files); } void PictureView::refresh(){ diff --git a/smdirwatcher.cpp b/smdirwatcher.cpp index 64ab330..87d2eff 100644 --- a/smdirwatcher.cpp +++ b/smdirwatcher.cpp @@ -169,8 +169,7 @@ const QList<QVariant> SmDataColletor::fileData(const QFileInfo &fi){ si[0] = ffData.value("duration").toDouble(); si[1] = ffData.value("bit_rate").toInt(); }else if(mime.startsWith("image")){ - QImage img(fi.absoluteFilePath()); - si[0] = img.size(); + si[0] = Helper::picSize(fi.absoluteFilePath()); } data << Helper::md5Sum(fi.absoluteFilePath()); data << si << fi.absoluteFilePath(); diff --git a/smglobals.cpp b/smglobals.cpp index 2e3a13e..7388968 100644 --- a/smglobals.cpp +++ b/smglobals.cpp @@ -89,7 +89,7 @@ QAbstractItemModel *SmGlobals::model(const QString &which){ } }else if(which == "PicFiles"){ if(!mModels.contains("PicFiles")){ - QStringList headers = QStringList() << tr("Filename") << tr("SizeNum") << tr("Format") << tr("Full Path") << tr("Id") << tr("Added") << tr("Md5Sum") << tr("Size"); + QStringList headers = QStringList() << tr("Filename") << tr("Size") << tr("Format") << tr("Full Path") << tr("Id") << tr("Added") << tr("Md5Sum") << tr("Pic. Size"); PicFilesModel *model = new PicFilesModel(headers); mModels.insert(which, model); } |