Aller au contenu

Réglages et pages de réglages

Trois services apparentés couvrent la configuration : ISettings (stockage clé/valeur persistant), IDocumentSettings (lectures superposées par .editorconfig) et ISettingsRegistry (une page d'interface dans la boîte de dialogue Préférences).

ISettings — configuration clé/valeur persistante

ctx.settings() renvoie un magasin restreint à votre plugin : l'hôte l'enracine sous plugins/<plugin.id>/, de sorte que des noms de clés locaux courts n'entrent jamais en collision avec l'éditeur ou les autres plugins. Les clés utilisent / comme séparateur de chemin ("ui/fontSize").

class ISettings {
public:
    bool contains(std::string_view key) const;
    void remove(std::string_view key);

    // Typed accessors -- defaultValue is returned when the key is missing
    // or the stored value cannot convert to the requested type.
    bool         getBool  (std::string_view key, bool defaultValue = false) const;
    std::int64_t getInt   (std::string_view key, std::int64_t defaultValue = 0) const;
    double       getDouble(std::string_view key, double defaultValue = 0.0) const;
    std::string  getString(std::string_view key, std::string_view defaultValue = {}) const;
    std::vector<std::uint8_t> getBytes(std::string_view key) const;

    void setBool / setInt / setDouble / setString / setBytes(...);

    void sync();   // flush now; the host also syncs on shutdown
};
ctx.settings().setBool("wrap", true);
bool wrap = ctx.settings().getBool("wrap", false);

L'implémentation par défaut s'appuie sur QSettings (INI), mais c'est un détail d'implémentation — l'interface est exempte de Qt et un plugin Python utilise le même magasin via ctx.settings.

Réglages globaux de l'application (lecture seule)

ctx.appSettings() est une vue const de la configuration propre à l'éditeur. Utilisez les constantes de clés de PluginApi/AppSettingsKeys.h plutôt que des chaînes codées en dur. Pour réagir aux changements, abonnez-vous à events::SettingsChanged (un scope vide signifie « quelque chose a changé »).

Réglages au niveau du document (.editorconfig)

ctx.documentSettings() lit des valeurs par document qui superposent le .editorconfig d'un projet à vos réglages stockés : pour une clé k, il résout mte.<plugin.id>.<k> à partir des sections du .editorconfig s'appliquant au chemin du document, se rabat sur ctx.settings(), puis sur votre valeur par défaut. Les écritures passent toujours par ctx.settings() — jamais en retour dans .editorconfig.

Une page dans la boîte de dialogue Préférences

L'interface de page est consciente de Qt, elle vit donc dans l'en-tête optionnel PluginApi/Qt/ISettingsPage.h :

class ISettingsPage {
public:
    std::string category() const;              // tree path, e.g. "Plugins/Hello World"
    std::string title() const;                 // page heading
    QWidget*    createWidget(QWidget* parent); // built lazily, at most once per dialog
    void        apply();                       // OK/Apply -> write widget state to ISettings
    void        reset();                       // Cancel/re-show -> reload from ISettings (optional)
    std::string scope() const;                 // published via events::SettingsChanged (optional)
};

Enregistrez-la dans initialize() et conservez le jeton :

m_page = ctx.settingsRegistry().registerPage(
    std::make_unique<MySettingsPage>(ctx.settings()));
  • category() regroupe les pages dans l'arborescence de la boîte de dialogue ; les segments intermédiaires créent ou réutilisent des groupes. Par convention, les pages de plugins vivent sous "Plugins/<Name>".
  • apply() est l'endroit où vous persistez ; reset() celui où vous rechargez après une annulation. N'écrivez pas les réglages depuis les signaux des widgets — le contrat de la boîte de dialogue est l'application différée.
  • Par convention, scope() renvoie "plugins/<plugin.id>" afin que d'autres parties du code puissent réagir sélectivement aux changements de votre page via events::SettingsChanged.
  • Le SettingsPageToken renvoyé révoque la page (et la libère) à sa destruction — faites-en le reset() dans shutdown() comme pour tout autre jeton.

Localisez chaque chaîne de la page et livrez les quatre catalogues — voir Traductions.

Plugins Python

Un plugin Python déclare la page équivalente de façon déclarative — un formulaire JSON construit avec mte.ui passé à ctx.settings_page.register(...) ; les valeurs liées avec binds="settings:<key>" sont persistées dans le même magasin par plugin. Voir la référence Python ctx.