File indexing completed on 2024-04-28 15:40:16

0001 // SPDX-FileCopyrightText: 2019-2022 The KPhotoAlbum Development Team
0002 //
0003 // SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0004 
0005 #include "PurposeMenu.h"
0006 
0007 #include "Logging.h"
0008 
0009 #include <MainWindow/Window.h>
0010 
0011 #include <KLocalizedString>
0012 #include <Purpose/AlternativesModel>
0013 #include <PurposeWidgets/Menu>
0014 #include <QJsonArray>
0015 #include <QJsonObject>
0016 #include <QMenu>
0017 
0018 Plugins::PurposeMenu::PurposeMenu(QMenu *parent)
0019     : Purpose::Menu(parent)
0020     , m_parentMenu(parent)
0021     , m_menuUpdateNeeded(true)
0022 {
0023     loadPurposeMenu();
0024 }
0025 
0026 void Plugins::PurposeMenu::slotSelectionChanged()
0027 {
0028     m_menuUpdateNeeded = true;
0029     clear();
0030     qCDebug(PluginsLog) << "Purpose menu items invalidated...";
0031 }
0032 
0033 void Plugins::PurposeMenu::loadPurposeMenu()
0034 {
0035     // attach the menu
0036     QAction *purposeMenu = m_parentMenu->addMenu(this);
0037     purposeMenu->setText(i18n("Share"));
0038     purposeMenu->setIcon(QIcon::fromTheme(QStringLiteral("document-share")));
0039 
0040     // set up the callback signal
0041     connect(this, &Purpose::Menu::finished, this, [this](const QJsonObject &output, int error, const QString &message) {
0042         if (error) {
0043             qCDebug(PluginsLog) << "Failed to share image:" << message;
0044             Q_EMIT imageSharingFailed(message);
0045         } else {
0046             // Note: most plugins don't seem to actually return anything in the url field...
0047             const QUrl returnUrl = QUrl(output[QStringLiteral("url")].toString(), QUrl::ParsingMode::StrictMode);
0048             qCDebug(PluginsLog) << "Image shared successfully.";
0049             qCDebug(PluginsLog) << "Raw json data: " << output;
0050             Q_EMIT imageShared(returnUrl);
0051         }
0052     });
0053 
0054     // update available options based on the latest picture
0055     connect(this, &QMenu::aboutToShow, this, &PurposeMenu::loadPurposeItems);
0056     qCDebug(PluginsLog) << "Purpose menu loaded...";
0057 }
0058 
0059 void Plugins::PurposeMenu::loadPurposeItems()
0060 {
0061     if (!m_menuUpdateNeeded) {
0062         return;
0063     }
0064     m_menuUpdateNeeded = false;
0065 
0066     const DB::FileNameList images = MainWindow::Window::theMainWindow()->selected(ThumbnailView::NoExpandCollapsedStacks);
0067     QJsonArray urls;
0068     for (const auto &image : images) {
0069         urls.append(QUrl(image).toString());
0070     }
0071 
0072     // "image/jpeg" is certainly not always true, but the interface does not allow a mimeType list
0073     // and the plugins likely won't care...
0074     model()->setInputData(QJsonObject {
0075         { QStringLiteral("mimeType"), QStringLiteral("image/jpeg") },
0076         { QStringLiteral("urls"), urls } });
0077     model()->setPluginType(QStringLiteral("Export"));
0078     reload();
0079     qCDebug(PluginsLog) << "Purpose menu items loaded...";
0080 }
0081 
0082 #include "moc_PurposeMenu.cpp"