Ajustes y páginas de ajustes¶
Tres servicios relacionados cubren la configuración: ISettings
(almacenamiento persistente clave/valor), IDocumentSettings (lecturas en capas
con .editorconfig) e ISettingsRegistry (una página de interfaz en el diálogo
de Preferencias).
ISettings — configuración persistente clave/valor¶
ctx.settings() devuelve un almacén acotado a tu plugin: el anfitrión lo
enraíza bajo plugins/<plugin.id>/, de modo que los nombres de clave locales y
cortos nunca chocan con el editor ni con otros plugins. Las claves usan / como
separador de ruta ("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
};
La implementación predeterminada se apoya en QSettings (INI), pero eso es un
detalle de implementación: la interfaz está libre de Qt y un plugin de Python usa
el mismo almacén a través de ctx.settings.
Ajustes de toda la aplicación (solo lectura)¶
ctx.appSettings() es una vista constante de la configuración propia del
editor. Usa las constantes de clave de PluginApi/AppSettingsKeys.h en lugar de
codificar cadenas a mano. Para reaccionar a los cambios, suscríbete a
events::SettingsChanged (un scope vacío significa «ha cambiado algo»).
Ajustes con ámbito de documento (.editorconfig)¶
ctx.documentSettings() lee valores por documento que superponen el
.editorconfig de un proyecto a tus ajustes guardados: para una clave k
resuelve mte.<plugin.id>.<k> a partir de las secciones del .editorconfig que
se aplican a la ruta del documento, recurre después a ctx.settings() y luego a
tu valor predeterminado. Las escrituras van siempre a través de
ctx.settings(), nunca de vuelta al .editorconfig.
Una página en el diálogo de Preferencias¶
La interfaz de la página conoce Qt, así que vive en la cabecera opcional
PluginApi/Qt/ISettingsPage.h. El registro en sí (ISettingsRegistry,
SettingsPageToken) está libre de Qt y vive en
PluginApi/ISettingsRegistry.h; la cabecera de Qt lo incluye, así que un plugin
que implemente una página sigue necesitando una única inclusión:
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)
};
Regístrala en initialize() y conserva el testigo:
category()agrupa las páginas en el árbol del diálogo; los segmentos intermedios crean o reutilizan grupos. Las páginas de plugin viven por convención bajo"Plugins/<Name>".apply()es donde persistes;reset()es donde recargas tras una cancelación. No escribas los ajustes desde señales de los widgets: el contrato del diálogo es de aplicación diferida.- Por convención,
scope()devuelve"plugins/<plugin.id>"para que otro código pueda reaccionar de forma selectiva a los cambios de tu página medianteevents::SettingsChanged. - El
SettingsPageTokendevuelto revoca la página (y la libera) al destruirse; hazlereset()enshutdown(), como con cualquier otro testigo.
Traduce todas las cadenas de la página y entrega los quince catálogos; consulta Traducciones.
Plugins de Python
Un plugin de Python declara la página equivalente de forma declarativa:
un formulario JSON construido con mte.ui que
se pasa a ctx.settings_page.register(...); los valores enlazados con
binds="settings:<key>" se guardan en el mismo almacén por plugin.
Consulta la referencia de ctx en Python.