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);