Gå till innehållet

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 PluginApi bor i namespace MTE::plugin och 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 IEditorView och det publika IEditorService.
  • 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ökare IPluginContext. 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:

  1. <exe-dir>/Plugins/ — de medföljande egenutvecklade insticksmodulerna.
  2. <AppLocalData>/Plugins/ — installationskatalogen per användare.
  3. 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.