diff --git a/src/kiwixapp.cpp b/src/kiwixapp.cpp index 4b33e7e..8dd965e 100644 --- a/src/kiwixapp.cpp +++ b/src/kiwixapp.cpp @@ -275,6 +275,10 @@ bool KiwixApp::isCurrentArticleBookmarked() void KiwixApp::setMonitorDir(const QString &dir) { m_settingsManager.setMonitorDir(dir); + m_library.setMonitorDirZims(QStringList()); + if (dir != "") { + m_library.asyncLoadMonitorDir(dir); + } } #define CREATE_ACTION(ID, TEXT) \ diff --git a/src/library.cpp b/src/library.cpp index 1ece08a..793aca5 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -5,6 +5,8 @@ #include #include +#include + class LibraryManipulator: public kiwix::LibraryManipulator { public: @@ -123,6 +125,45 @@ void Library::save() m_library.writeBookmarksToFile(kiwix::appendToDirectory(m_libraryDirectory.toStdString(), "library.bookmarks.xml")); } +void Library::setMonitorDirZims(QStringList zimList) +{ + m_monitorDirZims = zimList; +} + +void Library::loadMonitorDir(QString monitorDir) +{ + QMutex mutex; + QMutexLocker locker(&mutex); + const QDir dir(monitorDir); + QStringList newDirEntries = dir.entryList({"*.zim"}); + for (auto &str : newDirEntries) { + str = monitorDir + QDir::separator() + str; + } + QSet newDir = QSet::fromList(newDirEntries); + QStringList oldDirEntries = m_monitorDirZims; + QSet oldDir = QSet::fromList(oldDirEntries); + QStringList addedZims = (newDir - oldDir).values(); + QStringList removedZims = (oldDir - newDir).values(); + setMonitorDirZims(newDir.values()); + auto manipulator = LibraryManipulator(this); + auto manager = kiwix::Manager(&manipulator); + for (auto book : addedZims) { + manager.addBookFromPath(book.toStdString()); + } + for (auto bookPath : removedZims) { + removeBookFromLibraryById(QString::fromStdString(m_library.getBookByPath(bookPath.toStdString()).getId())); + } + emit(booksChanged()); + save(); +} + +void Library::asyncLoadMonitorDir(QString dir) +{ + QtConcurrent::run( [=]() { + loadMonitorDir(dir); + }); +} + const kiwix::Book &Library::getBookById(QString id) const { return m_library.getBookById(id.toStdString()); diff --git a/src/library.h b/src/library.h index 109f297..8446dee 100644 --- a/src/library.h +++ b/src/library.h @@ -33,11 +33,15 @@ public: QStringList getBookIds() const; QStringList listBookIds(const kiwix::Filter& filter, kiwix::supportedListSortBy sortBy, bool ascending) const; const std::vector getBookmarks(bool onlyValidBookmarks = false) const { return m_library.getBookmarks(onlyValidBookmarks); } + QStringList getLibraryZimsFromDir(QString dir) const; + void setMonitorDirZims(QStringList zimList); void addBookToLibrary(kiwix::Book& book); void removeBookFromLibraryById(const QString& id); void addBookmark(kiwix::Bookmark& bookmark); void removeBookmark(const QString& zimId, const QString& url); void save(); + void loadMonitorDir(QString dir); + void asyncLoadMonitorDir(QString dir); kiwix::Library& getKiwixLibrary() { return m_library; } public slots: const kiwix::Book& getBookById(QString id) const; @@ -49,6 +53,7 @@ signals: private: kiwix::Library m_library; QString m_libraryDirectory; + QStringList m_monitorDirZims; friend class LibraryManipulator; };