Работа с пользовательскими настройками¶
В проекте реализованы три уровня работы с пользовательскими настройками:
- UserConfigFile — низкоуровневый статический сервис для работы с единым общим файлом настроек (
mpConfig.mpcf). ⚠️ Важно: в своих проектах использовать напрямую не нужно — всегда используйтеUserConfigFileUtils. - UserConfigFileUtils — удобная обёртка над
UserConfigFileдля плагинов. Позволяет хранить простые значения, привязанные к имени плагина. - UserSettingsService — сервис для работы с отдельными XML-файлами, когда нужно хранить сложные объекты или коллекции.
1. UserConfigFile¶
- Управляет единым файлом
%appdata%/ModPlus Data/mpConfig.mpcf. - Позволяет читать и записывать строковые значения в XML-структуру.
- Использовать напрямую не требуется — только через
UserConfigFileUtils.
2. UserConfigFileUtils¶
Назначение¶
- Работает с файлом
%appdata%/ModPlus Data/mpConfig.mpcf. - Автоматически создаёт узел для вашего плагина (по имени плагина).
- Упрощает работу с простыми типами:
string,int,double,bool,enum. - Позволяет работать через свойства, без ручного указания строк.
Пример использования¶
public class MyPluginSettings
{
private readonly UserConfigFileUtils _settings;
public MyPluginSettings()
{
_settings = new UserConfigFileUtils(ModPlusConnector.Instance.Name);
}
public string UserName
{
get => _settings.GetValue("DefaultUser");
set => _settings.SetValue(value);
}
public int WindowWidth
{
get => _settings.GetValue(800);
set => _settings.SetValue(value);
}
public bool EnableFeatureX
{
get => _settings.GetValue(false);
set => _settings.SetValue(value);
}
public DisplayMode Mode
{
get => _settings.GetValue(DisplayMode.Normal);
set => _settings.SetValue(value);
}
}
👉 В большинстве случаев этого сервиса достаточно для плагинов.
3. UserSettingsService¶
Назначение¶
- Работает с отдельными XML-файлами.
- По умолчанию сохраняет в
%appdata%/ModPlus UserData(или в подпапке, если указанsubFolder). - Поддерживает сериализацию объектов и коллекций.
- При необходимости можно явно указать путь с помощью
SetToFileиGetFromFile.
Пример: сохранение и загрузка объекта¶
public class MyCustomData
{
public string Name { get; set; }
public int Value { get; set; }
}
var service = new UserSettingsService(ModPlusConnector.Instance.Name);
// Сохранение объекта
service.Set(new MyCustomData { Name = "Test", Value = 42 });
// Загрузка объекта
var data = service.Get<MyCustomData>();
Console.WriteLine($"{data.Name} = {data.Value}");
Пример: работа с коллекцией¶
var list = new List<object>
{
new MyCustomData { Name = "Item1", Value = 10 },
new MyCustomData { Name = "Item2", Value = 20 }
};
service.Set(list, new List<string> { "FirstItem", "SecondItem" });
// Загрузка по конкретному имени узла
var second = service.GetFromFile<MyCustomData>(
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
"ModPlus UserData",
ModPlusConnector.Instance.Name + ".xml"),
"SecondItem");
Пример: обновление через Set<T>¶
service.Set<MyCustomData>(data =>
{
// Загруженные данные или новый объект, если файла ещё нет
// Здесь мы обновляем только нужные поля
data.Value += 1;
data.Name = DateTime.Now.ToShortDateString();
});
👉 Метод Set<T> позволяет:
- Загрузить данные (или создать новый объект, если данных нет).
- Изменить их в переданном
Action<T>. - Сразу сохранить обратно в файл.
Это короткий способ обновления настроек, без необходимости вручную вызывать Get → изменить → Set.
Нюансы UserSettingsService¶
-
Сохраняемые классы должны иметь:
-
публичный конструктор без параметров;
- свойства с
get; set;. - Для value-type (int, double, bool) и для коллекций обязательно указывать
nodeName. - В XML удаляются
xmlns-атрибуты для читаемости.
Сравнительная таблица¶
| Сервис | Где хранит данные | Что хранит лучше всего | Когда использовать | Пример узла |
|---|---|---|---|---|
| UserConfigFile | %appdata%/ModPlus Data/mpConfig.mpcf |
Простые строки | ⚠️ Не использовать напрямую. Только через UserConfigFileUtils. |
<MyPlugin ... /> |
| UserConfigFileUtils | %appdata%/ModPlus Data/mpConfig.mpcf |
Строки, числа, bool, enum | Для плагинов: хранение простых параметров через свойства классов | <MyPlugin WindowWidth="800" EnableFeatureX="true" /> |
| UserSettingsService | %appdata%/ModPlus UserData/[Plugin].xml |
Объекты и коллекции (сериализация) | Когда нужно хранить сложные структуры или коллекции, отдельно от общего файла | <MyPlugin><MyCustomData Name="Test" Value="42" /></MyPlugin> |