File indexing completed on 2024-06-16 04:16:32

0001 /*
0002  * SPDX-FileCopyrightText: 2017 Boudewijn Rempt <boud@valdyas.org>
0003  * SPDX-FileCopyrightText: 2020 L. E. Segovia <amy@amyspark.me>
0004  *
0005  *  SPDX-License-Identifier: GPL-2.0-or-later
0006  */
0007 
0008 #include "QMic.h"
0009 
0010 #include <QApplication>
0011 #include <QMessageBox>
0012 #include <memory>
0013 
0014 #include <KisViewManager.h>
0015 #include <KoJsonTrader.h>
0016 #include <kis_action.h>
0017 #include <kis_debug.h>
0018 #include <klocalizedstring.h>
0019 #include <kpluginfactory.h>
0020 #include <kis_image.h>
0021 
0022 #include "kis_qmic_plugin_interface.h"
0023 
0024 K_PLUGIN_FACTORY_WITH_JSON(QMicFactory, "kritaqmic.json", registerPlugin<QMic>();)
0025 
0026 QMic::QMic(QObject *parent, const QVariantList &)
0027     : KisActionPlugin(parent)
0028     , m_qmicAction(createAction("QMic"))
0029     , m_againAction(createAction("QMicAgain"))
0030 {
0031     m_qmicAction->setActivationFlags(KisAction::ACTIVE_DEVICE);
0032     connect(m_qmicAction, SIGNAL(triggered()), this, SLOT(slotQMic()));
0033 
0034     m_againAction->setActivationFlags(KisAction::ACTIVE_DEVICE);
0035     m_againAction->setEnabled(false);
0036     connect(m_againAction, SIGNAL(triggered()), this, SLOT(slotQMicAgain()));
0037 }
0038 
0039 void QMic::slotQMicAgain()
0040 {
0041     slotQMic(true);
0042 }
0043 
0044 void QMic::slotQMic(bool again)
0045 {
0046     m_qmicAction->setEnabled(false);
0047     m_againAction->setEnabled(false);
0048 
0049     std::unique_ptr<KisQmicPluginInterface> plugin;
0050 
0051     // find the krita-gmic-qt plugin
0052     const QList<KoJsonTrader::Plugin> offers = KoJsonTrader::instance()->query("Krita/GMic", QString());
0053     if (offers.isEmpty()) {
0054         QMessageBox::warning(qApp->activeWindow(), i18nc("@title:window", "Krita"), i18n("The GMic plugin is not installed or could not be loaded."));
0055         return;
0056     }
0057 
0058     for (const auto &loader : offers) {
0059         auto *factory = qobject_cast<KPluginFactory *>(loader.instance());
0060         if (!factory) {
0061             warnPlugins << "(GMic) This is not a Krita plugin: " << loader.fileName() << loader.errorString();
0062 
0063             continue;
0064         }
0065 
0066         auto *pluginBase = factory->create<QObject>();
0067 
0068         plugin.reset(qobject_cast<KisQmicPluginInterface *>(pluginBase));
0069 
0070         if (!plugin) {
0071             warnPlugins << "(GMic) This is not a valid GMic-Qt plugin: " << loader.fileName();
0072             continue;
0073         }
0074 
0075         break;
0076     }
0077 
0078     if (!plugin) {
0079         QMessageBox::warning(qApp->activeWindow(), i18nc("@title:window", "Krita"), i18n("Krita cannot launch the gmic-qt plugin. No bundled library found."));
0080         return;
0081     }
0082 
0083     if (this->viewManager()->blockUntilOperationsFinished(this->viewManager()->image())) {
0084         auto image = std::make_shared<KisImageInterface>(this->viewManager().data());
0085         int status = plugin->launch(image, again);
0086 
0087         dbgPlugins << "pluginFinished" << status;
0088     }
0089 
0090     plugin.reset();
0091 
0092     m_qmicAction->setEnabled(true);
0093     m_againAction->setEnabled(true);
0094 }
0095 
0096 #include "QMic.moc"