diff --git a/CMakeLists.txt b/CMakeLists.txt --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,10 +22,14 @@ include(ECMAddAppIcon) include(FindPkgConfig) -find_package( Qt5 5.8.0 REQUIRED COMPONENTS Core DBus Gui QuickWidgets Qml Script ScriptTools Sql Svg Test Widgets Xml ) -find_package( Qt5 5.8.0 COMPONENTS QuickControls2 ) +find_package( Qt5 5.8.0 COMPONENTS QuickControls2 WebEngine ) set_package_properties( Qt5QuickControls2 PROPERTIES TYPE RUNTIME PURPOSE "Needed by the player's context area" ) + +find_package( Qt5 5.8.0 REQUIRED COMPONENTS Core DBus Gui QuickWidgets Qml Script ScriptTools Sql Svg Test Widgets Xml ) +set_package_properties( Qt5WebEngine PROPERTIES TYPE OPTIONAL PURPOSE "Needed by the wikipedia applet" ) + find_package( KF5 REQUIRED COMPONENTS Archive Codecs CoreAddons DBusAddons Declarative DNSSD GlobalAccel GuiAddons I18n IconThemes KCMUtils KIO NewStuff Notifications NotifyConfig Package Solid TextEditor ThreadWeaver WindowSystem ) + find_package( KF5 COMPONENTS Kirigami2 ) set_package_properties( KF5Kirigami2 PROPERTIES TYPE RUNTIME PURPOSE "Needed by the player's context area" ) diff --git a/images/icons/CMakeLists.txt b/images/icons/CMakeLists.txt --- a/images/icons/CMakeLists.txt +++ b/images/icons/CMakeLists.txt @@ -197,14 +197,12 @@ 48-actions-amarok_cart_view.png 48-actions-amarok_change_language.png 48-actions-amarok_clock.png - 48-actions-amarok_lyrics.png 48-actions-amarok_playcount.png 48-actions-amarok_playlist.png 48-actions-amarok_playlist_refresh.png 48-actions-amarok_scripts.png 48-actions-amarok_track.png 48-actions-collection-rescan-amarok.png - 48-actions-current-track-amarok.png 48-actions-download-amarok.png 48-actions-dynamic-amarok.png 48-actions-filename-album-amarok.png @@ -235,7 +233,6 @@ 48-actions-info-amarok.png 48-actions-label-amarok.png 48-actions-love-amarok.png - 48-actions-media-album-cover-manager-amarok.png 48-actions-media-album-repeat-amarok.png 48-actions-media-playlist-repeat-amarok.png 48-actions-media-random-albums-amarok.png @@ -250,7 +247,6 @@ 48-actions-media-track-queue-amarok.png 48-actions-media-track-remove-amarok.png 48-actions-music-amarok.png - 48-actions-photos-amarok.png 48-actions-playlist-generator.png 48-actions-podcast-amarok.png 48-actions-preferences-indicator-amarok.png @@ -264,7 +260,6 @@ 48-actions-view-importers-banshee-amarok.png 48-actions-view-importers-clementine-amarok.png 48-actions-view-importers-rhythmbox-amarok.png - 48-actions-view-media-analyzer-amarok.png 48-actions-view-services-amazon-amarok.png 48-actions-view-services-ampache-amarok.png 48-actions-view-services-gpodder-amarok.png diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -882,6 +882,11 @@ amarokshared ) +if( Qt5WebEngine_FOUND ) + target_link_libraries( amaroklib Qt5::WebEngine ) + add_definitions( -DWITH_QT_WEBENGINE ) +endif() + include_directories(${TAGLIB_INCLUDES}) add_definitions(${TAGLIB_CFLAGS}) target_link_libraries(amaroklib ${TAGLIB_LIBRARIES}) diff --git a/src/context/AmarokContextPackageStructure.cpp b/src/context/AmarokContextPackageStructure.cpp --- a/src/context/AmarokContextPackageStructure.cpp +++ b/src/context/AmarokContextPackageStructure.cpp @@ -24,6 +24,8 @@ void AmarokContextPackageStructure::initPackage(KPackage::Package* package) { package->addFileDefinition("mainscript", QStringLiteral("ui/main.qml"), i18n("Main Script File")); + package->addFileDefinition("icon", QStringLiteral("images/icon.png"), i18n("Applet Icon File")); + package->addFileDefinition("icon", QStringLiteral("images/icon.svg"), i18n("Applet Icon File")); package->setDefaultPackageRoot(QStringLiteral("kpackage/amarok")); package->addDirectoryDefinition("images", QStringLiteral("images"), i18n("Images")); auto mimetypes = QStringList() << QStringLiteral("image/svg+xml"); diff --git a/src/context/AppletModel.h b/src/context/AppletModel.h --- a/src/context/AppletModel.h +++ b/src/context/AppletModel.h @@ -58,6 +58,7 @@ Q_INVOKABLE void setAppletCollapsed(const QString &id, bool collapsed); Q_INVOKABLE void setAppletContentHeight(const QString& id, qreal height); + Q_INVOKABLE QUrl imageUrl(const QString &id, const QString &imageName); public Q_SLOTS: void newApplets(const QList &applets); diff --git a/src/context/AppletModel.cpp b/src/context/AppletModel.cpp --- a/src/context/AppletModel.cpp +++ b/src/context/AppletModel.cpp @@ -115,7 +115,7 @@ return package.metadata().pluginId(); case Icon: - return package.metadata().iconName(); + return QUrl::fromLocalFile(package.filePath("icon")); case Mainscript: return QUrl::fromLocalFile(package.filePath("mainscript")); @@ -210,6 +210,14 @@ } } +QUrl Context::AppletModel::imageUrl(const QString& id, const QString& imageName) +{ + auto package = findPackage(id); + if (package.isValid()) + return QUrl::fromLocalFile( package.filePath("images", imageName) ); + return QUrl(); +} + AppletPackage AppletModel::findPackage(const QString& id) { for (const auto &package : m_packages) diff --git a/src/context/applets/CMakeLists.txt b/src/context/applets/CMakeLists.txt --- a/src/context/applets/CMakeLists.txt +++ b/src/context/applets/CMakeLists.txt @@ -5,9 +5,12 @@ add_subdirectory( lyrics ) add_subdirectory( photos ) #add_subdirectory( tabs ) -#add_subdirectory( wikipedia ) add_subdirectory( analyzer ) +if( Qt5WebEngine_FOUND ) + add_subdirectory( wikipedia ) +endif() + if( LIBLASTFM_FOUND ) # add_subdirectory( upcomingevents ) # add_subdirectory( similarartists ) diff --git a/images/icons/48-actions-media-album-cover-manager-amarok.png b/src/context/applets/albums/package/contents/images/icon.png rename from images/icons/48-actions-media-album-cover-manager-amarok.png rename to src/context/applets/albums/package/contents/images/icon.png diff --git a/images/icons/48-actions-view-media-analyzer-amarok.png b/src/context/applets/analyzer/package/contents/images/icon.png rename from images/icons/48-actions-view-media-analyzer-amarok.png rename to src/context/applets/analyzer/package/contents/images/icon.png diff --git a/images/icons/48-actions-current-track-amarok.png b/src/context/applets/currenttrack/package/contents/images/icon.png rename from images/icons/48-actions-current-track-amarok.png rename to src/context/applets/currenttrack/package/contents/images/icon.png diff --git a/images/icons/48-actions-amarok_lyrics.png b/src/context/applets/lyrics/package/contents/images/icon.png rename from images/icons/48-actions-amarok_lyrics.png rename to src/context/applets/lyrics/package/contents/images/icon.png diff --git a/images/icons/48-actions-photos-amarok.png b/src/context/applets/photos/package/contents/images/icon.png rename from images/icons/48-actions-photos-amarok.png rename to src/context/applets/photos/package/contents/images/icon.png diff --git a/src/context/applets/wikipedia/WikipediaCustomStyle.css b/src/context/applets/wikipedia/WikipediaCustomStyle.css --- a/src/context/applets/wikipedia/WikipediaCustomStyle.css +++ b/src/context/applets/wikipedia/WikipediaCustomStyle.css @@ -4,13 +4,13 @@ { margin: 0px; padding: 6px 2px; + background-color: /*{background_color}*/; color: /*{text_color}*/; font-size: medium; } h1, h2, h3, h4, h5, h6 { - border: 2px solid /*{border_color}*/; -webkit-border-radius: 4px; -khtml-border-radius: 4px; -moz-border-radius: 4px; @@ -50,7 +50,6 @@ div#wiki_otherlangs { clear: both; - border: 2px solid /*{border_color}*/; -webkit-border-radius: 4px; -khtml-border-radius: 4px; -moz-border-radius: 4px; @@ -97,8 +96,6 @@ /* table for embedded media clip boxes */ table.metadata, table.ambox { - border-radius: 1.6em; - border: 2px solid /*{border_color}*/; -webkit-border-radius: 4px; -khtml-border-radius: 4px; -moz-border-radius: 4px; @@ -115,7 +112,6 @@ clear: right; float: right; width: 150pt; - border: 2px solid /*{border_color}*/; -webkit-border-radius: 4px; -khtml-border-radius: 4px; -moz-border-radius: 4px; @@ -134,16 +130,14 @@ table.infobox th { padding: 2pt; - border: 1px solid /*{border_color}*/; background-color: /*{alternate_table_background_color}*/; color: /*{text_color}*/; } table.gallery { clear: both; display: block; - border: 2px solid /*{border_color}*/; -webkit-border-radius: 4px; -khtml-border-radius: 4px; -moz-border-radius: 4px; @@ -217,7 +211,6 @@ { clear: right; background-color: /*{shaded_text_background_color}*/; - border: 2px solid /*{border_color}*/; border-radius: 4px; -webkit-border-radius: 4px; -khtml-border-radius: 4px; @@ -232,7 +225,6 @@ table.wikitable { - border: 2px solid /*{border_color}*/; -webkit-border-radius: 4px; -khtml-border-radius: 4px; -moz-border-radius: 4px; @@ -245,18 +237,15 @@ { padding: 2pt; background-color: /*{alternate_table_background_color}*/; - border: 2px solid /*{border_color}*/; } table.wikitable td { padding: 2pt; background-color: /*{table_background_color}*/; - border: 2px solid /*{border_color}*/; } table.navbox { - border: 2px solid /*{border_color}*/; -webkit-border-radius: 4px; -khtml-border-radius: 4px; -moz-border-radius: 4px; @@ -268,14 +257,12 @@ } table.navbox td { - border: 2px solid /*{border_color}*/; background-color: /*{table_background_color}*/; } /* article thumbnail images */ div.thumb { - border: 2px solid /*{border_color}*/; -webkit-border-radius: 4px; -khtml-border-radius: 4px; -moz-border-radius: 4px; diff --git a/src/context/applets/wikipedia/package/contents/images/amarok-wikipedia.svg b/src/context/applets/wikipedia/package/contents/images/amarok-wikipedia.svg deleted file mode 100644 --- a/src/context/applets/wikipedia/package/contents/images/amarok-wikipedia.svg +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - image/svg+xml - - - - image/svg+xml - - - - - - - - - - - diff --git a/src/context/applets/wikipedia/package/contents/images/icon.svg b/src/context/applets/wikipedia/package/contents/images/icon.svg new file mode 100644 --- /dev/null +++ b/src/context/applets/wikipedia/package/contents/images/icon.svg @@ -0,0 +1 @@ +]>Wikipedia logo version 2 \ No newline at end of file diff --git a/src/context/applets/wikipedia/package/contents/ui/main.qml b/src/context/applets/wikipedia/package/contents/ui/main.qml --- a/src/context/applets/wikipedia/package/contents/ui/main.qml +++ b/src/context/applets/wikipedia/package/contents/ui/main.qml @@ -17,8 +17,7 @@ import QtQuick 2.4 import QtQuick.Controls 1.4 import QtQuick.Layouts 1.3 -import QtWebEngine 1.1 -import org.kde.kirigami 2.0 as Kirigami +import QtWebEngine 1.3 import org.kde.amarok.qml 1.0 as AmarokQml import org.kde.amarok.wikipedia 1.0 @@ -29,30 +28,30 @@ anchors.fill: parent RowLayout { - Layout:fillWidth: true + Layout.fillWidth: true Layout.alignment: Qt.AlignTop Button { iconName: "go-previous" enabled: content.canGoBack Layout.alignment: Qt.AlignLeft - ToolTip.text: i18n("Previous") + tooltip: i18n("Previous") onClicked: content.goBack() } Button { iconName: "go-next" enabled: content.canGoForward Layout.alignment: Qt.AlignLeft - ToolTip.text: i18n("Next") + tooltip: i18n("Next") onClicked: content.goForward() } Button { iconName: "view-refresh" enabled: !content.loading Layout.alignment: Qt.AlignLeft - ToolTip.text: i18n("Refresh") + tooltip: i18n("Refresh") onClicked: content.reload() } @@ -62,46 +61,45 @@ Button { iconName: "filename-artist-amarok" Layout.alignment: Qt.AlignRight - ToolTip.text: i18n("Artist") + tooltip: i18n("Artist") onClicked: WikipediaEngine.selection = WikipediaEngine.Artist } Button { iconName: "filename-composer-amarok" Layout.alignment: Qt.AlignRight - ToolTip.text: i18n("Composer") + tooltip: i18n("Composer") onClicked: WikipediaEngine.selection = WikipediaEngine.Composer } Button { iconName: "filename-album-amarok" Layout.alignment: Qt.AlignRight - ToolTip.text: i18n("Album") + tooltip: i18n("Album") onClicked: WikipediaEngine.selection = WikipediaEngine.Album } Button { iconName: "filename-title-amarok" Layout.alignment: Qt.AlignRight - ToolTip.text: i18n("Track") + tooltip: i18n("Track") onClicked: WikipediaEngine.selection = WikipediaEngine.Track } } WebEngineView { id: content + backgroundColor: "transparent" + Layout.fillWidth: true Layout.fillHeight: true Layout.alignment: Qt.AlignBottom - height: Kirigami.Units.largeSpacing * 25 //TODO: Find a more elegant solution to set the height onNavigationRequested: { - if (request.navigationType == WebEngineNavigationRequest.LinkClickedNavigation) { - request.action = WebEngineNavigationRequest.IgnoreRequest; - WikipediaEngine.url = request.url; - } + request.action = WebEngineNavigationRequest.IgnoreRequest; + WikipediaEngine.url = request.url; } Connections { diff --git a/src/context/applets/wikipedia/package/metadata.desktop b/src/context/applets/wikipedia/package/metadata.desktop --- a/src/context/applets/wikipedia/package/metadata.desktop +++ b/src/context/applets/wikipedia/package/metadata.desktop @@ -57,7 +57,7 @@ Type=Service ServiceTypes=Amarok/ContextApplet -Icon=wikipedia-amarok +Icon=amarok-wikipedia X-KDE-PluginInfo-Author=Leo Franchi X-KDE-PluginInfo-Email=lfranchi@gmail.com diff --git a/src/context/applets/wikipedia/plugin/WikipediaEngine.h b/src/context/applets/wikipedia/plugin/WikipediaEngine.h --- a/src/context/applets/wikipedia/plugin/WikipediaEngine.h +++ b/src/context/applets/wikipedia/plugin/WikipediaEngine.h @@ -23,6 +23,7 @@ #include "network/NetworkAccessManagerProxy.h" #include +#include class WikipediaEngine : public QObject @@ -108,13 +109,15 @@ QString m_message; bool m_busy; QString m_title; + QString m_css; private slots: void _checkRequireUpdate( Meta::TrackPtr track ); void _parseLangLinksResult( const QUrl &url, QByteArray data, NetworkAccessManagerProxy::Error e ); void _parseListingResult( const QUrl &url, QByteArray data, NetworkAccessManagerProxy::Error e ); void _wikiResult( const QUrl &url, QByteArray result, NetworkAccessManagerProxy::Error e ); void _stopped(); + void _paletteChanged( const QPalette &palette ); }; diff --git a/src/context/applets/wikipedia/plugin/WikipediaEngine.cpp b/src/context/applets/wikipedia/plugin/WikipediaEngine.cpp --- a/src/context/applets/wikipedia/plugin/WikipediaEngine.cpp +++ b/src/context/applets/wikipedia/plugin/WikipediaEngine.cpp @@ -22,11 +22,14 @@ #include "WikipediaEngine.h" #include "EngineController.h" +#include "PaletteHandler.h" #include "core/meta/support/MetaConstants.h" #include "core/support/Amarok.h" #include "core/support/Debug.h" #include +#include +#include #include #include @@ -43,13 +46,16 @@ EngineController *engine = The::engineController(); _checkRequireUpdate( engine->currentTrack() ); + _paletteChanged( The::paletteHandler()->palette() ); connect( engine, &EngineController::trackChanged, this, &WikipediaEngine::_checkRequireUpdate ); connect( engine, &EngineController::trackMetadataChanged, this, &WikipediaEngine::_checkRequireUpdate ); connect( engine, &EngineController::stopped, this, &WikipediaEngine::_stopped ); + connect( The::paletteHandler(), &PaletteHandler::newPalette, + this, &WikipediaEngine::_paletteChanged ); } WikipediaEngine::~WikipediaEngine() @@ -379,6 +385,41 @@ m_previousTrackMetadata.clear(); } +void +WikipediaEngine::_paletteChanged( const QPalette &palette ) +{ + DEBUG_BLOCK + + // read css, replace color placeholders, write to file, load into page + QFile file( QStandardPaths::locate( QStandardPaths::GenericDataLocation, "amarok/data/WikipediaCustomStyle.css" ) ); + if( file.open(QIODevice::ReadOnly | QIODevice::Text) ) + { + QString contents = QString( file.readAll() ); + contents.replace( "/*{text_color}*/", palette.text().color().name() ); + contents.replace( "/*{link_color}*/", palette.link().color().name() ); + contents.replace( "/*{link_hover_color}*/", palette.linkVisited().color().name() ); + contents.replace( "/*{background_color}*/", palette.base().color().name() ); + + const QString abg = palette.window().color().name(); + contents.replace( "/*{shaded_text_background_color}*/", abg ); + contents.replace( "/*{table_background_color}*/", abg ); + contents.replace( "/*{headings_background_color}*/", abg ); + + const QString atbg = palette.alternateBase().color().name(); + contents.replace( "/*{alternate_table_background_color}*/", atbg ); + + if( m_css == contents ) + return; + + m_css = contents; + updateEngine(); + } + else + { + error() << "Could not load WikipediaCustomStyle.css"; + } +} + void WikipediaEngine::fetchWikiUrl( const QString &title, const QString &urlPrefix ) { @@ -413,8 +454,7 @@ wikiCurrentUrl = pageUrl; urls << pageUrl; emit urlChanged(); - The::networkAccessManager()->getData( pageUrl, this, - SLOT(_wikiResult(QUrl,QByteArray,NetworkAccessManagerProxy::Error)) ); + The::networkAccessManager()->getData( pageUrl, this, &WikipediaEngine::_wikiResult ); } void @@ -438,8 +478,7 @@ url.setQuery( query ); urls << url; debug() << "Fetching langlinks:" << url; - The::networkAccessManager()->getData( url, this, - SLOT(_parseLangLinksResult(QUrl,QByteArray,NetworkAccessManagerProxy::Error)) ); + The::networkAccessManager()->getData( url, this, &WikipediaEngine::_parseLangLinksResult ); } void @@ -460,8 +499,7 @@ url.setQuery( query ); urls << url; debug() << "Fetching listing:" << url; - The::networkAccessManager()->getData( url, this, - SLOT(_parseListingResult(QUrl,QByteArray,NetworkAccessManagerProxy::Error)) ); + The::networkAccessManager()->getData( url, this, &WikipediaEngine::_parseListingResult ); } void @@ -567,8 +605,8 @@ WikipediaEngine::wikiParse( QString &wiki ) { //remove the new-lines and tabs(replace with spaces IS needed). - wiki.replace( '\n', QLatin1Char(' ') ); - wiki.replace( '\t', QLatin1Char(' ') ); +// wiki.replace( '\n', QLatin1Char(' ') ); +// wiki.replace( '\t', QLatin1Char(' ') ); // Get the available language list QString wikiLanguagesSection; @@ -635,14 +673,26 @@ } }; + QString header = QString( "\n\n%1\n\n\n" ).arg( title ); + + // add own stylesheet + if( !m_css.isEmpty() ) + { + removeTag( "" ); + int index = header.indexOf( QStringLiteral( "" ) ); + header.insert( index, QString( "\n\n" ).arg( m_css ) ); + } + + wiki.prepend( header ); + // lets remove the warning box removeTag( "" ); // remove protection policy (we don't do edits) removeTag( "
" ); // lets also remove the "lock" image removeTag( "" ); // remove