From 101b1170ef8484df732ccbff235dc28fc91f1a26 Mon Sep 17 00:00:00 2001 From: Maik Qualmann Date: Wed, 28 Mar 2018 22:13:01 +0200 Subject: add possibility to use QWebEngine instead of QWebKit with compile flag CCBUGS: 363859 --- bootstrap.linux | 1 + bootstrap.macports | 1 + core/CMakeLists.txt | 10 +- core/app/CMakeLists.txt | 34 +- core/app/utils/digikam_config.h.cmake.in | 3 + core/app/views/stackedview.cpp | 11 +- core/app/views/welcomepageview.cpp | 8 +- core/app/views/welcomepageview_qwebengine.cpp | 222 +++++++++++ core/app/views/welcomepageview_qwebengine.h | 87 +++++ .../geolocation/geoiface/backend-googlemaps-js.js | 12 +- core/libs/dialogs/CMakeLists.txt | 20 +- core/libs/dialogs/webbrowserdlg_qwebengine.cpp | 228 ++++++++++++ core/libs/dialogs/webbrowserdlg_qwebengine.h | 76 ++++ core/libs/widgets/mainview/dxmlguiwindow.cpp | 7 +- .../htmlgallery/wizard/htmlfinalpage.cpp | 8 +- core/utilities/geolocation/geoiface/CMakeLists.txt | 20 +- .../geoiface/backends/backendgooglemaps.cpp | 29 +- .../geolocation/geoiface/widgets/htmlwidget.cpp | 2 +- .../geolocation/geoiface/widgets/htmlwidget.h | 2 +- .../geoiface/widgets/htmlwidget_qwebengine.cpp | 409 +++++++++++++++++++++ .../geoiface/widgets/htmlwidget_qwebengine.h | 119 ++++++ 21 files changed, 1278 insertions(+), 31 deletions(-) create mode 100644 core/app/views/welcomepageview_qwebengine.cpp create mode 100644 core/app/views/welcomepageview_qwebengine.h create mode 100644 core/libs/dialogs/webbrowserdlg_qwebengine.cpp create mode 100644 core/libs/dialogs/webbrowserdlg_qwebengine.h create mode 100644 core/utilities/geolocation/geoiface/widgets/htmlwidget_qwebengine.cpp create mode 100644 core/utilities/geolocation/geoiface/widgets/htmlwidget_qwebengine.h diff --git a/bootstrap.linux b/bootstrap.linux index a877a31..5ecf3b8 100755 --- a/bootstrap.linux +++ b/bootstrap.linux @@ -91,6 +91,7 @@ $CMAKE_BINARY -G "$MAKEFILES_TYPE" . \ -DENABLE_MEDIAPLAYER=ON \ -DENABLE_DBUS=ON \ -DENABLE_APPSTYLES=ON \ + -DENABLE_QWEBENGINE=OFF \ -Wno-dev \ $SOURCEDIR && echo "$MESSAGE" diff --git a/bootstrap.macports b/bootstrap.macports index 41a331a..562552f 100755 --- a/bootstrap.macports +++ b/bootstrap.macports @@ -85,6 +85,7 @@ cmake -G "$MAKEFILES_TYPE" . \ -DENABLE_KIO=OFF \ -DENABLE_LEGACY=OFF \ -DENABLE_APPSTYLES=OFF \ + -DENABLE_QWEBENGINE=OFF \ -DAPPLE_SUPPRESS_X11_WARNING=ON \ -DCMAKE_COLOR_MAKEFILE=ON \ -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON \ diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index 856954c..8f7163b 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -104,6 +104,7 @@ option(ENABLE_AKONADICONTACTSUPPORT "Build digiKam with KDE Mail Contacts suppor option(ENABLE_MEDIAPLAYER "Build digiKam with Media Player support (default=OFF)" OFF) option(ENABLE_DBUS "Build digiKam with DBUS support (default=ON)" ON) option(ENABLE_APPSTYLES "Build digiKam with support for changing the widget application style (default=OFF)" OFF) +option(ENABLE_QWEBENGINE "Build digiKam with QWebEngine instead of QWebKit (default=OFF)" OFF) # Mysql support options (experimental): option(ENABLE_MYSQLSUPPORT "Build digiKam with MySQL dabatase support (default=ON)" ON) @@ -124,10 +125,15 @@ find_package(Qt5 ${QT_MIN_VERSION} Sql Xml PrintSupport - WebKitWidgets Network ) +if(ENABLE_QWEBENGINE) + find_package(Qt5 ${QT_MIN_VERSION} NO_MODULE COMPONENTS WebEngineWidgets) +else() + find_package(Qt5 ${QT_MIN_VERSION} NO_MODULE COMPONENTS WebKitWidgets) +endif() + find_package(Qt5 ${QT_MIN_VERSION} OPTIONAL_COMPONENTS DBus @@ -415,6 +421,7 @@ MACRO_BOOL_TO_01(ENABLE_INTERNALMYSQL HAVE_INTERNALMYSQL) MACRO_BOOL_TO_01(ENABLE_MEDIAPLAYER HAVE_MEDIAPLAYER) MACRO_BOOL_TO_01(ENABLE_DBUS HAVE_DBUS) MACRO_BOOL_TO_01(ENABLE_APPSTYLES HAVE_APPSTYLE_SUPPORT) +MACRO_BOOL_TO_01(ENABLE_QWEBENGINE HAVE_QWEBENGINE) # Whether to use Qt's scaling to downscale previews. Under MacOSX, Qt # can make use of the higher physical resolution of Retina @@ -440,6 +447,7 @@ PRINT_COMPONENT_COMPILE_STATUS("MySQL Database Support" ENABLE_MYSQLSUPPORT) PRINT_COMPONENT_COMPILE_STATUS("MySQL Internal Support" ENABLE_INTERNALMYSQL) PRINT_COMPONENT_COMPILE_STATUS("DBUS Support" ENABLE_DBUS) PRINT_COMPONENT_COMPILE_STATUS("App. Style Support" ENABLE_APPSTYLES) +PRINT_COMPONENT_COMPILE_STATUS("QWebEngine Support" ENABLE_QWEBENGINE) # ============================================================================== diff --git a/core/app/CMakeLists.txt b/core/app/CMakeLists.txt index 23571bd..9b9be3c 100644 --- a/core/app/CMakeLists.txt +++ b/core/app/CMakeLists.txt @@ -93,7 +93,6 @@ endif() endif() include_directories($ - $ $ $ $ @@ -107,6 +106,12 @@ include_directories($ $) +if(ENABLE_QWEBENGINE) + include_directories($) +else() + include_directories($) +endif() + if(KF5KIO_FOUND) include_directories($) endif() @@ -140,7 +145,6 @@ target_link_libraries(digikamcore Qt5::Xml Qt5::Widgets Qt5::Sql - Qt5::WebKitWidgets Qt5::PrintSupport Qt5::Concurrent @@ -166,6 +170,12 @@ target_link_libraries(digikamcore libraw ) +if(ENABLE_QWEBENGINE) + target_link_libraries(digikamcore PUBLIC Qt5::WebEngineWidgets) +else() + target_link_libraries(digikamcore PUBLIC Qt5::WebKitWidgets) +endif() + if(ENABLE_DBUS) target_link_libraries(digikamcore PUBLIC Qt5::DBus) endif() @@ -344,7 +354,6 @@ set(libdigikamgui_SRCS views/imagepreviewviewitem.cpp views/imagepreviewview.cpp - views/welcomepageview.cpp views/leftsidebarwidgets.cpp views/digikamview.cpp views/trashview.cpp @@ -353,6 +362,18 @@ set(libdigikamgui_SRCS ${digikamadaptor_SRCS} ) +if(ENABLE_QWEBENGINE) + set(libdigikamgui_SRCS + ${libdigikamgui_SRCS} + views/welcomepageview_qwebengine.cpp + ) +else() + set(libdigikamgui_SRCS + ${libdigikamgui_SRCS} + views/welcomepageview.cpp + ) +endif() + if(${Marble_FOUND}) set(libdigikamgui_SRCS ${libdigikamgui_SRCS} @@ -432,7 +453,6 @@ target_link_libraries(digikamgui Qt5::Gui Qt5::Widgets Qt5::Sql - Qt5::WebKitWidgets Qt5::PrintSupport KF5::Solid @@ -443,6 +463,12 @@ target_link_libraries(digikamgui ${OpenCV_LIBRARIES} ) +if(ENABLE_QWEBENGINE) + target_link_libraries(digikamgui PUBLIC Qt5::WebEngineWidgets) +else() + target_link_libraries(digikamgui PUBLIC Qt5::WebKitWidgets) +endif() + if(ENABLE_DBUS) target_link_libraries(digikamgui PUBLIC Qt5::DBus) endif() diff --git a/core/app/utils/digikam_config.h.cmake.in b/core/app/utils/digikam_config.h.cmake.in index a4df21a..27046df 100644 --- a/core/app/utils/digikam_config.h.cmake.in +++ b/core/app/utils/digikam_config.h.cmake.in @@ -108,6 +108,9 @@ /* Define to 1 if changing application styles is supported */ #cmakedefine HAVE_APPSTYLE_SUPPORT 1 +/* Define to 1 if system use QWebEngine instead of QWebKit */ +#cmakedefine HAVE_QWEBENGINE 1 + #define LIBEXEC_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${LIBEXEC_INSTALL_DIR}" /* diff --git a/core/app/views/stackedview.cpp b/core/app/views/stackedview.cpp index 554156a..4295b48 100644 --- a/core/app/views/stackedview.cpp +++ b/core/app/views/stackedview.cpp @@ -48,18 +48,23 @@ #include "imagethumbnailbar.h" #include "loadingcacheinterface.h" #include "previewlayout.h" -#include "welcomepageview.h" #include "thumbbardock.h" #include "tableview.h" #include "trashview.h" #include "dimg.h" +#ifdef HAVE_QWEBENGINE +# include "welcomepageview_qwebengine.h" +#else +# include "welcomepageview.h" +#endif + #ifdef HAVE_MEDIAPLAYER -#include "mediaplayerview.h" +# include "mediaplayerview.h" #endif //HAVE_MEDIAPLAYER #ifdef HAVE_MARBLE -#include "mapwidgetview.h" +# include "mapwidgetview.h" #endif // HAVE_MARBLE namespace Digikam diff --git a/core/app/views/welcomepageview.cpp b/core/app/views/welcomepageview.cpp index fee2172..a54bba6 100644 --- a/core/app/views/welcomepageview.cpp +++ b/core/app/views/welcomepageview.cpp @@ -41,11 +41,17 @@ // Local includes +#include "digikam_config.h" #include "digikam_debug.h" #include "digikam_version.h" #include "daboutdata.h" #include "thememanager.h" -#include "webbrowserdlg.h" + +#ifdef HAVE_QWEBENGINE +# include "webbrowserdlg_qwebengine.h" +#else +# include "webbrowserdlg.h" +#endif namespace Digikam { diff --git a/core/app/views/welcomepageview_qwebengine.cpp b/core/app/views/welcomepageview_qwebengine.cpp new file mode 100644 index 0000000..ea964f8 --- /dev/null +++ b/core/app/views/welcomepageview_qwebengine.cpp @@ -0,0 +1,222 @@ +/* ============================================================ + * + * This file is a part of digiKam project + * http://www.digikam.org + * + * Date : 2006-12-20 + * Description : a widget to display a welcome page + * on root album. + * + * Copyright (C) 2006-2018 by Gilles Caulier + * Copyright (C) 2009-2011 by Andi Clemens + * Copyright (C) 2015 by Mohamed Anwer + * + * This program is free software; you can redistribute it + * and/or modify it under the terms of the GNU General + * Public License as published by the Free Software Foundation; + * either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * ============================================================ */ + +#include "welcomepageview_qwebengine.h" + +// Qt includes + +#include +#include +#include +#include +#include +#include + +// KDE includes + +#include + +// Local includes + +#include "digikam_debug.h" +#include "digikam_version.h" +#include "daboutdata.h" +#include "thememanager.h" +#include "webbrowserdlg.h" + +namespace Digikam +{ + +WelcomePageViewPage::WelcomePageViewPage(QObject* const parent) + : QWebEnginePage(parent) +{ +} + +WelcomePageViewPage::~WelcomePageViewPage() +{ +} + +bool WelcomePageViewPage::acceptNavigationRequest(const QUrl& url, QWebEnginePage::NavigationType type, bool) +{ + if (type == QWebEnginePage::NavigationTypeLinkClicked) + { + emit linkClicked(url); + return false; + } + + return true; +} + +// ---------------------------------------------------------------------------- + +WelcomePageView::WelcomePageView(QWidget* const parent) + : QWebEngineView(parent) +{ + setFocusPolicy(Qt::WheelFocus); + setContextMenuPolicy(Qt::NoContextMenu); + + WelcomePageViewPage* const wpage = new WelcomePageViewPage(this); + setPage(wpage); + + // ------------------------------------------------------------ + + connect(wpage, SIGNAL(linkClicked(const QUrl&)), + this, SLOT(slotUrlOpen(const QUrl&))); + + connect(ThemeManager::instance(), SIGNAL(signalThemeChanged()), + this, SLOT(slotThemeChanged())); + + QTimer::singleShot(0, this, SLOT(slotThemeChanged())); +} + +WelcomePageView::~WelcomePageView() +{ +} + +void WelcomePageView::slotUrlOpen(const QUrl& url) +{ + WebBrowserDlg* const browser = new WebBrowserDlg(url, this); + browser->show(); +} + +QStringList WelcomePageView::featuresTabContent() const +{ + QStringList newFeatures; + newFeatures << i18n("Port to Qt5 and KF5;"); + newFeatures << i18n("Replacing digiKam KIOSlaves by a multi-threaded interface to query the database;"); + newFeatures << i18n("Replacing Qt5::Multimedia dependency by QtAV framework to handle video files;"); + newFeatures << i18n("Add embedded trash support for each collection instead desktop trash;"); + newFeatures << i18n("Thumbs and preview video support is now delegate to QT5Multimedia framework;"); + newFeatures << i18n("Mysql internal server is now configurable as Sqlite to store database files at a customized place;"); + newFeatures << i18n("Mysql internal/remote server is now configurable with first run assistant;"); + newFeatures << i18n("Add a new garbage collector tool to cleanup database;"); + newFeatures << i18n("Add a new batch queue manager tool to convert RAW files to DNG;"); + newFeatures << i18n("Add a new tool to export contents in html gallery;"); + newFeatures << i18n("Add a new tool to export contents as a video slideshow;"); + newFeatures << i18n("Add a new tool to export contents by email;"); + newFeatures << i18n("Add a new batch queue manager tool to adjust time and date metadata;"); + newFeatures << i18n("Add a new batch queue manager tool to detect and fix red-eyes automatically;"); + newFeatures << i18n("Add a new option in editor and light table to import images from a digital scanner;"); + newFeatures << i18n("Add a new option in editor and light table to edit metadata;"); + newFeatures << i18n("Add a new option in editor and light table to edit geolocation;"); + newFeatures << i18n("Add a new option in editor and light table to run presentation tool;"); + newFeatures << i18n("Add a new editor tool to detect and fix red-eyes automatically;"); + newFeatures << i18n("Add a new editor tool to perform color change based on Lut3D;"); + newFeatures << i18n("Add a new tool in camera import interface to convert RAW files to DNG;"); + newFeatures << i18n("Add a new tool to export items on local network through UPNP/DLNA;"); + newFeatures << i18n("Consolidation of Mysql database backend;"); + newFeatures << i18n("Improved startup time with differed scan for new items stage."); + newFeatures << i18n("Presentation and Slideshow tools now support video."); + // Add new features here... + newFeatures << i18n("...and much more."); + + QString featureItems; + + for (int i = 0 ; i < newFeatures.count() ; ++i) + { + featureItems += i18n("
  • %1
  • \n", newFeatures.at(i)); + } + + QString tabHeader = i18n("New Features"); + QString tabContent = + i18n("

    %1

      %2
    ", + i18n("Some of the new features in this release of digiKam include (compared to digiKam 4.x):"), + featureItems + ); + + return QStringList() << tabHeader << tabContent; +} + +QStringList WelcomePageView::aboutTabContent() const +{ + QString tabHeader = i18n("About"); + QString tabContent = + i18n("

    %1

    %2

      %3
    ", + i18n("digiKam is an open source photo management program designed to import, organize, enhance, search and export your digital images to and from your computer."), + i18n("Currently, you are in the Album view mode of digiKam. Albums are the places where your files are stored, and are identical to the folders on your hard disk."), + i18n("
  • %1
  • %2
  • ", + i18n("digiKam has many powerful features which are described in the documentation"), + i18n("The digiKam homepage provides information about new versions of digiKam.")) + ); + return QStringList() << tabHeader << tabContent; +} + +QByteArray WelcomePageView::fileToString(const QString& aFileName) const +{ + QByteArray result; + QFileInfo info(aFileName); + unsigned int readLen; + unsigned int len = info.size(); + QFile file(aFileName); + + if (aFileName.isEmpty() || len == 0 || + !info.exists() || info.isDir() || !info.isReadable() || + !file.open(QIODevice::Unbuffered|QIODevice::ReadOnly)) + { + return QByteArray(); + } + + result.resize(len + 2); + readLen = file.read(result.data(), len); + + if (result[len-1] != '\n') + { + result[len++] = '\n'; + ++readLen; + } + + result[len] = '\0'; + + if (readLen < len) + { + return QByteArray(); + } + + return result; +} + +void WelcomePageView::slotThemeChanged() +{ + QString appTitle = i18n("digiKam"); + QString slogan = DAboutData::digiKamSlogan(); + QString locationHtml = QStandardPaths::locate(QStandardPaths::GenericDataLocation, QLatin1String("digikam/about/main.html")); + + QString content = QString::fromUtf8(fileToString(locationHtml)); + content = content.arg(appTitle) + .arg(slogan) + .arg(i18n("Welcome to digiKam %1", QLatin1String(digikam_version))) + .arg(featuresTabContent()[0]) + .arg(aboutTabContent()[0]) + .arg(i18n("Background Image Credits")) + .arg(featuresTabContent()[1]) + .arg(aboutTabContent()[1]); + + //qCDebug(DIGIKAM_GENERAL_LOG) << content; + + setHtml(content, QUrl::fromLocalFile(locationHtml)); +} + +} // namespace Digikam diff --git a/core/app/views/welcomepageview_qwebengine.h b/core/app/views/welcomepageview_qwebengine.h new file mode 100644 index 0000000..97582e2 --- /dev/null +++ b/core/app/views/welcomepageview_qwebengine.h @@ -0,0 +1,87 @@ +/* ============================================================ + * + * This file is a part of digiKam project + * http://www.digikam.org + * + * Date : 2006-12-20 + * Description : a widget to display a welcome page + * on root album. + * + * Copyright (C) 2006-2018 by Gilles Caulier + * Copyright (C) 2009-2011 by Andi Clemens + * Copyright (C) 2015 by Mohamed Anwer + * + * This program is free software; you can redistribute it + * and/or modify it under the terms of the GNU General + * Public License as published by the Free Software Foundation; + * either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * ============================================================ */ + +#ifndef WELCOME_PAGE_VIEW_QWEBENGINE_H +#define WELCOME_PAGE_VIEW_QWEBENGINE_H + +// Qt includes + +#include +#include +#include +#include +#include + +// Local includes + +#include "digikam_export.h" + +namespace Digikam +{ + +class WelcomePageViewPage : public QWebEnginePage +{ + Q_OBJECT + +public: + + explicit WelcomePageViewPage(QObject* const parent = 0); + virtual ~WelcomePageViewPage(); + + bool acceptNavigationRequest(const QUrl&, QWebEnginePage::NavigationType, bool); + +Q_SIGNALS: + + void linkClicked(const QUrl&); + +}; + +// ------------------------------------------------------------------- + +class WelcomePageView : public QWebEngineView +{ + Q_OBJECT + +public: + + explicit WelcomePageView(QWidget* const parent); + ~WelcomePageView(); + +private: + + QByteArray fileToString(const QString& aFileName) const; + QStringList featuresTabContent() const; + QStringList aboutTabContent() const; + +private Q_SLOTS: + + void slotUrlOpen(const QUrl&); + void slotThemeChanged(); +}; + +} // namespace Digikam + +#endif // WELCOME_PAGE_VIEW_QWEBENGINE_H diff --git a/core/data/geolocation/geoiface/backend-googlemaps-js.js b/core/data/geolocation/geoiface/backend-googlemaps-js.js index 456586a..12d9151 100644 --- a/core/data/geolocation/geoiface/backend-googlemaps-js.js +++ b/core/data/geolocation/geoiface/backend-googlemaps-js.js @@ -47,10 +47,15 @@ var projectionHelper = null; function kgeomapPostEventString(eventString) { + // We keep these 2 lines for backwards compatibility with QWebView eventBuffer.push(eventString); window.status = '(event)'; + + // We use this when porting to QWebEngineView + console.log('(event)'+eventString); } +// We keep this function for backwards compatibility with QWebView function kgeomapReadEventStrings() { var eventBufferString = eventBuffer.join('|'); @@ -759,9 +764,10 @@ function kgeomapInitialize() // google.maps.event.addListener(map, 'bounds_changed', function() { // kgeomapPostEventString('MB'); // }); - // google.maps.event.addListener(map, 'zoom_changed', function() { - // kgeomapPostEventString('ZC'); - // }); + google.maps.event.addListener(map, 'zoom_changed', function() + { + kgeomapPostEventString('ZC'); + }); google.maps.event.addListener(map, 'idle', function() { kgeomapPostEventString('id'); diff --git a/core/libs/dialogs/CMakeLists.txt b/core/libs/dialogs/CMakeLists.txt index 5bba683..4b8c443 100644 --- a/core/libs/dialogs/CMakeLists.txt +++ b/core/libs/dialogs/CMakeLists.txt @@ -25,9 +25,20 @@ set(libdialogs_SRCS dconfigdlgwidgets.cpp dmessagebox.cpp dsplashscreen.cpp - webbrowserdlg.cpp ) +if(ENABLE_QWEBENGINE) + set(libdialogs_SRCS + ${libdialogs_SRCS} + webbrowserdlg_qwebengine.cpp + ) +else() + set(libdialogs_SRCS + ${libdialogs_SRCS} + webbrowserdlg.cpp + ) +endif() + set(libdeletedialog_SRCS deletedialog.cpp ) @@ -41,13 +52,18 @@ include_directories( $ $ $ - $ $ $ $ ) +if(ENABLE_QWEBENGINE) + include_directories($) +else() + include_directories($) +endif() + #used by digikamcore add_library(digikamdialogscore_src OBJECT ${libdialogs_SRCS}) diff --git a/core/libs/dialogs/webbrowserdlg_qwebengine.cpp b/core/libs/dialogs/webbrowserdlg_qwebengine.cpp new file mode 100644 index 0000000..f1fc612 --- /dev/null +++ b/core/libs/dialogs/webbrowserdlg_qwebengine.cpp @@ -0,0 +1,228 @@ +/* ============================================================ + * + * This file is a part of digiKam project + * http://www.digikam.org + * + * Date : 2017-06-21 + * Description : a simple web browser dialog based on Qt WebEngine. + * + * Copyright (C) 2017-2018 by Gilles Caulier + * + * This program is free software; you can redistribute it + * and/or modify it under the terms of the GNU General + * Public License as published by the Free Software Foundation; + * either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * ============================================================ */ + +#include "webbrowserdlg_qwebengine.h" + +// Qt includes + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// KDE includes + +#include +#include + +// Local includes + +#include "statusprogressbar.h" +#include "searchtextbar.h" +#include "dxmlguiwindow.h" + +namespace Digikam +{ + +class WebBrowserDlg::Private +{ +public: + + Private() + { + browser = 0; + toolbar = 0; + progressbar = 0; + searchbar = 0; + } + +public: + + QUrl home; + QWebEngineView* browser; + QToolBar* toolbar; + StatusProgressBar* progressbar; + SearchTextBar* searchbar; +}; + +WebBrowserDlg::WebBrowserDlg(const QUrl& url, QWidget* const parent) + : QDialog(parent), + d(new Private) +{ + setModal(false); + d->home = url; + d->browser = new QWebEngineView(this); + + // -------------------------- + + d->toolbar = new QToolBar(this); + d->toolbar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); + d->toolbar->addAction(d->browser->pageAction(QWebEnginePage::Back)); + d->toolbar->addAction(d->browser->pageAction(QWebEnginePage::Forward)); + d->toolbar->addAction(d->browser->pageAction(QWebEnginePage::Reload)); + d->toolbar->addAction(d->browser->pageAction(QWebEnginePage::Stop)); + + QAction* const gohome = new QAction(QIcon::fromTheme(QLatin1String("go-home")), + i18n("Home"), this); + gohome->setToolTip(i18n("Go back to Home page")); + d->toolbar->addAction(gohome); + + QAction* const deskweb = new QAction(QIcon::fromTheme(QLatin1String("internet-web-browser")), + i18n("Desktop Browser"), this); + deskweb->setToolTip(i18n("Open Home page with default desktop Web browser")); + d->toolbar->addAction(deskweb); + + // -------------------------- + + d->searchbar = new SearchTextBar(this, QLatin1String("WebBrowserDlgSearchBar")); + d->searchbar->setHighlightOnResult(true); + + d->progressbar = new StatusProgressBar(this); + d->progressbar->setProgressTotalSteps(100); + d->progressbar->setAlignment(Qt::AlignLeft); + d->progressbar->setNotify(false); + + // ---------------------- + + QGridLayout* const grid = new QGridLayout(this); + grid->setSpacing(QApplication::style()->pixelMetric(QStyle::PM_DefaultLayoutSpacing)); + grid->addWidget(d->toolbar, 0, 0, 1, 1); + grid->addWidget(d->searchbar, 0, 2, 1, 1); + grid->addWidget(d->browser, 1, 0, 1, 3); + grid->addWidget(d->progressbar, 2, 0, 1, 3); + grid->setColumnStretch(1, 10); + grid->setRowStretch(1, 10); + setLayout(grid); + + // ---------------------- +/* +#if QT_VERSION >= 0x050700 + connect(d->browser, SIGNAL(iconChanged(const QIcon&)), + this, SLOT(slotIconChanged(const QIcon&))); +#endif +*/ + connect(d->browser, SIGNAL(titleChanged(const QString&)), + this, SLOT(slotTitleChanged(const QString&))); + + connect(d->browser, SIGNAL(urlChanged(const QUrl&)), + this, SLOT(slotUrlChanged(const QUrl&))); + + connect(d->browser, SIGNAL(loadStarted()), + this, SLOT(slotLoadingStarted())); + + connect(d->browser, SIGNAL(loadFinished(bool)), + this, SLOT(slotLoadingFinished(bool))); + + connect(d->searchbar, SIGNAL(signalSearchTextSettings(const SearchTextSettings&)), + this, SLOT(slotSearchTextChanged(const SearchTextSettings&))); + + connect(d->browser, SIGNAL(loadProgress(int)), + d->progressbar, SLOT(setProgressValue(int))); + + connect(gohome, SIGNAL(triggered()), + this, SLOT(slotGoHome())); + + connect(deskweb, SIGNAL(triggered()), + this, SLOT(slotDesktopWebBrowser())); + + // ---------------------- + + KConfigGroup group = KSharedConfig::openConfig()->group("WebBrowserDlg"); + + winId(); + windowHandle()->resize(800, 600); + DXmlGuiWindow::restoreWindowSize(windowHandle(), group); + resize(windowHandle()->size()); + + slotGoHome(); +} + +WebBrowserDlg::~WebBrowserDlg() +{ + delete d; +} + +void WebBrowserDlg::closeEvent(QCloseEvent* e) +{ + KConfigGroup group = KSharedConfig::openConfig()->group(QLatin1String("WebBrowserDlg")); + DXmlGuiWindow::saveWindowSize(windowHandle(), group); + + e->accept(); +} + +void WebBrowserDlg::slotUrlChanged(const QUrl& url) +{ + d->progressbar->setText(url.toString()); +} + +void WebBrowserDlg::slotTitleChanged(const QString& title) +{ + setWindowTitle(title); +} + +void WebBrowserDlg::slotIconChanged(const QIcon& icon) +{ + setWindowIcon(icon); +} + +void WebBrowserDlg::slotLoadingStarted() +{ + d->progressbar->setProgressBarMode(StatusProgressBar::ProgressBarMode); +} + +void WebBrowserDlg::slotLoadingFinished(bool b) +{ + QString curUrl = d->browser->url().toString(); + + d->progressbar->setProgressBarMode(StatusProgressBar::TextMode, curUrl); + + if (!b) + { + d->progressbar->setText(i18n("Cannot load page %1", curUrl)); + } +} + +void WebBrowserDlg::slotSearchTextChanged(const SearchTextSettings& settings) +{ + d->browser->findText(settings.text, + (settings.caseSensitive == Qt::CaseSensitive) ? QWebEnginePage::FindCaseSensitively + : QWebEnginePage::FindFlags(), + [this](bool found) { d->searchbar->slotSearchResult(found); }); +} + +void WebBrowserDlg::slotGoHome() +{ + d->browser->setUrl(d->home); +} + +void WebBrowserDlg::slotDesktopWebBrowser() +{ + QDesktopServices::openUrl(d->home); +} + +} // namespace Digikam diff --git a/core/libs/dialogs/webbrowserdlg_qwebengine.h b/core/libs/dialogs/webbrowserdlg_qwebengine.h new file mode 100644 index 0000000..30c15bf --- /dev/null +++ b/core/libs/dialogs/webbrowserdlg_qwebengine.h @@ -0,0 +1,76 @@ +/* ============================================================ + * + * This file is a part of digiKam project + * http://www.digikam.org + * + * Date : 2017-06-21 + * Description : a simple web browser dialog based on Qt WebEngine. + * + * Copyright (C) 2017-2018 by Gilles Caulier + * + * This program is free software; you can redistribute it + * and/or modify it under the terms of the GNU General + * Public License as published by the Free Software Foundation; + * either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * ============================================================ */ + +#ifndef WEB_BROWSER_DLG_QWEBENGINE_H +#define WEB_BROWSER_DLG_QWEBENGINE_H + +// Qt include + +#include +#include +#include +#include +#include + +// Local includes + +#include "digikam_export.h" + +namespace Digikam +{ + +class SearchTextSettings; + +class DIGIKAM_EXPORT WebBrowserDlg : public QDialog +{ + Q_OBJECT + +public: + + explicit WebBrowserDlg(const QUrl& url, QWidget* const parent = 0); + ~WebBrowserDlg(); + +private Q_SLOTS: + + void slotUrlChanged(const QUrl&); + void slotLoadingStarted(); + void slotLoadingFinished(bool); + void slotIconChanged(const QIcon&); + void slotTitleChanged(const QString&); + void slotSearchTextChanged(const SearchTextSettings&); + void slotGoHome(); + void slotDesktopWebBrowser(); + +protected: + + void closeEvent(QCloseEvent*); + +private: + + class Private; + Private* const d; +}; + +} // namespace Digikam + +#endif // WEB_BROWSER_DLG_QWEBENGINE_H diff --git a/core/libs/widgets/mainview/dxmlguiwindow.cpp b/core/libs/widgets/mainview/dxmlguiwindow.cpp index 86e8c53..75274c1 100644 --- a/core/libs/widgets/mainview/dxmlguiwindow.cpp +++ b/core/libs/widgets/mainview/dxmlguiwindow.cpp @@ -69,7 +69,12 @@ #include "digikam_debug.h" #include "digikam_globals.h" #include "daboutdata.h" -#include "webbrowserdlg.h" + +#ifdef HAVE_QWEBENGINE +# include "webbrowserdlg_qwebengine.h" +#else +# include "webbrowserdlg.h" +#endif namespace Digikam { diff --git a/core/utilities/assistants/htmlgallery/wizard/htmlfinalpage.cpp b/core/utilities/assistants/htmlgallery/wizard/htmlfinalpage.cpp index 7c9d01c..3de55e4 100644 --- a/core/utilities/assistants/htmlgallery/wizard/htmlfinalpage.cpp +++ b/core/utilities/assistants/htmlgallery/wizard/htmlfinalpage.cpp @@ -40,6 +40,7 @@ // Local includes +#include "digikam_config.h" #include "htmlwizard.h" #include "abstractthemeparameter.h" #include "galleryinfo.h" @@ -48,7 +49,12 @@ #include "digikam_debug.h" #include "dprogresswdg.h" #include "dhistoryview.h" -#include "webbrowserdlg.h" + +#ifdef HAVE_QWEBENGINE +# include "webbrowserdlg_qwebengine.h" +#else +# include "webbrowserdlg.h" +#endif namespace Digikam { diff --git a/core/utilities/geolocation/geoiface/CMakeLists.txt b/core/utilities/geolocation/geoiface/CMakeLists.txt index 18fec7b..23c52a9 100644 --- a/core/utilities/geolocation/geoiface/CMakeLists.txt +++ b/core/utilities/geolocation/geoiface/CMakeLists.txt @@ -26,13 +26,23 @@ set(libgeoiface_SRCS backends/mapbackend.cpp tiles/itemmarkertiler.cpp tiles/tilegrouper.cpp tiles/tileindex.cpp - widgets/htmlwidget.cpp widgets/mapwidget.cpp widgets/placeholderwidget.cpp ) +if(ENABLE_QWEBENGINE) + set(libgeoiface_SRCS + ${libgeoiface_SRCS} + widgets/htmlwidget_qwebengine.cpp + ) +else() + set(libgeoiface_SRCS + ${libgeoiface_SRCS} + widgets/htmlwidget.cpp + ) +endif() + include_directories($ - $ $ $ $ @@ -44,6 +54,12 @@ include_directories($ ${MARBLE_INCLUDE_DIR} ) +if(ENABLE_QWEBENGINE) + include_directories($) +else() + include_directories($) +endif() + # Marble translations need explicit loading ecm_create_qm_loader(libgeoiface_SRCS marble_qt) diff --git a/core/utilities/geolocation/geoiface/backends/backendgooglemaps.cpp b/core/utilities/geolocation/geoiface/backends/backendgooglemaps.cpp index b242192..b2897cd 100644 --- a/core/utilities/geolocation/geoiface/backends/backendgooglemaps.cpp +++ b/core/utilities/geolocation/geoiface/backends/backendgooglemaps.cpp @@ -46,11 +46,17 @@ // Local includes -#include "htmlwidget.h" +#include "digikam_config.h" +#include "digikam_debug.h" #include "mapwidget.h" #include "abstractmarkertiler.h" #include "geomodelhelper.h" -#include "digikam_debug.h" + +#ifdef HAVE_QWEBENGINE +# include "htmlwidget_qwebengine.h" +#else +# include "htmlwidget.h" +#endif namespace Digikam { @@ -683,7 +689,7 @@ void BackendGoogleMaps::slotHTMLEvents(const QStringList& events) if (zoomProbablyChanged && !mapTypeChanged) { - d->cacheZoom = d->htmlWidget->runScript(QLatin1String("kgeomapGetZoom();")).toInt(); + d->cacheZoom = d->htmlWidget->runScript(QLatin1String("kgeomapGetZoom();"), false).toInt(); emit signalZoomChanged(QString::fromLatin1("googlemaps:%1").arg(d->cacheZoom)); } @@ -701,7 +707,7 @@ void BackendGoogleMaps::slotHTMLEvents(const QStringList& events) if (mapBoundsProbablyChanged) { - const QString mapBoundsString = d->htmlWidget->runScript(QLatin1String("kgeomapGetBounds();")).toString(); + const QString mapBoundsString = d->htmlWidget->runScript(QLatin1String("kgeomapGetBounds();"), false).toString(); GeoIfaceHelperParseBoundsString(mapBoundsString, &d->cacheBounds); } @@ -764,11 +770,12 @@ bool BackendGoogleMaps::screenCoordinates(const GeoCoordinates& coordinates, QPo if (!d->isReady) return false; - const QString pointStringResult=d->htmlWidget->runScript( + const QString pointStringResult = d->htmlWidget->runScript( QString::fromLatin1("kgeomapLatLngToPixel(%1, %2);") .arg(coordinates.latString()) - .arg(coordinates.lonString()) - ).toString(); + .arg(coordinates.lonString()), + false + ).toString(); const bool isValid = GeoIfaceHelperParseXYStringToPoint( pointStringResult, point); @@ -994,8 +1001,8 @@ void BackendGoogleMaps::updateActionAvailability() void BackendGoogleMaps::updateZoomMinMaxCache() { // TODO: these functions seem to cause problems, the map is not fully updated after a few calls -// d->cacheMaxZoom = d->htmlWidget->runScript("kgeomapGetMaxZoom();").toInt(); -// d->cacheMinZoom = d->htmlWidget->runScript("kgeomapGetMinZoom();").toInt(); +// d->cacheMaxZoom = d->htmlWidget->runScript("kgeomapGetMaxZoom();", false).toInt(); +// d->cacheMinZoom = d->htmlWidget->runScript("kgeomapGetMinZoom();", false).toInt(); } void BackendGoogleMaps::slotThumbnailAvailableForIndex(const QVariant& index, const QPixmap& pixmap) @@ -1328,7 +1335,7 @@ void BackendGoogleMaps::slotTracksChanged(const QListtrackManager) { // no track manager, clear all tracks - const QVariant successClear = d->htmlWidget->runScript(QString::fromLatin1("kgeomapClearTracks();")); + const QVariant successClear = d->htmlWidget->runScript(QString::fromLatin1("kgeomapClearTracks();"), false); return; } @@ -1424,7 +1431,7 @@ void BackendGoogleMaps::slotTrackVisibilityChanged(const bool newState) } else if (d->htmlWidget) { - const QVariant successClear = d->htmlWidget->runScript(QString::fromLatin1("kgeomapClearTracks();")); + const QVariant successClear = d->htmlWidget->runScript(QString::fromLatin1("kgeomapClearTracks();"), false); } } diff --git a/core/utilities/geolocation/geoiface/widgets/htmlwidget.cpp b/core/utilities/geolocation/geoiface/widgets/htmlwidget.cpp index 29d0906..3dac61e 100644 --- a/core/utilities/geolocation/geoiface/widgets/htmlwidget.cpp +++ b/core/utilities/geolocation/geoiface/widgets/htmlwidget.cpp @@ -255,7 +255,7 @@ void HTMLWidget::slotScanForJSMessages(const QString& message) /** * @brief Wrapper around executeScript to catch more errors */ -QVariant HTMLWidget::runScript(const QString& scriptCode) +QVariant HTMLWidget::runScript(const QString& scriptCode, bool) { GEOIFACE_ASSERT(d->isReady); diff --git a/core/utilities/geolocation/geoiface/widgets/htmlwidget.h b/core/utilities/geolocation/geoiface/widgets/htmlwidget.h index 9a76ef9..f97b6a1 100644 --- a/core/utilities/geolocation/geoiface/widgets/htmlwidget.h +++ b/core/utilities/geolocation/geoiface/widgets/htmlwidget.h @@ -49,7 +49,7 @@ public: ~HTMLWidget(); void loadInitialHTML(const QString& initialHTML); - QVariant runScript(const QString& scriptCode); + QVariant runScript(const QString& scriptCode, bool async = true); bool runScript2Coordinates(const QString& scriptCode, GeoCoordinates* const coordinates); void mouseModeChanged(const GeoMouseModes mouseMode); void setSelectionRectangle(const GeoCoordinates::Pair& searchCoordinates); diff --git a/core/utilities/geolocation/geoiface/widgets/htmlwidget_qwebengine.cpp b/core/utilities/geolocation/geoiface/widgets/htmlwidget_qwebengine.cpp new file mode 100644 index 0000000..0387245 --- /dev/null +++ b/core/utilities/geolocation/geoiface/widgets/htmlwidget_qwebengine.cpp @@ -0,0 +1,409 @@ +/* ============================================================ + * + * This file is a part of digiKam project + * http://www.digikam.org + * + * Date : 2009-12-01 + * Description : Widget for displaying HTML in the backends + * + * Copyright (C) 2010-2018 by Gilles Caulier + * Copyright (C) 2009-2011 by Michael G. Hansen + * Copyright (C) 2015 by Mohamed Anwer + * + * This program is free software; you can redistribute it + * and/or modify it under the terms of the GNU General + * Public License as published by the Free Software Foundation; + * either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * ============================================================ */ + +#include "htmlwidget_qwebengine.h" + +// Qt includes + +#include +#include +#include +#include + +// Local includes + +#include "geoifacecommon.h" +#include "geoifacetypes.h" +#include "digikam_debug.h" + +namespace Digikam +{ + +HTMLWidgetPage::HTMLWidgetPage(HTMLWidget* const parent) + : QWebEnginePage(parent) +{ + m_timer = new QTimer(this); + m_timer->setInterval(100); + m_timer->setSingleShot(true); + + connect(m_timer, SIGNAL(timeout()), + this, SLOT(slotSendHTMLEvents()), + Qt::QueuedConnection); +} + +HTMLWidgetPage::~HTMLWidgetPage() +{ +} + +void HTMLWidgetPage::javaScriptConsoleMessage(JavaScriptConsoleMessageLevel /*level*/, const QString& message, int /*lineNumber*/, const QString& /*sourceID*/) +{ + if (!message.startsWith(QLatin1String("(event)"))) + return; + + qCDebug(DIGIKAM_GEOIFACE_LOG) << message; + + const QString eventString = message.mid(7); + + if (eventString.isEmpty()) + return; + + m_events << eventString; + + m_timer->start(); +} + +void HTMLWidgetPage::slotSendHTMLEvents() +{ + emit signalHTMLEvents(m_events); + m_events.clear(); +} + +// --------------------------------------------------------------------------------------------- + +class HTMLWidget::Private +{ +public: + + Private() + : parent(0), + child(0), + hpage(0), + isReady(false), + selectionStatus(false), + firstSelectionPoint(), + intermediateSelectionPoint(), + firstSelectionScreenPoint(), + intermediateSelectionScreenPoint() + { + } + + QWidget* parent; + QWidget* child; + HTMLWidgetPage* hpage; + + bool isReady; + bool selectionStatus; + + GeoCoordinates firstSelectionPoint; + GeoCoordinates intermediateSelectionPoint; + + QPoint firstSelectionScreenPoint; + QPoint intermediateSelectionScreenPoint; +}; + +HTMLWidget::HTMLWidget(QWidget* const parent) + : QWebEngineView(parent), + d(new Private()), + s(0) +{ + d->parent = parent; + setAcceptDrops(false); + setFocusPolicy(Qt::WheelFocus); + // settings()->setAttribute(QWebEngineSettings::WebGLEnabled, false); + + d->hpage = new HTMLWidgetPage(this); + setPage(d->hpage); + + d->parent->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + + connect(this, SIGNAL(loadProgress(int)), + this, SLOT(progress(int))); + + connect(this, SIGNAL(loadFinished(bool)), + this, SLOT(slotHTMLCompleted(bool))); + + connect(d->hpage, SIGNAL(signalHTMLEvents(QStringList)), + this, SIGNAL(signalHTMLEvents(QStringList))); + + if (d->parent) + { + d->parent->installEventFilter(this); + } + + d->child = findChild(); + + if (d->child) + { + d->child->installEventFilter(this); + } +} + +HTMLWidget::~HTMLWidget() +{ + delete d; +} + +void HTMLWidget::progress(int progress) +{ + qCDebug(DIGIKAM_GEOIFACE_LOG) << "Maps Loading Progress: " << progress << "%"; +} + +void HTMLWidget::slotHTMLCompleted(bool ok) +{ + qCDebug(DIGIKAM_GEOIFACE_LOG) << "Map Loading Completed: " << ok; + d->isReady = ok; + + emit signalJavaScriptReady(); +} + +/** + * @brief Wrapper around executeScript to catch more errors + */ +QVariant HTMLWidget::runScript(const QString& scriptCode, bool async) +{ + GEOIFACE_ASSERT(d->isReady); + + if (!d->isReady) + return QVariant(); + + //qCDebug(DIGIKAM_GEOIFACE_LOG) << scriptCode; + + if(async) + { + page()->runJavaScript(scriptCode); + } + else + { + QVariant ret; + QEventLoop loop; + // lambda c11 function capturing value returned by java script code which is not synchro with QWebEngineView. + // See https://wiki.qt.io/Porting_from_QtWebKit_to_QtWebEngine. + page()->runJavaScript(scriptCode, [&ret, &loop](const QVariant& result){ ret.setValue(result); loop.quit(); }); + + loop.exec(); + + return ret; + } + + return true; +} + +/** + * @brief Execute a script which returns coordinates and parse these + */ +bool HTMLWidget::runScript2Coordinates(const QString& scriptCode, GeoCoordinates* const coordinates) +{ + const QVariant scriptResult = runScript(scriptCode, false); + + return GeoIfaceHelperParseLatLonString(scriptResult.toString(), coordinates); +} + +bool HTMLWidget::eventFilter(QObject* object, QEvent* event) +{ + if (d->parent && object == d->parent) + { + + if (event->type() == QEvent::Resize) + { + QResizeEvent* const resizeEvent = dynamic_cast(event); + + if (resizeEvent) + { + resize(resizeEvent->size()); + } + } + } + else if (d->child && object == d->child) + { + if (event->type() == QEvent::MouseButtonRelease) + { + QMouseEvent* const e = dynamic_cast(event); + + if (s->currentMouseMode == MouseModeRegionSelection) + { + if (!d->firstSelectionPoint.hasCoordinates()) + { + runScript2Coordinates(QString::fromLatin1("kgeomapPixelToLatLng(%1, %2);") + .arg(e->x()) + .arg(e->y()), + &d->firstSelectionPoint); + + d->firstSelectionScreenPoint = QPoint(e->x(), e->y()); + } + else + { + runScript2Coordinates(QString::fromLatin1("kgeomapPixelToLatLng(%1, %2);") + .arg(e->x()) + .arg(e->y()), + &d->intermediateSelectionPoint); + + d->intermediateSelectionScreenPoint = QPoint(e->x(), e->y()); + + qreal lonWest, latNorth, lonEast, latSouth; + + if (d->firstSelectionScreenPoint.x() < d->intermediateSelectionScreenPoint.x()) + { + lonWest = d->firstSelectionPoint.lon(); + lonEast = d->intermediateSelectionPoint.lon(); + } + else + { + lonEast = d->firstSelectionPoint.lon(); + lonWest = d->intermediateSelectionPoint.lon(); + } + + if (d->firstSelectionScreenPoint.y() < d->intermediateSelectionScreenPoint.y()) + { + latNorth = d->firstSelectionPoint.lat(); + latSouth = d->intermediateSelectionPoint.lat(); + } + else + { + latNorth = d->intermediateSelectionPoint.lat(); + latSouth = d->firstSelectionPoint.lat(); + } + + runScript(QLatin1String("kgeomapRemoveTemporarySelectionRectangle();")); + runScript(QString::fromLatin1("kgeomapSetSelectionRectangle(%1, %2, %3, %4);") + .arg(lonWest) + .arg(latNorth) + .arg(lonEast) + .arg(latSouth)); + + const GeoCoordinates::Pair selectionCoordinates( + GeoCoordinates(latNorth, lonWest), + GeoCoordinates(latSouth, lonEast)); + + d->firstSelectionPoint.clear(); + d->intermediateSelectionPoint.clear(); + + emit selectionHasBeenMade(selectionCoordinates); + } + } + } + else if (event->type() == QEvent::MouseMove) + { + QMouseEvent* const e = dynamic_cast(event); + + if (s->currentMouseMode == MouseModeRegionSelection && + d->firstSelectionPoint.hasCoordinates()) + { + runScript2Coordinates(QString::fromLatin1("kgeomapPixelToLatLng(%1, %2);") + .arg(e->x()) + .arg(e->y()), + &d->intermediateSelectionPoint); + + d->intermediateSelectionScreenPoint = QPoint(e->x(), e->y()); + + qCDebug(DIGIKAM_GEOIFACE_LOG) << d->firstSelectionScreenPoint << QLatin1String(" ") << d->intermediateSelectionScreenPoint; + + qreal lonWest, latNorth, lonEast, latSouth; + + if (d->firstSelectionScreenPoint.x() < d->intermediateSelectionScreenPoint.x()) + { + lonWest = d->firstSelectionPoint.lon(); + lonEast = d->intermediateSelectionPoint.lon(); + } + else + { + lonEast = d->firstSelectionPoint.lon(); + lonWest = d->intermediateSelectionPoint.lon(); + } + + if (d->firstSelectionScreenPoint.y() < d->intermediateSelectionScreenPoint.y()) + { + latNorth = d->firstSelectionPoint.lat(); + latSouth = d->intermediateSelectionPoint.lat(); + } + else + { + latNorth = d->intermediateSelectionPoint.lat(); + latSouth = d->firstSelectionPoint.lat(); + } + + runScript(QString::fromLatin1("kgeomapSetTemporarySelectionRectangle(%1, %2, %3, %4);") + .arg(lonWest) + .arg(latNorth) + .arg(lonEast) + .arg(latSouth)); + } + } + } + + return false; +} + +void HTMLWidget::setSelectionRectangle(const GeoCoordinates::Pair& searchCoordinates) +{ + if (!searchCoordinates.first.hasCoordinates()) + { + runScript(QString::fromLatin1("kgeomapRemoveSelectionRectangle();")); + return; + } + + qreal West = searchCoordinates.first.lon(); + qreal North = searchCoordinates.first.lat(); + qreal East = searchCoordinates.second.lon(); + qreal South = searchCoordinates.second.lat(); + + runScript(QString::fromLatin1("kgeomapSetSelectionRectangle(%1, %2, %3, %4);") + .arg(West).arg(North).arg(East).arg(South)); +} + +void HTMLWidget::removeSelectionRectangle() +{ + runScript(QLatin1String("kgeomapRemoveSelectionRectangle();")); +} + +void HTMLWidget::mouseModeChanged(const GeoMouseModes mouseMode) +{ + const bool inSelectionMode = (mouseMode == MouseModeRegionSelection); + + if (inSelectionMode) + { + d->firstSelectionPoint.clear(); + d->intermediateSelectionPoint.clear(); + runScript(QString::fromLatin1("kgeomapSelectionModeStatus(%1);").arg(inSelectionMode)); + } + else + { + runScript(QString::fromLatin1("kgeomapSelectionModeStatus(%1);").arg(inSelectionMode)); + } +} + +void HTMLWidget::centerOn(const qreal west, const qreal north, + const qreal east, const qreal south, + const bool useSaneZoomLevel) +{ +/* + qCDebug(DIGIKAM_GEOIFACE_LOG) << "West:" << west + << " North:" << north + << " East:" << east + << " South:" << south; +*/ + runScript(QString::fromLatin1("kgeomapSetMapBoundaries(%1, %2, %3, %4, %5);") + .arg(west) + .arg(north) + .arg(east) + .arg(south) + .arg(useSaneZoomLevel ? 1 : 0)); +} + +void HTMLWidget::setSharedGeoIfaceObject(GeoIfaceSharedData* const sharedData) +{ + s = sharedData; +} + +} // namespace Digikam diff --git a/core/utilities/geolocation/geoiface/widgets/htmlwidget_qwebengine.h b/core/utilities/geolocation/geoiface/widgets/htmlwidget_qwebengine.h new file mode 100644 index 0000000..14cebb3 --- /dev/null +++ b/core/utilities/geolocation/geoiface/widgets/htmlwidget_qwebengine.h @@ -0,0 +1,119 @@ +/* ============================================================ + * + * This file is a part of digiKam project + * http://www.digikam.org + * + * Date : 2009-12-01 + * Description : Widget for displaying HTML in the backends + * + * Copyright (C) 2010-2018 by Gilles Caulier + * Copyright (C) 2009-2011 by Michael G. Hansen + * Copyright (C) 2015 by Mohamed Anwer + * + * This program is free software; you can redistribute it + * and/or modify it under the terms of the GNU General + * Public License as published by the Free Software Foundation; + * either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * ============================================================ */ + +#ifndef HTML_WIDGET_QWEBENGINE_H +#define HTML_WIDGET_QWEBENGINE_H + +// Qt includes + +#include +#include +#include + +// Local includes + +#include "geoifacecommon.h" +#include "geoifacetypes.h" +#include "geocoordinates.h" + +namespace Digikam +{ + +class HTMLWidget; + +class HTMLWidgetPage : public QWebEnginePage +{ + Q_OBJECT + +public: + + explicit HTMLWidgetPage(HTMLWidget* const parent = 0); + virtual ~HTMLWidgetPage(); + +Q_SIGNALS: + + void signalHTMLEvents(const QStringList& events); + +private Q_SLOTS: + + void slotSendHTMLEvents(); + +protected: + + void javaScriptConsoleMessage(JavaScriptConsoleMessageLevel, const QString&, int, const QString&); + +private: + + QStringList m_events; + QTimer* m_timer; +}; + +// ------------------------------------------------------------------- + +class HTMLWidget : public QWebEngineView +{ + Q_OBJECT + +public: + + explicit HTMLWidget(QWidget* const parent = 0); + ~HTMLWidget(); + + void loadInitialHTML(const QString& initialHTML); + QVariant runScript(const QString& scriptCode, bool async = true); + bool runScript2Coordinates(const QString& scriptCode, GeoCoordinates* const coordinates); + void mouseModeChanged(const GeoMouseModes mouseMode); + void setSelectionRectangle(const GeoCoordinates::Pair& searchCoordinates); + void removeSelectionRectangle(); + void centerOn(const qreal west, const qreal north, const qreal east, const qreal south, + const bool useSaneZoomLevel = true); + void setSharedGeoIfaceObject(GeoIfaceSharedData* const sharedData); + +Q_SIGNALS: + + void signalHTMLEvents(const QStringList& events); + void signalJavaScriptReady(); + void selectionHasBeenMade(const Digikam::GeoCoordinates::Pair& coordinatesRect); + +protected: + + bool eventFilter(QObject*, QEvent*); + +protected Q_SLOTS: + + void slotHTMLCompleted(bool ok); + void progress(int progress); + +private: + + class Private; + Private* const d; + + GeoIfaceSharedData* s; +}; + +} // namespace Digikam + +#endif // HTML_WIDGET_QWEBENGINE_H -- cgit v0.11.2