diff --git a/resources/css/_settingsManager.css b/resources/css/_settingsManager.css index aed2f7c..94f81e9 100644 --- a/resources/css/_settingsManager.css +++ b/resources/css/_settingsManager.css @@ -12,6 +12,13 @@ html, body { position: relative; } +#header { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + justify-content: space-between; +} + .row { display: flex; flex-direction: row; @@ -22,8 +29,39 @@ html, body { height: 40px; } +#save-button { + color: black; + font-weight: bold; + font-size: 14px; + border: 1px solid black; + background: transparent; + border-radius: 2px; + height: 20px; +} + +#save-button:hover { + color: white; + background: black; +} + input { width: 80px; + margin: 5px; +} + +input[type=button] { + width: 65px; + color: blue; + font-weight: bold; + font-size: 14px; + border: 0; + background: transparent; + border-radius: 2px; +} + +input[type=button]:hover { + color: white; + background: blue; } input[type=number]::-webkit-inner-spin-button, diff --git a/resources/js/_settingsManager.js b/resources/js/_settingsManager.js index 00d0d9c..88b3b49 100644 --- a/resources/js/_settingsManager.js +++ b/resources/js/_settingsManager.js @@ -1,3 +1,28 @@ +function onDownloadDirChanged (downloadDir) { + app.downloadDir = downloadDir; +} + +function onSettingsChecked (valid) { + if (!valid) { + alert("Invalid download path"); + app.downloadDir = settingsManager.downloadDir; + return; + } + settingsManager.setKiwixServerPort(app.kiwixServerPort); + app.zoomFactor = (app.zoomFactor < 30) ? 30 : app.zoomFactor; + app.zoomFactor = (app.zoomFactor > 500) ? 500 : app.zoomFactor; + settingsManager.setZoomFactor(app.zoomFactor / 100); + settingsManager.setDownloadDir(app.downloadDir); +} + +function validPort (port) { + return /^([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$/.test(port); +} + +function validDownloadDir (dir) { + settingsManager.validDownloadDir(dir); +} + function init() { new QWebChannel(qt.webChannelTransport, function(channel) { settingsManager = channel.objects.settingsManager; @@ -7,24 +32,26 @@ function init() { settingsManager: settingsManager, kiwixServerPort: settingsManager.kiwixServerPort, zoomFactor: Math.floor(settingsManager.zoomFactor * 100), + downloadDir: settingsManager.downloadDir, }, methods: { - setPort : function() { - // regex for valid port - if (/^([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$/.test(this.kiwixServerPort)) - { - settingsManager.setKiwixServerPort(this.kiwixServerPort); - } else { - alert("invalid port"); + saveSettings : function() { + if (!validPort(this.kiwixServerPort)) { + alert("Invalid port"); this.kiwixServerPort = settingsManager.kiwixServerPort; + return; } + validDownloadDir(this.downloadDir); }, - setZoomFactor : function() { - this.zoomFactor = (this.zoomFactor < 30) ? 30 : this.zoomFactor; - this.zoomFactor = (this.zoomFactor > 500) ? 500 : this.zoomFactor; - settingsManager.setZoomFactor(this.zoomFactor / 100); + resetDownloadDir : function() { + settingsManager.resetDownloadDir(); + }, + browseDownloadDir : function() { + settingsManager.browseDownloadDir(); } } }); + settingsManager.downloadDirChanged.connect(onDownloadDirChanged) + settingsManager.settingsChecked.connect(onSettingsChecked) }); } \ No newline at end of file diff --git a/resources/texts/_settingsManager.html b/resources/texts/_settingsManager.html index f6d967c..73d3a40 100644 --- a/resources/texts/_settingsManager.html +++ b/resources/texts/_settingsManager.html @@ -8,14 +8,23 @@
-

Settings

+
- +
-
+
+
+
+ + + +
diff --git a/src/contentmanager.cpp b/src/contentmanager.cpp index 681d914..48b3874 100644 --- a/src/contentmanager.cpp +++ b/src/contentmanager.cpp @@ -203,7 +203,10 @@ QString ContentManager::downloadBook(const QString &id) return ""; kiwix::Download *download; try { - download = mp_downloader->startDownload(book.getUrl()); + auto downloadPath = KiwixApp::instance()->getSettingsManager()->getDownloadDir(); + std::pair downloadDir("dir", downloadPath.toStdString()); + const std::vector> options = { downloadDir }; + download = mp_downloader->startDownload(book.getUrl(), options); } catch (std::exception& e) { return ""; } @@ -214,12 +217,11 @@ QString ContentManager::downloadBook(const QString &id) return QString::fromStdString(download->getDid()); } -void ContentManager::eraseBookFilesFromComputer(const QString fileToRemove) +void ContentManager::eraseBookFilesFromComputer(const QString dirPath, const QString filename) { - QString dirName = KiwixApp::instance()->getLibraryDirectory(); - QDir dir(dirName, fileToRemove); - for(const QString& filename: dir.entryList()) { - dir.remove(filename); + QDir dir(dirPath, filename); + for(const QString& file: dir.entryList()) { + dir.remove(file); } } @@ -236,8 +238,9 @@ void ContentManager::eraseBook(const QString& id) } } kiwix::Book book = mp_library->getBookById(id); - QString fileToRemove = QString::fromUtf8(getLastPathElement(book.getPath()).c_str()) + "*"; - eraseBookFilesFromComputer(fileToRemove); + QString dirPath = QString::fromStdString(removeLastPathElement(book.getPath())); + QString filename = QString::fromStdString(getLastPathElement(book.getPath())) + "*"; + eraseBookFilesFromComputer(dirPath, filename); mp_library->removeBookFromLibraryById(id); mp_library->save(); emit mp_library->bookmarksChanged(); @@ -281,8 +284,9 @@ void ContentManager::cancelBook(const QString& id) if (download->getStatus() != kiwix::Download::K_COMPLETE) { download->cancelDownload(); } - QString fileToRemove = QString::fromUtf8(getLastPathElement(download->getPath()).c_str()) + "*"; - eraseBookFilesFromComputer(fileToRemove); + QString dirPath = QString::fromStdString(removeLastPathElement(download->getPath())); + QString filename = QString::fromStdString(getLastPathElement(download->getPath())) + "*"; + eraseBookFilesFromComputer(dirPath, filename); mp_library->removeBookFromLibraryById(id); mp_library->save(); emit(oneBookChanged(id)); diff --git a/src/contentmanager.h b/src/contentmanager.h index b86935f..b5ba1f4 100644 --- a/src/contentmanager.h +++ b/src/contentmanager.h @@ -40,7 +40,7 @@ private: bool m_sortOrderAsc = true; QStringList getBookIds(); - void eraseBookFilesFromComputer(const QString fileSelection); + void eraseBookFilesFromComputer(const QString dirPath, const QString filename); signals: void filterParamsChanged(); diff --git a/src/settingsmanager.cpp b/src/settingsmanager.cpp index d6e5db9..3a22513 100644 --- a/src/settingsmanager.cpp +++ b/src/settingsmanager.cpp @@ -1,4 +1,8 @@ #include "settingsmanager.h" +#include "kiwix/tools/pathTools.h" +#include "kiwixapp.h" +#include +#include SettingsManager::SettingsManager(QObject *parent) : QObject(parent), @@ -61,8 +65,35 @@ void SettingsManager::setZoomFactor(qreal zoomFactor) m_settings.setValue("view/zoomFactor", zoomFactor); } +void SettingsManager::validDownloadDir(QString dir) +{ + emit(settingsChecked(fileExists(dir.toStdString()))); +} + +bool SettingsManager::setDownloadDir(QString downloadDir) +{ + m_downloadDir = downloadDir; + m_settings.setValue("download/dir", downloadDir); + return true; +} + +void SettingsManager::resetDownloadDir() +{ + emit(downloadDirChanged(QString::fromStdString(getDataDirectory()))); +} + +void SettingsManager::browseDownloadDir() +{ + QString dir = QFileDialog::getExistingDirectory(KiwixApp::instance()->getMainWindow(), + tr("Browse Directory"), + QString(), + QFileDialog::ShowDirsOnly); + emit(downloadDirChanged(dir)); +} + void SettingsManager::initSettings() { m_kiwixServerPort = m_settings.value("localKiwixServer/port", 8181).toInt(); m_zoomFactor = m_settings.value("view/zoomFactor", 1).toDouble(); + m_downloadDir = m_settings.value("download/dir", QString::fromStdString(getDataDirectory())).toString(); } \ No newline at end of file diff --git a/src/settingsmanager.h b/src/settingsmanager.h index 4bac512..275d621 100644 --- a/src/settingsmanager.h +++ b/src/settingsmanager.h @@ -10,6 +10,7 @@ class SettingsManager : public QObject Q_OBJECT Q_PROPERTY(int kiwixServerPort READ getKiwixServerPort NOTIFY portChanged) Q_PROPERTY(qreal zoomFactor READ getZoomFactor NOTIFY zoomChanged) + Q_PROPERTY(QString downloadDir READ getDownloadDir NOTIFY downloadDirChanged) public: explicit SettingsManager(QObject *parent = nullptr); @@ -28,6 +29,11 @@ public slots: int getKiwixServerPort() { return m_kiwixServerPort; }; void setZoomFactor(qreal zoomFactor); qreal getZoomFactor() { return m_zoomFactor; }; + void validDownloadDir(QString dir); + bool setDownloadDir(QString downloadDir); + QString getDownloadDir() { return m_downloadDir; } + void resetDownloadDir(); + void browseDownloadDir(); private: void initSettings(); @@ -35,12 +41,15 @@ private: signals: void portChanged(int port); void zoomChanged(qreal zoomFactor); + void downloadDirChanged(QString downloadDir); + void settingsChecked(bool valid); private: QSettings m_settings; bool m_settingsViewDisplayed; int m_kiwixServerPort; qreal m_zoomFactor; + QString m_downloadDir; }; #endif // SETTINGSMANAGER_H