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"