Ustawienia i strony ustawień¶
Konfigurację obsługują trzy powiązane usługi: ISettings (trwały magazyn
klucz/wartość), IDocumentSettings (odczyty warstwowane przez .editorconfig)
oraz ISettingsRegistry (strona UI w oknie Preferencji).
ISettings — zapisywana konfiguracja klucz/wartość¶
ctx.settings() zwraca magazyn ograniczony do Twojej wtyczki: host
zakotwicza go pod plugins/<plugin.id>/, więc krótkie lokalne nazwy kluczy
nigdy nie kolidują z edytorem ani innymi wtyczkami. Klucze używają / jako
separatora ścieżki ("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
};
Domyślna implementacja oparta jest na QSettings (INI), ale to szczegół
implementacyjny — interfejs jest wolny od Qt, a wtyczka w Pythonie korzysta z
tego samego magazynu przez ctx.settings.
Ustawienia globalne aplikacji (tylko do odczytu)¶
ctx.appSettings() to widok const własnej konfiguracji edytora. Używaj
stałych kluczy z PluginApi/AppSettingsKeys.h, zamiast hardkodować stringi.
Aby reagować na zmiany, zasubskrybuj events::SettingsChanged (puste scope
znaczy „zmieniło się cokolwiek").
Ustawienia w zakresie dokumentu (.editorconfig)¶
ctx.documentSettings() czyta wartości per dokument, w których projektowy
.editorconfig nakłada się warstwą na Twoje zapisane ustawienia: dla klucza k
rozwiązuje mte.<plugin.id>.<k> z sekcji .editorconfig obejmujących ścieżkę
dokumentu, potem cofa się do ctx.settings(), a na końcu do Twojej wartości
domyślnej. Zapisy zawsze idą przez ctx.settings() — nigdy z powrotem do
.editorconfig.
Strona w oknie Preferencji¶
Interfejs strony jest świadomy Qt, więc żyje w opcjonalnym nagłówku
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)
};
Zarejestruj ją w initialize() i zatrzymaj token:
category()grupuje strony w drzewie okna; pośrednie segmenty tworzą lub wykorzystują istniejące grupy. Strony wtyczek zwyczajowo żyją pod"Plugins/<Name>".apply()to miejsce utrwalania;reset()to miejsce ponownego wczytania po anulowaniu. Nie zapisuj ustawień z sygnałów widżetów — kontrakt okna to odroczone zastosowanie zmian.- Zwyczajowo
scope()zwraca"plugins/<plugin.id>", aby inny kod mógł selektywnie reagować na zmiany z Twojej strony przezevents::SettingsChanged. - Zwrócony
SettingsPageTokencofa rejestrację strony (i zwalnia ją) przy destrukcji — wykonaj na nimreset()wshutdown(), jak na każdym innym tokenie.
Zlokalizuj każdy string na stronie i dostarcz wszystkie cztery katalogi — zobacz Tłumaczenia.
Wtyczki w Pythonie
Wtyczka w Pythonie deklaruje odpowiednik takiej strony deklaratywnie —
formularz JSON zbudowany przy pomocy mte.ui
przekazany do ctx.settings_page.register(...); wartości powiązane przez
binds="settings:<key>" trafiają do tego samego magazynu per wtyczka. Zobacz
dokumentację ctx w Pythonie.