From b42ee5c83d77761ef7d8bf8635662159bc2884bb Mon Sep 17 00:00:00 2001 From: Torsten Rahn Date: Wed, 17 Oct 2018 15:21:28 +0200 Subject: Differential Revision: https://phabricator.kde.org/D698 Port to QtWebEngine (finally!) --- CMakeLists.txt | 6 +- src/apps/behaim/CMakeLists.txt | 2 + src/apps/marble-maps/CMakeLists.txt | 2 + src/lib/marble/CMakeLists.txt | 3 +- src/lib/marble/LegendWidget.cpp | 2 - src/lib/marble/LegendWidget.ui | 2 +- src/lib/marble/MarbleLegendBrowser.cpp | 108 ++++++++++----------- src/lib/marble/MarbleLegendBrowser.h | 31 ++++-- src/lib/marble/MarbleWebView.cpp | 4 +- src/lib/marble/MarbleWebView.h | 25 ++++- src/lib/marble/PopupItem.cpp | 47 ++++----- src/lib/marble/PopupItem.h | 6 +- src/lib/marble/TinyWebBrowser.cpp | 23 +++-- src/lib/marble/TinyWebBrowser.h | 10 +- src/lib/marble/WebPopupWidget.ui | 14 ++- src/lib/marble/cloudsync/RouteItemDelegate.cpp | 2 +- .../geodata/handlers/dgml/DgmlIconTagHandler.cpp | 4 +- 17 files changed, 165 insertions(+), 126 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2ea05eb..dd13e4c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -130,11 +130,11 @@ if(CMAKE_SYSTEM_NAME STREQUAL Android) else() find_package(Qt5 ${REQUIRED_QT_VERSION} COMPONENTS - WebKit - WebKitWidgets + WebEngine + WebEngineWidgets ) - if ( NOT Qt5WebKitWidgets_FOUND ) + if ( NOT Qt5WebEngineWidgets_FOUND ) set ( MARBLE_NO_WEBKITWIDGETS TRUE ) endif() endif() diff --git a/src/apps/behaim/CMakeLists.txt b/src/apps/behaim/CMakeLists.txt index b8ad26c..bbed8a9 100644 --- a/src/apps/behaim/CMakeLists.txt +++ b/src/apps/behaim/CMakeLists.txt @@ -25,6 +25,8 @@ if (CMAKE_SYSTEM_NAME STREQUAL Android) Qt5::Positioning Qt5::AndroidExtras Qt5::Multimedia + Qt5::WebEngineWidgets + Qt5::WebEngine ) else() set(TARGET marble-behaim) diff --git a/src/apps/marble-maps/CMakeLists.txt b/src/apps/marble-maps/CMakeLists.txt index 14be2c0..a52818c 100644 --- a/src/apps/marble-maps/CMakeLists.txt +++ b/src/apps/marble-maps/CMakeLists.txt @@ -30,6 +30,8 @@ if (CMAKE_SYSTEM_NAME STREQUAL Android) Qt5::AndroidExtras Qt5::Multimedia Qt5::QuickControls2 + Qt5::WebEngineWidgets + Qt5::WebEngine ) else() set(TARGET marble-maps) diff --git a/src/lib/marble/CMakeLists.txt b/src/lib/marble/CMakeLists.txt index 3f1afa7..64d0cec 100644 --- a/src/lib/marble/CMakeLists.txt +++ b/src/lib/marble/CMakeLists.txt @@ -394,7 +394,8 @@ target_link_libraries(marblewidget if (NOT MARBLE_NO_WEBKITWIDGETS) target_link_libraries(marblewidget LINK_PUBLIC - Qt5::WebKitWidgets + Qt5::WebEngineWidgets + Qt5::WebEngine ) endif () if (NOT MARBLE_NO_DBUS) diff --git a/src/lib/marble/LegendWidget.cpp b/src/lib/marble/LegendWidget.cpp index c6949ae..8f9c237 100644 --- a/src/lib/marble/LegendWidget.cpp +++ b/src/lib/marble/LegendWidget.cpp @@ -22,8 +22,6 @@ using namespace Marble; #include "ui_LegendWidget.h" #endif -#include "MarbleLegendBrowser.h" - namespace Marble { diff --git a/src/lib/marble/LegendWidget.ui b/src/lib/marble/LegendWidget.ui index 5a41ffd..14c7633 100644 --- a/src/lib/marble/LegendWidget.ui +++ b/src/lib/marble/LegendWidget.ui @@ -28,7 +28,7 @@ MarbleLegendBrowser - QWebView + QWebEngineView
MarbleLegendBrowser.h
diff --git a/src/lib/marble/MarbleLegendBrowser.cpp b/src/lib/marble/MarbleLegendBrowser.cpp index c06fe9a..d5a4a87 100644 --- a/src/lib/marble/MarbleLegendBrowser.cpp +++ b/src/lib/marble/MarbleLegendBrowser.cpp @@ -24,8 +24,9 @@ #include #ifndef MARBLE_NO_WEBKITWIDGETS -#include -#include +#include +#include +#include "MarbleWebView.h" #endif #include @@ -49,10 +50,11 @@ namespace Marble class MarbleLegendBrowserPrivate { public: - MarbleModel *m_marbleModel; + MarbleModel *m_marbleModel; QMap m_checkBoxMap; QMap m_symbolMap; QString m_currentThemeId; + MarbleJsWrapper *m_jsWrapper; }; @@ -64,14 +66,7 @@ MarbleLegendBrowser::MarbleLegendBrowser( QWidget *parent ) d( new MarbleLegendBrowserPrivate ) { d->m_marbleModel = nullptr; - -#ifndef MARBLE_NO_WEBKITWIDGETS - QWebFrame *frame = page()->mainFrame(); - connect(frame, SIGNAL(javaScriptWindowObjectCleared()), - this, SLOT(injectCheckBoxChecker())); - page()->setLinkDelegationPolicy( QWebPage::DelegateAllLinks ); - connect( this, SIGNAL(linkClicked(QUrl)), this, SLOT(openLinkExternally(QUrl)) ); -#endif + d->m_jsWrapper = new MarbleJsWrapper(this); } MarbleLegendBrowser::~MarbleLegendBrowser() @@ -92,7 +87,7 @@ void MarbleLegendBrowser::setMarbleModel( MarbleModel *marbleModel ) QSize MarbleLegendBrowser::sizeHint() const { - return QSize( 180, 320 ); + return QSize( 320, 320 ); } void MarbleLegendBrowser::initTheme() @@ -153,6 +148,7 @@ void MarbleLegendBrowser::loadLegend() TemplateDocument doc(finalHtml); finalHtml = doc.finalText(); + injectWebChannel(finalHtml); reverseSupportCheckboxes(finalHtml); // Generate some parts of the html from the MapTheme tag. @@ -166,18 +162,20 @@ void MarbleLegendBrowser::loadLegend() QUrl baseUrl = QUrl::fromLocalFile( legendPath ); // Set the html string in the QTextBrowser. - setHtml(finalHtml, baseUrl); + MarbleWebPage * page = new MarbleWebPage(this); + connect( page, SIGNAL(linkClicked(QUrl)), this, SLOT(openLinkExternally(QUrl)) ); + page->setHtml(finalHtml, baseUrl); + setPage(page); - QTextDocument *document = new QTextDocument(page()->mainFrame()->toHtml()); - d->m_marbleModel->setLegend( document ); -#endif -} + QWebChannel *channel = new QWebChannel(page); + channel->registerObject(QStringLiteral("Marble"), d->m_jsWrapper); + page->setWebChannel(channel); -void MarbleLegendBrowser::injectCheckBoxChecker() -{ -#ifndef MARBLE_NO_WEBKITWIDGETS - QWebFrame *frame = page()->mainFrame(); - frame->addToJavaScriptWindowObject( "Marble", this ); + if ( d->m_marbleModel ) { + page->toHtml([=]( QString document ) { + d->m_marbleModel->setLegend( new QTextDocument(document) ); + }); + } #endif } @@ -194,6 +192,7 @@ bool MarbleLegendBrowser::event( QEvent * event ) { // "Delayed initialization": legend gets created only if ( event->type() == QEvent::Show ) { + setVisible(true); loadLegend(); return true; } @@ -218,8 +217,7 @@ QString MarbleLegendBrowser::readHtml( const QUrl & name ) void MarbleLegendBrowser::translateHtml( QString & html ) { // must match string extraction in Messages.sh - // TODO: html.remove also changes html, is that intended? - QString s = html.remove(0, html.indexOf(QLatin1String(""))); + QString s = html; QRegExp rx( "\\s]+))?)+\\s*|\\s*)/?>" ); rx.setMinimal( true ); s.replace( rx, "\n" ); @@ -232,6 +230,18 @@ void MarbleLegendBrowser::translateHtml( QString & html ) html.replace(*i, QCoreApplication::translate("Legends", (*i).toUtf8().constData())); } +void MarbleLegendBrowser::injectWebChannel(QString &html) +{ + QString webChannelCode = ""; + webChannelCode += "" + ""; + html.replace("", webChannelCode); +} + void MarbleLegendBrowser::reverseSupportCheckboxes(QString &html) { const QString old = ""; @@ -241,7 +251,7 @@ void MarbleLegendBrowser::reverseSupportCheckboxes(QString &html) checked = "checked"; const QString repair = QLatin1String( - ""); html.replace(old, repair); @@ -283,7 +293,7 @@ QString MarbleLegendBrowser::generateSectionsHtml() if(!section->radio().isEmpty()) { checkBoxString = QLatin1String( "