Gå til innhold

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 i namespace MTE::plugin og 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 IEditorView og den offentlige IEditorService.
  • 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 en IPluginContext som 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:

  1. <exe-dir>/Plugins/ — de medfølgende egetutviklede programtilleggene.
  2. <AppLocalData>/Plugins/ — installasjonsmappen per bruker.
  3. 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.