File indexing completed on 2024-04-21 04:00:31

0001 /*
0002     SPDX-FileCopyrightText: 2011 Alejandro Fiestas Olivares <afiestas@kde.org>
0003     SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez <aleixpol@kde.org>
0004     SPDX-FileCopyrightText: 2018 Nicolas Fella <nicolas.fella@gmx.de>
0005 
0006     SPDX-License-Identifier: GPL-2.0-or-later
0007 */
0008 
0009 #include "sharefileitemaction.h"
0010 
0011 #include <QAction>
0012 #include <QDesktopServices>
0013 #include <QIcon>
0014 #include <QJsonArray>
0015 #include <QList>
0016 #include <QUrl>
0017 #include <QVariantList>
0018 #include <QWidget>
0019 
0020 #include <KLocalizedString>
0021 #include <KNotification>
0022 #include <KPluginFactory>
0023 #include <kio/global.h>
0024 
0025 #include "alternativesmodel.h"
0026 #include "menu.h"
0027 
0028 K_PLUGIN_CLASS_WITH_JSON(ShareFileItemAction, "sharefileitemaction.json")
0029 
0030 Q_LOGGING_CATEGORY(PURPOSE_FILEITEMACTION, "kf.kio.widgets.fileitemactions.purpose")
0031 
0032 ShareFileItemAction::ShareFileItemAction(QObject *parent)
0033     : KAbstractFileItemActionPlugin(parent)
0034     , m_menu(new Purpose::Menu())
0035 {
0036     m_menu->setTitle(i18n("Share"));
0037     m_menu->setIcon(QIcon::fromTheme(QStringLiteral("document-share")));
0038     m_menu->model()->setPluginType(QStringLiteral("Export"));
0039 
0040     connect(m_menu, &Purpose::Menu::finished, this, [this](const QJsonObject &output, int errorCode, const QString &errorMessage) {
0041         m_isFinished = true;
0042         if (errorCode == 0 || errorCode == KIO::ERR_USER_CANCELED) {
0043             if (output.contains(QLatin1String("url")))
0044                 QDesktopServices::openUrl(QUrl(output.value(QLatin1String("url")).toString()));
0045         } else {
0046             Q_EMIT error(errorMessage);
0047             qWarning() << "job failed with error" << errorCode << errorMessage << output;
0048         }
0049     });
0050 }
0051 
0052 ShareFileItemAction::~ShareFileItemAction()
0053 {
0054     // TODO KF6 Remove this compatibility block
0055     // In case our instance is deleted, but the job isn't finished we fall back to a notification
0056     if (!m_isFinished) {
0057         QObject::connect(m_menu, &Purpose::Menu::finished, [](const QJsonObject &output, int errorCode, const QString &errorMessage) {
0058             if (errorCode == 0 || errorCode == KIO::ERR_USER_CANCELED) {
0059                 if (output.contains(QLatin1String("url")))
0060                     QDesktopServices::openUrl(QUrl(output.value(QLatin1String("url")).toString()));
0061             } else {
0062                 KNotification::event(KNotification::Error, i18n("Error sharing"), errorMessage);
0063                 qWarning() << "job failed with error" << errorCode << errorMessage << output;
0064             }
0065         });
0066     }
0067 }
0068 
0069 QList<QAction *> ShareFileItemAction::actions(const KFileItemListProperties &fileItemInfos, QWidget *parentWidget)
0070 {
0071     QJsonArray urlsJson;
0072 
0073     for (const QUrl &url : fileItemInfos.urlList()) {
0074         urlsJson.append(url.toString());
0075     }
0076 
0077     m_menu->model()->setInputData(
0078         QJsonObject{{QStringLiteral("mimeType"), QJsonValue{!fileItemInfos.mimeType().isEmpty() ? fileItemInfos.mimeType() : QStringLiteral("*/*")}},
0079                     {QStringLiteral("urls"), urlsJson}});
0080     m_menu->reload();
0081     m_menu->setParent(parentWidget, Qt::Popup);
0082 
0083     return {m_menu->menuAction()};
0084 }
0085 
0086 #include "moc_sharefileitemaction.cpp"
0087 #include "sharefileitemaction.moc"