summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--helper.cpp9
-rw-r--r--helper.h1
-rw-r--r--newpicsdialog.cpp41
-rw-r--r--newpicsdialog.h8
-rw-r--r--picfilesmodel.cpp56
-rw-r--r--picfilesmodel.h9
-rw-r--r--pictureswidget.cpp20
-rw-r--r--smdirwatcher.cpp3
-rw-r--r--smglobals.cpp2
9 files changed, 91 insertions, 58 deletions
diff --git a/helper.cpp b/helper.cpp
index 348c066..7349b09 100644
--- a/helper.cpp
+++ b/helper.cpp
@@ -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){
diff --git a/helper.h b/helper.h
index 4f70854..74aea3f 100644
--- a/helper.h
+++ b/helper.h
@@ -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);
}