Zum Inhalt

Ein natives Plugin schreiben

Ein minimales natives Plugin besteht aus einer Klasse, einem Factory-Makro, einer JSON-Datei und einer kurzen CMakeLists.txt. Sie können es vollständig außerhalb des Quellbaums gegen das Plugin-SDK entwickeln — ein Checkout der MTE-Quellen ist nicht erforderlich.

Nativ oder Python?

Diese Seite behandelt native C++-Plugins (kompiliert zu einer .dll/.so/.dylib und vom Qt-Loader geladen). Wenn Sie lieber einen Ordner mit .py-Dateien ausliefern, den der Editor als Subprozess startet, lesen Sie Python-Plugins — dieselbe PluginApi-Oberfläche, anderes Backend, kein Compiler nötig.

Entwurf

Diese Anleitung basiert auf PLUGIN_ARCHITECTURE.md; prüfen Sie den genauen SDK-Paketnamen und die Argumente von mte_add_plugin() gegen das ausgelieferte SDK, bevor Sie sich darauf verlassen.

1. IPlugin implementieren

#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. Die Factory exportieren (natives Qt-Backend)

#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. In plugin.json beschreiben

{
  "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 }
  ]
}

Die apiVersion hier und die von info() zurückgegebene müssen beide gleich MTE_PLUGIN_API_VERSION sein, andernfalls verweigert der Host das Laden des Plugins.

Mitgelieferte Bibliotheken attributieren — thirdParty

Wenn Ihr Plugin eine Drittanbieter-Komponente bündelt oder dagegen linkt, deklarieren Sie sie in einem optionalen thirdParty-Array, damit der Editor seine Attributionspflichten erfüllen kann:

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

Jeder Eintrag benötigt einen name (Einträge ohne Namen werden verworfen); license, url und file sind optional. Ihr Plugin ist Eigentümer der Lizenztexte — liefern Sie sie neben dem Plugin unter Plugins/Licenses/<your-plugin-id>/ aus, wobei file der Basisname ist. Der About-Dialog listet die thirdParty-Komponenten jedes installierten Plugins auf und verweist die Benutzer auf diesen Ordner; der Kern trägt die Drittanbieter-Texte eines Plugins niemals selbst. (Das mitgelieferte HtmlPreviewPlugin, das QtWebEngine + Chromium einbettet, ist das Referenzbeispiel.)

4. Bauen

Verwenden Sie den CMake-Helfer des SDK:

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

5. Installieren & ausführen

Packen Sie entweder die gebaute Bibliothek + plugin.json als <name>.mteplugin in ein Zip und installieren Sie es über Einstellungen ▸ Plugins ▸ Install… (das Paket wird validiert — Manifest, Archivsicherheit und die eingebetteten Metadaten der Binärdatei —, bevor irgendetwas angefasst wird), oder legen Sie die Dateien von Hand in ein erkanntes Plugin-Verzeichnis (siehe Architekturüberblick). Starten Sie den Editor neu; aktivieren Sie das Plugin bei Bedarf unter Einstellungen ▸ Plugins.

Weiter