/
Landilf
/
2413_Ryumin_CourseWork
Обзор
Документация
Войти
/
Landilf
/
2413_Ryumin_CourseWork
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
CourseWork/GUI/Views/MainWindow.axaml.cs
166 строк
7 KB
Landilf
add project
27 янв 2026, 13:57
27 янв 2026, 13:57
753b3e7
Код
Авторство
О чём код?
using Avalonia.Controls; using Avalonia.Input; using GUI.ViewModels; using GameCore.Enums; using GameCore.Engine; using GameCore.Entities; namespace GUI.Views; /// <summary> /// Главное окно приложения. /// </summary> public partial class MainWindow : Window { #region Конструкторы /// <summary> /// Конструктор главного окна. /// </summary> public MainWindow() { InitializeComponent(); } #endregion #region Методы /// <summary> /// Обработчик нажатия клавиш. /// </summary> /// <param name="parKeyEventArgs">Аргументы события клавиатуры.</param> /// <summary> /// Обработчик ввода текста (для поддержки кириллицы и разных раскладок). /// </summary> /// <param name="parEventArgs">Аргументы события.</param> protected override void OnTextInput(TextInputEventArgs parEventArgs) { base.OnTextInput(parEventArgs); var vm = DataContext as MainViewModel; // Если мы на экране победы и нужно ввести имя if (vm?.CurrentView is VictoryViewModel victoryVm && victoryVm.IsInTop && victoryVm.IsTypingName) { if (!string.IsNullOrEmpty(parEventArgs.Text)) { char c = parEventArgs.Text[0]; // Игнорируем управляющие символы (они обработаются в OnKeyDown) if (!char.IsControl(c)) { if (victoryVm.Username.Length < 15) { victoryVm.Username += parEventArgs.Text; parEventArgs.Handled = true; } } } } } /// <summary> /// Обработчик нажатия клавиш. /// </summary> /// <param name="parKeyEventArgs">Аргументы события клавиатуры.</param> protected override void OnKeyDown(KeyEventArgs parKeyEventArgs) { base.OnKeyDown(parKeyEventArgs); if (parKeyEventArgs.Handled) { return; } // Если фокус находится в поле ввода текста (например, ввод имени на экране победы), // мы игнорируем все горячие клавиши навигации и управления, чтобы избежать случайных нажатий. // Оставляем только Enter и Escape для подтверждения или отмены действий. if (parKeyEventArgs.Source is TextBox && parKeyEventArgs.Key != Key.Enter && parKeyEventArgs.Key != Key.Escape) { return; } var vm = DataContext as MainViewModel; if (vm == null) { return; } if (vm.CurrentView is MainMenuViewModel menuVm) { if (parKeyEventArgs.Key == Key.W || parKeyEventArgs.Key == Key.Up) { menuVm.MoveUp(); parKeyEventArgs.Handled = true; } else if (parKeyEventArgs.Key == Key.S || parKeyEventArgs.Key == Key.Down) { menuVm.MoveDown(); parKeyEventArgs.Handled = true; } else if (parKeyEventArgs.Key == Key.Enter) { menuVm.Select(); parKeyEventArgs.Handled = true; } } else if (vm.CurrentView is HelpViewModel helpVm) { if (parKeyEventArgs.Key == Key.Enter || parKeyEventArgs.Key == Key.Escape) { helpVm.GoBack(); parKeyEventArgs.Handled = true; } } else if (vm.CurrentView is HighScoresViewModel scoresVm) { if (parKeyEventArgs.Key == Key.Enter || parKeyEventArgs.Key == Key.Escape) { scoresVm.GoBack(); parKeyEventArgs.Handled = true; } } else if (vm.CurrentView is GameViewModel gameVm) { if (parKeyEventArgs.Key == Key.W || parKeyEventArgs.Key == Key.Up) { gameVm.HandleInput(Direction.Up); parKeyEventArgs.Handled = true; } else if (parKeyEventArgs.Key == Key.S || parKeyEventArgs.Key == Key.Down) { gameVm.HandleInput(Direction.Down); parKeyEventArgs.Handled = true; } else if (parKeyEventArgs.Key == Key.A || parKeyEventArgs.Key == Key.Left) { gameVm.HandleInput(Direction.Left); parKeyEventArgs.Handled = true; } else if (parKeyEventArgs.Key == Key.D || parKeyEventArgs.Key == Key.Right) { gameVm.HandleInput(Direction.Right); parKeyEventArgs.Handled = true; } else if (parKeyEventArgs.Key == Key.V) { gameVm.CheatVictory(); parKeyEventArgs.Handled = true; } else if (parKeyEventArgs.Key == Key.Escape) { gameVm.PauseGame(); parKeyEventArgs.Handled = true; } } else if (vm.CurrentView is PauseMenuViewModel pauseVm) { if (parKeyEventArgs.Key == Key.W || parKeyEventArgs.Key == Key.Up) { pauseVm.MoveUp(); parKeyEventArgs.Handled = true; } else if (parKeyEventArgs.Key == Key.S || parKeyEventArgs.Key == Key.Down) { pauseVm.MoveDown(); parKeyEventArgs.Handled = true; } else if (parKeyEventArgs.Key == Key.Enter) { pauseVm.Select(); parKeyEventArgs.Handled = true; } else if (parKeyEventArgs.Key == Key.Escape) { vm.ResumeGame(); parKeyEventArgs.Handled = true; } } else if (vm.CurrentView is ConfirmationViewModel confirmVm) { if (parKeyEventArgs.Key == Key.A || parKeyEventArgs.Key == Key.Left) { confirmVm.MoveLeft(); parKeyEventArgs.Handled = true; } else if (parKeyEventArgs.Key == Key.D || parKeyEventArgs.Key == Key.Right) { confirmVm.MoveRight(); parKeyEventArgs.Handled = true; } else if (parKeyEventArgs.Key == Key.Enter) { confirmVm.Select(); parKeyEventArgs.Handled = true; } else if (parKeyEventArgs.Key == Key.Escape) { vm.CancelConfirmation(); parKeyEventArgs.Handled = true; } } else if (vm.CurrentView is GameOverViewModel gameOverVm) { if (parKeyEventArgs.Key == Key.W || parKeyEventArgs.Key == Key.Up) { gameOverVm.MoveUp(); parKeyEventArgs.Handled = true; } else if (parKeyEventArgs.Key == Key.S || parKeyEventArgs.Key == Key.Down) { gameOverVm.MoveDown(); parKeyEventArgs.Handled = true; } else if (parKeyEventArgs.Key == Key.Enter) { gameOverVm.Select(); parKeyEventArgs.Handled = true; } } else if (vm.CurrentView is VictoryViewModel victoryVm) { if (victoryVm.IsTypingName) { // РЕЖИМ ВВОДА ИМЕНИ if (parKeyEventArgs.Key == Key.Enter) { victoryVm.IsTypingName = false; // Завершаем ввод, переходим к кнопкам parKeyEventArgs.Handled = true; } else if (parKeyEventArgs.Key == Key.Back) { if (victoryVm.Username.Length > 0) victoryVm.Username = victoryVm.Username.Substring(0, victoryVm.Username.Length - 1); parKeyEventArgs.Handled = true; } } else { // РЕЖИМ НАВИГАЦИИ ПО МЕНЮ if (parKeyEventArgs.Key == Key.A || parKeyEventArgs.Key == Key.Left) { victoryVm.MoveLeft(); parKeyEventArgs.Handled = true; } else if (parKeyEventArgs.Key == Key.D || parKeyEventArgs.Key == Key.Right) { victoryVm.MoveRight(); parKeyEventArgs.Handled = true; } else if (parKeyEventArgs.Key == Key.Enter) { victoryVm.Select(); parKeyEventArgs.Handled = true; } else if (parKeyEventArgs.Key == Key.Escape && victoryVm.IsInTop) { victoryVm.IsTypingName = true; // Можно вернуться к редактированию parKeyEventArgs.Handled = true; } } } } #endregion }