summaryrefslogtreecommitdiffstats
path: root/mappingtreemodel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'mappingtreemodel.cpp')
-rw-r--r--mappingtreemodel.cpp45
1 files changed, 45 insertions, 0 deletions
diff --git a/mappingtreemodel.cpp b/mappingtreemodel.cpp
index 42c1380..ce96ff4 100644
--- a/mappingtreemodel.cpp
+++ b/mappingtreemodel.cpp
@@ -7,6 +7,7 @@
#include <QSqlDatabase>
#include <QSqlQuery>
+#include <QHash>
#include <algorithm>
@@ -43,6 +44,8 @@ MappingTreeModel::MappingTreeModel(QStringList &headers, QObject *parent) : SmTr
mUpdateParentQ->prepare("UPDATE mappings_parents SET iparent_id = :pid WHERE imapping_id = :id");
mDeleteMappingParentQ = new QSqlQuery(mDb);
mDeleteMappingParentQ->prepare("DELETE FROM mappings_parents WHERE imapping_id = :id");
+ mMappingsForFileIdQ = new QSqlQuery(mDb);
+ mMappingsForFileIdQ->prepare("SELECT DISTINCT(imapping_id) FROM pics_mappings WHERE ipics_id = :pid");
}
MappingTreeModel::~MappingTreeModel(){
@@ -57,6 +60,7 @@ MappingTreeModel::~MappingTreeModel(){
delete mAddParentQ;
delete mDeleteChildQ;
delete mUpdateParentQ;
+ delete mMappingsForFileIdQ;
mDb = QSqlDatabase();
}
@@ -87,6 +91,36 @@ QString MappingTreeModel::mappingTypeNameFromId(int id) const{
return QString();
}
+//caller has ownership of this item!
+SmTreeItem *MappingTreeModel::treeFromPaths(const QStringList &paths){
+ if(paths.isEmpty()){
+ return 0;
+ }
+ QHash<QString, SmTreeItem*> partsHash;
+ SmTreeItem *root = new SmTreeItem(1);
+ partsHash.insert(QString(), root);
+ SmTreeItem *pItem = root;
+
+ // create tree
+ for(int i = 0; i < paths.count(); ++i){
+ //split the paths
+ QStringList parts = paths.at(i).split(forbidden());
+ //process path items
+ for(int j = 0; j < parts.count(); ++j){
+ if(partsHash.contains(parts.at(j))){
+ pItem = partsHash.value(parts.at(j)); //we've already seen this item, set it as new parent
+ }else{
+ //create a new item, save old root
+ SmTreeItem *oldRoot = pItem;
+ pItem = new SmTreeItem(QList<QVariant>() << parts.at(j), oldRoot);
+ oldRoot->appendChild(pItem);
+ partsHash.insert(parts.at(j), pItem);
+ }
+ }
+ }
+ return root;
+}
+
QVariant MappingTreeModel::data(const QModelIndex &index, int role) const{
if(!index.isValid()){
return QVariant();
@@ -118,6 +152,17 @@ QList<QVariant> MappingTreeModel::childList(const QVariant &value, int column) c
return QList<QVariant>() << value;
}
+QList<QVariant> MappingTreeModel::mappingsForFile(const QVariant &fileId) const{
+ QList<QVariant> retval;
+ mMappingsForFileIdQ->addBindValue(fileId);
+ if(mMappingsForFileIdQ->exec()){
+ while(mMappingsForFileIdQ->next()){
+ retval << mMappingsForFileIdQ->value(0);
+ }
+ }
+ return retval;
+}
+
QModelIndex MappingTreeModel::indexFromPath(const QString &path, int column) const{
QStringList items = path.split("/");
if(items.isEmpty() || column >= NumFields){