diff --git a/YACReaderLibrary/db/folder_model.cpp b/YACReaderLibrary/db/folder_model.cpp index ba7fdcce..ca746621 100644 --- a/YACReaderLibrary/db/folder_model.cpp +++ b/YACReaderLibrary/db/folder_model.cpp @@ -53,11 +53,76 @@ void drawMacOSXFinishedFolderIcon() #define ROOT 1 -FolderItem *createRoot() +struct FolderColumns { + int name; + int path; + int finished; + int completed; + int id; + int parentId; + int numChildren; + int firstChildHash; + int customImage; + int type; + int added; + int updated; + + FolderColumns(QSqlQuery &sqlquery) + { + auto record = sqlquery.record(); + + name = record.indexOf("name"); + path = record.indexOf("path"); + finished = record.indexOf("finished"); + completed = record.indexOf("completed"); + id = record.indexOf("id"); + parentId = record.indexOf("parentId"); + numChildren = record.indexOf("numChildren"); + firstChildHash = record.indexOf("firstChildHash"); + customImage = record.indexOf("customImage"); + type = record.indexOf("type"); + added = record.indexOf("added"); + updated = record.indexOf("updated"); + } +}; + +QList folderDataFromQuery(QSqlQuery &query, const FolderColumns &columns) { - QList rootData; - rootData << "root"; - auto root = new FolderItem(rootData); + QList data; + + data << query.value(columns.name); + data << query.value(columns.path); + data << query.value(columns.finished); + data << query.value(columns.completed); + data << query.value(columns.numChildren); + data << query.value(columns.firstChildHash); + data << query.value(columns.customImage); + data << query.value(columns.type); + data << query.value(columns.added); + data << query.value(columns.updated); + + return data; +} + +// TODO: load from DB, type is pretty much needed +FolderItem *createRoot(QSqlDatabase &db) +{ + QList data; + + QSqlQuery selectQuery(db); + selectQuery.prepare("SELECT * FROM folder WHERE id = 1"); + selectQuery.exec(); + + auto columns = FolderColumns(selectQuery); + + if (!selectQuery.next()) { + return nullptr; + } + + data = folderDataFromQuery(selectQuery, columns); + data[0] = "root"; + + auto root = new FolderItem(data); root->id = ROOT; root->parentItem = nullptr; @@ -83,7 +148,7 @@ int FolderModel::columnCount(const QModelIndex &parent) const if (rootItem == nullptr) { return 0; } - return rootItem->columnCount(); + return 1; } } @@ -454,7 +519,7 @@ FolderModel::ModelData FolderModel::createModelData(const QString &path) const QSqlDatabase db = DataBaseManagement::loadDatabase(path); QSqlQuery selectQuery("select * from folder where id <> 1 order by parentId,name", db); - auto root = createRoot(); + auto root = createRoot(db); modelData = createModelData(selectQuery, root); connectionName = db.connectionName(); @@ -471,40 +536,14 @@ FolderModel::ModelData FolderModel::createModelData(QSqlQuery &sqlquery, FolderI // add parent to the lookup itemsLookup.insert(parent->id, parent); - QSqlRecord record = sqlquery.record(); - - int name = record.indexOf("name"); - int path = record.indexOf("path"); - int finished = record.indexOf("finished"); - int completed = record.indexOf("completed"); - int id = record.indexOf("id"); - int parentId = record.indexOf("parentId"); - int numChildren = record.indexOf("numChildren"); - int firstChildHash = record.indexOf("firstChildHash"); - int customImage = record.indexOf("customImage"); - int type = record.indexOf("type"); - int added = record.indexOf("added"); - int updated = record.indexOf("updated"); + auto columns = FolderColumns(sqlquery); while (sqlquery.next()) { - QList data; + auto item = new FolderItem(folderDataFromQuery(sqlquery, columns)); - data << sqlquery.value(name); - data << sqlquery.value(path); - data << sqlquery.value(finished); - data << sqlquery.value(completed); - data << sqlquery.value(numChildren); - data << sqlquery.value(firstChildHash); - data << sqlquery.value(customImage); - data << sqlquery.value(type); - data << sqlquery.value(added); - data << sqlquery.value(updated); - - auto item = new FolderItem(data); - - item->id = sqlquery.value(id).toULongLong(); + item->id = sqlquery.value(columns.id).toULongLong(); // la inserci�n de hijos se hace de forma ordenada - FolderItem *parent = itemsLookup.value(sqlquery.value(parentId).toULongLong()); + FolderItem *parent = itemsLookup.value(sqlquery.value(columns.parentId).toULongLong()); parent->appendChild(item); // se a�ade el item al map, de forma que se pueda encontrar como padre en siguientes iteraciones itemsLookup.insert(item->id, item); @@ -605,6 +644,35 @@ void FolderModel::updateFolderType(const QModelIndexList &list, YACReader::FileT emit dataChanged(index(list.first().row(), FolderModel::Name), index(list.last().row(), FolderModel::Updated)); } +void FolderModel::updateTreeType(YACReader::FileType type) +{ + QString connectionName = ""; + { + QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); + db.transaction(); + + auto item = rootItem; + + std::function setType; + setType = [&setType](FolderItem *item, YACReader::FileType type) -> void { + item->setData(FolderModel::Type, QVariant::fromValue(type)); + + for (auto child : item->children()) { + setType(child, type); + } + }; + + setType(item, type); + + if (!isSubfolder) { + DBHelper::updateDBType(db, type); + } + db.commit(); + connectionName = db.connectionName(); + } + QSqlDatabase::removeDatabase(connectionName); +} + QStringList FolderModel::getSubfoldersNames(const QModelIndex &mi) { QStringList result; diff --git a/YACReaderLibrary/db/folder_model.h b/YACReaderLibrary/db/folder_model.h index ee44d57c..a0f9801b 100644 --- a/YACReaderLibrary/db/folder_model.h +++ b/YACReaderLibrary/db/folder_model.h @@ -69,6 +69,7 @@ public: void updateFolderCompletedStatus(const QModelIndexList &list, bool status); void updateFolderFinishedStatus(const QModelIndexList &list, bool status); void updateFolderType(const QModelIndexList &list, YACReader::FileType type); + void updateTreeType(YACReader::FileType type); QStringList getSubfoldersNames(const QModelIndex &mi); FolderModel *getSubfoldersModel(const QModelIndex &mi); // it creates a model that contains just the direct subfolders @@ -112,7 +113,6 @@ public: }; bool isSubfolder; - public slots: void deleteFolder(const QModelIndex &mi); void updateFolderChildrenInfo(qulonglong folderId); diff --git a/YACReaderLibrary/db_helper.cpp b/YACReaderLibrary/db_helper.cpp index 32e53129..04c1add9 100644 --- a/YACReaderLibrary/db_helper.cpp +++ b/YACReaderLibrary/db_helper.cpp @@ -1668,6 +1668,21 @@ void DBHelper::updateFolderTreeType(qulonglong id, QSqlDatabase &db, YACReader:: } } +void DBHelper::updateDBType(QSqlDatabase &db, YACReader::FileType type) +{ + QSqlQuery updateFolderQuery(db); + updateFolderQuery.prepare("UPDATE folder " + "SET type = :type"); + updateFolderQuery.bindValue(":type", static_cast(type)); + updateFolderQuery.exec(); + + QSqlQuery updateComicInfo(db); + updateComicInfo.prepare("UPDATE comic_info " + "SET type = :type"); + updateComicInfo.bindValue(":type", static_cast(type)); + updateComicInfo.exec(); +} + Folder DBHelper::loadFolder(qulonglong id, QSqlDatabase &db) { QSqlQuery query(db); diff --git a/YACReaderLibrary/db_helper.h b/YACReaderLibrary/db_helper.h index a843572c..699bc59a 100644 --- a/YACReaderLibrary/db_helper.h +++ b/YACReaderLibrary/db_helper.h @@ -91,6 +91,7 @@ public: static QList