Przejdź do treści

Pisanie wtyczki natywnej

Minimalna wtyczka natywna to jedna klasa, jedno makro fabryki, jeden plik JSON i krótki CMakeLists.txt. Możesz ją napisać w całości poza drzewem źródeł, w oparciu o Plugin SDK — bez checkoutu źródeł MTE.

Natywna czy Python?

Ta strona opisuje wtyczki natywne C++ (kompilowane do .dll/.so/.dylib i ładowane przez loader Qt). Jeśli wolisz dostarczyć folder plików .py, które edytor uruchamia jako podproces, zobacz Wtyczki w Pythonie — ta sama powierzchnia PluginApi, inny backend, kompilator niepotrzebny.

Wersja robocza

Ten przewodnik opiera się na PLUGIN_ARCHITECTURE.md; przed poleganiem na nich zweryfikuj dokładną nazwę pakietu SDK oraz argumenty mte_add_plugin() względem dostarczonego SDK.

1. Zaimplementuj 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. Wyeksportuj fabrykę (natywny backend 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. Opisz ją w 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 }
  ]
}

Zarówno tutejszy apiVersion, jak i ten zwracany przez info() muszą być równe MTE_PLUGIN_API_VERSION, inaczej host odmówi załadowania wtyczki.

Uznanie dołączonych bibliotek — thirdParty

Jeśli Twoja wtyczka dołącza lub linkuje komponent zewnętrzny, zadeklaruj go w opcjonalnej tablicy thirdParty, aby edytor mógł wypełnić obowiązki atrybucyjne:

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

Każdy wpis wymaga pola name (wpisy bez niego są pomijane); license, url i file są opcjonalne. Teksty licencji należą do Twojej wtyczki — dostarcz je obok wtyczki w Plugins/Licenses/<your-plugin-id>/, gdzie file to nazwa pliku. Okno O programie wyświetla komponenty thirdParty każdej zainstalowanej wtyczki i kieruje użytkowników do tego folderu; rdzeń edytora nigdy nie przechowuje tekstów licencji zewnętrznych za wtyczkę. (Dołączony HtmlPreviewPlugin, który osadza QtWebEngine + Chromium, jest przykładem referencyjnym.)

4. Zbuduj ją

Użyj helpera CMake z SDK:

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

5. Zainstaluj i uruchom

Spakuj zbudowaną bibliotekę + plugin.json do archiwum <name>.mteplugin i zainstaluj przez Preferencje ▸ Wtyczki ▸ Zainstaluj… (pakiet jest walidowany — manifest, bezpieczeństwo archiwum oraz metadane osadzone w binarium — zanim cokolwiek zostanie zmienione), albo wrzuć pliki ręcznie do jednego z wykrywanych katalogów wtyczek (zobacz Przegląd architektury). Uruchom edytor ponownie; w razie potrzeby włącz wtyczkę w Preferencje ▸ Wtyczki.

Dalsze kroki