diff --git a/src/contentmanager.cpp b/src/contentmanager.cpp index f24d029..8109294 100644 --- a/src/contentmanager.cpp +++ b/src/contentmanager.cpp @@ -12,6 +12,8 @@ #include #include #include "contentmanagermodel.h" +#include +#include ContentManager::ContentManager(Library* library, kiwix::Downloader* downloader, QObject *parent) : QObject(parent), @@ -23,14 +25,46 @@ ContentManager::ContentManager(Library* library, kiwix::Downloader* downloader, // so, we don't need to delete it. mp_view = new ContentManagerView(); auto managerModel = new ContentManagerModel(); + const auto booksList = getBooksList(); + managerModel->setBooksData(booksList); mp_view->setModel(managerModel); mp_view->show(); setCurrentLanguage(QLocale().name().split("_").at(0)); connect(mp_library, &Library::booksChanged, this, [=]() {emit(this->booksChanged());}); connect(this, &ContentManager::filterParamsChanged, this, &ContentManager::updateLibrary); + connect(this, &ContentManager::booksChanged, this, [=]() { + const auto nBookList = getBooksList(); + managerModel->setBooksData(nBookList); + }); connect(&m_remoteLibraryManager, &OpdsRequestManager::requestReceived, this, &ContentManager::updateRemoteLibrary); } +QList> ContentManager::getBooksList() +{ + const auto bookIds = getBookIds(); + QList> bookList; + QStringList keys = {"title", "tags", "date", "id", "size"}; + auto app = KiwixApp::instance(); + std::shared_ptr archive; + QIcon bookIcon; + for (auto bookId : bookIds) { + try { + archive = app->getLibrary()->getArchive(bookId); + std::string favicon, _mimetype; + auto item = archive->getIllustrationItem(48); + favicon = item.getData(); + _mimetype = item.getMimetype(); + QPixmap pixmap; + pixmap.loadFromData((const uchar*)favicon.data(), favicon.size()); + bookIcon = QIcon(pixmap); + } catch (std::out_of_range& e) {} + auto mp = getBookInfos(bookId, keys); + mp["icon"] = bookIcon; + bookList.append(mp); + } + return bookList; +} + void ContentManager::setLocal(bool local) { if (local == m_local) { return; diff --git a/src/contentmanager.h b/src/contentmanager.h index 0852291..b3b58fd 100644 --- a/src/contentmanager.h +++ b/src/contentmanager.h @@ -43,6 +43,7 @@ private: QStringList getBookIds(); void eraseBookFilesFromComputer(const QString dirPath, const QString filename); + QList> getBooksList(); signals: void filterParamsChanged(); diff --git a/src/contentmanagermodel.cpp b/src/contentmanagermodel.cpp index ec5bfee..8f4df44 100644 --- a/src/contentmanagermodel.cpp +++ b/src/contentmanagermodel.cpp @@ -10,9 +10,6 @@ ContentManagerModel::ContentManagerModel(QObject *parent) : QAbstractItemModel(parent) { - rootNode = new Node({tr("Icon"), tr("Name"), tr("Date"), tr("Size"), tr("Content Type"), tr("Download")}); - auto childNode = new Node({"someIcon", "test name", "test date", "test size", "test content", "download link"}, rootNode); - rootNode->appendChild(childNode); } ContentManagerModel::~ContentManagerModel() @@ -83,7 +80,8 @@ QModelIndex ContentManagerModel::parent(const QModelIndex &index) const int ContentManagerModel::rowCount(const QModelIndex &parent) const { - return 5; + Q_UNUSED(parent); + return m_data.size(); } QVariant ContentManagerModel::headerData(int section, Qt::Orientation orientation, int role) const @@ -101,3 +99,43 @@ QVariant ContentManagerModel::headerData(int section, Qt::Orientation orientatio default: return QVariant(); } } + +void ContentManagerModel::setBooksData(const QList>& data) +{ + m_data = data; + rootNode = new Node({tr("Icon"), tr("Name"), tr("Date"), tr("Size"), tr("Content Type"), tr("Download")}); + setupNodes(); + emit dataChanged(QModelIndex(), QModelIndex()); +} + +QString convertToUnits(QString size) +{ + QStringList units = {"bytes", "KB", "MB", "GB", "TB", "PB", "EB"}; + int unitIndex = 0; + auto bytes = size.toDouble(); + while (bytes >= 1024 && unitIndex < units.size()) { + bytes /= 1024; + unitIndex++; + } + + const auto preciseBytes = QString::number(bytes, 'g', 3); + return preciseBytes + units[unitIndex]; +} + +void ContentManagerModel::setupNodes() +{ + beginResetModel(); + for (auto bookItem : m_data) { + auto name = bookItem["title"].toString(); + auto date = bookItem["date"].toString(); + auto size = convertToUnits(bookItem["size"].toString()); + auto content = bookItem["tags"].toString(); + auto id = bookItem["id"].toString(); + auto description = bookItem["description"].toString(); + auto icon = bookItem["icon"]; + const auto temp = new Node({icon, name, date, size, content, id}, rootNode); + rootNode->appendChild(temp); + } + endResetModel(); +} + diff --git a/src/contentmanagermodel.h b/src/contentmanagermodel.h index da45b63..9241c82 100644 --- a/src/contentmanagermodel.h +++ b/src/contentmanagermodel.h @@ -24,8 +24,11 @@ public: QModelIndex parent(const QModelIndex &index) const override; int rowCount(const QModelIndex &parent = QModelIndex()) const override; int columnCount(const QModelIndex &parent = QModelIndex()) const override; + void setBooksData(const QList>& data); + void setupNodes(); private: + QList> m_data; Node *rootNode; };