Krita Source Code Documentation
Loading...
Searching...
No Matches
plugin.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2014 Boudewijn Rempt (boud@valdyas.org)
3 *
4 * SPDX-License-Identifier: LGPL-2.0-only
5 */
6
7#include "plugin.h"
8
9#include <klocalizedstring.h>
10#include <kis_debug.h>
11#include <kpluginfactory.h>
12
14#include "pyqtpluginsettings.h"
15
16#include <QCoreApplication>
17
18#include <Krita.h>
19
20K_PLUGIN_FACTORY_WITH_JSON(KritaPyQtPluginFactory, "kritapykrita.json", registerPlugin<KritaPyQtPlugin>();)
21
22KritaPyQtPlugin::KritaPyQtPlugin(QObject *parent, const QVariantList &)
23 : QObject(parent)
24 , m_autoReload(false)
25{
26 dbgScript << "Loading Python plugin";
27
29 switch (initResult) {
31 break;
33 qWarning() << i18n("Cannot load Python library");
34 return;
36 qWarning() << i18n("Cannot set Python paths");
37 return;
39 qWarning() << i18n("Cannot load built-in pykrita module");
40 return;
41 default:
42 qWarning() << i18n("Unexpected error initializing python plugin.");
43 return;
44 }
45
46 pluginManager = PyKrita::pluginManager();
47
49 PyQtPluginSettingsFactory* settingsFactory = new PyQtPluginSettingsFactory(pluginManager);
50
51 //load and save preferences
52 //if something in kritarc is missing, then the default from this load function will be used and saved back to kconfig.
53 //this way, cfg.readEntry() in any part won't be able to set its own default
54 KisPreferenceSet* settings = settingsFactory->createPreferenceSet();
56 settings->loadPreferences();
57 settings->savePreferences();
58 delete settings;
59
60 preferenceSetRegistry->add("PyQtPluginSettingsFactory", settingsFactory);
61
62 // Try to import the `pykrita` module
64 PyObject* pykritaPackage = py.moduleImport("pykrita");
65 pykritaPackage = py.moduleImport("krita");
66
67 if (pykritaPackage) {
68 dbgScript << "Loaded pykrita, now load plugins";
69 pluginManager->scanPlugins();
70 pluginManager->tryLoadEnabledPlugins();
71 //py.functionCall("_pykritaLoaded", PyKrita::Python::PYKRITA_ENGINE);
72 } else {
73 dbgScript << "Cannot load pykrita module";
74 }
75
76 Q_FOREACH (Extension *extension, Krita::instance()->extensions()) {
77 extension->setup();
78 }
79
80 // This ensures that QObject's owned by Python are destructed before
81 // the destructor of QCoreApplication is called, in order to prevent
82 // a crash on exit.
83 // See https://bugs.kde.org/show_bug.cgi?id=417465
84 // XXX: Commented out because this still can cause crashes:
85 // https://invent.kde.org/graphics/krita/-/commit/a0c29913114164ff3f2ba4e255ccee1c52cb3e86#note_260688
86 // connect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit, this, []() { PyKrita::finalize(); });
87}
88
90{
91 // Don't call PyKrita::finalize here, because that can result in a crash
92 // deep inside Qt.
93}
94
95#include "plugin.moc"
static KisPreferenceSetRegistry * instance()
virtual void loadPreferences()=0
virtual void savePreferences() const =0
KritaPyQtPlugin(QObject *parent, const QVariantList &)
Definition plugin.cpp:22
virtual ~KritaPyQtPlugin()
Definition plugin.cpp:89
static Krita * instance()
instance retrieve the singleton instance of the Application object.
Definition Krita.cpp:390
PyObject * moduleImport(const char *moduleName)
KisPreferenceSet * createPreferenceSet() override
K_PLUGIN_FACTORY_WITH_JSON(KritaASCCDLFactory, "kritaasccdl.json", registerPlugin< KritaASCCDL >();) KritaASCCDL
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128
#define dbgScript
Definition kis_debug.h:56
@ INIT_CANNOT_LOAD_PYKRITA_MODULE
Definition utilities.h:32
@ INIT_CANNOT_LOAD_PYTHON_LIBRARY
Definition utilities.h:30
@ INIT_CANNOT_SET_PYTHON_PATHS
Definition utilities.h:31
@ INIT_OK
Definition utilities.h:29
InitResult initialize()
Definition utilities.cpp:44
PythonPluginManager * pluginManager()
Definition utilities.cpp:92