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¶
- Przegląd API wtyczek — cykl życia, tokeny i pełna tabela usług
- Polecenia i menu
- Doki, karty i pasek stanu
- Strony ustawień
- Zdarzenia
- Tłumaczenia