diff --git a/kiwix-desktop.pro b/kiwix-desktop.pro index 181d267..7baec7b 100644 --- a/kiwix-desktop.pro +++ b/kiwix-desktop.pro @@ -45,6 +45,7 @@ DEFINES += QT_DEPRECATED_WARNINGS SOURCES += \ + src/findinpagebar.cpp \ src/main.cpp \ src/mainwindow.cpp \ src/kiwixapp.cpp \ @@ -60,7 +61,6 @@ SOURCES += \ src/mainmenu.cpp \ src/webpage.cpp \ src/about.cpp \ - src/tocsidebar.cpp \ src/contentmanager.cpp \ src/contentmanagerview.cpp \ src/tabbar.cpp \ @@ -70,9 +70,11 @@ SOURCES += \ src/opdsrequestmanager.cpp \ src/localkiwixserver.cpp \ src/fullscreenwindow.cpp \ - src/fullscreennotification.cpp + src/fullscreennotification.cpp \ + src/zimview.cpp HEADERS += \ + src/findinpagebar.h \ src/mainwindow.h \ src/kiwixapp.h \ src/kprofile.h \ @@ -88,7 +90,6 @@ HEADERS += \ src/mainmenu.h \ src/webpage.h \ src/about.h \ - src/tocsidebar.h \ src/contentmanager.h \ src/contentmanagerview.h \ src/tabbar.h \ @@ -99,12 +100,13 @@ HEADERS += \ src/localkiwixserver.h \ src/fullscreenwindow.h \ src/fullscreennotification.h \ - src/menuproxystyle.h + src/menuproxystyle.h \ + src/zimview.h FORMS += \ + src/findinpagebar.ui \ ui/mainwindow.ui \ ui/about.ui \ - src/tocsidebar.ui \ src/contentmanagerside.ui \ src/readinglistbar.ui \ ui/localkiwixserver.ui diff --git a/resources/css/style.css b/resources/css/style.css index 28b2af1..7b4ccc8 100644 --- a/resources/css/style.css +++ b/resources/css/style.css @@ -174,6 +174,10 @@ QTabBar::tab:last QToolButton::hover { Find Search page */ +#FindInPageBar { + border-top: 1px solid #ccc; +} + #findEdit { background-color: white; padding: 2px; @@ -182,30 +186,25 @@ QTabBar::tab:last QToolButton::hover { font-size: 16px; border: 1px solid #ccc; border-radius: 0px; - border-bottom-left-radius: 5px; - border-top-left-radius: 5px; } #fNextButton, -#fPreviousButton { +#fPreviousButton, +#hideButton { + outline: none; max-height: 36px; max-width: 36px; border: 1px solid #ccc; border-radius: 0px; - margin-left: -2px; } #fNextButton:pressed, -#fPreviousButton:pressed { +#fPreviousButton:pressed, +#hideButton:pressed { background-color: #D9E9FF; border: 1px solid #3366CC; } -#fPreviousButton { - border-top-right-radius: 5px; - border-bottom-right-radius: 5px; -} - /* ---------------------------------------- Find Search page */ diff --git a/src/contentmanager.cpp b/src/contentmanager.cpp index 48b3874..c1f39d4 100644 --- a/src/contentmanager.cpp +++ b/src/contentmanager.cpp @@ -230,7 +230,7 @@ void ContentManager::eraseBook(const QString& id) auto tabBar = KiwixApp::instance()->getTabWidget(); int i = 1; while (i < tabBar->count() - 1) { - WebView* webView = tabBar->widget(i); + WebView* webView = tabBar->widget(i)->getWebView(); if (webView->zimId() == id) { tabBar->closeTab(i); } else { diff --git a/src/tocsidebar.cpp b/src/findinpagebar.cpp similarity index 58% rename from src/tocsidebar.cpp rename to src/findinpagebar.cpp index 0d6cd9b..06ec6cf 100644 --- a/src/tocsidebar.cpp +++ b/src/findinpagebar.cpp @@ -1,63 +1,69 @@ -#include "tocsidebar.h" -#include "ui_tocsidebar.h" +#include "findinpagebar.h" +#include "ui_findinpagebar.h" #include "kiwixapp.h" -TocSideBar::TocSideBar(QWidget *parent) : - QWidget(parent), - mp_ui(new Ui::TocSideBar) +FindInPageBar::FindInPageBar(QWidget *parent) : + QFrame(parent), + mp_ui(new Ui::FindInPageBar) { mp_ui->setupUi(this); mp_findLineEdit = mp_ui->findEdit; connect(mp_ui->hideButton, &QPushButton::released, - this, &TocSideBar::findClose); + this, &FindInPageBar::findClose); connect(mp_ui->fNextButton, &QPushButton::released, - this, &TocSideBar::findNext); + this, &FindInPageBar::findNext); connect(mp_ui->fPreviousButton, &QPushButton::released, - this, &TocSideBar::findPrevious); + this, &FindInPageBar::findPrevious); connect(mp_findLineEdit, &QLineEdit::returnPressed, - this, &TocSideBar::findNext); + this, &FindInPageBar::findNext); } -TocSideBar::~TocSideBar() +FindInPageBar::~FindInPageBar() { delete mp_ui; } -void TocSideBar::postInit() -{ - -} - -void TocSideBar::findClose() -{ - auto current = KiwixApp::instance()->getTabWidget()->currentWidget(); - if (!current) - return; - auto page = current->page(); - page->findText(""); - KiwixApp::instance()->setSideBar(KiwixApp::NONE); -} - -void TocSideBar::findNext() +void FindInPageBar::findNext() { auto searchText = mp_findLineEdit->text(); if (searchText.isEmpty()) return; - auto current = KiwixApp::instance()->getTabWidget()->currentWidget(); + auto current = KiwixApp::instance()->getTabWidget()->currentWebView(); if (!current) return; auto page = current->page(); page->findText(searchText); } -void TocSideBar::findPrevious() +void FindInPageBar::findPrevious() { auto searchText = mp_findLineEdit->text(); if (searchText.isEmpty()) return; - auto current = KiwixApp::instance()->getTabWidget()->currentWidget(); + auto current = KiwixApp::instance()->getTabWidget()->currentWebView(); if (!current) return; auto page = current->page(); page->findText(searchText, QWebEnginePage::FindBackward); } + +void FindInPageBar::findClose() +{ + auto current = KiwixApp::instance()->getTabWidget()->currentWebView(); + if (!current) + return; + auto page = current->page(); + page->findText(""); + close(); +} + +void FindInPageBar::keyPressEvent(QKeyEvent *event) +{ + switch(event->key()) { + case Qt::Key_Escape: + findClose(); + break; + default: + QWidget::keyPressEvent(event); + } +} \ No newline at end of file diff --git a/src/findinpagebar.h b/src/findinpagebar.h new file mode 100644 index 0000000..0632bc1 --- /dev/null +++ b/src/findinpagebar.h @@ -0,0 +1,34 @@ +#ifndef FINDINPAGEBAR_H +#define FINDINPAGEBAR_H + +#include +#include + +namespace Ui { +class FindInPageBar; +} + +class FindInPageBar : public QFrame +{ + Q_OBJECT + +public: + explicit FindInPageBar(QWidget *parent = nullptr); + ~FindInPageBar(); + + QLineEdit* getFindLineEdit() { return mp_findLineEdit; }; + +public slots: + void findNext(); + void findPrevious(); + void findClose(); + +protected: + void keyPressEvent(QKeyEvent *event); + +private: + Ui::FindInPageBar *mp_ui; + QLineEdit *mp_findLineEdit; +}; + +#endif // FINDINPAGEBAR_H diff --git a/src/findinpagebar.ui b/src/findinpagebar.ui new file mode 100644 index 0000000..c7e9b40 --- /dev/null +++ b/src/findinpagebar.ui @@ -0,0 +1,82 @@ + + + FindInPageBar + + + + 0 + 0 + 833 + 43 + + + + + 0 + 0 + + + + Frame + + + + + + Find in page + + + + + + + + :/icons/search_forward.svg:/icons/search_forward.svg + + + true + + + + + + + + :/icons/search_backward.svg:/icons/search_backward.svg + + + true + + + + + + + Qt::Horizontal + + + + 350 + 20 + + + + + + + + + :/icons/close.svg:/icons/close.svg + + + true + + + + + + + + + + diff --git a/src/kiwixapp.cpp b/src/kiwixapp.cpp index 0060585..5bab3ea 100644 --- a/src/kiwixapp.cpp +++ b/src/kiwixapp.cpp @@ -160,7 +160,7 @@ void KiwixApp::printPage() printDialog.setStyle(nullptr); printDialog.setStyleSheet(""); if (printDialog.exec() == QDialog::Accepted) { - auto webview = mp_tabWidget->currentWidget(); + auto webview = mp_tabWidget->currentWebView(); if(!webview) return; webview->page()->print(printer, [=](bool success) { @@ -184,8 +184,6 @@ void KiwixApp::setSideBar(KiwixApp::SideBarType type) { auto sideDockWidget = mp_mainWindow->getSideDockWidget(); switch(type) { - case SEARCH_BAR: - mp_mainWindow->findChild("tocsidebar")->getFindLineEdit()->setFocus(); case CONTENTMANAGER_BAR: case READINGLIST_BAR: sideDockWidget->setCurrentIndex(type); @@ -317,9 +315,9 @@ void KiwixApp::createAction() HIDE_ACTION(SearchLibraryAction); CREATE_ACTION(FindInPageAction, tr("Find in page")); - SET_SHORTCUT(FindInPageAction, QKeySequence::Find); + mpa_actions[FindInPageAction]->setShortcuts({QKeySequence::Find, Qt::Key_F3}); connect(mpa_actions[FindInPageAction], &QAction::triggered, - this, [=]() { toggleSideBar(SEARCH_BAR); }); + this, [=]() { mp_tabWidget->openFindInPageBar(); }); CREATE_ACTION_ICON(ToggleFullscreenAction, "full-screen-enter", tr("Set fullScreen")); SET_SHORTCUT(ToggleFullscreenAction, QKeySequence::FullScreen); diff --git a/src/kiwixapp.h b/src/kiwixapp.h index 75c6779..c86c02b 100644 --- a/src/kiwixapp.h +++ b/src/kiwixapp.h @@ -7,8 +7,8 @@ #include "kiwix/downloader.h" #include #include "tabbar.h" -#include "tocsidebar.h" #include "kprofile.h" +#include "urlschemehandler.h" #include "settingsmanager.h" #include @@ -54,7 +54,6 @@ public: MAX_ACTION }; enum SideBarType { - SEARCH_BAR, CONTENTMANAGER_BAR, READINGLIST_BAR, NONE diff --git a/src/mainwindow.h b/src/mainwindow.h index 5df2b68..21407b9 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -6,7 +6,6 @@ #include "webview.h" #include "tabbar.h" #include "topwidget.h" -#include "tocsidebar.h" #include "about.h" #include "contentmanagerside.h" #include "localkiwixserver.h" diff --git a/src/searchbar.cpp b/src/searchbar.cpp index 8a27cd6..c56cea4 100644 --- a/src/searchbar.cpp +++ b/src/searchbar.cpp @@ -122,7 +122,7 @@ void SearchBar::updateCompletion(const QString &text) { QStringList wordList; m_urlList.clear(); - auto currentWidget = KiwixApp::instance()->getTabWidget()->currentWidget(); + auto currentWidget = KiwixApp::instance()->getTabWidget()->currentWebView(); if (!currentWidget) { m_completionModel.setStringList(wordList); return; diff --git a/src/tabbar.cpp b/src/tabbar.cpp index ac034c8..9c1a741 100644 --- a/src/tabbar.cpp +++ b/src/tabbar.cpp @@ -37,40 +37,9 @@ TabBar::TabBar(QWidget *parent) : } this->closeTab(index); }); - connect(app->getAction(KiwixApp::ZoomInAction), &QAction::triggered, - this, [=]() { - auto current = this->currentWidget(); - QUITIFNULL(current); - auto zoomFactor = current->zoomFactor(); - zoomFactor += 0.1; - zoomFactor = max(min(zoomFactor, 5.0), 0.25); - current->setZoomFactor(zoomFactor); - auto key = this->currentZimId() + "/zoomFactor"; - KiwixApp::instance()->getSettingsManager()->setSettings(key, zoomFactor); - }); - connect(app->getAction(KiwixApp::ZoomOutAction), &QAction::triggered, - this, [=]() { - auto current = this->currentWidget(); - QUITIFNULL(current); - auto zoomFactor = current->zoomFactor(); - zoomFactor -= 0.1; - zoomFactor = max(min(zoomFactor, 5.0), 0.25); - current->setZoomFactor(zoomFactor); - auto key = this->currentZimId() + "/zoomFactor"; - KiwixApp::instance()->getSettingsManager()->setSettings(key, zoomFactor); - }); - connect(app->getAction(KiwixApp::ZoomResetAction), &QAction::triggered, - this, [=]() { - auto current = this->currentWidget(); - QUITIFNULL(current); - auto settingsManager = KiwixApp::instance()->getSettingsManager(); - current->setZoomFactor(settingsManager->getZoomFactor()); - auto key = this->currentZimId() + "/zoomFactor"; - settingsManager->deleteSettings(key); - }); connect(app->getAction(KiwixApp::OpenHomePageAction), &QAction::triggered, this, [=]() { - auto current = this->currentWidget(); + auto current = this->currentWebView(); QUITIFNULL(current); current->setUrl("zim://" + current->zimId() + ".zim/"); }); @@ -80,6 +49,7 @@ TabBar::TabBar(QWidget *parent) : return; } auto index = currentIndex() + 1; + m_settingsIndex = index; auto view = KiwixApp::instance()->getSettingsManager()->getView(); mp_stackedWidget->insertWidget(index, view); insertTab(index,QIcon(":/icons/settings.svg"), tr("Settings")); @@ -87,7 +57,6 @@ TabBar::TabBar(QWidget *parent) : tb->setDefaultAction(KiwixApp::instance()->getAction(KiwixApp::CloseTabAction)); setTabButton(index, QTabBar::RightSide, tb); setCurrentIndex(index); - m_settingsIndex = index; }); } @@ -119,51 +88,11 @@ void TabBar::setNewTabButton() setTabButton(1, QTabBar::RightSide, 0); } -WebView* TabBar::createNewTab(bool setCurrent) +ZimView* TabBar::createNewTab(bool setCurrent) { - WebView* webView = new WebView(); - connect(webView->page(), &QWebEnginePage::fullScreenRequested, this, &TabBar::fullScreenRequested); - connect(webView, &WebView::titleChanged, this, - [=](const QString& str) { - setTitleOf(str, webView); - QUITIFNOTCURRENT(webView); - emit currentTitleChanged(str); - }); - connect(webView, &WebView::iconChanged, this, - [=](const QIcon& icon) { setIconOf(icon, webView); }); - connect(webView, &WebView::zimIdChanged, this, - [=](const QString& zimId) { - QUITIFNOTCURRENT(webView); - emit currentZimIdChanged(zimId); - }); - connect(webView->page()->action(QWebEnginePage::Back), &QAction::changed, - [=]() { - QUITIFNOTCURRENT(webView); - emit webActionEnabledChanged(QWebEnginePage::Back, webView->isWebActionEnabled(QWebEnginePage::Back)); - }); - connect(webView->page()->action(QWebEnginePage::Forward), &QAction::changed, - [=]() { - QUITIFNOTCURRENT(webView); - emit webActionEnabledChanged(QWebEnginePage::Forward, webView->isWebActionEnabled(QWebEnginePage::Forward)); - }); - connect(webView->page(), &QWebEnginePage::linkHovered, this, - [=](const QString& url) { - auto tabbar = KiwixApp::instance()->getTabWidget(); - if (url.isEmpty()) { - QToolTip::hideText(); - } else { - auto link = url; - if (url.startsWith("zim://")) { - link = QUrl(url).path(); - } - auto height = tabbar->currentWidget()->height() + 1; - auto pos = tabbar->mapToGlobal(QPoint(-3, height)); - QToolTip::showText(pos, link); - } - }); - // Ownership of webview is passed to the tabWidget + auto tab = new ZimView(this, this); auto index = count() - 1; - mp_stackedWidget->insertWidget(index, webView); + mp_stackedWidget->insertWidget(index, tab); insertTab(index, ""); QToolButton *tb = new QToolButton(this); tb->setDefaultAction(KiwixApp::instance()->getAction(KiwixApp::CloseTabAction)); @@ -171,55 +100,55 @@ WebView* TabBar::createNewTab(bool setCurrent) if (setCurrent) { setCurrentIndex(index); } - return webView; + return tab; } void TabBar::openUrl(const QUrl& url, bool newTab) { - WebView* webView = currentWidget(); + WebView* webView = currentWebView(); if (newTab || !webView) { - webView = createNewTab(true); + webView = createNewTab(true)->getWebView(); } QUITIFNULL(webView); webView->setUrl(url); } -void TabBar::setTitleOf(const QString& title, WebView* webView) +void TabBar::setTitleOf(const QString& title, ZimView* tab) { - CURRENTIFNULL(webView); + CURRENTIFNULL(tab); if (title.startsWith("zim://")) { auto url = QUrl(title); - setTabText(mp_stackedWidget->indexOf(webView), url.path()); + setTabText(mp_stackedWidget->indexOf(tab), url.path()); } else { - setTabText(mp_stackedWidget->indexOf(webView), title); + setTabText(mp_stackedWidget->indexOf(tab), title); } } -void TabBar::setIconOf(const QIcon &icon, WebView *webView) +void TabBar::setIconOf(const QIcon &icon, ZimView *tab) { - CURRENTIFNULL(webView); - setTabIcon(mp_stackedWidget->indexOf(webView), icon); + CURRENTIFNULL(tab); + setTabIcon(mp_stackedWidget->indexOf(tab), icon); } QString TabBar::currentZimId() { if (!currentWidget()) return ""; - return currentWidget()->zimId(); + return currentWebView()->zimId(); } QString TabBar::currentArticleUrl() { if(!currentWidget()) return ""; - return currentWidget()->url().path(); + return currentWebView()->url().path(); } QString TabBar::currentArticleTitle() { if(!currentWidget()) return ""; - return currentWidget()->title(); + return currentWebView()->title(); } QSize TabBar::tabSizeHint(int index) const { @@ -228,12 +157,17 @@ QSize TabBar::tabSizeHint(int index) const { return QSize(40, 40); } -void TabBar::triggerWebPageAction(QWebEnginePage::WebAction action, WebView *webView) +void TabBar::openFindInPageBar() { - CURRENTIFNULL(webView); - QUITIFNULL(webView); - webView->triggerPageAction(action); - webView->setFocus(); + currentWidget()->openFindInPageBar(); +} + +void TabBar::triggerWebPageAction(QWebEnginePage::WebAction action, ZimView *widget) +{ + CURRENTIFNULL(widget); + QUITIFNULL(widget); + widget->getWebView()->triggerPageAction(action); + widget->getWebView()->setFocus(); } void TabBar::closeTab(int index) @@ -275,7 +209,7 @@ void TabBar::onCurrentChanged(int index) KiwixApp::instance()->setSideBar(KiwixApp::NONE); QTimer::singleShot(0, [=](){emit currentTitleChanged("");}); } else if (index) { - auto view = widget(index); + auto view = widget(index)->getWebView(); emit webActionEnabledChanged(QWebEnginePage::Back, view->isWebActionEnabled(QWebEnginePage::Back)); emit webActionEnabledChanged(QWebEnginePage::Forward, view->isWebActionEnabled(QWebEnginePage::Forward)); emit libraryPageDisplayed(false); @@ -298,7 +232,7 @@ void TabBar::fullScreenRequested(QWebEngineFullScreenRequest request) if (m_fullScreenWindow) return; request.accept(); - m_fullScreenWindow.reset(new FullScreenWindow(this->currentWidget())); + m_fullScreenWindow.reset(new FullScreenWindow(this->currentWebView())); } else { if (!m_fullScreenWindow) return; @@ -314,4 +248,4 @@ void TabBar::mousePressEvent(QMouseEvent *event) } else { QTabBar::mousePressEvent(event); } -} \ No newline at end of file +} diff --git a/src/tabbar.h b/src/tabbar.h index 1c8280a..3f0ce7c 100644 --- a/src/tabbar.h +++ b/src/tabbar.h @@ -5,6 +5,7 @@ #include #include #include "webview.h" +#include "zimview.h" #include "contentmanagerview.h" #include "fullscreenwindow.h" #include @@ -21,24 +22,29 @@ public: void setContentManagerView(ContentManagerView* view); void setNewTabButton(); - WebView* createNewTab(bool setCurrent); - WebView* widget(int index) { return (index != 0) ? static_cast(mp_stackedWidget->widget(index)) : nullptr; } - WebView* currentWidget() { auto current = mp_stackedWidget->currentWidget(); - if (current == mp_contentManagerView || + ZimView* createNewTab(bool setCurrent); + ZimView* widget(int index) { return (index != 0) ? static_cast(mp_stackedWidget->widget(index)) : nullptr; } + WebView* currentWebView() { auto current = mp_stackedWidget->currentWidget(); + if (mp_stackedWidget->currentIndex() == 0) return nullptr; + return static_cast(current)->getWebView(); + } + ZimView* currentWidget() { auto current = mp_stackedWidget->currentWidget(); + if (mp_stackedWidget->currentIndex() == 0 || mp_stackedWidget->currentIndex() == m_settingsIndex) return nullptr; - return static_cast(current); + return static_cast(current); } void openUrl(const QUrl &url, bool newTab); // Redirect call to sub-webView - void setTitleOf(const QString& title, WebView* webView=nullptr); - void setIconOf(const QIcon& icon, WebView* webView=nullptr); + void setTitleOf(const QString& title, ZimView* tab=nullptr); + void setIconOf(const QIcon& icon, ZimView* tab=nullptr); QString currentZimId(); - void triggerWebPageAction(QWebEnginePage::WebAction action, WebView* webView=nullptr); + void triggerWebPageAction(QWebEnginePage::WebAction action, ZimView* widget=nullptr); QString currentArticleUrl(); QString currentArticleTitle(); virtual QSize tabSizeHint(int index) const; + void openFindInPageBar(); protected: void mousePressEvent(QMouseEvent *event); diff --git a/src/tocsidebar.h b/src/tocsidebar.h deleted file mode 100644 index 4f45182..0000000 --- a/src/tocsidebar.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef TOCSIDEBAR_H -#define TOCSIDEBAR_H - -#include -#include - -namespace Ui { -class TocSideBar; -} - -class TocSideBar : public QWidget -{ - Q_OBJECT - -public: - explicit TocSideBar(QWidget *parent = 0); - ~TocSideBar(); - - void postInit(); - QLineEdit* getFindLineEdit() { return mp_findLineEdit; }; - -public slots: - void findNext(); - void findPrevious(); - void findClose(); - -private: - Ui::TocSideBar *mp_ui; - QLineEdit *mp_findLineEdit; -}; - -#endif // TOCSIDEBAR_H diff --git a/src/tocsidebar.ui b/src/tocsidebar.ui deleted file mode 100644 index aae03ac..0000000 --- a/src/tocsidebar.ui +++ /dev/null @@ -1,120 +0,0 @@ - - - TocSideBar - - - - 0 - 0 - 500 - 300 - - - - - 0 - 0 - - - - Form - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 0 - 0 - - - - Hide - - - true - - - - - - - - - 0 - - - QLayout::SetMaximumSize - - - - - - - - - - - - :/icons/search_forward.svg:/icons/search_forward.svg - - - true - - - - - - - - - - - :/icons/search_backward.svg:/icons/search_backward.svg - - - true - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - - diff --git a/src/webview.cpp b/src/webview.cpp index da51a54..04e8ebc 100644 --- a/src/webview.cpp +++ b/src/webview.cpp @@ -7,6 +7,7 @@ #include "webpage.h" #include #include +#include WebView::WebView(QWidget *parent) : QWebEngineView(parent) @@ -32,7 +33,7 @@ QWebEngineView* WebView::createWindow(QWebEnginePage::WebWindowType type) || type==QWebEnginePage::WebBrowserTab ) { auto tabWidget = KiwixApp::instance()->getTabWidget(); - return tabWidget->createNewTab(type==QWebEnginePage::WebBrowserTab); + return tabWidget->createNewTab(type==QWebEnginePage::WebBrowserTab)->getWebView(); } return nullptr; } diff --git a/src/webview.h b/src/webview.h index c377ea9..cdf8346 100644 --- a/src/webview.h +++ b/src/webview.h @@ -6,6 +6,7 @@ #include #include +#include "findinpagebar.h" class WebView : public QWebEngineView { diff --git a/src/zimview.cpp b/src/zimview.cpp new file mode 100644 index 0000000..6103c02 --- /dev/null +++ b/src/zimview.cpp @@ -0,0 +1,101 @@ +#include "zimview.h" +#include "kiwixapp.h" +#include +#include +#include + +ZimView::ZimView(TabBar *tabBar, QWidget *parent) + : QWidget(parent), + mp_tabBar(tabBar), + mp_findInPageBar(new FindInPageBar(this)) +{ + mp_webView = new WebView(); + QVBoxLayout *layout = new QVBoxLayout; + layout->addWidget(mp_webView); + layout->addWidget(mp_findInPageBar); + layout->setContentsMargins(0,0,0,0); + layout->setSpacing(0); + setLayout(layout); + mp_findInPageBar->hide(); + auto app = KiwixApp::instance(); + connect(app->getAction(KiwixApp::ZoomInAction), &QAction::triggered, + this, [=]() { + auto zoomFactor = mp_webView->zoomFactor(); + zoomFactor += 0.1; + zoomFactor = max(min(zoomFactor, 5.0), 0.25); + mp_webView->setZoomFactor(zoomFactor); + auto key = mp_webView->zimId() + "/zoomFactor"; + KiwixApp::instance()->getSettingsManager()->setSettings(key, zoomFactor); + }); + connect(app->getAction(KiwixApp::ZoomOutAction), &QAction::triggered, + this, [=]() { + auto zoomFactor = mp_webView->zoomFactor(); + zoomFactor -= 0.1; + zoomFactor = max(min(zoomFactor, 5.0), 0.25); + mp_webView->setZoomFactor(zoomFactor); + auto key = mp_webView->zimId() + "/zoomFactor"; + KiwixApp::instance()->getSettingsManager()->setSettings(key, zoomFactor); + }); + connect(app->getAction(KiwixApp::ZoomResetAction), &QAction::triggered, + this, [=]() { + auto settingsManager = KiwixApp::instance()->getSettingsManager(); + mp_webView->setZoomFactor(settingsManager->getZoomFactor()); + auto key = mp_webView->zimId() + "/zoomFactor"; + settingsManager->deleteSettings(key); + }); + connect(mp_webView->page(), &QWebEnginePage::fullScreenRequested, mp_tabBar, &TabBar::fullScreenRequested); + connect(mp_webView, &WebView::titleChanged, this, + [=](const QString& str) { + mp_tabBar->setTitleOf(str, this); + if (mp_tabBar->currentWidget() != this) { + return; + } + emit mp_tabBar->currentTitleChanged(str); + }); + connect(mp_webView, &WebView::iconChanged, this, + [=](const QIcon& icon) { mp_tabBar->setIconOf(icon, this); }); + connect(mp_webView, &WebView::zimIdChanged, this, + [=](const QString& zimId) { + if (mp_tabBar->currentWidget() != this) { + return; + } + emit mp_tabBar->currentZimIdChanged(zimId); + }); + connect(mp_webView->page()->action(QWebEnginePage::Back), &QAction::changed, + [=]() { + if (mp_tabBar->currentWidget() != this) { + return; + } + emit mp_tabBar->webActionEnabledChanged(QWebEnginePage::Back, mp_webView->isWebActionEnabled(QWebEnginePage::Back)); + }); + connect(mp_webView->page()->action(QWebEnginePage::Forward), &QAction::changed, + [=]() { + if (mp_tabBar->currentWidget() != this) { + return; + } + emit mp_tabBar->webActionEnabledChanged(QWebEnginePage::Forward, mp_webView->isWebActionEnabled(QWebEnginePage::Forward)); + }); + connect(mp_webView->page(), &QWebEnginePage::linkHovered, this, + [=](const QString& url) { + if (mp_tabBar->currentIndex() == 0) { + return; + } + if (url.isEmpty()) { + QToolTip::hideText(); + } else { + auto link = url; + if (url.startsWith("zim://")) { + link = QUrl(url).path(); + } + auto height = mp_tabBar->currentWebView()->height() + 1; + auto pos = mp_tabBar->mapToGlobal(QPoint(-3, height)); + QToolTip::showText(pos, link); + } + }); +} + +void ZimView::openFindInPageBar() +{ + mp_findInPageBar->show(); + mp_findInPageBar->getFindLineEdit()->setFocus(); +} diff --git a/src/zimview.h b/src/zimview.h new file mode 100644 index 0000000..d3fde56 --- /dev/null +++ b/src/zimview.h @@ -0,0 +1,29 @@ +#ifndef ZIMVIEW_H +#define ZIMVIEW_H + +#include +#include "webview.h" +#include "findinpagebar.h" + +class TabBar; + +class ZimView : public QWidget +{ + Q_OBJECT +public: + explicit ZimView(TabBar* tabBar, QWidget *parent = nullptr); + + WebView *getWebView() { return mp_webView; } + FindInPageBar *getFindInPageBar() { return mp_findInPageBar; } + void openFindInPageBar(); + +signals: + +private: + WebView *mp_webView; + TabBar *mp_tabBar; + FindInPageBar *mp_findInPageBar; + +}; + +#endif // ZIMVIEW_H diff --git a/ui/mainwindow.ui b/ui/mainwindow.ui index 1255b62..3e89d7f 100644 --- a/ui/mainwindow.ui +++ b/ui/mainwindow.ui @@ -67,7 +67,6 @@ 0 - @@ -108,12 +107,6 @@ QToolBar
src/topwidget.h
- - TocSideBar - QWidget -
src/tocsidebar.h
- 1 -
TabBar QWidget