Impostazioni e pagine delle impostazioni¶
Tre servizi correlati coprono la configurazione: ISettings (archivio
chiave/valore persistente), IDocumentSettings (letture stratificate con
.editorconfig) e ISettingsRegistry (una pagina dell'interfaccia nella
finestra delle Preferenze).
ISettings — configurazione chiave/valore persistente¶
ctx.settings() restituisce un archivio circoscritto al tuo plugin: l'host lo
radica sotto plugins/<plugin.id>/, così i nomi di chiave locali brevi non
collidono mai con l'editor o con altri plugin. Le chiavi usano / come separatore
di percorso ("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
};
L'implementazione predefinita si appoggia a QSettings (INI), ma è un dettaglio
implementativo: l'interfaccia è priva di Qt e un plugin Python usa lo stesso
archivio tramite ctx.settings.
Impostazioni globali dell'applicazione (sola lettura)¶
ctx.appSettings() è una vista const della configurazione dell'editor stesso.
Usa le costanti di chiave da PluginApi/AppSettingsKeys.h invece di scrivere le
stringhe nel codice. Per reagire ai cambiamenti, sottoscrivi
events::SettingsChanged (uno scope vuoto significa «è cambiato qualcosa»).
Impostazioni con ambito di documento (.editorconfig)¶
ctx.documentSettings() legge valori per documento che stratificano
l'.editorconfig di un progetto sopra le tue impostazioni memorizzate: per una
chiave k risolve mte.<plugin.id>.<k> dalle sezioni di .editorconfig che si
applicano al percorso del documento, ripiega su ctx.settings() e poi sul tuo
valore predefinito. Le scritture passano sempre da ctx.settings() — mai di
ritorno in .editorconfig.
Una pagina nella finestra delle Preferenze¶
L'interfaccia della pagina conosce Qt, quindi vive nell'intestazione opzionale
PluginApi/Qt/ISettingsPage.h. Il registro in sé (ISettingsRegistry,
SettingsPageToken) è privo di Qt e vive in PluginApi/ISettingsRegistry.h —
l'intestazione Qt lo include, quindi a un plugin che implementa una pagina serve
comunque una sola inclusione:
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)
};
Registrala in initialize() e conserva il token:
category()raggruppa le pagine nell'albero della finestra; i segmenti intermedi creano o riusano dei gruppi. Per convenzione le pagine dei plugin vivono sotto"Plugins/<Name>".apply()è il punto in cui rendi persistente;reset()è quello in cui ricarichi dopo un annullamento. Non scrivere le impostazioni dai segnali dei widget: il contratto della finestra prevede un'applicazione differita.- Per convenzione
scope()restituisce"plugins/<plugin.id>", così che altro codice possa reagire in modo selettivo ai cambiamenti della tua pagina tramiteevents::SettingsChanged. - Il
SettingsPageTokenrestituito revoca la pagina (e la libera) quando viene distrutto: esegui il suoreset()inshutdown()come per ogni altro token.
Localizza ogni stringa della pagina e distribuisci tutti e quindici i cataloghi — vedi Traduzioni.
Plugin Python
Un plugin Python dichiara la pagina equivalente in modo dichiarativo: un
modulo JSON costruito con mte.ui e passato a
ctx.settings_page.register(...); i valori legati con
binds="settings:<key>" vengono resi persistenti nello stesso archivio per
plugin. Vedi la
documentazione di ctx per Python.