diff --git a/CMakeLists.txt b/CMakeLists.txt index b7ed694f..60922516 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,161 +1,161 @@ cmake_minimum_required(VERSION 3.1) set(PIM_VERSION "5.9.40") project(kdepim-addons VERSION ${PIM_VERSION}) if(POLICY CMP0063) cmake_policy(SET CMP0063 NEW) endif() set(KF5_VERSION "5.48.0") find_package(ECM ${KF5_VERSION} CONFIG REQUIRED) set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH}) # Do NOT add quote set(KDEPIM_DEV_VERSION alpha) # add an extra space if(DEFINED KDEPIM_DEV_VERSION) set(KDEPIM_DEV_VERSION " ${KDEPIM_DEV_VERSION}") endif() set(KDEPIMADDONS_VERSION_NUMBER ${PIM_VERSION}) set(KDEPIMADDONS_VERSION "${KDEPIMADDONS_VERSION_NUMBER}${KDEPIM_DEV_VERSION}") set(KDEPIMADDONS_LIB_VERSION "${KDEPIMADDONS_VERSION_NUMBER}") set(KDEPIMADDONS_LIB_SOVERSION "5") set(AKONADINOTES_LIB_VERSION "5.9.40") set(QT_REQUIRED_VERSION "5.9.0") include(ECMOptionalAddSubdirectory) include(ECMInstallIcons) include(ECMSetupVersion) include(ECMAddTests) include(ECMMarkNonGuiExecutable) include(GenerateExportHeader) include(ECMGenerateHeaders) include(CMakePackageConfigHelpers) include(FeatureSummary) include(CheckFunctionExists) include(ECMGeneratePriFile) include(ECMCoverageOption) include(KDEInstallDirs) include(KDECMakeSettings) include(KDECompilerSettings NO_POLICY_SCOPE) include(ECMAddAppIcon) include(ECMQtDeclareLoggingCategory) option(KDEPIMADDONS_BUILD_EXAMPLES "Build the kdepim-addons example applications." TRUE) option(KDEPIM_ENTERPRISE_BUILD "Enable features specific to the enterprise branch, which are normally disabled. Also, it disables many components not needed for Kontact such as the Kolab client." FALSE) option(KMAIL_EDITORCONVERTERPLUGIN_BUILD "Build the kmail editor converter plugin." FALSE) find_package(Qt5 ${QT_REQUIRED_VERSION} CONFIG REQUIRED WebEngine WebEngineWidgets Widgets Test) find_package(KF5I18n ${KF5_VERSION} CONFIG REQUIRED) find_package(KF5Config ${KF5_VERSION} CONFIG REQUIRED) find_package(KF5DBusAddons ${KF5_VERSION} CONFIG REQUIRED) find_package(KF5AkonadiNotes ${AKONADINOTES_LIB_VERSION} CONFIG REQUIRED) find_package(KF5XmlGui ${KF5_VERSION} CONFIG REQUIRED) find_package(KF5Declarative ${KF5_VERSION} CONFIG REQUIRED) find_package(KF5SyntaxHighlighting ${KF5_VERSION} CONFIG REQUIRED) find_package(KF5KIO ${KF5_VERSION} CONFIG REQUIRED) find_package(KF5IconThemes ${KF5_VERSION} CONFIG REQUIRED) find_package(KF5Parts ${KF5_VERSION} CONFIG REQUIRED) find_package(KF5Prison ${KF5_VERSION} CONFIG REQUIRED) find_package(KF5Holidays ${KF5_VERSION} CONFIG REQUIRED) set(MAILCOMMON_LIB_VERSION "5.9.40") set(GRAVATAR_LIB_VERSION "5.9.40") set(PIMCOMMON_LIB_VERSION "5.9.41") set(GRANTLEETHEME_LIB_VERSION "5.9.40") set(CALENDARSUPPORT_LIB_VERSION "5.9.40") set(EVENTVIEW_LIB_VERSION "5.9.40") set(LIBKDEPIM_LIB_VERSION "5.9.40") set(KDEPIM_APPS_LIB_VERSION "5.9.40") set(LIBKLEO_LIB_VERSION "5.9.40") set(AKONADI_LIB_VERSION "5.9.40") set(INCIDENCEEDITOR_LIB_VERSION "5.9.40") set(KTNEF_LIB_VERSION "5.9.40") set(MESSAGELIB_LIB_VERSION "5.9.46") set(AKONADICALENDAR_LIB_VERSION "5.9.40") set(CALENDAR_UTILS_VERSION "5.9.40") set(KPIMTEXTEDIT_LIB_VERSION "5.9.41") set(KIMAP_LIB_VERSION "5.9.40") set(LIBKSIEVE_LIB_VERSION "5.9.40") set(KMAILTRANSPORT_LIB_VERSION "5.9.40") set(AKONADICONTACT_LIB_VERSION "5.9.40") set(IMPORTWIZARD_LIB_VERSION "5.9.40") set(MAILIMPORTER_LIB_VERSION "5.9.40") set(KPIMPKPASS_LIB_VERSION "5.9.40") -set(KPIMITINERARY_LIB_VERSION "5.9.42") +set(KPIMITINERARY_LIB_VERSION "5.9.44") find_package(KF5CalendarUtils ${CALENDAR_UTILS_VERSION} CONFIG REQUIRED) find_package(KF5WebEngineViewer ${MESSAGELIB_LIB_VERSION} CONFIG REQUIRED) find_package(KF5TemplateParser ${MESSAGELIB_LIB_VERSION} CONFIG REQUIRED) find_package(KF5MailCommon ${MAILCOMMON_LIB_VERSION} CONFIG REQUIRED) find_package(KF5KaddressbookGrantlee ${KDEPIM_APPS_LIB_VERSION} CONFIG REQUIRED) find_package(KF5MessageViewer ${MESSAGELIB_LIB_VERSION} CONFIG REQUIRED) find_package(KF5KaddressbookImportExport ${KDEPIM_APPS_LIB_VERSION} CONFIG REQUIRED) find_package(KF5Libkleo ${LIBKLEO_LIB_VERSION} CONFIG REQUIRED) find_package(KF5GrantleeTheme ${GRANTLEETHEME_LIB_VERSION} CONFIG REQUIRED) find_package(KF5PimCommonAkonadi ${PIMCOMMON_LIB_VERSION} CONFIG REQUIRED) find_package(KF5LibkdepimAkonadi ${LIBKDEPIM_LIB_VERSION} CONFIG REQUIRED) find_package(KF5IncidenceEditor ${INCIDENCEEDITOR_LIB_VERSION} CONFIG REQUIRED) find_package(KF5MessageCore ${MESSAGELIB_LIB_VERSION} CONFIG REQUIRED) find_package(KF5MessageComposer ${MESSAGELIB_LIB_VERSION} CONFIG REQUIRED) find_package(KF5MessageList ${MESSAGELIB_LIB_VERSION} CONFIG REQUIRED) find_package(KF5CalendarSupport ${CALENDARSUPPORT_LIB_VERSION} CONFIG REQUIRED) find_package(KF5EventViews ${EVENTVIEW_LIB_VERSION} CONFIG REQUIRED) find_package(KF5Akonadi ${AKONADI_LIB_VERSION} CONFIG REQUIRED) find_package(KF5AkonadiCalendar ${AKONADICALENDAR_LIB_VERSION} CONFIG REQUIRED) find_package(KF5Gravatar ${GRAVATAR_LIB_VERSION} CONFIG REQUIRED) find_package(KF5PimTextEdit ${KPIMTEXTEDIT_LIB_VERSION} CONFIG REQUIRED) find_package(KF5IdentityManagement ${KIDENTITYMANAGEMENT_LIB_VERSION} CONFIG REQUIRED) find_package(KF5IMAP ${KIMAP_LIB_VERSION} CONFIG REQUIRED) find_package(KF5LibKSieve ${LIBKSIEVE_LIB_VERSION} CONFIG REQUIRED) find_package(KF5Tnef ${KTNEF_LIB_VERSION} CONFIG REQUIRED) find_package(KF5MailTransportAkonadi ${KMAILTRANSPORT_LIB_VERSION} CONFIG REQUIRED) find_package(KF5AkonadiContact ${AKONADICONTACT_LIB_VERSION} CONFIG REQUIRED) find_package(KPimImportWizard ${IMPORTWIZARD_LIB_VERSION} CONFIG) find_package(KF5MailImporterAkonadi ${MAILIMPORTER_LIB_VERSION} CONFIG REQUIRED) find_package(KPimPkPass ${KPIMPKPASS_LIB_VERSION} CONFIG REQUIRED) find_package(KPimItinerary ${KPIMITINERARY_LIB_VERSION} CONFIG REQUIRED) add_definitions(-DQT_NO_CAST_FROM_ASCII) add_definitions(-DQT_NO_CAST_TO_ASCII) add_definitions(-DQT_NO_NARROWING_CONVERSIONS_IN_CONNECT) add_definitions(-DQT_NO_URL_CAST_FROM_STRING) if(KDEPIM_ENTERPRISE_BUILD) set(KDEPIM_ENTERPRISE_BUILD true) else() set(KDEPIM_ENTERPRISE_BUILD false) endif() # Extra package find_package(Gpgmepp 1.8.0 CONFIG) set_package_properties(Gpgmepp PROPERTIES DESCRIPTION "GpgME library" URL "http://www.gnupg.org" TYPE REQUIRED) if(KDEPIMADDONS_BUILD_EXAMPLES) add_subdirectory(examples) endif() include_directories(${CMAKE_CURRENT_SOURCE_DIR}) add_subdirectory(plugins) add_subdirectory(korganizer) add_subdirectory(kmail) add_subdirectory(kaddressbook) add_subdirectory(akregator) add_subdirectory(sieveeditor) add_subdirectory(kmailtransport) if(KPimImportWizard_FOUND) add_subdirectory(akonadi-import-wizard) endif() install(FILES kdepim-addons.categories kdepim-addons.renamecategories DESTINATION ${KDE_INSTALL_CONFDIR}) feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES) diff --git a/plugins/messageviewer/bodypartformatter/semantic/semanticrenderer.cpp b/plugins/messageviewer/bodypartformatter/semantic/semanticrenderer.cpp index c68ae887..3f717345 100644 --- a/plugins/messageviewer/bodypartformatter/semantic/semanticrenderer.cpp +++ b/plugins/messageviewer/bodypartformatter/semantic/semanticrenderer.cpp @@ -1,205 +1,210 @@ /* Copyright (c) 2017 Volker Krause This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "semanticrenderer.h" #include "semanticmemento.h" #include "semantic_debug.h" #include #include #include #include #include #include #include #include #include #include #include #include #include +#include #include #include #include #include #include #include #include #include #include using namespace KItinerary; // Grantlee has no Q_GADGET support yet #define GRANTLEE_MAKE_GADGET(Class) \ GRANTLEE_BEGIN_LOOKUP(Class) \ const auto idx = Class::staticMetaObject.indexOfProperty(property.toUtf8().constData()); \ if (idx < 0) { \ return {};} \ const auto mp = Class::staticMetaObject.property(idx); \ return mp.readOnGadget(&object); \ GRANTLEE_END_LOOKUP GRANTLEE_MAKE_GADGET(Airport) GRANTLEE_MAKE_GADGET(Airline) GRANTLEE_MAKE_GADGET(Event) GRANTLEE_MAKE_GADGET(EventReservation) GRANTLEE_MAKE_GADGET(Flight) GRANTLEE_MAKE_GADGET(FlightReservation) GRANTLEE_MAKE_GADGET(LodgingBusiness) GRANTLEE_MAKE_GADGET(LodgingReservation) GRANTLEE_MAKE_GADGET(Person) GRANTLEE_MAKE_GADGET(Place) GRANTLEE_MAKE_GADGET(PostalAddress) GRANTLEE_MAKE_GADGET(Seat) GRANTLEE_MAKE_GADGET(Ticket) GRANTLEE_MAKE_GADGET(TrainStation) GRANTLEE_MAKE_GADGET(TrainTrip) GRANTLEE_MAKE_GADGET(TrainReservation) GRANTLEE_MAKE_GADGET(BusStation) GRANTLEE_MAKE_GADGET(BusTrip) GRANTLEE_MAKE_GADGET(BusReservation) GRANTLEE_MAKE_GADGET(CancelAction) GRANTLEE_MAKE_GADGET(CheckInAction) GRANTLEE_MAKE_GADGET(DownloadAction) GRANTLEE_MAKE_GADGET(UpdateAction) GRANTLEE_MAKE_GADGET(ViewAction) GRANTLEE_MAKE_GADGET(FoodEstablishment) GRANTLEE_MAKE_GADGET(FoodEstablishmentReservation) +GRANTLEE_MAKE_GADGET(RentalCarReservation) +GRANTLEE_MAKE_GADGET(RentalCar) SemanticRenderer::SemanticRenderer() { Grantlee::registerMetaType(); Grantlee::registerMetaType(); Grantlee::registerMetaType(); Grantlee::registerMetaType(); Grantlee::registerMetaType(); Grantlee::registerMetaType(); Grantlee::registerMetaType(); Grantlee::registerMetaType(); Grantlee::registerMetaType(); Grantlee::registerMetaType(); Grantlee::registerMetaType(); Grantlee::registerMetaType(); Grantlee::registerMetaType(); Grantlee::registerMetaType(); Grantlee::registerMetaType(); Grantlee::registerMetaType(); Grantlee::registerMetaType(); Grantlee::registerMetaType(); Grantlee::registerMetaType(); Grantlee::registerMetaType(); Grantlee::registerMetaType(); Grantlee::registerMetaType(); Grantlee::registerMetaType(); Grantlee::registerMetaType(); Grantlee::registerMetaType(); Grantlee::registerMetaType(); + Grantlee::registerMetaType(); + Grantlee::registerMetaType(); } bool SemanticRenderer::render(const MimeTreeParser::MessagePartPtr &msgPart, MessageViewer::HtmlWriter *htmlWriter, MessageViewer::RenderContext *context) const { Q_UNUSED(context); const auto mpList = msgPart.dynamicCast(); if (!msgPart->isRoot() || !mpList->hasSubParts()) { return false; } const auto node = mpList->subParts().at(0)->content(); const auto nodeHelper = msgPart->nodeHelper(); if (!nodeHelper || !node) { return false; } auto memento = dynamic_cast(nodeHelper->bodyPartMemento(node->topLevel(), "org.kde.messageviewer.semanticData")); if (!memento || !memento->hasData()) { return false; } const auto extractedData = memento->data(); if (extractedData.isEmpty()) { // hasData() will not be correct for filtered structured data on the first pass through here... return false; } const auto dir = nodeHelper->createTempDir(QStringLiteral("semantic")); auto c = MessageViewer::MessagePartRendererManager::self()->createContext(); const auto pal = qGuiApp->palette(); QVariantMap style; style.insert(QStringLiteral("frameColor"), pal.link().color().name()); style.insert(QStringLiteral("expandIcon"), QLatin1String("file://") + MessageViewer::IconNameCache::instance()->iconPathFromLocal(QStringLiteral("quoteexpand.png"))); style.insert(QStringLiteral("collapseIcon"), QLatin1String("file://") + MessageViewer::IconNameCache::instance()->iconPathFromLocal(QStringLiteral("quotecollapse.png"))); c.insert(QStringLiteral("style"), style); // Grantlee can't do indexed map/array lookups, so we need to interleave this here already QVariantList elems; elems.reserve(extractedData.size()); for (int i = 0; i < extractedData.size(); ++i) { QVariantMap data; QVariantMap state; const auto d = extractedData.at(i); state.insert(QStringLiteral("expanded"), d.expanded); data.insert(QStringLiteral("state"), state); data.insert(QStringLiteral("groupId"), i); QVector reservations; for (const auto &r : d.reservations) { QVariantMap m; m.insert(QStringLiteral("reservation"), r); // generate ticket barcodes const auto ticket = JsonLd::convert(r).reservedTicket().value(); std::unique_ptr barcode; switch (ticket.ticketTokenType()) { case Ticket::AztecCode: barcode.reset(Prison::createBarcode(Prison::Aztec)); barcode->setData(ticket.ticketTokenData()); break; case Ticket::QRCode: barcode.reset(Prison::createBarcode(Prison::QRCode)); barcode->setData(ticket.ticketTokenData()); break; default: break; } if (barcode) { barcode->toImage(barcode->minimumSize()); // minimumSize is only available after we rendered once... const auto img = barcode->toImage(barcode->minimumSize()); const auto fileName = dir + QStringLiteral("/ticketToken") + QString::number(i) + QStringLiteral(".png"); img.save(fileName); m.insert(QStringLiteral("ticketToken"), fileName); nodeHelper->addTempFile(fileName); } reservations.push_back(m); } data.insert(QStringLiteral("reservations"), QVariant::fromValue(reservations)); elems.push_back(data); } c.insert(QStringLiteral("data"), elems); auto t = MessageViewer::MessagePartRendererManager::self()->loadByName(QStringLiteral(":/org.kde.messageviewer/semantic/semantic.html")); const_cast(t->engine())->addDefaultLibrary(QStringLiteral("kitinerary_grantlee_extension")); Grantlee::OutputStream s(htmlWriter->stream()); t->render(&s, &c); return false; // yes, false, we want the rest of the email rendered normally after this } diff --git a/plugins/messageviewer/bodypartformatter/semantic/templates.qrc b/plugins/messageviewer/bodypartformatter/semantic/templates.qrc index d1b515e9..90c95223 100644 --- a/plugins/messageviewer/bodypartformatter/semantic/templates.qrc +++ b/plugins/messageviewer/bodypartformatter/semantic/templates.qrc @@ -1,12 +1,13 @@ templates/semantic.html templates/flightreservation.html templates/lodgingreservation.html templates/trainreservation.html templates/busreservation.html templates/event.html templates/actions.html templates/foodestablishmentreservation.html + templates/rentalcarreservation.html diff --git a/plugins/messageviewer/bodypartformatter/semantic/templates/rentalcarreservation.html b/plugins/messageviewer/bodypartformatter/semantic/templates/rentalcarreservation.html new file mode 100644 index 00000000..331eb1e2 --- /dev/null +++ b/plugins/messageviewer/bodypartformatter/semantic/templates/rentalcarreservation.html @@ -0,0 +1,8 @@ +
{{ trip.name }} - {{ res.pickupTime|formatDateTime }} - {{ res.dropoffTime|formatDateTime }}
+
{% i18n "Reservation Number: %1" res.reservationNumber %}
+{% if res.underName.name %} +
{% i18n "Under Name: %1" res.underName.name %}
+{% endif %} +
{{ trip.address|formatAddress|safe }}
+{% include ":/org.kde.messageviewer/semantic/actions.html" %} +
diff --git a/plugins/messageviewer/bodypartformatter/semantic/templates/semantic.html b/plugins/messageviewer/bodypartformatter/semantic/templates/semantic.html index 3b71b1ef..b17e1a5a 100644 --- a/plugins/messageviewer/bodypartformatter/semantic/templates/semantic.html +++ b/plugins/messageviewer/bodypartformatter/semantic/templates/semantic.html @@ -1,28 +1,30 @@
{% for elem in data %} {% with elem.reservations.0.reservation as res %} {% with elem.reservations.0.reservation.reservationFor as trip %} {% if res.className == "FlightReservation" %} {% include ":/org.kde.messageviewer/semantic/flightreservation.html" %} {% elif res.className == "LodgingReservation" %} {% include ":/org.kde.messageviewer/semantic/lodgingreservation.html" %} {% elif res.className == "TrainReservation" %} {% include ":/org.kde.messageviewer/semantic/trainreservation.html" %} {% elif res.className == "BusReservation" %} {% include ":/org.kde.messageviewer/semantic/busreservation.html" %} {% elif res.className == "EventReservation" %} {% include ":/org.kde.messageviewer/semantic/event.html" %} {% elif res.className == "FoodEstablishmentReservation" %} {% include ":/org.kde.messageviewer/semantic/foodestablishmentreservation.html" %} + {% elif res.className == "RentalCarReservation" %} + {% include ":/org.kde.messageviewer/semantic/rentalcarreservation.html" %} {% endif %} {% if not forloop.last %}
{% endif %} {% endwith %} {% endwith %} {% endfor %}