/
Alexwww228
/
BridgeBattleSimulator
Обзор
Документация
Войти
/
Alexwww228
/
BridgeBattleSimulator
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
BattleSimulator.UI/ViewModels/SaveSlotViewModel.cs
88 строк
4 KB
Alexwww228
fix: Save system and Abstract Factory
24 май 2026, 01:45
24 май 2026, 01:45
7391992
Код
Авторство
О чём код?
using System.Collections.Generic; using System.Linq; using ReactiveUI; using BattleSimulator.UI.Services; namespace BattleSimulator.UI.ViewModels; /// <summary> /// ViewModel экрана выбора слота сохранения/загрузки. /// /// Используется в двух режимах: /// — Загрузка (IsSaveMode = false): показывается при «Продолжить игру» в меню, /// разрешает выбирать только непустые слоты. /// — Сохранение (IsSaveMode = true): показывается при «Сохранить» во время боя, /// разрешает выбирать любой слот (в т.ч. пустой) и перезаписывать занятый. /// </summary> public sealed class SaveSlotViewModel : ReactiveObject { private readonly GameSaveService _saveService; /// <summary> /// true — режим сохранения (выбор слота для записи), /// false — режим загрузки (выбор слота для чтения). /// </summary> public bool IsSaveMode { get; } /// <summary>Заголовок экрана — зависит от режима.</summary> public string Title => IsSaveMode ? "💾 Сохранить игру" : "📂 Выбор сохранения"; /// <summary>Подзаголовок — зависит от режима.</summary> public string Subtitle => IsSaveMode ? "Выберите слот для сохранения" : "Выберите слот для загрузки игры"; /// <summary> /// Делегат, вызываемый при выборе слота. /// Параметр — номер выбранного слота (1..SlotCount). /// </summary> public Action<int>? OnSlotSelected { get; set; } /// <summary>Делегат, вызываемый при нажатии «Назад».</summary> public Action? OnBack { get; set; } /// <summary>Список всех слотов с их состоянием (пустой / занятый).</summary> public IReadOnlyList<SaveSlotInfo> Slots { get; private set; } /// <param name="saveService">Сервис сохранений.</param> /// <param name="isSaveMode">true — режим записи, false — режим чтения.</param> public SaveSlotViewModel(GameSaveService saveService, bool isSaveMode = false) { _saveService = saveService; IsSaveMode = isSaveMode; Slots = _saveService.GetAllSlots(); SelectSlotCommand = ReactiveCommand.Create<int>(SelectSlot); BackCommand = ReactiveCommand.Create(Back); } /// <summary>Команда выбора слота (параметр — номер слота).</summary> public ReactiveCommand<int, RxUnit> SelectSlotCommand { get; } /// <summary>Команда возврата.</summary> public ReactiveCommand<RxUnit, RxUnit> BackCommand { get; } /// <summary>Обновить список слотов (после сохранения или удаления).</summary> public void Refresh() { Slots = _saveService.GetAllSlots(); this.RaisePropertyChanged(nameof(Slots)); } private void SelectSlot(int slot) { if (IsSaveMode) { // В режиме сохранения можно выбрать любой слот (пустой или занятый) OnSlotSelected?.Invoke(slot); } else { // В режиме загрузки — только непустой слот if (_saveService.HasSave(slot)) OnSlotSelected?.Invoke(slot); } } private void Back() => OnBack?.Invoke(); }