summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mappingtreemodel.cpp27
-rw-r--r--mappingtreemodel.h2
-rw-r--r--pictureswidget.cpp58
-rw-r--r--pictureswidget.h11
-rw-r--r--smtreemodel.cpp12
5 files changed, 77 insertions, 33 deletions
diff --git a/mappingtreemodel.cpp b/mappingtreemodel.cpp
index b2ca982..5ab6068 100644
--- a/mappingtreemodel.cpp
+++ b/mappingtreemodel.cpp
@@ -109,6 +109,15 @@ QVariant MappingTreeModel::data(const QModelIndex &index, int role) const{
return SmTreeModel::data(index, role);
}
+QList<QVariant> MappingTreeModel::childList(const QVariant &value, int column) const{
+ QModelIndex itemIdx = findRecursive(value, column, createIndex(0, 0, root()));
+ SmTreeItem *item = static_cast<SmTreeItem*>(itemIdx.internalPointer());
+ if(item->childCount()){
+ return getChildListRecursive(item, column);
+ }
+ return QList<QVariant>() << value;
+}
+
QModelIndex MappingTreeModel::indexFromPath(QString &path, int column) const{
QStringList items = path.split("/");
if(items.isEmpty() || column >= NumFields){
@@ -318,7 +327,8 @@ void MappingTreeModel::populate(){
SmTreeItem *rootItem = new SmTreeItem(NumFields);
SmTreeItem *firstChild = new SmTreeItem(NumFields, rootItem);
firstChild->setData(Name, mappingTypeNameFromId(mType));
- firstChild->setData(Id, mType);
+ //no real id needed... conflicts with mapping ids!
+ firstChild->setData(Id, 0);
rootItem->appendChild(firstChild);
//collect children recursive
while(mTypeParentsQ->next()){
@@ -379,6 +389,21 @@ QStringList MappingTreeModel::getPathsRecursive(SmTreeItem *parent) const{
return retval;
}
+QList<QVariant> MappingTreeModel::getChildListRecursive(SmTreeItem *item, int column) const{
+ QList<QVariant> retval;
+ if(!item){
+ return retval;
+ }
+ for(int i = 0; i < item->childCount(); ++i){
+ if(item->child(i)->childCount()){
+ retval << getChildListRecursive(item->child(i), column);
+ }else{
+ retval << item->child(i)->data(column);
+ }
+ }
+ return retval;
+}
+
QString MappingTreeModel::basePath(SmTreeItem *item) const{
QStringList pItems;
SmTreeItem *cur = item;
diff --git a/mappingtreemodel.h b/mappingtreemodel.h
index 411a0b2..50843ba 100644
--- a/mappingtreemodel.h
+++ b/mappingtreemodel.h
@@ -34,6 +34,7 @@ class MappingTreeModel : public SmTreeModel {
//data
QVariant data(const QModelIndex &index, int role) const;
+ QList<QVariant> childList(const QVariant &value, int column = 0) const;
QModelIndex indexFromPath(QString &path, int column = 0) const;
bool setData(const QModelIndex &index, const QVariant &value, int role);
void move(const QModelIndex &source, const QModelIndex &dest);
@@ -63,6 +64,7 @@ class MappingTreeModel : public SmTreeModel {
void getMappingTypes();
void getChildrenRecursive(SmTreeItem *item);
QStringList getPathsRecursive(SmTreeItem *parent) const;
+ QList<QVariant> getChildListRecursive(SmTreeItem *item, int column) const;
QString basePath(SmTreeItem *item) const;
int lowerBound(SmTreeItem *item, const QVariant &value, int column = 0) const;
QList<MappingData> mappingData(SmTreeItem *item);
diff --git a/pictureswidget.cpp b/pictureswidget.cpp
index 8492dd2..f274425 100644
--- a/pictureswidget.cpp
+++ b/pictureswidget.cpp
@@ -245,14 +245,14 @@ void PictureView::setFileMappings(){
}
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");
- mPopulateQ = new QSqlQuery(mDb);
- mPopulateQ->prepare("SELECT pics.tfilename, pics.isize, pics.tformat, pics.dtadded, pics.cmd5sum, pics.ipicsid FROM pics, pics_mappings WHERE pics_mappings.imapping_id = :mapid 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 FROM pics, pics_mappings WHERE pics_mappings.imapping_id IN (%1) AND pics_mappings.ipics_id = pics.ipicsid ORDER BY pics.tfilename");
mDeleteFileQ = new QSqlQuery(mDb);
mDeleteFileQ->prepare("DELETE FROM pics WHERE ipicsid = :id");
- mCurMappingIdsQ = new QSqlQuery(mDb);
- mCurMappingIdsQ->prepare("SELECT DISTINCT(pics_mappings.imapping_id) FROM pics_mappings, pics WHERE pics_mappings.ipics_id IN (SELECT ipicsid FROM pics, pics_mappings WHERE pics_mappings.imapping_id = :mid AND pics_mappings.ipics_id = pics.ipicsid)");
mCurMappingIdsQS = QString("SELECT DISTINCT(pics_mappings.imapping_id) FROM pics_mappings, pics WHERE pics_mappings.ipics_id IN (%1)");
mDeleteMappingsQ = new QSqlQuery(mDb);
mDeleteMappingsQ->prepare("DELETE FROM pics_mappings WHERE ipics_id = :id");
@@ -262,6 +262,22 @@ PicFilesModel::PicFilesModel(const QStringList &headers, QObject *parent) : SmTr
mAllFilesQ->prepare("SELECT pics.tfilename, pics.isize, pics.tformat, pics.dtadded, pics.cmd5sum, pics.ipicsid FROM pics");
}
+PicFilesModel::~PicFilesModel(){
+ delete mDeleteFileQ;
+ delete mDeleteMappingsQ;
+ delete mAddMappingsQ;
+ delete mAllFilesQ;
+ mDb = QSqlDatabase::database();
+}
+
+void PicFilesModel::setMapping(int mappingId){
+ QList<QVariant> ids = mMappingTreeModel->childList(mappingId, MappingTreeModel::Id);
+ mMappingIds.clear();
+ foreach(QVariant i, ids){
+ mMappingIds << i.toInt();
+ }
+}
+
QList<int> PicFilesModel::mappingIds(const QList<QVariant> &fileIds){
QList<int> retval;
QStringList ids;
@@ -384,23 +400,21 @@ bool PicFilesModel::changeMappings(const QList<int> &fileIds, const QList<int> &
void PicFilesModel::populate(){
SmTreeItem *root = new SmTreeItem(NumFields);
- mPopulateQ->bindValue(":mapid", mMappingId);
- if(mPopulateQ->exec()){
- while(mPopulateQ->next()){
- QList<QVariant> data;
- data << mPopulateQ->value(0) << mPopulateQ->value(1) << mPopulateQ->value(2); // Filename, size and Mime type
- data << Helper::createArchivePath(mPopulateQ->value(0).toString(), mPopulateQ->value(4).toString()); // full path;
- data << mPopulateQ->value(5) << mPopulateQ->value(3) << mPopulateQ->value(4); //Id, added and md5
- QLocale l;
- data << l.toString(mPopulateQ->value(1).toInt());
- SmTreeItem *child = new SmTreeItem(data, root);
- root->appendChild(child);
- }
- mCurMappingsIds.clear();
- mCurMappingIdsQ->bindValue(":mid", mMappingId);
- while(mCurMappingIdsQ->next()){
- mCurMappingsIds << mCurMappingIdsQ->value(0).toInt();
- }
- setRoot(root);
+ 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 40c1874..41df3b8 100644
--- a/pictureswidget.h
+++ b/pictureswidget.h
@@ -19,6 +19,7 @@ class PictureView;
class MappingTreeWidget;
class MappingEditWidget;
class MappingEditDialog;
+class MappingTreeModel;
class QSqlQuery;
class PicFilesModel;
class QSortFilterProxyModel;
@@ -103,7 +104,8 @@ class PicFilesModel : public SmTreeModel {
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);
- void setMapping(int mappingId) { mMappingId = mappingId; }
+ ~PicFilesModel();
+ void setMapping(int mappingId);
QList<int> mappingIds(const QList<QVariant> &fileIds);
//some data
@@ -119,15 +121,14 @@ class PicFilesModel : public SmTreeModel {
private:
QSqlDatabase mDb;
- QSqlQuery *mPopulateQ;
+ MappingTreeModel *mMappingTreeModel;
+ QString mPopulateQS;
QSqlQuery *mDeleteFileQ;
- QSqlQuery *mCurMappingIdsQ;
QSqlQuery *mDeleteMappingsQ;
QSqlQuery *mAddMappingsQ;
QSqlQuery *mAllFilesQ;
QString mCurMappingIdsQS;
- int mMappingId;
- QList<int> mCurMappingsIds;
+ QList<int> mMappingIds;
};
#endif // PICTURESWIDGET_H
diff --git a/smtreemodel.cpp b/smtreemodel.cpp
index 802eebc..7df30d3 100644
--- a/smtreemodel.cpp
+++ b/smtreemodel.cpp
@@ -145,21 +145,23 @@ QModelIndex SmTreeModel::find(const QVariant &value, int column, const QModelInd
QModelIndex SmTreeModel::findRecursive(const QVariant &value, int column, const QModelIndex &parent) const{
SmTreeItem *parentItem = 0;
if(!parent.isValid()){
- //return QModelIndex();
parentItem = mRootItem;
}else{
parentItem = static_cast<SmTreeItem*>(parent.internalPointer());
}
+ if(parentItem->data(column) == value){
+ return parent;
+ }
for(int i = 0; i < parentItem->childCount(); ++i){
SmTreeItem *child = parentItem->child(i);
+ if(child->data(column) == value){
+ return createIndex(i, column, child);
+ }
if(child->childCount()){
return findRecursive(value, column, createIndex(i, column, child));
}
- if(child->data(column) == value){
- return createIndex(i, column, child);
- }
}
- QModelIndex next = index(parent.row() + 1, column, parent.parent());
+ QModelIndex next = index(parent.row() + 1, column, parent.parent());
if(!next.isValid()){
return QModelIndex();
}