# Settings & Preferences Framework `oxide_engine::settings` is the engine's unified, serialized configuration store. The engine, the editor, and every module register typed **sections**; the framework persists them all to RON and restores them — without any central code knowing the sections' shapes. It is the backbone of the editor's Preferences window and of per-module settings. ## Sections A section is any plain `serde`-serializable struct with a `Default`. Register it once under a name and the store owns a typed instance: ```rust use oxide_engine::settings::Settings; use serde::{Serialize, Deserialize}; #[derive(Serialize, Deserialize, Default)] struct EditorPrefs { theme: String, grid: bool } let mut settings = Settings::new(); settings.register::("editor"); // Typed read/write. settings.get_mut::("editor").unwrap().theme = "dark".into(); assert_eq!(settings.get::("editor").unwrap().theme, "dark"); ``` `set` replaces a section's value (only if the registered type matches), and `reset` returns it to `Default`. Accessing a section as the wrong type returns `None` rather than panicking. ## Persisting Every section serializes to a `name → RON` map via `export`, and `import` loads matching sections back. This map is exactly the shape a [`Project`](projects.md) stores, so per-project settings round-trip through the project file: ```rust # use oxide_engine::settings::Settings; # use serde::{Serialize, Deserialize}; # #[derive(Serialize, Deserialize, Default)] struct EditorPrefs { theme: String } # let mut settings = Settings::new(); # settings.register::("editor"); let saved = settings.export(); // BTreeMap let mut restored = Settings::new(); restored.register::("editor"); restored.import(&saved); // matching sections restored ``` `import` is deliberately lenient: an **unknown** section (e.g. one owned by a disabled module) is ignored, and a **malformed** section is skipped, leaving its current value. This means a project saved with a module enabled still opens cleanly with that module disabled, and vice-versa. ## How the layers fit together | Scope | Lives where | Persisted to | |-------|-------------|--------------| | Engine preferences (render/quality defaults) | a `Settings` section | global prefs file / project | | Editor preferences (theme, layout, shortcuts) | a `Settings` section | global editor prefs file | | Per-module settings | each module registers a section | the [project](projects.md) it's enabled in | `Project` stores the per-project subset (`set_settings_section` / `settings_section` hold the same RON blobs `export`/`import` produce). The editor keeps its global preferences in a separate file using the same `Settings` API. [`Settings`]: ../engine/src/settings.rs