Aller au contenu

Écrire un plugin natif

Un plugin natif minimal, c'est une classe, une macro de fabrique, un fichier JSON et un court CMakeLists.txt. Vous pouvez l'écrire entièrement hors de l'arborescence, contre le Plugin SDK — aucune copie des sources de MTE n'est requise.

Natif ou Python ?

Cette page couvre les plugins C++ natifs (compilés en .dll/.so/.dylib et chargés par le chargeur Qt). Si vous préférez livrer un dossier de fichiers .py que l'éditeur lance comme sous-processus, consultez les plugins Python — même surface PluginApi, backend différent, aucun compilateur requis.

Brouillon

Ce guide pas à pas s'appuie sur PLUGIN_ARCHITECTURE.md ; vérifiez le nom exact du paquet SDK et les arguments de mte_add_plugin() par rapport au SDK livré avant de vous y fier.

1. Implémenter IPlugin

#include <PluginApi/IPlugin.h>
#include <PluginApi/IPluginContext.h>

class HelloWorldPlugin : public MTE::plugin::IPlugin {
public:
    MTE::plugin::PluginInfo info() const override {
        return { "org.mte.helloworld", "Hello World", "1.0.0",
                 "Example Vendor", "Says hi.", MTE_PLUGIN_API_VERSION };
    }

    bool initialize(MTE::plugin::IPluginContext& ctx) override {
        m_cmd = ctx.commands().registerCommand(
            { "helloworld.sayHi", "Say Hi", "Ctrl+Alt+H", "Hello" },
            [&ctx] { ctx.log().log(MTE::plugin::LogLevel::Info, "Hi!"); });
        m_menu = ctx.menus().addItem("Plugins/Say Hi", "helloworld.sayHi");
        return true;
    }

    void shutdown() noexcept override {}   // tokens tear down automatically

private:
    MTE::plugin::CommandToken m_cmd;
    MTE::plugin::MenuToken    m_menu;
};

2. Exporter la fabrique (backend natif Qt)

#include <PluginApi/Qt/PluginQtGlue.h>

class HelloWorldFactory : public QObject, public MTE::plugin::IPluginFactory {
    Q_OBJECT
    Q_PLUGIN_METADATA(IID "org.mte.IPluginFactory/1" FILE "plugin.json")
    Q_INTERFACES(MTE::plugin::IPluginFactory)
public:
    std::unique_ptr<MTE::plugin::IPlugin> create() override {
        return std::make_unique<HelloWorldPlugin>();
    }
};

3. Le décrire dans plugin.json

{
  "id":         "org.mte.helloworld",
  "name":       "Hello World",
  "version":    "1.0.0",
  "apiVersion": 1,
  "entry":      "native",
  "requires":   [],
  "order":      600,
  "menus": [
    { "title": "Plugins", "barPriority": 570, "itemPriority": 100 }
  ]
}

L'apiVersion déclaré ici et celui renvoyé par info() doivent tous deux être égaux à MTE_PLUGIN_API_VERSION, sinon l'hôte refuse de charger le plugin.

Attribuer les bibliothèques embarquées — thirdParty

Si votre plugin embarque ou lie un composant tiers, déclarez-le dans un tableau optionnel thirdParty afin que l'éditeur puisse honorer ses obligations d'attribution :

"thirdParty": [
  { "name": "Qt WebEngine", "license": "LGPL-3.0",
    "url": "https://doc.qt.io/qt-6/qtwebengine-index.html",
    "file": "QtWebEngine-LGPLv3.txt" }
]

Chaque entrée requiert un name (les entrées sans nom sont ignorées) ; license, url et file sont optionnels. Votre plugin est propriétaire des textes de licence — livrez-les à côté du plugin sous Plugins/Licenses/<your-plugin-id>/, où file est le nom de base du fichier. La boîte de dialogue À propos liste les composants thirdParty de chaque plugin installé et oriente les utilisateurs vers ce dossier ; le cœur de l'éditeur ne porte jamais les textes tiers d'un plugin à sa place. (Le plugin fourni HtmlPreviewPlugin, qui embarque QtWebEngine + Chromium, est l'exemple de référence.)

4. Le compiler

Utilisez l'assistant CMake du SDK :

find_package(MTEPluginSDK REQUIRED)
mte_add_plugin(NAME HelloWorldPlugin
    SOURCES Src/HelloWorldPlugin.cpp
    # TRANSLATIONS Translations/HelloWorld_en.ts ...
)

5. Installer et lancer

Soit vous compressez la bibliothèque compilée + plugin.json en <name>.mteplugin et l'installez via Préférences ▸ Extensions ▸ Installer… (le paquet est validé — manifeste, sûreté de l'archive et métadonnées embarquées dans le binaire — avant que quoi que ce soit ne soit touché), soit vous déposez les fichiers à la main dans un répertoire de plugins découvert (voir la vue d'ensemble de l'architecture). Redémarrez l'éditeur ; activez le plugin dans Préférences ▸ Extensions si nécessaire.

Étapes suivantes