/
Landilf
/
2413_Ryumin_CourseWork
Обзор
Документация
Войти
/
Landilf
/
2413_Ryumin_CourseWork
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
CourseWork/GUI/ViewModels/MainViewModel.cs
198 строк
5 KB
Landilf
add project
27 янв 2026, 13:57
27 янв 2026, 13:57
753b3e7
Код
Авторство
О чём код?
using GameCore; using GameCore.Controllers; using ReactiveUI; namespace GUI.ViewModels; /// <summary> /// Главная модель представления приложения, управляющая навигацией. /// </summary> public class MainViewModel : ViewModelBase { #region Поля /// <summary> /// Текущая активная модель представления (отображаемый экран). /// </summary> private ViewModelBase? _currentView; /// <summary> /// Стек навигации для возврата назад (например, из паузы). /// </summary> private readonly Stack<ViewModelBase> _viewStack = new(); #endregion #region Свойства /// <summary> /// Контроллер игры. /// </summary> public GameController Controller { get; } /// <summary> /// Текущая активная модель представления. /// </summary> public ViewModelBase? CurrentView { get => _currentView; set => this.RaiseAndSetIfChanged(ref _currentView, value); } /// <summary> /// Вьюмодель главного меню. /// </summary> public MainMenuViewModel MainMenu { get; } /// <summary> /// Вьюмодель справки. /// </summary> public HelpViewModel Help { get; } /// <summary> /// Вьюмодель рекордов. /// </summary> public HighScoresViewModel HighScores { get; } /// <summary> /// Вьюмодель игры. /// </summary> public GameViewModel Game { get; } /// <summary> /// Вьюмодель паузы. /// </summary> public PauseMenuViewModel PauseMenu { get; } #endregion #region Конструкторы /// <summary> /// Конструктор. /// </summary> public MainViewModel() { Controller = new GameController(); // Сначала инициализируем игру, так как меню может зависеть от её состояния Game = new GameViewModel(this); MainMenu = new MainMenuViewModel(this); Help = new HelpViewModel(this); HighScores = new HighScoresViewModel(this); PauseMenu = new PauseMenuViewModel(this); CurrentView = MainMenu; } #endregion #region Методы /// <summary> /// Переход в главное меню. /// </summary> public void GoToMenu() { Game.StopGame(); _viewStack.Clear(); MainMenu.RefreshMenu(); CurrentView = MainMenu; } /// <summary> /// Продолжение игры из главного меню. /// </summary> public void ContinueGame() { _viewStack.Clear(); CurrentView = Game; Game.ResumeGame(); } /// <summary> /// Переход к справке. /// </summary> public void GoToHelp() => CurrentView = Help; /// <summary> /// Переход к рекордам. /// </summary> public void GoToHighScores() { HighScores.LoadScores(); CurrentView = HighScores; } /// <summary> /// Переход к игре. /// </summary> public void GoToGame() { _viewStack.Clear(); Game.StartGame("Player"); CurrentView = Game; } /// <summary> /// Переход к экрану поражения. /// </summary> public void GoToGameOver() => CurrentView = new GameOverViewModel(this); /// <summary> /// Переход к экрану победы. /// </summary> /// <param name="parTime">Время игры.</param> public void GoToVictory(TimeSpan parTime) => CurrentView = new VictoryViewModel(this, parTime); /// <summary> /// Переход в меню паузы. /// </summary> public void GoToPauseMenu() { if (CurrentView != null) { _viewStack.Push(CurrentView); PauseMenu.Reset(); } CurrentView = PauseMenu; } /// <summary> /// Возобновление игры из паузы. /// </summary> public void ResumeGame() { if (_viewStack.Count > 0 && _viewStack.Peek() == Game) { CurrentView = _viewStack.Pop(); Game.ResumeGame(); } } /// <summary> /// Показывает окно подтверждения. /// </summary> /// <param name="parMessage">Сообщение.</param> /// <param name="parOnConfirm">Действие подтверждения.</param> public void ShowConfirmation(string parMessage, Action parOnConfirm) { if (CurrentView != null) _viewStack.Push(CurrentView); CurrentView = new ConfirmationViewModel(this, parMessage, parOnConfirm); } /// <summary> /// Отмена подтверждения (возврат назад). /// </summary> public void CancelConfirmation() { if (_viewStack.Count > 0) { CurrentView = _viewStack.Pop(); } } #endregion }