From 324ffbb32691e85530170eb1e4bf12f4cc17a602 Mon Sep 17 00:00:00 2001 From: Nikhil Tanwar <2002nikhiltanwar@gmail.com> Date: Thu, 3 Feb 2022 20:02:23 +0530 Subject: [PATCH 1/8] Improve const correctness in Library This makes getBookIds(), listBookIds(), and getBookmarks() const member functions --- src/library.cpp | 4 ++-- src/library.h | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/library.cpp b/src/library.cpp index 8ec5298..1ece08a 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -76,7 +76,7 @@ std::shared_ptr Library::getSearcher(const QString &zimId) return searcher; } -QStringList Library::getBookIds() +QStringList Library::getBookIds() const { QStringList list; for(auto& id: m_library.getBooksIds()) { @@ -85,7 +85,7 @@ QStringList Library::getBookIds() return list; } -QStringList Library::listBookIds(const kiwix::Filter& filter, kiwix::supportedListSortBy sortBy, bool ascending) +QStringList Library::listBookIds(const kiwix::Filter& filter, kiwix::supportedListSortBy sortBy, bool ascending) const { QStringList list; auto bookIds = m_library.filter(filter); diff --git a/src/library.h b/src/library.h index 1ebe779..109f297 100644 --- a/src/library.h +++ b/src/library.h @@ -30,9 +30,9 @@ public: QString openBookFromPath(const QString& zimPath); std::shared_ptr getReader(const QString& zimId); std::shared_ptr getSearcher(const QString& zimId); - QStringList getBookIds(); - QStringList listBookIds(const kiwix::Filter& filter, kiwix::supportedListSortBy sortBy, bool ascending); - const std::vector getBookmarks(bool onlyValidBookmarks = false) { return m_library.getBookmarks(onlyValidBookmarks); } + 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); } void addBookToLibrary(kiwix::Book& book); void removeBookFromLibraryById(const QString& id); void addBookmark(kiwix::Bookmark& bookmark); From 52ff3afaec62c84c4078d17d38eda4439d357a4b Mon Sep 17 00:00:00 2001 From: Nikhil Tanwar <2002nikhiltanwar@gmail.com> Date: Thu, 3 Feb 2022 20:06:12 +0530 Subject: [PATCH 2/8] Move getters in settingsmanager out of slots and make them const This changes the following getters: getKiwixServerPort() getKiwixServerIpAddress() getZoomFactor() getDownloadDir() --- src/settingsmanager.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/settingsmanager.h b/src/settingsmanager.h index d3f383c..2dd4a26 100644 --- a/src/settingsmanager.h +++ b/src/settingsmanager.h @@ -22,16 +22,16 @@ public: bool settingsExists(const QString &key); QVariant getSettings(const QString &key); qreal getZoomFactorByZimId(const QString &id); + int getKiwixServerPort() const { return m_kiwixServerPort; } + QString getKiwixServerIpAddress() const { return m_kiwixServerIpAddress; } + qreal getZoomFactor() const { return m_zoomFactor; } + QString getDownloadDir() const { return m_downloadDir; } public slots: void setKiwixServerPort(int port); - int getKiwixServerPort() { return m_kiwixServerPort; }; void setKiwixServerIpAddress(QString ipAddress); - QString getKiwixServerIpAddress() { return m_kiwixServerIpAddress; }; void setZoomFactor(qreal zoomFactor); - qreal getZoomFactor() { return m_zoomFactor; }; bool setDownloadDir(QString downloadDir); - QString getDownloadDir() { return m_downloadDir; } private: void initSettings(); From a887af01beab1b4c54a41c38a6f3df1ba7c6994c Mon Sep 17 00:00:00 2001 From: Nikhil Tanwar <2002nikhiltanwar@gmail.com> Date: Thu, 3 Feb 2022 20:39:43 +0530 Subject: [PATCH 3/8] Add generalised confirm function and use it in confirmDialogDownloadDir This adds a new method confirmDialog(QString, QString) as a generalised function for confirm boxes confirmDialogDownloadDir is changed to use this new method --- src/settingsview.cpp | 16 +++++++++++----- src/settingsview.h | 2 +- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/settingsview.cpp b/src/settingsview.cpp index c8d47b2..fac6806 100644 --- a/src/settingsview.cpp +++ b/src/settingsview.cpp @@ -24,19 +24,19 @@ SettingsView::SettingsView(QWidget *parent) ui->resetButton->setText(gt("reset")); ui->browseButton->setText(gt("browse")); } + void SettingsView::init(int zoomPercent, const QString &dir) { ui->zoomPercentSpinBox->setValue(zoomPercent); ui->downloadDirPath->setText(dir); } -bool SettingsView::confirmDialogDownloadDir(const QString& dir) + +bool SettingsView::confirmDialog( QString messageText, QString messageTitle) { - auto text = gt("download-dir-dialog-msg"); - text = text.replace("{{DIRECTORY}}", dir); QMessageBox msgBox( QMessageBox::Question, //Icon - gt("download-dir-dialog-title"), //Title - text, //Text + messageTitle, //Title + messageText, //Text QMessageBox::Ok | QMessageBox::Cancel //Buttons ); msgBox.setDefaultButton(QMessageBox::Ok); @@ -45,6 +45,12 @@ bool SettingsView::confirmDialogDownloadDir(const QString& dir) return (ret == QMessageBox::Ok); } +bool SettingsView::confirmDialogDownloadDir(const QString &dir) { + auto messageText = gt("download-dir-dialog-msg"); + messageText = messageText.replace("{{DIRECTORY}}", dir); + return confirmDialog(messageText, gt("download-dir-dialog-title")); +} + void SettingsView::resetDownloadDir() { auto dir = QString::fromStdString(kiwix::getDataDirectory()); diff --git a/src/settingsview.h b/src/settingsview.h index 55c6cd4..0079db4 100644 --- a/src/settingsview.h +++ b/src/settingsview.h @@ -20,7 +20,7 @@ public Q_SLOTS: void onZoomChanged(qreal zoomFactor); private: bool confirmDialogDownloadDir(const QString& dir); - + bool confirmDialog(QString messageText, QString messageTitle); Ui::Settings *ui; }; From 8d6d6833e711b620cd064d7f2632b9f10944694c Mon Sep 17 00:00:00 2001 From: Nikhil Tanwar <2002nikhiltanwar@gmail.com> Date: Tue, 8 Feb 2022 20:09:53 +0530 Subject: [PATCH 4/8] Make SettingsManager::setDownloadDir a void function The current implementation doesn't have any effect on it being a bool --- src/settingsmanager.cpp | 3 +-- src/settingsmanager.h | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/settingsmanager.cpp b/src/settingsmanager.cpp index 288c23c..7941329 100644 --- a/src/settingsmanager.cpp +++ b/src/settingsmanager.cpp @@ -73,12 +73,11 @@ void SettingsManager::setZoomFactor(qreal zoomFactor) emit(zoomChanged(zoomFactor)); } -bool SettingsManager::setDownloadDir(QString downloadDir) +void SettingsManager::setDownloadDir(QString downloadDir) { m_downloadDir = downloadDir; m_settings.setValue("download/dir", downloadDir); emit(downloadDirChanged(downloadDir)); - return true; } void SettingsManager::initSettings() diff --git a/src/settingsmanager.h b/src/settingsmanager.h index 2dd4a26..8540e87 100644 --- a/src/settingsmanager.h +++ b/src/settingsmanager.h @@ -31,7 +31,7 @@ public slots: void setKiwixServerPort(int port); void setKiwixServerIpAddress(QString ipAddress); void setZoomFactor(qreal zoomFactor); - bool setDownloadDir(QString downloadDir); + void setDownloadDir(QString downloadDir); private: void initSettings(); From a69e6a1f028891aea1d8177a3f710ee75935f75b Mon Sep 17 00:00:00 2001 From: Nikhil Tanwar <2002nikhiltanwar@gmail.com> Date: Thu, 3 Feb 2022 21:13:22 +0530 Subject: [PATCH 5/8] Add monitor directory entry in settings panel This adds an option to check/update monitor directory from the settings panel. --- resources/css/_settingsManager.css | 21 ++++++-- resources/i18n/en.json | 10 +++- src/kiwixapp.cpp | 4 ++ src/kiwixapp.h | 2 +- src/settingsmanager.cpp | 10 +++- src/settingsmanager.h | 4 ++ src/settingsview.cpp | 62 ++++++++++++++++++++-- src/settingsview.h | 6 ++- ui/settings.ui | 85 ++++++++++++++++++++++++++++++ 9 files changed, 194 insertions(+), 10 deletions(-) diff --git a/resources/css/_settingsManager.css b/resources/css/_settingsManager.css index 6452da3..dff210c 100644 --- a/resources/css/_settingsManager.css +++ b/resources/css/_settingsManager.css @@ -1,5 +1,5 @@ QWidget#widget { - max-width: 500; + max-width: 600; } QLabel, @@ -23,8 +23,8 @@ QLabel#settingsLabel { font-weight: bold; } QSpinBox, -QLabel#downloadDirPath { - font: bold 12pt "Cantarell"; +QLabel#downloadDirPath, #monitorDirPath { + font: bold 12pt; } QPushButton { background-color: white; @@ -38,3 +38,18 @@ QPushButton:hover { background-color: #3366cc; color: white; } + +#monitorDirLabel { + padding-right: 0; +} + +#monitorHelp { + padding: 1; + margin: 0; + background: #666666; + color: white; + border-radius: 2px; + max-height: 18px; + min-width: 14px; + font: bold; +} diff --git a/resources/i18n/en.json b/resources/i18n/en.json index 71d568b..a41af4d 100644 --- a/resources/i18n/en.json +++ b/resources/i18n/en.json @@ -69,7 +69,10 @@ "port-for-local-kiwix-server-setting":"Port for local Kiwix server", "zoom-level-setting":"Default zoom level", "download-directory-setting":"Download directory", + "monitor-directory-setting":"Monitor directory", + "monitor-directory-default":"Not set", "reset":"Reset", + "clear":"Clear", "browse":"Browse", "about-kiwix-desktop-title":"Kiwix Desktop", "about-kiwix-desktop-description":"Kiwix enables you to have the whole Wikipedia at hand wherever you go! On a boat, in the middle of nowhere or in jail, Kiwix gives you access to the whole human knowledge. You don't need Internet, everything is stored on your computer.", @@ -124,5 +127,10 @@ "download-dir-dialog-msg":"The new download directory path will be:\n{{DIRECTORY}}", "invalid-port":"Invalid port", "zim-open-fail-title":"Invalid file", - "zim-open-fail-text":"The ZIM file {{ZIM}} cannot be opened properly. It will be removed from your library." + "zim-open-fail-text":"The ZIM file {{ZIM}} cannot be opened properly. It will be removed from your library.", + "monitor-dir-dialog-title":"Are you sure you want to change the monitor directory?", + "monitor-dir-dialog-msg":"The new monitor directory path will be:\n{{DIRECTORY}}", + "monitor-clear-dir-dialog-title":"Are you sure you want to clear the monitor directory?", + "monitor-clear-dir-dialog-msg":"This will stop checking the monitor directory for new ZIM files.", + "monitor-directory-tooltip":"All ZIM files in this directory will be automatically added to the library." } diff --git a/src/kiwixapp.cpp b/src/kiwixapp.cpp index 99255ec..4b33e7e 100644 --- a/src/kiwixapp.cpp +++ b/src/kiwixapp.cpp @@ -273,6 +273,10 @@ bool KiwixApp::isCurrentArticleBookmarked() return false; } +void KiwixApp::setMonitorDir(const QString &dir) { + m_settingsManager.setMonitorDir(dir); +} + #define CREATE_ACTION(ID, TEXT) \ mpa_actions[ID] = new QAction(TEXT) #define SET_SHORTCUT(ID, TEXT, SHORTCUT) \ diff --git a/src/kiwixapp.h b/src/kiwixapp.h index 65a98c4..79534a3 100644 --- a/src/kiwixapp.h +++ b/src/kiwixapp.h @@ -79,7 +79,7 @@ public: kiwix::Server* getLocalServer() { return &m_server; } SettingsManager* getSettingsManager() { return &m_settingsManager; }; QString getText(const QString &key) { return m_translation.getText(key); }; - + void setMonitorDir(const QString &dir); bool isCurrentArticleBookmarked(); public slots: diff --git a/src/settingsmanager.cpp b/src/settingsmanager.cpp index 7941329..cd3fee9 100644 --- a/src/settingsmanager.cpp +++ b/src/settingsmanager.cpp @@ -16,7 +16,7 @@ SettingsView* SettingsManager::getView() { if (m_view == nullptr) { auto view = new SettingsView(); - view->init(m_zoomFactor * 100, m_downloadDir); + view->init(m_zoomFactor * 100, m_downloadDir, m_monitorDir); connect(view, &QObject::destroyed, this, [=]() { m_view = nullptr; }); m_view = view; } @@ -80,10 +80,18 @@ void SettingsManager::setDownloadDir(QString downloadDir) emit(downloadDirChanged(downloadDir)); } +void SettingsManager::setMonitorDir(QString monitorDir) +{ + m_monitorDir = monitorDir; + m_settings.setValue("monitor/dir", monitorDir); + emit(monitorDirChanged(monitorDir)); +} + void SettingsManager::initSettings() { m_kiwixServerPort = m_settings.value("localKiwixServer/port", 8080).toInt(); m_zoomFactor = m_settings.value("view/zoomFactor", 1).toDouble(); m_downloadDir = m_settings.value("download/dir", QString::fromStdString(kiwix::getDataDirectory())).toString(); m_kiwixServerIpAddress = m_settings.value("localKiwixServer/ipAddress", QString("0.0.0.0")).toString(); + m_monitorDir = m_settings.value("monitor/dir", QString("")).toString(); } diff --git a/src/settingsmanager.h b/src/settingsmanager.h index 8540e87..2976ba4 100644 --- a/src/settingsmanager.h +++ b/src/settingsmanager.h @@ -26,12 +26,14 @@ public: QString getKiwixServerIpAddress() const { return m_kiwixServerIpAddress; } qreal getZoomFactor() const { return m_zoomFactor; } QString getDownloadDir() const { return m_downloadDir; } + QString getMonitorDir() const { return m_monitorDir; } public slots: void setKiwixServerPort(int port); void setKiwixServerIpAddress(QString ipAddress); void setZoomFactor(qreal zoomFactor); void setDownloadDir(QString downloadDir); + void setMonitorDir(QString monitorDir); private: void initSettings(); @@ -39,6 +41,7 @@ signals: void portChanged(int port); void zoomChanged(qreal zoomFactor); void downloadDirChanged(QString downloadDir); + void monitorDirChanged(QString monitorDir); private: QSettings m_settings; @@ -47,6 +50,7 @@ private: QString m_kiwixServerIpAddress; qreal m_zoomFactor; QString m_downloadDir; + QString m_monitorDir; }; #endif // SETTINGSMANAGER_H diff --git a/src/settingsview.cpp b/src/settingsview.cpp index fac6806..0e4f8c4 100644 --- a/src/settingsview.cpp +++ b/src/settingsview.cpp @@ -16,21 +16,32 @@ SettingsView::SettingsView(QWidget *parent) connect(ui->zoomPercentSpinBox, QOverload::of(&QSpinBox::valueChanged), this, &SettingsView::setZoom); connect(ui->browseButton, &QPushButton::clicked, this, &SettingsView::browseDownloadDir); connect(ui->resetButton, &QPushButton::clicked, this, &SettingsView::resetDownloadDir); + connect(ui->monitorBrowse, &QPushButton::clicked, this, &SettingsView::browseMonitorDir); + connect(ui->monitorClear, &QPushButton::clicked, this, &SettingsView::clearMonitorDir); connect(KiwixApp::instance()->getSettingsManager(), &SettingsManager::downloadDirChanged, this, &SettingsView::onDownloadDirChanged); + connect(KiwixApp::instance()->getSettingsManager(), &SettingsManager::monitorDirChanged, this, &SettingsView::onMonitorDirChanged); connect(KiwixApp::instance()->getSettingsManager(), &SettingsManager::zoomChanged, this, &SettingsView::onZoomChanged); ui->settingsLabel->setText(gt("settings")); ui->zoomPercentLabel->setText(gt("zoom-level-setting")); ui->downloadDirLabel->setText(gt("download-directory-setting")); + ui->monitorDirLabel->setText(gt("monitor-directory-setting")); ui->resetButton->setText(gt("reset")); ui->browseButton->setText(gt("browse")); + ui->monitorClear->setText(gt("clear")); + ui->monitorBrowse->setText(gt("browse")); + ui->monitorHelp->setText("?"); + ui->monitorHelp->setToolTip(gt("monitor-directory-tooltip")); } -void SettingsView::init(int zoomPercent, const QString &dir) +void SettingsView::init(int zoomPercent, const QString &downloadDir, const QString &monitorDir) { ui->zoomPercentSpinBox->setValue(zoomPercent); - ui->downloadDirPath->setText(dir); + ui->downloadDirPath->setText(downloadDir); + if (monitorDir == QString()) { + ui->monitorClear->hide(); + } + ui->monitorDirPath->setText(monitorDir); } - bool SettingsView::confirmDialog( QString messageText, QString messageTitle) { QMessageBox msgBox( @@ -51,6 +62,13 @@ bool SettingsView::confirmDialogDownloadDir(const QString &dir) { return confirmDialog(messageText, gt("download-dir-dialog-title")); } +bool SettingsView::confirmDialogMonitorDir(const QString &dir) { + auto messageText = gt("monitor-dir-dialog-msg"); + messageText = messageText.replace("{{DIRECTORY}}", dir); + auto messageTitle = gt("monitor-dir-dialog-title"); + return confirmDialog(messageText, messageTitle); +} + void SettingsView::resetDownloadDir() { auto dir = QString::fromStdString(kiwix::getDataDirectory()); @@ -79,6 +97,34 @@ void SettingsView::browseDownloadDir() } } +void SettingsView::browseMonitorDir() +{ + const auto &monitorDir = KiwixApp::instance()->getSettingsManager()->getMonitorDir(); + QString previousDir; + if (monitorDir == "") { + previousDir = KiwixApp::instance()->getSettingsManager()->getDownloadDir(); + } else { + previousDir = monitorDir; + } + QString dir = QFileDialog::getExistingDirectory(KiwixApp::instance()->getMainWindow(), + gt("browse-directory"), + previousDir, + QFileDialog::ShowDirsOnly); + if (dir == monitorDir || dir.isEmpty()) { + return; + } + if (confirmDialogMonitorDir(dir)) { + KiwixApp::instance()->setMonitorDir(dir); + } +} + +void SettingsView::clearMonitorDir() +{ + if (confirmDialog(gt("monitor-clear-dir-dialog-msg"), gt("monitor-clear-dir-dialog-title"))) { + KiwixApp::instance()->setMonitorDir(""); + } +} + void SettingsView::setZoom(int zoomPercent) { qreal zoomFactor = (qreal) zoomPercent/100; @@ -90,6 +136,16 @@ void SettingsView::onDownloadDirChanged(const QString &dir) ui->downloadDirPath->setText(dir); } +void SettingsView::onMonitorDirChanged(const QString &dir) +{ + if (dir == "") { + ui->monitorClear->hide(); + } else { + ui->monitorClear->show(); + } + ui->monitorDirPath->setText(dir); +} + void SettingsView::onZoomChanged(qreal zoomFactor) { qreal zoomPercent = zoomFactor * 100; diff --git a/src/settingsview.h b/src/settingsview.h index 0079db4..c5e28cc 100644 --- a/src/settingsview.h +++ b/src/settingsview.h @@ -11,16 +11,20 @@ class SettingsView : public QWidget public: SettingsView(QWidget *parent = nullptr); ~SettingsView(){}; - void init(int zoomPercent, const QString &dir); + void init(int zoomPercent, const QString &downloadDir, const QString &monitorDir); public Q_SLOTS: void resetDownloadDir(); void browseDownloadDir(); + void browseMonitorDir(); + void clearMonitorDir(); void setZoom(int zoomPercent); void onDownloadDirChanged(const QString &dir); + void onMonitorDirChanged(const QString &dir); void onZoomChanged(qreal zoomFactor); private: bool confirmDialogDownloadDir(const QString& dir); bool confirmDialog(QString messageText, QString messageTitle); + bool confirmDialogMonitorDir(const QString& dir); Ui::Settings *ui; }; diff --git a/ui/settings.ui b/ui/settings.ui index 63447af..2d15ed3 100644 --- a/ui/settings.ui +++ b/ui/settings.ui @@ -199,6 +199,91 @@ + + + + Qt::Horizontal + + + + + + + + + TextLabel + + + + + + + ? + + + Qt::AutoText + + + Qt::AlignCenter + + + -5 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + TextLabel + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Reset + + + + + + + Browse + + + + + From 45a09cfae64e1203a6340ec0eb09cae1b1e089d8 Mon Sep 17 00:00:00 2001 From: Nikhil Tanwar <2002nikhiltanwar@gmail.com> Date: Thu, 3 Feb 2022 16:12:30 +0530 Subject: [PATCH 6/8] Add logic to refresh library with monitor directory changes To check if there have been any changes in monitor directory, we compare the files before and after followed by adding/removing them from the library --- src/kiwixapp.cpp | 4 ++++ src/library.cpp | 41 +++++++++++++++++++++++++++++++++++++++++ src/library.h | 5 +++++ 3 files changed, 50 insertions(+) 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; }; From e0337d0cafb1febd2e3ffa09053a1df2fbdfafe7 Mon Sep 17 00:00:00 2001 From: Nikhil Tanwar <2002nikhiltanwar@gmail.com> Date: Thu, 3 Feb 2022 16:16:34 +0530 Subject: [PATCH 7/8] Refresh library with monitory directory changes on startup This refreshes the library on every startup list of elements already in monitor directory (before changes) are taken by filtering library.xml --- src/kiwixapp.cpp | 5 +++++ src/library.cpp | 13 +++++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/kiwixapp.cpp b/src/kiwixapp.cpp index 8dd965e..ddd41a8 100644 --- a/src/kiwixapp.cpp +++ b/src/kiwixapp.cpp @@ -101,6 +101,11 @@ void KiwixApp::init() this->openZimFile(message); } }); + QString monitorDir = m_settingsManager.getMonitorDir(); + if (monitorDir != "") { + m_library.setMonitorDirZims(m_library.getLibraryZimsFromDir(monitorDir)); + m_library.asyncLoadMonitorDir(monitorDir); + } } KiwixApp::~KiwixApp() diff --git a/src/library.cpp b/src/library.cpp index 793aca5..e0d9f37 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -130,6 +130,19 @@ void Library::setMonitorDirZims(QStringList zimList) m_monitorDirZims = zimList; } +QStringList Library::getLibraryZimsFromDir(QString dir) const +{ + QStringList zimsInDir; + for (auto str : getBookIds()) { + auto filePath = QString::fromStdString(getBookById(str).getPath()); + QDir absoluteDir = QFileInfo(filePath).absoluteDir(); + if (absoluteDir == dir) { + zimsInDir.push_back(filePath); + } + } + return zimsInDir; +} + void Library::loadMonitorDir(QString monitorDir) { QMutex mutex; From 5e9aa63b4587846acf00d0756669c08bd4becaf2 Mon Sep 17 00:00:00 2001 From: Nikhil Tanwar <2002nikhiltanwar@gmail.com> Date: Thu, 3 Feb 2022 16:36:59 +0530 Subject: [PATCH 8/8] Add real-time library monitoring Adds a QFileSystemWatcher to watch over monitor directory. Everytime directoryChange is emitted, it calls asyncLoadMonitorDir --- src/kiwixapp.cpp | 8 ++++++++ src/kiwixapp.h | 1 + 2 files changed, 9 insertions(+) diff --git a/src/kiwixapp.cpp b/src/kiwixapp.cpp index ddd41a8..01de599 100644 --- a/src/kiwixapp.cpp +++ b/src/kiwixapp.cpp @@ -101,9 +101,13 @@ void KiwixApp::init() this->openZimFile(message); } }); + connect(&m_watcher, &QFileSystemWatcher::directoryChanged, this, [=](QString monitorDir) { + m_library.asyncLoadMonitorDir(monitorDir); + }); QString monitorDir = m_settingsManager.getMonitorDir(); if (monitorDir != "") { m_library.setMonitorDirZims(m_library.getLibraryZimsFromDir(monitorDir)); + m_watcher.addPath(monitorDir); m_library.asyncLoadMonitorDir(monitorDir); } } @@ -281,7 +285,11 @@ bool KiwixApp::isCurrentArticleBookmarked() void KiwixApp::setMonitorDir(const QString &dir) { m_settingsManager.setMonitorDir(dir); m_library.setMonitorDirZims(QStringList()); + for (auto path : m_watcher.directories()) { + m_watcher.removePath(path); + } if (dir != "") { + m_watcher.addPath(dir); m_library.asyncLoadMonitorDir(dir); } } diff --git a/src/kiwixapp.h b/src/kiwixapp.h index 79534a3..268e544 100644 --- a/src/kiwixapp.h +++ b/src/kiwixapp.h @@ -108,6 +108,7 @@ private: kiwix::UpdatableNameMapper m_nameMapper; kiwix::Server m_server; Translation m_translation; + QFileSystemWatcher m_watcher; QAction* mpa_actions[MAX_ACTION];