diff --git a/kiwix-desktop.pro b/kiwix-desktop.pro index 7550048..04d147e 100644 --- a/kiwix-desktop.pro +++ b/kiwix-desktop.pro @@ -44,7 +44,7 @@ SOURCES += \ src/blobbuffer.cpp \ src/library.cpp \ src/settingsmanager.cpp \ - src/settingsmanagerview.cpp \ + src/settingsview.cpp \ src/topwidget.cpp \ src/urlschemehandler.cpp \ src/webview.cpp \ @@ -76,7 +76,7 @@ HEADERS += \ src/blobbuffer.h \ src/library.h \ src/settingsmanager.h \ - src/settingsmanagerview.h \ + src/settingsview.h \ src/topwidget.h \ src/kconstants.h \ src/urlschemehandler.h \ diff --git a/src/kiwixapp.cpp b/src/kiwixapp.cpp index e1f9fee..92d8234 100644 --- a/src/kiwixapp.cpp +++ b/src/kiwixapp.cpp @@ -17,7 +17,6 @@ KiwixApp::KiwixApp(int& argc, char *argv[]) : QtSingleApplication("kiwix-desktop", argc, argv), - m_settingsManager(), m_profile(), m_libraryDirectory(findLibraryDirectory()), m_library(m_libraryDirectory), diff --git a/src/settingsmanager.cpp b/src/settingsmanager.cpp index 9412c41..481c728 100644 --- a/src/settingsmanager.cpp +++ b/src/settingsmanager.cpp @@ -13,12 +13,18 @@ SettingsManager::SettingsManager(QObject *parent) initSettings(); } -SettingsManagerView* SettingsManager::getView() +SettingsView* SettingsManager::getView() { - auto view = new SettingsManagerView(); - view->registerObject("settingsManager", this); - view->setHtml(); - connect(view, &QObject::destroyed, this, [=]() { m_settingsViewDisplayed = false; }); + static SettingsView *view = nullptr; + + if (!view || !m_settingsViewDisplayed) + view = new SettingsView(); + + view->init(m_kiwixServerPort, m_zoomFactor * 100, m_downloadDir); + connect(view, &QObject::destroyed, this, [=]() { m_settingsViewDisplayed = false;}); + connect(view, &SettingsView::serverPortChanged, this, &SettingsManager::setKiwixServerPort); + connect(view, &SettingsView::downloadDirChanged, this, &SettingsManager::setDownloadDir); + connect(view, &SettingsView::zoomFactorChanged, this, &SettingsManager::setZoomFactor); m_settingsViewDisplayed = true; return view; } @@ -62,6 +68,9 @@ void SettingsManager::setKiwixServerPort(int port) void SettingsManager::setZoomFactor(qreal zoomFactor) { + if (zoomFactor > 1) + zoomFactor /= 100; + m_zoomFactor = zoomFactor; m_settings.setValue("view/zoomFactor", zoomFactor); } diff --git a/src/settingsmanager.h b/src/settingsmanager.h index 0cfaf48..ec635b4 100644 --- a/src/settingsmanager.h +++ b/src/settingsmanager.h @@ -3,7 +3,7 @@ #include #include -#include "settingsmanagerview.h" +#include "settingsview.h" class SettingsManager : public QObject { @@ -16,7 +16,7 @@ public: explicit SettingsManager(QObject *parent = nullptr); virtual ~SettingsManager() {}; - SettingsManagerView* getView(); + SettingsView* getView(); bool isSettingsViewdisplayed() { return m_settingsViewDisplayed; }; void setSettings(const QString &key, const QVariant &value); void deleteSettings(const QString &key); diff --git a/src/settingsmanagerview.cpp b/src/settingsmanagerview.cpp deleted file mode 100644 index 2082c7d..0000000 --- a/src/settingsmanagerview.cpp +++ /dev/null @@ -1,23 +0,0 @@ -#include "settingsmanagerview.h" -#include "kiwixapp.h" -#include - -SettingsManagerView::SettingsManagerView(QWidget *parent) : QWebEngineView(parent) -{ - page()->setWebChannel(&m_webChannel); - setContextMenuPolicy( Qt::NoContextMenu ); -} - -void SettingsManagerView::registerObject(const QString& id, QObject* object) -{ - m_webChannel.registerObject(id, object); -} - -void SettingsManagerView::setHtml() -{ - QFile contentFile(":texts/_settingsManager.html"); - contentFile.open(QIODevice::ReadOnly); - auto byteContent = contentFile.readAll(); - contentFile.close(); - QWebEngineView::setHtml(byteContent); -} diff --git a/src/settingsmanagerview.h b/src/settingsmanagerview.h deleted file mode 100644 index de5dfc0..0000000 --- a/src/settingsmanagerview.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef SETTINGSMANAGERVIEW_H -#define SETTINGSMANAGERVIEW_H - -#include -#include - -class SettingsManagerView : public QWebEngineView -{ - Q_OBJECT -public: - SettingsManagerView(QWidget *parent = nullptr); - void registerObject(const QString &id, QObject *object); - void setHtml(); - -private: - QWebChannel m_webChannel; -}; - -#endif // SETTINGSMANAGERVIEW_H diff --git a/src/settingsview.cpp b/src/settingsview.cpp new file mode 100644 index 0000000..a2079ac --- /dev/null +++ b/src/settingsview.cpp @@ -0,0 +1,73 @@ +#include "settingsview.h" +#include "ui_settings.h" +#include "kiwixapp.h" + +#include +#include +SettingsView::SettingsView(QWidget *parent) + : QWidget(parent) + , ui(new Ui::Settings) +{ + ui->setupUi(this); + connect(ui->serverPortSpinBox, QOverload::of(&QSpinBox::valueChanged), this, &SettingsView::serverPortChanged); + connect(ui->zoomLevelSpinBox, QOverload::of(&QSpinBox::valueChanged), this, &SettingsView::zoomFactorChanged); + connect(ui->resetButton, &QPushButton::clicked, this, &SettingsView::resetDownloadDir); + connect(ui->browseButton, &QPushButton::clicked, this, &SettingsView::browseDownloadDir); + ui->settingsLabel->setText(gt("settings")); + ui->serverPortLabel->setText(gt("port-for-local-kiwix-server-setting")); + ui->zoomLevelLabel->setText(gt("zoom-level-setting")); + ui->downloadDirLabel->setText(gt("download-directory-setting")); + ui->resetButton->setText(gt("reset")); + ui->browseButton->setText(gt("browse")); +} +void SettingsView::init(int port, int factor, const QString &dir) +{ + ui->serverPortSpinBox->setValue(port); + ui->zoomLevelSpinBox->setValue(factor); + ui->downloadDirPath->setText(dir); +} +bool SettingsView::confirmDialogDownloadDir(const QString& dir) +{ + 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 + QMessageBox::Ok | QMessageBox::Cancel //Buttons + ); + msgBox.setDefaultButton(QMessageBox::Ok); + + int ret = msgBox.exec(); + return (ret == QMessageBox::Ok); +} + +void SettingsView::resetDownloadDir() +{ + auto dir = QString::fromStdString(getDataDirectory()); + const auto &downloadDir = KiwixApp::instance()->getSettingsManager()->getDownloadDir(); + if (dir == downloadDir) { + return; + } + if (confirmDialogDownloadDir(dir)) { + ui->downloadDirPath->setText(dir); + emit(downloadDirChanged(dir)); + } +} + +void SettingsView::browseDownloadDir() +{ + const auto &downloadDir = KiwixApp::instance()->getSettingsManager()->getDownloadDir(); + QString dir = QFileDialog::getExistingDirectory(KiwixApp::instance()->getMainWindow(), + gt("browse-directory"), + downloadDir, + QFileDialog::ShowDirsOnly); + if (dir == downloadDir || dir.isEmpty()) { + return; + } + + if (confirmDialogDownloadDir(dir)) { + ui->downloadDirPath->setText(dir); + emit(downloadDirChanged(dir)); + } +} diff --git a/src/settingsview.h b/src/settingsview.h new file mode 100644 index 0000000..7af92d2 --- /dev/null +++ b/src/settingsview.h @@ -0,0 +1,28 @@ +#ifndef SETTINGSVIEW_H +#define SETTINGSVIEW_H + +#include +namespace Ui { +class Settings; +} +class SettingsView : public QWidget +{ + Q_OBJECT +public: + SettingsView(QWidget *parent = nullptr); + ~SettingsView(){}; + void init(int port, int factor, const QString &dir); +public Q_SLOTS: + void resetDownloadDir(); + void browseDownloadDir(); +signals: + void serverPortChanged(int port); + void zoomFactorChanged(int factor); + void downloadDirChanged(const QString &dir); +private: + bool confirmDialogDownloadDir(const QString& dir); + + Ui::Settings *ui; +}; + +#endif // SETTINGSVIEW_H diff --git a/src/tabbar.cpp b/src/tabbar.cpp index dc7e188..94ffb20 100644 --- a/src/tabbar.cpp +++ b/src/tabbar.cpp @@ -56,13 +56,13 @@ TabBar::TabBar(QWidget *parent) : connect(app->getAction(KiwixApp::SettingAction), &QAction::triggered, this, [=]() { for (int i = 0 ; i < (mp_stackedWidget->count() - 1) ; i++) { - if (qobject_cast(mp_stackedWidget->widget(i))) { + if (qobject_cast(mp_stackedWidget->widget(i))) { setCurrentIndex(i); return; } } int index = currentIndex() + 1; - SettingsManagerView* view = KiwixApp::instance()->getSettingsManager()->getView(); + SettingsView* view = KiwixApp::instance()->getSettingsManager()->getView(); mp_stackedWidget->insertWidget(index, view); insertTab(index,QIcon(":/icons/settings.svg"), gt("settings")); QToolButton *tb = new QToolButton(this); @@ -294,7 +294,7 @@ void TabBar::onCurrentChanged(int index) QWidget *w = mp_stackedWidget->widget(index); - if (qobject_cast(w)) { + if (qobject_cast(w)) { emit webActionEnabledChanged(QWebEnginePage::Back, false); emit webActionEnabledChanged(QWebEnginePage::Forward, false); emit libraryPageDisplayed(false); diff --git a/ui/settings.ui b/ui/settings.ui new file mode 100644 index 0000000..dcbd772 --- /dev/null +++ b/ui/settings.ui @@ -0,0 +1,241 @@ + + + Settings + + + + 0 + 0 + 1029 + 580 + + + + + 0 + 0 + + + + + 600 + 0 + + + + Form + + + + + + + 600 + 16777215 + + + + + + + + + + 0 + 0 + + + + + 16 + 75 + true + + + + Settings + + + + + + + Qt::Horizontal + + + + + + + + + + 10 + 75 + true + + + + Port for local kiwix server: + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + 1 + + + 65535 + + + + + + + + + Qt::Horizontal + + + + + + + + + + 75 + true + + + + Zoom level: + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + % + + + 100 + + + + + + + + + Qt::Horizontal + + + + + + + + + + 75 + true + + + + Download directory: + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + Reset + + + + + + + Browse + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + +