Arkitekturöversikt¶
Insticksmodulsundersystemet är byggt av tre komponenter, alla under Components/:
| Komponent | Synlighet | Ansvar |
|---|---|---|
PluginApi |
Publik | Rena abstrakta gränssnitt + värdetyper. Ingen Qt, ingen Scintilla, inga MTE-interna headers — bara standardbiblioteket. |
PluginHost |
Intern | Läser in, äger och fördelar insticksmodulerna. Qt är ett implementationsdetalj här (bakom kulisserna används QPluginLoader). |
Plugins |
Egenutvecklade | Exempel- och inbyggda insticksmoduler; var och en ett eget CMake-mål som bara beror på PluginApi (och Qt, när den inhemska backenden används). |
Designprinciper¶
- Backend-oberoende kontrakt. Alla typer i
PluginApibor inamespace MTE::pluginoch får inte inkludera någon header från Qt, Scintilla eller MTE:s inre. Det är det som låter en framtida Python-backend uppfylla samma kontrakt utan Qt:s motstånd. - Inga tredjepartstyper genom det publika API:t. Insticksmoduler ser aldrig
typer från Scintilla eller Qt; värden anpassar mellan det interna
IEditorViewoch det publikaIEditorService. - RAII överallt. Att registrera ett kommando, en menypost, en dockpanel eller
en händelseprenumeration ger tillbaka en symbol eller ett prenumerationshandtag.
Att förstöra det avregistrerar bidraget. Insticksmoduler håller sina symboler som
medlemmar så att allt rivs ned automatiskt i
shutdown().
Livscykel¶
Varje insticksmodul implementerar ett enda gränssnitt, IPlugin:
class IPlugin {
public:
virtual ~IPlugin() = default;
virtual PluginInfo info() const = 0;
virtual bool initialize(IPluginContext& ctx) = 0;
virtual void shutdown() noexcept = 0;
};
info()returnerar POD-metadata (id,name,version,vendor,description,apiVersion).initialize(ctx)tar emot en tjänstesökareIPluginContext. Insticksmodulen tar de tjänster den behöver och registrerar sina kommandon, menyer, paneler och händelseprenumerationer.shutdown()körs på vägen ut; eftersom bidragen är RAII-symboler brukar nedrivningen bara vara att låta medlemmarna förstöras.
Ingen omladdning under körning
Att aktivera, inaktivera, installera och avinstallera en insticksmodul får alla effekt vid nästa start. Värden läser aldrig in eller ut kod från insticksmoduler under körning — det håller modellen enkel och kringgår Windows-problemet «går inte att ta bort en inläst DLL».
Upptäckt¶
Värden genomsöker, i tur och ordning:
<exe-dir>/Plugins/— de medföljande egenutvecklade insticksmodulerna.<AppLocalData>/Plugins/— installationskatalogen per användare.- Sökvägar från miljövariabeln
MTE_PLUGIN_PATH.
Varje katalog genomsöks efter lösa bibliotek och efter en nivå av direkta
underkataloger (den layout <id>/ per insticksmodul som en installerare
producerar). Upptäckten går inte djupare.