summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArno <am@disconnect.de>2012-10-04 06:59:44 +0200
committerArno <am@disconnect.de>2012-10-04 07:01:29 +0200
commit184448e767ccdeae66fe4d795757cace98033b0e (patch)
tree26cafbb4fbafe94406413439c0cbd36f5cd66cc3
parentdeeec5306a37e2280626f3486a07629570aafe92 (diff)
downloadSheMov-184448e767ccdeae66fe4d795757cace98033b0e.tar.gz
SheMov-184448e767ccdeae66fe4d795757cace98033b0e.tar.bz2
SheMov-184448e767ccdeae66fe4d795757cace98033b0e.zip
Fix Mappings in PictureViewer2
Another fix for the new MappingTreeModel database layout: Make the mappings display correctly when showing an archived picture. For performance reasons I had to make PicFilesModel global and put it into a separate file. Also clean up MappingTreeModel: remove comments and unused functions.
-rw-r--r--mappingtreemodel.cpp105
-rw-r--r--mappingtreemodel.h9
-rw-r--r--mappingtreewidget.cpp2
-rw-r--r--picfilesmodel.cpp219
-rw-r--r--picfilesmodel.h49
-rw-r--r--pictureswidget.cpp198
-rw-r--r--pictureswidget.h34
-rw-r--r--pictureviewer2.cpp51
-rw-r--r--pictureviewer2.h3
-rw-r--r--shemov.pro6
-rw-r--r--smglobals.cpp7
11 files changed, 344 insertions, 339 deletions
diff --git a/mappingtreemodel.cpp b/mappingtreemodel.cpp
index f2af964..c32574a 100644
--- a/mappingtreemodel.cpp
+++ b/mappingtreemodel.cpp
@@ -115,11 +115,12 @@ SmTreeItem *MappingTreeModel::treeFromPaths(const QStringList &paths){
}else{
//create a new item, save old root
SmTreeItem *oldRoot = pItem;
- pItem = new SmTreeItem(QList<QVariant>() << parts.at(j), oldRoot);
+ pItem = new SmTreeItem(QList<QVariant>() << parts.at(j), partsHash.value(parts.at(j)));
oldRoot->appendChild(pItem);
partsHash.insert(parts.at(j), pItem);
}
}
+ pItem = root;
}
return root;
}
@@ -141,11 +142,6 @@ QVariant MappingTreeModel::data(const QModelIndex &index, int role) const{
if(role == MapParentIdRole){
return item->data(MapParentId);
}
- if(role == Qt::ForegroundRole){
- if(mSelectedMappings.contains(item)){
- return QColor(Qt::blue);
- }
- }
return SmTreeModel::data(index, role);
}
@@ -292,13 +288,6 @@ bool MappingTreeModel::deleteMappingType(int typeId){
return false;
}
-/*
- * FIXME!
- * this is total crap. The model has to be redesigned.
- * Like this children can never have the same name as parents.
- * Too drunk to think about it now.
- */
-
bool MappingTreeModel::addChild(const QVariant &name, const QModelIndex &parent){
if(!parent.isValid()){
return false;
@@ -324,34 +313,8 @@ bool MappingTreeModel::addChild(const QVariant &name, const QModelIndex &parent)
QModelIndex newIdx = index(where, 0, parent);
setData(newIdx, name, NameRole);
setData(newIdx, id, IdRole);
- //setData(newIdx, AddedRole);
return true;
}
-
- /*mAddChildQ->bindValue(":name", name);
- mAddChildQ->bindValue(":type", mType);
- if(mAddChildQ->exec()){
- mSelectChildQ->bindValue(":name", name);
- mSelectChildQ->bindValue(":type", mType);
- mSelectChildQ->exec();
- while(mSelectChildQ->next()){
- int where = lowerBound(pItem, mSelectChildQ->value(1), Name);
- if(insertRows(where, 1, parent)){
- QModelIndex newIdx = index(where, 0, parent);
- setData(newIdx, mSelectChildQ->value(1), NameRole);
- setData(newIdx, mSelectChildQ->value(0), IdRole);
- setData(newIdx, mSelectChildQ->value(2), AddedRole);
- }
- if(pItem->parent() != root()){
- mAddParentQ->bindValue(":id", mSelectChildQ->value(0)); //Id
- mAddParentQ->bindValue(":parentid", pItem->data(Id));
- mAddParentQ->exec();
- }
- //mValidMappings.clear();
- //mValidMappings = mappingData(root());
- return true;
- }
- }*/
return false;
}
@@ -366,8 +329,6 @@ bool MappingTreeModel::deleteChild(const QModelIndex &idx){
mDeleteChildQ->bindValue(":id", item->data(Id));
if(mDeleteChildQ->exec()){
removeRows(idx.row(), 1, idx.parent());
- mValidMappings.clear();
- mValidMappings = mappingData(root());
return true;
}
return false;
@@ -382,36 +343,13 @@ int MappingTreeModel::childCount(const QModelIndex &idx) const{
}
MappingData MappingTreeModel::mappingDataFromIndex(QModelIndex &idx) const{
- MappingData retval = { -1, QString(), QStringList() };
+ MappingData retval = { -1, QString(), QList<QStringList>() };
if(!idx.isValid()){
return retval;
}
retval.id = idx.data(MappingTreeModel::MapParentIdRole).toInt();
retval.name = idx.data(MappingTreeModel::NameRole).toString();
- retval.path = path(idx);
- return retval;
-}
-
-//continue here!
-MappingData MappingTreeModel::mappingDataFromId(int mappingId) const{
- MappingData retval = { -1, QString(), QStringList() };
- QModelIndex mapIdx = findRecursive(mappingId, MappingTreeModel::Id, rootIndex());
- //REMOVE ME
- Q_ASSERT(mapIdx.isValid());
- retval.id = mappingId;
- retval.name = mapIdx.data(MappingTreeModel::NameRole).toString();
- qDebug() << "mapping" << retval.id << retval.name;
- SmTreeItem *mapItem = static_cast<SmTreeItem*>(mapIdx.internalPointer());
- //REMOVE ME
- Q_ASSERT(mapItem);
- //retval.path = path(mapItem);
-
- /*foreach(MappingData d, mValidMappings){
- if(d.id == mappingId){
- retval = d;
- break;
- }
- }*/
+ retval.path << path(idx);
return retval;
}
@@ -438,8 +376,6 @@ void MappingTreeModel::populate(){
getChildrenRecursive(childItem);
}
setRoot(rootItem);
- //mValidMappings.clear();
- //mValidMappings = mappingData(root());
emit needExpansion();
}
}
@@ -571,7 +507,7 @@ QList<MappingData> MappingTreeModel::mappingData(SmTreeItem *item){
retval << mappingData(item->child(i));
}
}
- MappingData mapItem = { item->data(Id).toInt(), item->data(Name).toString(), QStringList() };
+ MappingData mapItem = { item->data(Id).toInt(), item->data(Name).toString(), QList<QStringList>() };
QStringList path;
SmTreeItem *p = item;
while(p->parent()){
@@ -579,7 +515,7 @@ QList<MappingData> MappingTreeModel::mappingData(SmTreeItem *item){
p = p->parent();
}
std::reverse(path.begin(), path.end());
- mapItem.path = path;
+ mapItem.path << path;
retval << mapItem;
return retval;
}
@@ -606,20 +542,23 @@ bool MappingTreeResultModel::setData(const QModelIndex &index, const QVariant &v
void MappingTreeResultModel::addItem(const MappingData &data){
SmTreeItem *curItem = root();
- for(int i = 0; i < data.path.count(); ++i){
- int childPos = hasChild(curItem, data.path.at(i));
- if(childPos != -1){
- //child already exists
- curItem = curItem->child(childPos);
- continue;
- }else{
- //insert child
- int id = -1;
- if(i == data.path.count() - 1){
- id = data.id;
+ QList<QStringList> paths = data.path;
+ foreach(QStringList p, paths){
+ for(int i = 0; i < p.count(); ++i){
+ int childPos = hasChild(curItem, p.at(i));
+ if(childPos != -1){
+ //child already exists
+ curItem = curItem->child(childPos);
+ continue;
+ }else{
+ //insert child
+ int id = -1;
+ if(i == p.count() - 1){
+ id = data.id;
+ }
+ QModelIndex curIdx = insertChild(p.at(i), id, curItem);
+ curItem = itemAt(curIdx);
}
- QModelIndex curIdx = insertChild(data.path.at(i), id, curItem);
- curItem = itemAt(curIdx);
}
}
}
diff --git a/mappingtreemodel.h b/mappingtreemodel.h
index f2771c9..72a7b7f 100644
--- a/mappingtreemodel.h
+++ b/mappingtreemodel.h
@@ -50,13 +50,12 @@ class MappingTreeModel : public SmTreeModel {
bool deleteChild(const QModelIndex &idx);
int childCount(const QModelIndex &idx) const;
MappingData mappingDataFromIndex(QModelIndex &idx) const;
- MappingData mappingDataFromId(int mappingId) const;
QStringList paths() const;
const QString &forbidden() const { return mForbidden; }
public slots:
void populate();
- void setType(int type); // { mType = type; }
+ void setType(int type);
signals:
void mappingTypesChanged();
@@ -92,8 +91,6 @@ class MappingTreeModel : public SmTreeModel {
QSqlQuery *mMappingsForFileIdQ;
QSqlQuery *mMappingsQ;
QList<mappingType> mMappingTypes;
- QList<MappingData> mValidMappings;
- QList<SmTreeItem*> mSelectedMappings;
QMap<QString, int> mMappings;
const QString mForbidden;
int mType;
@@ -125,7 +122,9 @@ class MappingTreeResultModel : public SmTreeModel {
struct MappingData {
int id;
QString name;
- QStringList path;
+ QList<QStringList> path;
};
+Q_DECLARE_METATYPE(QList<QStringList>)
+
#endif // MAPPINGTREEMODEL_H
diff --git a/mappingtreewidget.cpp b/mappingtreewidget.cpp
index 82a1490..92366e0 100644
--- a/mappingtreewidget.cpp
+++ b/mappingtreewidget.cpp
@@ -92,7 +92,7 @@ MappingTreeWidget::MappingTreeWidget(QWidget *parent) : QWidget(parent){
}
MappingData MappingTreeWidget::selectedItem() const {
- MappingData retval = { -1, QString(), QStringList() };
+ MappingData retval = { -1, QString(), QList<QStringList>() };
QModelIndex sel = selected();
if(!sel.isValid()){
return retval;
diff --git a/picfilesmodel.cpp b/picfilesmodel.cpp
new file mode 100644
index 0000000..651ce32
--- /dev/null
+++ b/picfilesmodel.cpp
@@ -0,0 +1,219 @@
+/*
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version
+ 2 of the License, or (at your option) any later version.
+*/
+
+#include <QSqlQuery>
+#include <QFont>
+#include <QFile>
+#include <QLocale>
+
+#include "picfilesmodel.h"
+#include "smglobals.h"
+#include "smtreeitem.h"
+#include "helper.h"
+
+PicFilesModel::PicFilesModel(const QStringList &headers, QObject *parent) : SmTreeModel(headers, parent) {
+ //conjure up model
+ mMappingTreeModel = static_cast<MappingTreeModel*>(SmGlobals::instance()->model("MappingTree"));
+
+ //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_mappings2 WHERE pics_mappings2.imappings_parents_id IN (%1) AND pics_mappings2.ipics_id = pics.ipicsid ORDER BY pics.tfilename");
+ mMappingsQS = QString("SELECT DISTINCT(pics_mappings2.imappings_parents_id) FROM pics_mappings2, pics WHERE pics_mappings2.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_mappings2 WHERE ipics_id = :id");
+ mAddMappingsQ = new QSqlQuery(mDb);
+ mAddMappingsQ->prepare("INSERT INTO pics_mappings2(ipics_id, imappings_parents_id) VALUES(:pid, :id)");
+
+}
+
+PicFilesModel::~PicFilesModel(){
+ delete mDeleteFileQ;
+ delete mDeleteMappingsQ;
+ delete mAddMappingsQ;
+ mDb = QSqlDatabase::database();
+}
+
+void PicFilesModel::setMapping(int pMapId){
+ QList<QVariant> ids = mMappingTreeModel->childList(pMapId, MappingTreeModel::MapParentId);
+ mMappingIds.clear();
+ foreach(QVariant i, ids){
+ mMappingIds << i.toInt();
+ }
+}
+
+QVariant PicFilesModel::data(const QModelIndex &index, int role) const {
+ if(role == Qt::FontRole){
+ if(index.column() == Md5Sum){
+ return QFont("courier");
+ }
+ }
+ if(role == Qt::ForegroundRole){
+ if(index.column() == SizeDisplay){
+ int fileSize = index.data(SizeRole).toInt();
+ if(fileSize > 1024 * 1024 * 1024){
+ return QColor(Qt::red);
+ }else{
+ return QColor(Qt::green);
+ }
+ }
+ }
+ SmTreeItem *item = itemAt(index);
+ if(role == FileNameRole){
+ return item->data(FileName);
+ }
+ if(role == SizeRole){
+ return item->data(Size);
+ }
+ if(role == MimeTypeRole){
+ return item->data(MimeType);
+ }
+ if(role == FullPathRole){
+ return item->data(FullPath);
+ }
+ if(role == IdRole){
+ return item->data(Id);
+ }
+ if(role == AddedRole){
+ return item->data(Added);
+ }
+ if(role == Md5SumRole){
+ return item->data(Md5Sum);
+ }
+ if(role == SizeDisplayRole){
+ return item->data(SizeDisplay);
+ }
+ return SmTreeModel::data(index, role);
+}
+
+QList<QVariant> PicFilesModel::dataList(const QModelIndex &idx) const{
+ QList<QVariant> retval;
+ if(!idx.isValid()){
+ return retval;
+ }
+ SmTreeItem *item = itemAt(idx);
+ for(int i = 0; i < NumFields; ++i){
+ retval << item->data(i);
+ }
+ QList<MappingData> mapData = mappingDataFromFile(idx.data(PicFilesModel::IdRole).toInt());
+ QList<QStringList> mappings;
+ foreach(MappingData d, mapData){
+ mappings << d.path;
+ }
+
+ retval.append(QVariant::fromValue(mappings));
+ return retval;
+}
+
+QList<QList<QVariant> > PicFilesModel::allFiles() const {
+ QList<QList<QVariant> > retval;
+ //assume depth of exactly 1
+ SmTreeItem *rootItem = root();
+ for(int i = 0; i < rootItem->childCount(); ++i){
+ SmTreeItem *cur = rootItem->child(i);
+ QList<QVariant> data;
+ for(int j = 0; j < cur->columnCount(); ++j){
+ data << cur->data(j);
+ }
+ retval << data;
+ }
+ 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());
+ }
+ }
+}
+
+bool PicFilesModel::changeMappings(const QList<int> &fileIds, const QList<int> &mappingIds){
+ mDb.transaction();
+ foreach(int fid, fileIds){
+ mDeleteMappingsQ->bindValue(":id", fid);
+ if(!mDeleteMappingsQ->exec()){
+ goto error;
+ }
+ foreach(int mid, mappingIds){
+ mAddMappingsQ->bindValue(":pid", fid);
+ mAddMappingsQ->bindValue(":id", mid);
+ if(!mAddMappingsQ->exec()){
+ goto error;
+ }
+ }
+ }
+ mDb.commit();
+ return true;
+
+ error:
+ mDb.rollback();
+ return false;
+}
+
+QList<MappingData> PicFilesModel::mappingDataFromFile(int fileId) const{
+ QList<int> d = QList<int>() << fileId;
+ return mappingDataFromFiles(d);
+}
+
+QList<MappingData> PicFilesModel::mappingDataFromFiles(const QList<int> fileIds) const{
+ QList<int> parentIds = mappingPIdsFromFiles(fileIds);
+ if(parentIds.isEmpty()){
+ return QList<MappingData>();
+ }
+ QList<MappingData> retval;
+ foreach(int pId, parentIds){
+ QModelIndex curIdx = mMappingTreeModel->findRecursive(pId, MappingTreeModel::MapParentId, mMappingTreeModel->rootIndex());
+ MappingData curData;
+ curData.id = curIdx.data(MappingTreeModel::MapParentIdRole).toInt();
+ curData.name = curIdx.data(MappingTreeModel::NameRole).toString();
+ curData.path << mMappingTreeModel->path(curIdx); //.join("/");
+ retval << curData;
+ }
+ return retval;
+}
+
+QList<int> PicFilesModel::mappingPIdsFromFiles(QList<int> fileIds) const{
+ if(fileIds.isEmpty()){
+ return QList<int>();
+ }
+ QStringList idList;
+ foreach(int id, fileIds){
+ idList << QString::number(id);
+ }
+ QString query = mMappingsQS.arg(idList.join(","));
+ QSqlQuery q(query, mDb);
+ QList<int> retval;
+ while(q.next()){
+ retval << q.value(0).toInt();
+ }
+ return retval;
+}
+
+void PicFilesModel::populate(){
+ SmTreeItem *root = new SmTreeItem(NumFields);
+ QStringList idList;
+ foreach(int id, mMappingIds){
+ idList << QString::number(id);
+ }
+ QString query = mPopulateQS.arg(idList.join(","));
+ QSqlQuery q(query, mDb);
+ while(q.next()){
+ QList<QVariant> data;
+ 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
+ SmTreeItem *child = new SmTreeItem(data, root);
+ root->appendChild(child);
+ }
+ setRoot(root);
+}
diff --git a/picfilesmodel.h b/picfilesmodel.h
new file mode 100644
index 0000000..146fbfc
--- /dev/null
+++ b/picfilesmodel.h
@@ -0,0 +1,49 @@
+/*
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version
+ 2 of the License, or (at your option) any later version.
+*/
+
+#ifndef PICFILESMODEL_H
+#define PICFILESMODEL_H
+
+#include "smtreemodel.h"
+#include "mappingtreemodel.h"
+
+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 { NumFields = 8 };
+ explicit PicFilesModel(const QStringList &headers, QObject *parent = 0);
+ ~PicFilesModel();
+ void setMapping(int pMapId);
+
+ //some data
+ Qt::ItemFlags flags(const QModelIndex &) const { return Qt::ItemIsEnabled | Qt::ItemIsSelectable; }
+ 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);
+ bool changeMappings(const QList<int> &fileIds, const QList<int> &mappingIds);
+ QList<MappingData> mappingDataFromFile(int fileId) const;
+ QList<MappingData> mappingDataFromFiles(const QList<int> fileIds) const;
+
+ public slots:
+ void populate();
+
+ private:
+ QList<int> mappingPIdsFromFiles(QList<int> fileIds) const;
+ QSqlDatabase mDb;
+ MappingTreeModel *mMappingTreeModel;
+ QString mPopulateQS;
+ QString mMappingsQS;
+ QSqlQuery *mDeleteFileQ;
+ QSqlQuery *mDeleteMappingsQ;
+ QSqlQuery *mAddMappingsQ;
+ QList<int> mMappingIds;
+};
+
+#endif // PICFILESMODEL_H
diff --git a/pictureswidget.cpp b/pictureswidget.cpp
index 745a133..661aba6 100644
--- a/pictureswidget.cpp
+++ b/pictureswidget.cpp
@@ -21,6 +21,7 @@
#include <QSettings>
#include "pictureswidget.h"
+#include "picfilesmodel.h"
#include "mappingtreewidget.h"
#include "smtreeitem.h"
#include "helper.h"
@@ -62,7 +63,7 @@ void PicturesWidget::showPicViewer(bool toggled){
void PicturesWidget::writeSettings(){
QSettings s;
MappingData selected = mMappingTree->selectedItem();
- s.setValue("ui/selectedmapping", selected.path);
+ s.setValue("ui/selectedmapping", selected.path.first());
}
void PicturesWidget::readSettings(){
@@ -99,7 +100,7 @@ void PicturesWidget::constructWindowTitle(){
QString windowTitle = mWindowTitleBase;
MappingData selected = mMappingTree->selectedItem();
if(selected.id != -1){
- windowTitle = QString("%1 - [%2]").arg(mWindowTitleBase).arg(selected.path.join("/"));
+ windowTitle = QString("%1 - [%2]").arg(mWindowTitleBase).arg(selected.path.first().join("/"));
mPictureView->setHoverWinVisible(false);
}
emit needWindowTitleChange(windowTitle);
@@ -120,7 +121,7 @@ void PicturesWidget::showInPicViewer(const QModelIndex &idx){
PictureView::PictureView(QWidget *parent) : QTreeView(parent) {
//setup models
- mModel = new PicFilesModel(QStringList() << tr("Filename") << tr("SizeNum") << tr("Format") << tr("Full Path") << tr("Id") << tr("Added") << tr("Md5Sum") << tr("Size"), this);
+ mModel = static_cast<PicFilesModel*>(SmGlobals::instance()->model("PicFiles"));
mProxy = new QSortFilterProxyModel(this);
mProxy->setSourceModel(mModel);
setModel(mProxy);
@@ -269,194 +270,3 @@ void PictureView::selectedFilesChanged(){
emit numSelected(sel.size());
emit selectedSize(selSize);
}
-
-PicFilesModel::PicFilesModel(const QStringList &headers, QObject *parent) : SmTreeModel(headers, parent) {
- //conjure up model
- mMappingTreeModel = static_cast<MappingTreeModel*>(SmGlobals::instance()->model("MappingTree"));
-
- //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_mappings2 WHERE pics_mappings2.imappings_parents_id IN (%1) AND pics_mappings2.ipics_id = pics.ipicsid ORDER BY pics.tfilename");
- mMappingsQS = QString("SELECT DISTINCT(pics_mappings2.imappings_parents_id) FROM pics_mappings2, pics WHERE pics_mappings2.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_mappings2 WHERE ipics_id = :id");
- mAddMappingsQ = new QSqlQuery(mDb);
- mAddMappingsQ->prepare("INSERT INTO pics_mappings2(ipics_id, imappings_parents_id) VALUES(:pid, :id)");
-
-}
-
-PicFilesModel::~PicFilesModel(){
- delete mDeleteFileQ;
- delete mDeleteMappingsQ;
- delete mAddMappingsQ;
- mDb = QSqlDatabase::database();
-}
-
-void PicFilesModel::setMapping(int pMapId){
- QList<QVariant> ids = mMappingTreeModel->childList(pMapId, MappingTreeModel::MapParentId);
- mMappingIds.clear();
- foreach(QVariant i, ids){
- mMappingIds << i.toInt();
- }
-}
-
-QVariant PicFilesModel::data(const QModelIndex &index, int role) const {
- if(role == Qt::FontRole){
- if(index.column() == Md5Sum){
- return QFont("courier");
- }
- }
- if(role == Qt::ForegroundRole){
- if(index.column() == SizeDisplay){
- int fileSize = index.data(SizeRole).toInt();
- if(fileSize > 1024 * 1024 * 1024){
- return QColor(Qt::red);
- }else{
- return QColor(Qt::green);
- }
- }
- }
- SmTreeItem *item = itemAt(index);
- if(role == FileNameRole){
- return item->data(FileName);
- }
- if(role == SizeRole){
- return item->data(Size);
- }
- if(role == MimeTypeRole){
- return item->data(MimeType);
- }
- if(role == FullPathRole){
- return item->data(FullPath);
- }
- if(role == IdRole){
- return item->data(Id);
- }
- if(role == AddedRole){
- return item->data(Added);
- }
- if(role == Md5SumRole){
- return item->data(Md5Sum);
- }
- if(role == SizeDisplayRole){
- return item->data(SizeDisplay);
- }
- return SmTreeModel::data(index, role);
-}
-
-QList<QVariant> PicFilesModel::dataList(const QModelIndex &idx) const{
- QList<QVariant> retval;
- if(!idx.isValid()){
- return retval;
- }
- SmTreeItem *item = itemAt(idx);
- for(int i = 0; i < NumFields; ++i){
- retval << item->data(i);
- }
- return retval;
-}
-
-QList<QList<QVariant> > PicFilesModel::allFiles() const {
- QList<QList<QVariant> > retval;
- //assume depth of exactly 1
- SmTreeItem *rootItem = root();
- for(int i = 0; i < rootItem->childCount(); ++i){
- SmTreeItem *cur = rootItem->child(i);
- QList<QVariant> data;
- for(int j = 0; j < cur->columnCount(); ++j){
- data << cur->data(j);
- }
- retval << data;
- }
- 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());
- }
- }
-}
-
-bool PicFilesModel::changeMappings(const QList<int> &fileIds, const QList<int> &mappingIds){
- mDb.transaction();
- foreach(int fid, fileIds){
- mDeleteMappingsQ->bindValue(":id", fid);
- if(!mDeleteMappingsQ->exec()){
- goto error;
- }
- foreach(int mid, mappingIds){
- mAddMappingsQ->bindValue(":pid", fid);
- mAddMappingsQ->bindValue(":id", mid);
- if(!mAddMappingsQ->exec()){
- goto error;
- }
- }
- }
- mDb.commit();
- return true;
-
- error:
- mDb.rollback();
- return false;
-}
-
-QList<MappingData> PicFilesModel::mappingDataFromFiles(const QList<int> fileIds) const{
- QList<int> parentIds = mappingPIdsFromFiles(fileIds);
- if(parentIds.isEmpty()){
- return QList<MappingData>();
- }
- QList<MappingData> retval;
- foreach(int pId, parentIds){
- QModelIndex curIdx = mMappingTreeModel->findRecursive(pId, MappingTreeModel::MapParentId, mMappingTreeModel->rootIndex());
- MappingData curData;
- curData.id = curIdx.data(MappingTreeModel::MapParentIdRole).toInt();
- curData.name = curIdx.data(MappingTreeModel::NameRole).toString();
- curData.path = mMappingTreeModel->path(curIdx);
- retval << curData;
- }
- return retval;
-}
-
-QList<int> PicFilesModel::mappingPIdsFromFiles(QList<int> fileIds) const{
- if(fileIds.isEmpty()){
- return QList<int>();
- }
- QStringList idList;
- foreach(int id, fileIds){
- idList << QString::number(id);
- }
- QString query = mMappingsQS.arg(idList.join(","));
- QSqlQuery q(query, mDb);
- QList<int> retval;
- while(q.next()){
- retval << q.value(0).toInt();
- }
- return retval;
-}
-
-void PicFilesModel::populate(){
- SmTreeItem *root = new SmTreeItem(NumFields);
- QStringList idList;
- foreach(int id, mMappingIds){
- idList << QString::number(id);
- }
- QString query = mPopulateQS.arg(idList.join(","));
- QSqlQuery q(query, mDb);
- while(q.next()){
- QList<QVariant> data;
- 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
- SmTreeItem *child = new SmTreeItem(data, root);
- root->appendChild(child);
- }
- setRoot(root);
-}
diff --git a/pictureswidget.h b/pictureswidget.h
index b2da8ea..9618e6e 100644
--- a/pictureswidget.h
+++ b/pictureswidget.h
@@ -103,38 +103,4 @@ class PictureView : public QTreeView {
MappingTreeModel *mMappingTreeModel;
};
-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 { NumFields = 8 };
- explicit PicFilesModel(const QStringList &headers, QObject *parent = 0);
- ~PicFilesModel();
- void setMapping(int pMapId);
-
- //some data
- Qt::ItemFlags flags(const QModelIndex &) const { return Qt::ItemIsEnabled | Qt::ItemIsSelectable; }
- 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);
- bool changeMappings(const QList<int> &fileIds, const QList<int> &mappingIds);
- QList<MappingData> mappingDataFromFiles(const QList<int> fileIds) const;
-
- public slots:
- void populate();
-
- private:
- QList<int> mappingPIdsFromFiles(QList<int> fileIds) const;
- QSqlDatabase mDb;
- MappingTreeModel *mMappingTreeModel;
- QString mPopulateQS;
- QString mMappingsQS;
- QSqlQuery *mDeleteFileQ;
- QSqlQuery *mDeleteMappingsQ;
- QSqlQuery *mAddMappingsQ;
- QList<int> mMappingIds;
-};
-
#endif // PICTURESWIDGET_H
diff --git a/pictureviewer2.cpp b/pictureviewer2.cpp
index 36701ff..ae18a0c 100644
--- a/pictureviewer2.cpp
+++ b/pictureviewer2.cpp
@@ -14,9 +14,9 @@
#include <QContextMenuEvent>
#include <QMenu>
#include <QTimer>
+#include <QDateTime>
#include <QPainter>
#include <QStyleOptionGraphicsItem>
-#include <QDate>
#include <QSettings>
#include <QTextDocument>
#include <QTextCursor>
@@ -29,6 +29,7 @@
#include <QMessageBox>
#include "pictureviewer2.h"
+#include "picfilesmodel.h"
#include "pictureswidget.h"
#include "smglobals.h"
#include "mappingtreemodel.h"
@@ -52,6 +53,10 @@ PictureViewer2::PictureViewer2(QWidget *parent) : QGraphicsView(parent), mCur(0)
mSlideTimer = new QTimer(this);
connect(mSlideTimer, SIGNAL(timeout()), this, SLOT(next()));
+ //models
+ mMappingTreeModel = static_cast<MappingTreeModel*>(SmGlobals::instance()->model("MappingTree"));
+ mPicFilesModel = static_cast<PicFilesModel*>(SmGlobals::instance()->model("PicFiles"));
+
//setup gui
mScene = new QGraphicsScene(this);
setScene(mScene);
@@ -306,15 +311,18 @@ void PictureViewer2::constructInfoItem(const PicData &data, QSize picSize){
mScene->addItem(mFnItem);
}
-//FIXME!
void PictureViewer2::constructMappingItem(const PicData &file){
- MappingTreeModel *mappingModel = static_cast<MappingTreeModel*>(SmGlobals::instance()->model("MappingTree"));
- QList<QVariant> mappings = mappingModel->mappingsForFile(file.at(PicFilesModel::Id));
+ QList<MappingData> mapData = mPicFilesModel->mappingDataFromFile(file.at(PicFilesModel::Id).toInt());
+ QList<QStringList> mappings;
+ foreach(MappingData d, mapData){
+ mappings << d.path;
+ }
QStringList mappingPaths;
- foreach(QVariant mId, mappings){
- mappingPaths << mappingModel->mappingDataFromId(mId.toInt()).path.join("/");
+ foreach(QStringList l, mappings){
+ mappingPaths << l.join("/");
}
- SmTreeItem *mappingTree = mappingModel->treeFromPaths(mappingPaths);
+
+ SmTreeItem *mappingTree = mMappingTreeModel->treeFromPaths(mappingPaths);
if(mappingTree){
if(mMappingItem){
mMappingPos = mMappingItem->scenePos();
@@ -352,26 +360,29 @@ QTextDocument *PictureViewer2::treeToString(const SmTreeItem *root) const{
retval->setIndentWidth(2);
retval->setDocumentMargin(8);
QTextCursor *cursor = new QTextCursor(retval);
- treeToStringRecursive(root, cursor, 0);
+ for(int i = 0; i < root->childCount(); ++i){
+ treeToStringRecursive(root->child(i), cursor, 0);
+ QTextBlockFormat fmt;
+ fmt.setIndent(0);
+ cursor->insertBlock(fmt);
+ }
return retval;
}
void PictureViewer2::treeToStringRecursive(const SmTreeItem *parent, QTextCursor *cursor, int indent) const{
+ QChar bullet(0x2640);
+ if(indent % 2){
+ bullet = QChar(0x2642);
+ }
+ cursor->insertText(QString("%1 %2").arg(bullet).arg(parent->data(0).toString()));
+ if(parent->childCount()){
+ indent++;
+ }
for(int i = 0; i < parent->childCount(); ++i){
QTextBlockFormat fmt;
fmt.setIndent(indent * 5);
- //to prevent a stupid empty line with a <br />...
- if(indent > 0){
- cursor->insertBlock(fmt);
- }
- QChar bullet(0x2640);
- if(indent % 2){
- bullet = QChar(0x2642);
- }
- cursor->insertText(QString("%1 %2").arg(bullet).arg(parent->child(i)->data(0).toString()));
- if(parent->child(i)->childCount()){
- treeToStringRecursive(parent->child(i), cursor, indent + 1);
- }
+ cursor->insertBlock(fmt);
+ treeToStringRecursive(parent->child(i), cursor, indent);
}
}
diff --git a/pictureviewer2.h b/pictureviewer2.h
index d9fec03..e245224 100644
--- a/pictureviewer2.h
+++ b/pictureviewer2.h
@@ -25,6 +25,7 @@ class PictureViewer2Item;
class QGraphicsItem;
class SmTreeItem;
class MappingTreeModel;
+class PicFilesModel;
typedef QList<QVariant> PicData;
typedef QList<QList<QVariant> > PicDataList;
@@ -88,6 +89,8 @@ class PictureViewer2 : public QGraphicsView {
QPointF mMappingPos;
QAction *mSlideA;
QAction *mHideA;
+ MappingTreeModel *mMappingTreeModel;
+ PicFilesModel *mPicFilesModel;
};
class PictureViewer2Item : public QGraphicsItem {
diff --git a/shemov.pro b/shemov.pro
index 846e533..adf6f6c 100644
--- a/shemov.pro
+++ b/shemov.pro
@@ -39,7 +39,8 @@ SOURCES = main.cpp \
mappingtreewidget.cpp \
newpicsdialog.cpp \
pictureswidget.cpp \
- pictureviewer2.cpp
+ pictureviewer2.cpp \
+ picfilesmodel.cpp
HEADERS = \
filesystemdirproxy.h \
filesystemwidget.h \
@@ -74,6 +75,7 @@ HEADERS = \
mappingtreewidget.h \
newpicsdialog.h \
pictureswidget.h \
- pictureviewer2.h
+ pictureviewer2.h \
+ picfilesmodel.h
LIBS += -lmagic -lXfixes -lX11
RESOURCES = shemov.qrc
diff --git a/smglobals.cpp b/smglobals.cpp
index 93ec72e..c435a2c 100644
--- a/smglobals.cpp
+++ b/smglobals.cpp
@@ -28,6 +28,7 @@
#include "seriesmetadatamodel.h"
#include "mappingtreemodel.h"
#include "pictureviewer2.h"
+#include "picfilesmodel.h"
#include "configurationdialog.h"
SmGlobals *SmGlobals::mInstance = 0;
@@ -98,6 +99,12 @@ QAbstractItemModel *SmGlobals::model(const QString &which){
MappingTreeModel *model = new MappingTreeModel(headers);
mModels.insert(which, model);
}
+ }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");
+ PicFilesModel *model = new PicFilesModel(headers);
+ mModels.insert(which, model);
+ }
}
return mModels.contains(which) ? mModels.value(which) : 0;
}