/
Landilf
/
2413_Ryumin_CourseWork
Обзор
Документация
Войти
/
Landilf
/
2413_Ryumin_CourseWork
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
CourseWork/GUI/ViewModels/MainMenuViewModel.cs
165 строк
4 KB
Landilf
add project
27 янв 2026, 13:57
27 янв 2026, 13:57
753b3e7
Код
Авторство
О чём код?
using ReactiveUI; using System.Collections.ObjectModel; using GameCore.Resources; namespace GUI.ViewModels; /// <summary> /// Модель представления главного меню. /// </summary> public class MainMenuViewModel : ViewModelBase { #region Поля /// <summary> /// Ссылка на главную модель. /// </summary> private readonly MainViewModel _mainViewModel; /// <summary> /// Индекс выбранного пункта. /// </summary> private int _selectedIndex; #endregion #region Свойства /// <summary> /// Коллекция пунктов меню. /// </summary> public ObservableCollection<MenuItemVm> MenuItems { get; } = new(); /// <summary> /// Индекс выбранного пункта. /// </summary> public int SelectedIndex { get => _selectedIndex; set { this.RaiseAndSetIfChanged(ref _selectedIndex, value); UpdateSelection(); } } #endregion #region Конструкторы /// <summary> /// Конструктор. /// </summary> /// <param name="parMainViewModel">Главная модель.</param> public MainMenuViewModel(MainViewModel parMainViewModel) { _mainViewModel = parMainViewModel; RefreshMenu(); } #endregion #region Методы /// <summary> /// Обновляет список пунктов меню в зависимости от состояния игры. /// </summary> public void RefreshMenu() { MenuItems.Clear(); // Если игра инициализирована и находится в состоянии паузы, добавляем возможность продолжить if (_mainViewModel.Game?.Engine?.State == GameCore.Enums.GameState.Paused) { MenuItems.Add(new MenuItemVm { Title = Strings.MainMenuResume }); } MenuItems.Add(new MenuItemVm { Title = Strings.MainMenuNewGame }); MenuItems.Add(new MenuItemVm { Title = Strings.MainMenuHighScores }); MenuItems.Add(new MenuItemVm { Title = Strings.MainMenuHelp }); MenuItems.Add(new MenuItemVm { Title = Strings.MainMenuExit }); SelectedIndex = 0; UpdateSelection(); } /// <summary> /// Обновляет выделение пунктов меню. /// </summary> private void UpdateSelection() { for (int i = 0; i < MenuItems.Count; i++) { MenuItems[i].IsSelected = (i == SelectedIndex); } } /// <summary> /// Перемещение вверх. /// </summary> public void MoveUp() { if (SelectedIndex > 0) { SelectedIndex--; } else { SelectedIndex = MenuItems.Count - 1; } } /// <summary> /// Перемещение вниз. /// </summary> public void MoveDown() { if (SelectedIndex < MenuItems.Count - 1) { SelectedIndex++; } else { SelectedIndex = 0; } } /// <summary> /// Выбор текущего пункта. /// </summary> public void Select() { if (SelectedIndex < 0 || SelectedIndex >= MenuItems.Count) { return; } var selectedTitle = MenuItems[SelectedIndex].Title; if (selectedTitle == Strings.MainMenuResume) { _mainViewModel.ContinueGame(); } else if (selectedTitle == Strings.MainMenuNewGame) { _mainViewModel.GoToGame(); } else if (selectedTitle == Strings.MainMenuHighScores) { _mainViewModel.GoToHighScores(); } else if (selectedTitle == Strings.MainMenuHelp) { _mainViewModel.GoToHelp(); } else if (selectedTitle == Strings.MainMenuExit) { _mainViewModel.ShowConfirmation( Strings.PromptExitGame, () => Environment.Exit(0) ); } } #endregion }