Arkitekturoversikt¶
Programtilleggssystemet er bygget av tre komponenter, alle under Components/:
| Komponent | Synlighet | Ansvar |
|---|---|---|
PluginApi |
Offentlig | Rene abstrakte grensesnitt og verditypter. Ingen Qt, ingen Scintilla, ingen MTE-interne hodefiler — bare standardbiblioteket. |
PluginHost |
Intern | Laster inn, eier og fordeler til programtilleggene. Qt er en implementasjonsdetalj her (den bruker QPluginLoader bak kulissene). |
Plugins |
Egetutviklede | Eksempler og innebygde programtillegg; hvert sitt CMake-mål som bare avhenger av PluginApi (og av Qt, når den innebygde backenden brukes). |
Designprinsipper¶
- Backend-uavhengig kontrakt. Alle
PluginApi-typer ligger inamespace MTE::pluginog må ikke inkludere noen Qt-, Scintilla- eller MTE-intern hodefil. Det er dét som lar en framtidig Python-backend oppfylle den samme kontrakten uten motstand fra Qt. - Ingen tredjepartstyper på tvers av det offentlige API-et. Programtillegg ser aldri
Scintilla- eller Qt-typer; verten oversetter mellom den interne
IEditorViewog den offentligeIEditorService. - RAII overalt. Å registrere en kommando, en menypost, et dokkpanel eller et
hendelsesabonnement gir et symbol eller et abonnementshåndtak tilbake. Ødelegger man
det, avmeldes bidraget. Programtillegg holder symbolene sine som medlemmer, så alt rives
ned av seg selv i
shutdown().
Livssyklus¶
Hvert programtillegg implementerer ett enkelt grensesnitt, IPlugin:
class IPlugin {
public:
virtual ~IPlugin() = default;
virtual PluginInfo info() const = 0;
virtual bool initialize(IPluginContext& ctx) = 0;
virtual void shutdown() noexcept = 0;
};
info()gir POD-metadata tilbake (id,name,version,vendor,description,apiVersion).initialize(ctx)mottar enIPluginContextsom virker som tjenestekatalog. Programtillegget henter de tjenestene det trenger, og registrerer kommandoene, menyene, panelene og hendelsesabonnementene sine.shutdown()kjører på vei ut; fordi bidragene er RAII-symboler, er den vanlige nedrivingen som regel bare å la medlemmene bli ødelagt.
Ingen innlasting på nytt under kjøring
Å slå et programtillegg av eller på, å installere det og å avinstallere det får alt sammen først virkning ved neste oppstart. Verten laster aldri inn eller ut programtilleggskode mens den kjører — det holder modellen enkel og går utenom Windows' problem med at man «ikke kan slette en innlastet DLL».
Oppdagelse¶
Verten går gjennom, i denne rekkefølgen:
<exe-dir>/Plugins/— de medfølgende egetutviklede programtilleggene.<AppLocalData>/Plugins/— installasjonsmappen per bruker.- Stier fra miljøvariabelen
MTE_PLUGIN_PATH.
Hver mappe gås gjennom for løse biblioteker og for ett nivå av umiddelbare undermapper
(det <id>/-oppsettet per programtillegg som et installasjonsprogram gir). Oppdagelsen
går ikke dypere ned.