diff --git a/kiwix-desktop.pro b/kiwix-desktop.pro
index dbcc193..9e4804b 100644
--- a/kiwix-desktop.pro
+++ b/kiwix-desktop.pro
@@ -46,6 +46,8 @@ SOURCES += \
src/kiwixapp.cpp \
src/blobbuffer.cpp \
src/library.cpp \
+ src/settingsmanager.cpp \
+ src/settingsmanagerview.cpp \
src/topwidget.cpp \
src/urlschemehandler.cpp \
src/webview.cpp \
@@ -68,6 +70,8 @@ HEADERS += \
src/kiwixapp.h \
src/blobbuffer.h \
src/library.h \
+ src/settingsmanager.h \
+ src/settingsmanagerview.h \
src/topwidget.h \
src/kconstants.h \
src/urlschemehandler.h \
@@ -148,6 +152,7 @@ RESOURCES += \
resources/kiwix.qrc \
resources/translations.qrc \
resources/contentmanager.qrc \
+ resources/settingsmanager.qrc \
resources/style.qrc
unix {
diff --git a/resources/css/_settingsManager.css b/resources/css/_settingsManager.css
new file mode 100644
index 0000000..e76e05b
--- /dev/null
+++ b/resources/css/_settingsManager.css
@@ -0,0 +1,28 @@
+html, body {
+ padding: 0;
+ margin: auto;
+ height: 100%;
+ position: relative;
+ width: 75%;
+ overflow: hidden;
+}
+
+#settings {
+ height: 100%;
+ position: relative;
+}
+
+.row {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: nowrap;
+ justify-content: space-between;
+ align-items: center;
+ border-top: 1px solid grey;
+ height: 40px;
+}
+
+input[type=number]::-webkit-inner-spin-button,
+input[type=number]::-webkit-outer-spin-button {
+ opacity: 1;
+}
\ No newline at end of file
diff --git a/resources/js/_settingsManager.js b/resources/js/_settingsManager.js
new file mode 100644
index 0000000..e386f47
--- /dev/null
+++ b/resources/js/_settingsManager.js
@@ -0,0 +1,24 @@
+function init() {
+ new QWebChannel(qt.webChannelTransport, function(channel) {
+ settingsManager = channel.objects.settingsManager;
+ app = new Vue({
+ el: "#settings",
+ data: {
+ settingsManager: settingsManager,
+ kiwixServerPort: settingsManager.kiwixServerPort,
+ },
+ 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");
+ this.kiwixServerPort = settingsManager.kiwixServerPort;
+ }
+ }
+ }
+ });
+ });
+}
\ No newline at end of file
diff --git a/resources/settingsmanager.qrc b/resources/settingsmanager.qrc
new file mode 100644
index 0000000..5d32dec
--- /dev/null
+++ b/resources/settingsmanager.qrc
@@ -0,0 +1,7 @@
+
+
+ texts/_settingsManager.html
+ css/_settingsManager.css
+ js/_settingsManager.js
+
+
diff --git a/resources/texts/_settingsManager.html b/resources/texts/_settingsManager.html
new file mode 100644
index 0000000..70c4469
--- /dev/null
+++ b/resources/texts/_settingsManager.html
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
Settings
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/kiwixapp.cpp b/src/kiwixapp.cpp
index e45c4e4..1f28d98 100644
--- a/src/kiwixapp.cpp
+++ b/src/kiwixapp.cpp
@@ -27,13 +27,14 @@ kiwix::Downloader* createDownloader() {
KiwixApp::KiwixApp(int& argc, char *argv[])
: QApplication(argc, argv),
+ m_settingsManager(),
m_libraryDirectory(findLibraryDirectory()),
m_library(),
mp_downloader(createDownloader()),
m_manager(&m_library, mp_downloader),
mp_server(new kiwix::KiwixServe(
appendToDirectory(m_libraryDirectory.toStdString(),"library.xml"),
- 8181))
+ m_settingsManager.getKiwixServerPort()))
{
m_qtTranslator.load(QLocale(), "qt", "_",
QLibraryInfo::location(QLibraryInfo::TranslationsPath));
@@ -377,8 +378,7 @@ void KiwixApp::createAction()
CREATE_ACTION(AboutAction, tr("About Kiwix"));
CREATE_ACTION_ICON(SettingAction, "settings", tr("Settings"));
- SET_SHORTCUT(SettingAction, QKeySequence::Preferences);
- HIDE_ACTION(SettingAction);
+ SET_SHORTCUT(SettingAction, QKeySequence(Qt::Key_F12));
CREATE_ACTION_ICON(DonateAction, "donate", tr("Donate to support Kiwix"));
SET_SHORTCUT(DonateAction, QKeySequence("Ctrl+<,3"));
diff --git a/src/kiwixapp.h b/src/kiwixapp.h
index fa0165c..cf4ce32 100644
--- a/src/kiwixapp.h
+++ b/src/kiwixapp.h
@@ -9,6 +9,7 @@
#include "tabbar.h"
#include "tocsidebar.h"
#include "urlschemehandler.h"
+#include "settingsmanager.h"
#include
#include
@@ -75,6 +76,7 @@ public:
QAction* getAction(Actions action);
QString getLibraryDirectory() { return m_libraryDirectory; };
kiwix::KiwixServe* getLocalServer() { return mp_server; }
+ SettingsManager* getSettingsManager() { return &m_settingsManager; };
bool isCurrentArticleBookmarked();
@@ -97,6 +99,7 @@ protected:
private:
QTranslator m_qtTranslator, m_appTranslator;
+ SettingsManager m_settingsManager;
UrlSchemeHandler m_schemeHandler;
QString m_libraryDirectory;
Library m_library;
diff --git a/src/localkiwixserver.cpp b/src/localkiwixserver.cpp
index a4f0489..af64535 100644
--- a/src/localkiwixserver.cpp
+++ b/src/localkiwixserver.cpp
@@ -23,6 +23,8 @@ LocalKiwixServer::LocalKiwixServer(QWidget *parent) :
connect(ui->KiwixServerButton, SIGNAL(clicked()), this, SLOT(runOrStopServer()));
connect(ui->OpenInBrowserButton, SIGNAL(clicked()), this, SLOT(openInBrowser()));
+ connect(KiwixApp::instance()->getSettingsManager(), &SettingsManager::portChanged,
+ this, [=](int port) { m_port = port; });
const QHostAddress &localhost = QHostAddress(QHostAddress::LocalHost);
for (const QHostAddress &address: QNetworkInterface::allAddresses()) {
if (address.protocol() == QAbstractSocket::IPv4Protocol && address != localhost) {
@@ -44,13 +46,14 @@ void LocalKiwixServer::openInBrowser()
QUrl url;
url.setScheme("http");
url.setHost(m_ipAddress);
- url.setPort(m_port);
+ url.setPort(mp_server->getPort());
QDesktopServices::openUrl(url);
}
void LocalKiwixServer::runOrStopServer()
{
if (!m_active) {
+ mp_server->setPort(m_port);
mp_server->run();
ui->IpAddress->setText(m_ipAddress + ":" + QString::number(m_port));
std::this_thread::sleep_for(std::chrono::milliseconds(500));
diff --git a/src/settingsmanager.cpp b/src/settingsmanager.cpp
new file mode 100644
index 0000000..1870e1c
--- /dev/null
+++ b/src/settingsmanager.cpp
@@ -0,0 +1,31 @@
+#include "settingsmanager.h"
+
+SettingsManager::SettingsManager(QObject *parent)
+ : QObject(parent),
+ m_settings("Kiwix", "Kiwix-desktop"),
+ m_settingsViewDisplayed(false)
+{
+ setSettings();
+}
+
+SettingsManagerView* SettingsManager::getView()
+{
+ auto view = new SettingsManagerView();
+ view->registerObject("settingsManager", this);
+ view->setHtml();
+ connect(view, &QObject::destroyed, this, [=]() { m_settingsViewDisplayed = false; });
+ m_settingsViewDisplayed = true;
+ return view;
+}
+
+void SettingsManager::setKiwixServerPort(int port)
+{
+ m_kiwixServerPort = port;
+ m_settings.setValue("localKiwixServer/port", port);
+ emit(portChanged(port));
+}
+
+void SettingsManager::setSettings()
+{
+ m_kiwixServerPort = m_settings.value("localKiwixServer/port", 8181).toInt();
+}
\ No newline at end of file
diff --git a/src/settingsmanager.h b/src/settingsmanager.h
new file mode 100644
index 0000000..97c61f5
--- /dev/null
+++ b/src/settingsmanager.h
@@ -0,0 +1,35 @@
+#ifndef SETTINGSMANAGER_H
+#define SETTINGSMANAGER_H
+
+#include
+#include
+#include "settingsmanagerview.h"
+
+class SettingsManager : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(int kiwixServerPort READ getKiwixServerPort NOTIFY portChanged)
+public:
+ explicit SettingsManager(QObject *parent = nullptr);
+ virtual ~SettingsManager() {};
+
+ SettingsManagerView* getView();
+ bool isSettingsViewdisplayed() { return m_settingsViewDisplayed; };
+
+public slots:
+ void setKiwixServerPort(int port);
+ int getKiwixServerPort() { return m_kiwixServerPort; };
+
+private:
+ void setSettings();
+
+signals:
+ void portChanged(int port);
+
+private:
+ QSettings m_settings;
+ bool m_settingsViewDisplayed;
+ int m_kiwixServerPort;
+};
+
+#endif // SETTINGSMANAGER_H
diff --git a/src/settingsmanagerview.cpp b/src/settingsmanagerview.cpp
new file mode 100644
index 0000000..76857e0
--- /dev/null
+++ b/src/settingsmanagerview.cpp
@@ -0,0 +1,24 @@
+#include "settingsmanagerview.h"
+#include "kiwixapp.h"
+#include
+#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
new file mode 100644
index 0000000..aec1e00
--- /dev/null
+++ b/src/settingsmanagerview.h
@@ -0,0 +1,18 @@
+#ifndef SETTINGSMANAGERVIEW_H
+#define SETTINGSMANAGERVIEW_H
+
+#include
+#include
+
+class SettingsManagerView : public QWebEngineView
+{
+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/tabbar.cpp b/src/tabbar.cpp
index 6b8a045..3acc648 100644
--- a/src/tabbar.cpp
+++ b/src/tabbar.cpp
@@ -12,7 +12,8 @@
#define CURRENTIFNULL(VIEW) if(nullptr==VIEW) { VIEW = currentWidget();}
TabBar::TabBar(QWidget *parent) :
- QTabBar(parent)
+ QTabBar(parent),
+ m_settingsIndex(-1)
{
setTabsClosable(true);
setElideMode(Qt::ElideRight);
@@ -67,6 +68,18 @@ TabBar::TabBar(QWidget *parent) :
QUITIFNULL(current);
current->setUrl("zim://" + current->zimId() + ".zim/");
});
+ connect(app->getAction(KiwixApp::SettingAction), &QAction::triggered,
+ this, [=]() {
+ if (KiwixApp::instance()->getSettingsManager()->isSettingsViewdisplayed()) {
+ return;
+ }
+ auto index = currentIndex() + 1;
+ auto view = KiwixApp::instance()->getSettingsManager()->getView();
+ mp_stackedWidget->insertWidget(index, view);
+ insertTab(index,QIcon(":/icons/settings.svg"), tr("Settings"));
+ setCurrentIndex(index);
+ m_settingsIndex = index;
+ });
}
void TabBar::setStackedWidget(QStackedWidget *widget) {
@@ -214,6 +227,12 @@ void TabBar::closeTab(int index)
{
if (index == 0 || index == this->count() - 1)
return;
+ if (index == m_settingsIndex) {
+ m_settingsIndex = -1;
+ }
+ if (index < m_settingsIndex) {
+ m_settingsIndex--;
+ }
setSelectionBehaviorOnRemove(index);
auto webview = widget(index);
mp_stackedWidget->removeWidget(webview);
@@ -237,8 +256,13 @@ void TabBar::onCurrentChanged(int index)
{
if (index == -1)
return;
- if (index)
- {
+ if (index == m_settingsIndex) {
+ emit webActionEnabledChanged(QWebEnginePage::Back, false);
+ emit webActionEnabledChanged(QWebEnginePage::Forward, false);
+ emit libraryPageDisplayed(false);
+ KiwixApp::instance()->setSideBar(KiwixApp::NONE);
+ QTimer::singleShot(0, [=](){emit currentTitleChanged("");});
+ } else if (index) {
auto view = widget(index);
emit webActionEnabledChanged(QWebEnginePage::Back, view->isWebActionEnabled(QWebEnginePage::Back));
emit webActionEnabledChanged(QWebEnginePage::Forward, view->isWebActionEnabled(QWebEnginePage::Forward));
diff --git a/src/tabbar.h b/src/tabbar.h
index 4af3c31..f962bf1 100644
--- a/src/tabbar.h
+++ b/src/tabbar.h
@@ -53,6 +53,7 @@ public slots:
private:
ContentManagerView* mp_contentManagerView;
QStackedWidget* mp_stackedWidget;
+ int m_settingsIndex;
void setSelectionBehaviorOnRemove(int index);