From 175c46cddfed7c6ab0c1fd4c2edc014a1ed4dd89 Mon Sep 17 00:00:00 2001 From: luddens Date: Tue, 24 Sep 2019 11:25:03 +0200 Subject: [PATCH 1/5] settings page architecture --- kiwix-desktop.pro | 5 +++++ resources/css/_settingsManager.css | 12 +++++++++++ resources/js/_settingsManager.js | 13 ++++++++++++ resources/settingsmanager.qrc | 7 +++++++ resources/texts/_settingsManager.html | 14 +++++++++++++ src/kiwixapp.cpp | 2 +- src/kiwixapp.h | 3 +++ src/settingsmanager.cpp | 16 ++++++++++++++ src/settingsmanager.h | 21 +++++++++++++++++++ src/settingsmanagerview.cpp | 24 +++++++++++++++++++++ src/settingsmanagerview.h | 18 ++++++++++++++++ src/tabbar.cpp | 30 ++++++++++++++++++++++++--- src/tabbar.h | 1 + 13 files changed, 162 insertions(+), 4 deletions(-) create mode 100644 resources/css/_settingsManager.css create mode 100644 resources/js/_settingsManager.js create mode 100644 resources/settingsmanager.qrc create mode 100644 resources/texts/_settingsManager.html create mode 100644 src/settingsmanager.cpp create mode 100644 src/settingsmanager.h create mode 100644 src/settingsmanagerview.cpp create mode 100644 src/settingsmanagerview.h 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..89a4279 --- /dev/null +++ b/resources/css/_settingsManager.css @@ -0,0 +1,12 @@ +html, body { + padding: 0; + margin: 0; + height: 100%; + position: relative; + width: 100%; + overflow: hidden; +} +#settings { + height: 100%; + position: relative; +} \ No newline at end of file diff --git a/resources/js/_settingsManager.js b/resources/js/_settingsManager.js new file mode 100644 index 0000000..8cbdf6d --- /dev/null +++ b/resources/js/_settingsManager.js @@ -0,0 +1,13 @@ +function init() { + new QWebChannel(qt.webChannelTransport, function(channel) { + settingsManager = channel.objects.settingsManager; + app = new Vue({ + el: "#settings", + data: { + settingsManager: settingsManager, + }, + methods: { + } + }); + }); +} \ 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..08d108b --- /dev/null +++ b/resources/texts/_settingsManager.html @@ -0,0 +1,14 @@ + + + + + + + + + +
+

Settings

+
+ + \ No newline at end of file diff --git a/src/kiwixapp.cpp b/src/kiwixapp.cpp index e45c4e4..d79b135 100644 --- a/src/kiwixapp.cpp +++ b/src/kiwixapp.cpp @@ -27,6 +27,7 @@ kiwix::Downloader* createDownloader() { KiwixApp::KiwixApp(int& argc, char *argv[]) : QApplication(argc, argv), + m_settingsManager(), m_libraryDirectory(findLibraryDirectory()), m_library(), mp_downloader(createDownloader()), @@ -378,7 +379,6 @@ void KiwixApp::createAction() CREATE_ACTION_ICON(SettingAction, "settings", tr("Settings")); SET_SHORTCUT(SettingAction, QKeySequence::Preferences); - HIDE_ACTION(SettingAction); 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/settingsmanager.cpp b/src/settingsmanager.cpp new file mode 100644 index 0000000..9f0d197 --- /dev/null +++ b/src/settingsmanager.cpp @@ -0,0 +1,16 @@ +#include "settingsmanager.h" + +SettingsManager::SettingsManager(QObject *parent) + : QObject(parent), m_settingsViewDisplayed(false) +{ +} + +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; +} \ No newline at end of file diff --git a/src/settingsmanager.h b/src/settingsmanager.h new file mode 100644 index 0000000..487b28a --- /dev/null +++ b/src/settingsmanager.h @@ -0,0 +1,21 @@ +#ifndef SETTINGSMANAGER_H +#define SETTINGSMANAGER_H + +#include +#include "settingsmanagerview.h" + +class SettingsManager : public QObject +{ + Q_OBJECT +public: + explicit SettingsManager(QObject *parent = nullptr); + virtual ~SettingsManager() {}; + + SettingsManagerView* getView(); + bool isSettingsViewdisplayed() { return m_settingsViewDisplayed; }; + +private: + bool m_settingsViewDisplayed; +}; + +#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); From aab3d123a096408f1b6136f7c21d109ceeb00374 Mon Sep 17 00:00:00 2001 From: luddens Date: Fri, 4 Oct 2019 14:36:19 +0200 Subject: [PATCH 2/5] kiwix server port can be set Add an input in the settings page which allows the user to change the Kiwix server port. The SettingsManager sets the value(s) of the settings in the setSettings() method at the start of the app. This method for now sets a default value but it will use a config file later too. The setKiwixServerPort() method is called when the user indicates a valid port. It sets the m_kiwixServerPort member and emit the portChanged() signal which is connected in the LocalKiwixServer class to update the m_port member. The server port is now always set before its launch in the runOrStopServer method. The LocalKiwixServer::openInBrowser() now uses the mp_server->getPort() to always use the right port. In fact if the user changes the port in the settings while the server is running the m_port member doesn't match anymore the port used by the running server so the openInBrowser will use a wrong port. The KiwixApp class uses now the SettingsManager::getKiwixServerPort() method to set the port of the kiwix-server --- resources/js/_settingsManager.js | 11 +++++++++++ resources/texts/_settingsManager.html | 4 ++++ src/kiwixapp.cpp | 2 +- src/localkiwixserver.cpp | 5 ++++- src/settingsmanager.cpp | 12 ++++++++++++ src/settingsmanager.h | 12 ++++++++++++ 6 files changed, 44 insertions(+), 2 deletions(-) diff --git a/resources/js/_settingsManager.js b/resources/js/_settingsManager.js index 8cbdf6d..e386f47 100644 --- a/resources/js/_settingsManager.js +++ b/resources/js/_settingsManager.js @@ -5,8 +5,19 @@ function init() { 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; + } + } } }); }); diff --git a/resources/texts/_settingsManager.html b/resources/texts/_settingsManager.html index 08d108b..0756eff 100644 --- a/resources/texts/_settingsManager.html +++ b/resources/texts/_settingsManager.html @@ -9,6 +9,10 @@

Settings

+
+ + +
\ No newline at end of file diff --git a/src/kiwixapp.cpp b/src/kiwixapp.cpp index d79b135..6abe5ff 100644 --- a/src/kiwixapp.cpp +++ b/src/kiwixapp.cpp @@ -34,7 +34,7 @@ KiwixApp::KiwixApp(int& argc, char *argv[]) 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)); 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 index 9f0d197..d2401ac 100644 --- a/src/settingsmanager.cpp +++ b/src/settingsmanager.cpp @@ -3,6 +3,7 @@ SettingsManager::SettingsManager(QObject *parent) : QObject(parent), m_settingsViewDisplayed(false) { + setSettings(); } SettingsManagerView* SettingsManager::getView() @@ -13,4 +14,15 @@ SettingsManagerView* SettingsManager::getView() connect(view, &QObject::destroyed, this, [=]() { m_settingsViewDisplayed = false; }); m_settingsViewDisplayed = true; return view; +} + +void SettingsManager::setKiwixServerPort(int port) +{ + m_kiwixServerPort = port; + emit(portChanged(port)); +} + +void SettingsManager::setSettings() +{ + m_kiwixServerPort = 8181; } \ No newline at end of file diff --git a/src/settingsmanager.h b/src/settingsmanager.h index 487b28a..8366144 100644 --- a/src/settingsmanager.h +++ b/src/settingsmanager.h @@ -7,6 +7,7 @@ class SettingsManager : public QObject { Q_OBJECT + Q_PROPERTY(int kiwixServerPort READ getKiwixServerPort NOTIFY portChanged) public: explicit SettingsManager(QObject *parent = nullptr); virtual ~SettingsManager() {}; @@ -14,8 +15,19 @@ public: 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: bool m_settingsViewDisplayed; + int m_kiwixServerPort; }; #endif // SETTINGSMANAGER_H From 49bad4bf59a4ceb11a2598c0859ad3e8d1ba4eb7 Mon Sep 17 00:00:00 2001 From: luddens Date: Fri, 4 Oct 2019 15:12:48 +0200 Subject: [PATCH 3/5] use QSettings to save settings --- src/settingsmanager.cpp | 7 +++++-- src/settingsmanager.h | 2 ++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/settingsmanager.cpp b/src/settingsmanager.cpp index d2401ac..1870e1c 100644 --- a/src/settingsmanager.cpp +++ b/src/settingsmanager.cpp @@ -1,7 +1,9 @@ #include "settingsmanager.h" SettingsManager::SettingsManager(QObject *parent) - : QObject(parent), m_settingsViewDisplayed(false) + : QObject(parent), + m_settings("Kiwix", "Kiwix-desktop"), + m_settingsViewDisplayed(false) { setSettings(); } @@ -19,10 +21,11 @@ SettingsManagerView* SettingsManager::getView() void SettingsManager::setKiwixServerPort(int port) { m_kiwixServerPort = port; + m_settings.setValue("localKiwixServer/port", port); emit(portChanged(port)); } void SettingsManager::setSettings() { - m_kiwixServerPort = 8181; + 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 index 8366144..97c61f5 100644 --- a/src/settingsmanager.h +++ b/src/settingsmanager.h @@ -2,6 +2,7 @@ #define SETTINGSMANAGER_H #include +#include #include "settingsmanagerview.h" class SettingsManager : public QObject @@ -26,6 +27,7 @@ signals: void portChanged(int port); private: + QSettings m_settings; bool m_settingsViewDisplayed; int m_kiwixServerPort; }; From 8ea9dd3f43bd819d4e7a6551713b7179d9c424ab Mon Sep 17 00:00:00 2001 From: luddens Date: Fri, 4 Oct 2019 16:26:42 +0200 Subject: [PATCH 4/5] settings page css improvements --- resources/css/_settingsManager.css | 20 ++++++++++++++++++-- resources/texts/_settingsManager.html | 4 ++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/resources/css/_settingsManager.css b/resources/css/_settingsManager.css index 89a4279..e76e05b 100644 --- a/resources/css/_settingsManager.css +++ b/resources/css/_settingsManager.css @@ -1,12 +1,28 @@ html, body { padding: 0; - margin: 0; + margin: auto; height: 100%; position: relative; - width: 100%; + 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/texts/_settingsManager.html b/resources/texts/_settingsManager.html index 0756eff..70c4469 100644 --- a/resources/texts/_settingsManager.html +++ b/resources/texts/_settingsManager.html @@ -9,9 +9,9 @@

Settings

-
+
- +
From 96dd73c339a80db12d1fbd2b7f58c487572d7da5 Mon Sep 17 00:00:00 2001 From: luddens Date: Fri, 1 Nov 2019 13:55:45 +0200 Subject: [PATCH 5/5] set shortcut to F12 --- src/kiwixapp.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kiwixapp.cpp b/src/kiwixapp.cpp index 6abe5ff..1f28d98 100644 --- a/src/kiwixapp.cpp +++ b/src/kiwixapp.cpp @@ -378,7 +378,7 @@ void KiwixApp::createAction() CREATE_ACTION(AboutAction, tr("About Kiwix")); CREATE_ACTION_ICON(SettingAction, "settings", tr("Settings")); - SET_SHORTCUT(SettingAction, QKeySequence::Preferences); + SET_SHORTCUT(SettingAction, QKeySequence(Qt::Key_F12)); CREATE_ACTION_ICON(DonateAction, "donate", tr("Donate to support Kiwix")); SET_SHORTCUT(DonateAction, QKeySequence("Ctrl+<,3"));