diff --git a/Content/Debug/Components/AC_DebugHUD.uasset b/Content/Debug/Components/AC_DebugHUD.uasset index d6ef799..fe1111d 100644 --- a/Content/Debug/Components/AC_DebugHUD.uasset +++ b/Content/Debug/Components/AC_DebugHUD.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d7a18ff591ef9cd37f05e1312b531b9cdff305332917961f489eeee2105e4152 -size 764802 +oid sha256:dce2ec9756ba76b5e259ca534ebbae4184d56a3394732807a5356b585255b61d +size 760290 diff --git a/Content/Input/Components/AC_InputDevice.uasset b/Content/Input/Components/AC_InputDevice.uasset index 75fa7db..0481bc6 100644 --- a/Content/Input/Components/AC_InputDevice.uasset +++ b/Content/Input/Components/AC_InputDevice.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:aac84b4bfad413610ddfcc4385d2963838de8ba4a1455b475aac03f51bec2163 -size 225040 +oid sha256:65b4856d80777a96c7f11c7be8757f4b9803c9531336b8b17705fcb3477d0308 +size 224848 diff --git a/Content/Toasts/Components/AC_ToastSystem.ts b/Content/Toasts/Components/AC_ToastSystem.ts index d1834b9..263eb02 100644 --- a/Content/Toasts/Components/AC_ToastSystem.ts +++ b/Content/Toasts/Components/AC_ToastSystem.ts @@ -1,7 +1,6 @@ // Toasts/Components/AC_ToastSystem.ts import type { S_ToastMessage } from '#root/Toasts/Structs/S_ToastMessage.ts'; -import type { S_ToastSettings } from '#root/Toasts/Structs/S_ToastSettings.ts'; import type { WBP_Toast } from '#root/Toasts/UI/WBP_Toast.ts'; import { WBP_ToastContainer } from '#root/Toasts/UI/WBP_ToastContainer.ts'; import { ActorComponent } from '#root/UE/ActorComponent.ts'; @@ -33,10 +32,8 @@ export class AC_ToastSystem extends ActorComponent { /** * Validate system state and settings */ - const function1 = (isEnabled: boolean): boolean => - this.IsInitialized && isEnabled; - return function1(this.ToastSettings.IsEnabled); + return this.IsInitialized && this.IsEnabled; } /** @@ -101,12 +98,7 @@ export class AC_ToastSystem extends ActorComponent { maxVisibleToasts: Integer ): boolean => activeToastsLength >= maxVisibleToasts; - while ( - ExceedsToastLimit( - this.ActiveToasts.length, - this.ToastSettings.MaxVisibleToasts - ) - ) { + while (ExceedsToastLimit(this.ActiveToasts.length, this.MaxVisibleToasts)) { const widget = this.ToastWidgets.Get(0); if (SystemLibrary.IsValid(widget)) { @@ -136,19 +128,16 @@ export class AC_ToastSystem extends ActorComponent { public ShowToast( Message: Text = '', Type: E_MessageType = E_MessageType.Info, - Duration: Float = 0 + Duration: Float = 5 ): Integer { if (this.ShouldProcessToasts()) { - const toastDuration = - Duration !== 0 ? Duration : this.ToastSettings.DefaultDuration; - const currentTime = SystemLibrary.GetGameTimeInSeconds(); const newToast: S_ToastMessage = { ID: this.NextToastID++, Message, Type, - Duration: toastDuration, + Duration, CreatedTime: currentTime, }; @@ -184,12 +173,21 @@ export class AC_ToastSystem extends ActorComponent { } /** - * Get toast widgets for testing purposes - * @returns Array of active toast widgets + * Get system state and configuration for testing purposes + * Provides read-only access to private configuration and active widgets + * @returns Object containing toast widgets array and system configuration * @category Testing */ - public GetTestData(): UEArray { - return this.ToastWidgets; + public GetTestData(): { + ToastWidgets: UEArray; + MaxVisibleToasts: Integer; + IsEnabled: boolean; + } { + return { + ToastWidgets: this.ToastWidgets, + MaxVisibleToasts: this.MaxVisibleToasts, + IsEnabled: this.IsEnabled, + }; } /** @@ -213,7 +211,7 @@ export class AC_ToastSystem extends ActorComponent { * @category System Utilities */ public LogToConsole(Type: E_MessageType, Message: Text): void { - if (this.ToastSettings.AlsoLogToConsole) { + if (this.AlsoLogToConsole) { SystemLibrary.PrintString(`[${Type}] ${Message}`, false); } } @@ -223,17 +221,34 @@ export class AC_ToastSystem extends ActorComponent { // ════════════════════════════════════════════════════════════════════════════════════════ /** - * Toast system configuration settings - * Controls capacity, duration, and logging behavior + * Maximum number of simultaneously visible toast notifications + * When limit is exceeded, oldest toasts are automatically removed + * @default 5 + * @range 1-10 recommended * @category System Config * @instanceEditable true */ - public ToastSettings: S_ToastSettings = { - MaxVisibleToasts: 5, - DefaultDuration: 3.0, - AlsoLogToConsole: true, - IsEnabled: true, - }; + private readonly MaxVisibleToasts: Integer = 5; + + /** + * Duplicate all toast messages to console output for debugging + * Format: [MessageType] Message text + * @default true + * @recommendation Set false in production builds for performance + * @category System Config + * @instanceEditable true + */ + private readonly AlsoLogToConsole: boolean = true; + + /** + * Master switch for the entire toast system + * When disabled: ShowToast() returns -1, widgets are not created + * LogToConsole still works if AlsoLogToConsole is true + * @default true + * @category System Config + * @instanceEditable true + */ + private readonly IsEnabled: boolean = true; /** * System initialization state flag diff --git a/Content/Toasts/Components/AC_ToastSystem.uasset b/Content/Toasts/Components/AC_ToastSystem.uasset index f44d0ab..8fa8d24 100644 --- a/Content/Toasts/Components/AC_ToastSystem.uasset +++ b/Content/Toasts/Components/AC_ToastSystem.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f6f49a538626bb79a83da977edcfc7c706efbdf1cd0f3463c6abb600c18b9273 -size 327351 +oid sha256:74864f4950f8f9bd3867aa9715fd7458c08c93c06a0a08b04f8a2acfb736771c +size 305149 diff --git a/Content/Toasts/Structs/S_ToastSettings.ts b/Content/Toasts/Structs/S_ToastSettings.ts deleted file mode 100644 index e0152c2..0000000 --- a/Content/Toasts/Structs/S_ToastSettings.ts +++ /dev/null @@ -1,11 +0,0 @@ -// Toasts/Structs/S_ToastSettings.ts - -import type { Float } from '#root/UE/Float.ts'; -import type { Integer } from '#root/UE/Integer.ts'; - -export interface S_ToastSettings { - MaxVisibleToasts: Integer; - DefaultDuration: Float; - AlsoLogToConsole: boolean; - IsEnabled: boolean; -} diff --git a/Content/Toasts/Structs/S_ToastSettings.uasset b/Content/Toasts/Structs/S_ToastSettings.uasset deleted file mode 100644 index 173189f..0000000 --- a/Content/Toasts/Structs/S_ToastSettings.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:25ff1b1ce9b44f05631c9ab00a15b7d5b590e7a9863b37016e94b77c21593f82 -size 6954 diff --git a/Content/Toasts/TDD.md b/Content/Toasts/TDD.md index ac51558..307ac72 100644 --- a/Content/Toasts/TDD.md +++ b/Content/Toasts/TDD.md @@ -10,6 +10,7 @@ - **Типизированные сообщения:** Цветовая дифференциация по типу (Info, Success, Warning, Error, Debug) - **Ограниченная емкость:** Контролируемое количество видимых уведомлений - **Integration ready:** Тесная интеграция с Debug HUD и другими системами +- **Instance-editable config:** Настройки доступны для изменения в Blueprint editor ## Компоненты системы @@ -24,7 +25,7 @@ - `InitializeToastSystem()` - Инициализация контейнера и системы - `ShowToast()` - Создание нового уведомления с возвратом ID - `UpdateToastSystem()` - Main loop для удаления expired toast -- `EnforceToastLimit()` - Контроль максимального количества +- `GetTestData()` - Возврат данных для тестирования ### WBP_ToastContainer (UI Container) **Ответственности:** @@ -33,32 +34,16 @@ - Добавление и удаление child toast widgets - Viewport integration для корректного отображения -**Ключевые функции:** -- `AddToast()` - Создание и добавление нового toast widget -- `RemoveToast()` - Безопасное удаление toast из контейнера -- `InitializeContainer()` - Настройка visibility и добавление в viewport - ### WBP_Toast (Individual Widget) **Ответственности:** - Отображение текста уведомления - Динамическое изменение цвета фона по типу сообщения - Обновление содержимого в runtime -- Viewport lifecycle management - -**Ключевые функции:** -- `InitializeToast()` - Инициализация с сообщением и типом -- `SetMessage()` - Обновление текста уведомления -- `SetToastType()` - Изменение типа и стилизации ### BFL_Colors (Color Management Library) **Ответственности:** - Цветовая схема для разных типов сообщений - Консистентная стилизация across всей системы -- Alpha channel поддержка для прозрачности -- Type-safe color mapping - -**Ключевые функции:** -- `GetColorByMessageType()` - Возвращает Color по типу сообщения ## Типы уведомлений @@ -69,126 +54,133 @@ enum E_MessageType { Success = 'Success', // Успешные операции Warning = 'Warning', // Предупреждения Error = 'Error', // Ошибки - Debug = 'Debug', // Debug информация - Test = 'Test' // Тестовые сообщения + Debug = 'Debug' // Debug информация } ``` ### Цветовая схема +- **Info:** Синий (#0066CC) +- **Success:** Зеленый (#00CC66) +- **Warning:** Оранжевый (#FF9900) +- **Error:** Красный (#CC0000) +- **Debug:** Фиолетовый (#9933CC) + +## API Reference + +### ShowToast() ```typescript -GetColorByMessageType(Type: E_MessageType, Alpha: Byte): Color { - Info: Color(226, 144, 74, Alpha) - Success: Color(92, 184, 92, Alpha) - Warning: Color(78, 173, 240, Alpha) - Error: Color(79, 83, 217, Alpha) - Debug: Color(125, 117, 108, Alpha) +public ShowToast( + Message: Text = '', + Type: E_MessageType = E_MessageType.Info, + Duration: Float = 5 +): Integer +``` +**Описание:** Создает и отображает новое toast уведомление +**Возвращает:** Toast ID (положительное число) или -1 при неудаче + +**Parameters:** +- `Message` - Текст уведомления +- `Type` - Тип сообщения (Info/Success/Warning/Error/Debug) +- `Duration` - Время отображения в секундах (по умолчанию 5) + +**Примеры:** +```typescript +// Стандартное использование +this.ToastComponent.ShowToast("Save complete", E_MessageType.Success) + +// Кастомная длительность +this.ToastComponent.ShowToast("Critical error!", E_MessageType.Error, 10) +``` + +### GetTestData() +```typescript +public GetTestData(): { + ToastWidgets: UEArray; + MaxVisibleToasts: Integer; + IsEnabled: boolean; } ``` +**Описание:** Возвращает данные системы для тестирования +**Возвращает:** Объект с активными widgets и конфигурацией -## Структуры данных - -### S_ToastMessage +**Использование в тестах:** ```typescript -interface S_ToastMessage { - ID: Integer // Уникальный идентификатор (1, 2, 3...) - Message: Text // Текст уведомления - Type: E_MessageType // Тип для цветовой схемы - Duration: Float // Время жизни в секундах (default: 3.0) - CreatedTime: Float // Timestamp создания для lifecycle tracking -} +const data = this.ToastComponent.GetTestData() +this.AssertEqual(data.ToastWidgets.length, 5, "Should not exceed max") +this.AssertEqual(data.MaxVisibleToasts, 5, "Default limit check") +this.AssertTrue(data.IsEnabled, "System should be enabled") ``` -### S_ToastSettings +### InitializeToastSystem() ```typescript -interface S_ToastSettings { - MaxVisibleToasts: Integer // Максимум видимых (default: 5) - DefaultDuration: Float // Длительность по умолчанию (3.0s) - AlsoLogToConsole: boolean // Дублировать в console.log - IsEnabled: boolean // Главный выключатель системы -} +public InitializeToastSystem(): void +``` +**Описание:** Инициализирует систему, создает UI контейнер +**Обязательность:** Должна быть вызвана ДО любых вызовов ShowToast() + +### UpdateToastSystem() +```typescript +public UpdateToastSystem(): void +``` +**Описание:** Main loop функция, обрабатывает removal expired toast +**Вызов:** Должна вызываться каждый frame в Tick + +## Алгоритмы работы + +### Создание toast +``` +ShowToast(Message, Type, Duration): +1. ShouldProcessToasts() - проверка IsInitialized && IsEnabled +2. Создание S_ToastMessage с уникальным ID +3. EnforceToastLimit() - удаление oldest если >= MaxVisibleToasts +4. ToastContainer.AddToast() - создание widget +5. Add в ActiveToasts и ToastWidgets +6. LogToConsole() если AlsoLogToConsole = true +7. Return ID или -1 ``` -## Жизненный цикл Toast - -### Создание уведомления +### Удаление expired toast ``` -1. ShowToast() вызывается с параметрами -2. Проверка ShouldProcessToasts() (система включена?) -3. EnforceToastLimit() - удаление oldest при превышении лимита -4. Создание S_ToastMessage с уникальным ID -5. ToastContainer.AddToast() создает WBP_Toast widget -6. Добавление в ActiveToasts и ToastWidgets массивы -7. LogToConsole() при включенной настройке -8. Возврат Toast ID для tracking -``` - -### Обновление системы -``` -UpdateToastSystem() каждый frame: -1. ShouldProcessToasts() проверка готовности -2. RemoveExpiredToasts() - поиск expired по времени -3. Для каждого expired toast: - - ToastContainer.RemoveToast() удаление из UI +RemoveExpiredToasts() в UpdateToastSystem(): +1. Loop через ActiveToasts +2. Для каждого toast проверка: (CurrentTime - CreatedTime > Duration) +3. Если expired: + - ToastContainer.RemoveToast(widget) - RemoveIndex() из ActiveToasts и ToastWidgets - - SetVisibility(Hidden) и RemoveFromParent() ``` ### Контроль лимитов ``` -EnforceToastLimit() при превышении MaxVisibleToasts: +EnforceToastLimit(): 1. while (ActiveToasts.length >= MaxVisibleToasts) -2. Получение oldest toast (index 0) -3. ToastContainer.RemoveToast() удаление widget -4. RemoveIndex(0) из обоих массивов -5. Repeat until в пределах лимита +2. Удаление oldest toast (index 0) +3. RemoveIndex(0) из обоих массивов ``` ## Производительность -### Оптимизации -- **Единственный таймер:** Один GetGameTimeInSeconds() вызов на Update -- **Массивная обработка:** Batch removal в RemoveExpiredToasts -- **Ленивое создание:** Widget создается только при отображении -- **Memory pool:** Переиспользование widget instances (planned) - ### Benchmarks -- **Инициализация:** <1ms (создание контейнера) -- **ShowToast:** <0.1ms на создание (без UI rendering) +- **Инициализация:** <1ms +- **ShowToast:** <0.1ms на создание - **UpdateToastSystem:** <0.05ms при 5 активных toast -- **RemoveExpiredToasts:** <0.02ms per expired toast - **Memory footprint:** ~50 байт на активный toast -### Performance considerations -- **UI rendering cost:** Widget creation дороже логической обработки -- **String operations:** Message copying минимизирована -- **Array operations:** Remove операции O(n), но n ≤ 5 -- **Timer precision:** GetGameTimeInSeconds() dependency - ## Система тестирования ### FT_ToastsSystemInitialization **Проверяет базовую инициализацию:** -- Корректность default settings (IsEnabled = true) -- Валидность MaxVisibleToasts > 0 +- Корректность default settings (IsEnabled = true, MaxVisibleToasts = 5) - Успешность InitializeToastSystem() ### FT_ToastsDurationHandling -**Тестирует создание и ID assignment:** +**Тестирует ID assignment:** - ShowToast() возвращает валидные положительные ID -- Два последовательных toast получают разные ID -- Система корректно increment NextToastID +- Каждый toast получает уникальный ID ### FT_ToastsToastCreation **Валидирует создание по всем типам:** -```typescript -ToastTypes: UEArray = [ - E_MessageType.Info, - E_MessageType.Success, - E_MessageType.Warning, - E_MessageType.Error, - E_MessageType.Debug -] -``` +- Info, Success, Warning, Error, Debug +- Все типы создают валидные widgets ### FT_ToastLimit **Проверяет контроль лимитов:** @@ -198,229 +190,53 @@ ToastTypes: UEArray = [ ### FT_ToastsEdgeCases **Тестирует граничные условия:** -- **Empty message:** ShowToast() без параметров -- **Long message:** 500-символьный текст -- **Multiline message:** Сообщение с \n переносами -- Все edge cases должны возвращать валидные ID > 0 +- Empty message +- Long message (500 символов) +- Multiline message ## Интеграция с системами ### С Debug HUD System ```typescript -// В AC_DebugHUD.InitializeDebugHUD() -this.ToastComponent.ShowToast( - 'Debug HUD Initialized', - E_MessageType.Success -) - -// В ToggleVisualDebug() -this.ToastComponent.ShowToast( - `Visual Debug ${enabled ? 'Enabled' : 'Disabled'}` -) +this.ToastComponent.ShowToast('Debug HUD Initialized', E_MessageType.Success) ``` -### С Main Character (BP_MainCharacter) +### С Main Character ```typescript -// В EventBeginPlay() - инициализация первой -if (this.ShowDebugInfo) { - this.ToastSystemComponent.InitializeToastSystem() - this.DebugHUDComponent.InitializeDebugHUD( - this.MovementComponent, - this.ToastSystemComponent // передача reference - ) -} +// В EventBeginPlay +this.ToastSystemComponent.InitializeToastSystem() -// В EventTick() - обновление каждый frame -if (this.ShowDebugInfo) { - this.ToastSystemComponent.UpdateToastSystem() -} +// В Tick +this.ToastSystemComponent.UpdateToastSystem() ``` -### С Console Logging +## Миграция с предыдущей версии + +### Изменения в рефакторинге +1. ✅ Убрана структура `S_ToastSettings` +2. ✅ Переменные стали прямыми полями компонента с `@instanceEditable` +3. ✅ `ShowToast()` теперь имеет `Duration: Float = 5` (было 0) +4. ✅ `GetTestData()` возвращает расширенный объект + +### Breaking Changes + +#### 1. Доступ к настройкам ```typescript -// Настройка AlsoLogToConsole = true дублирует все toast в console -LogToConsole(Type: E_MessageType, Message: Text): void { - if (this.ToastSettings.AlsoLogToConsole) { - SystemLibrary.PrintString(`[${Type}] ${Message}`, false) - } -} +// ❌ Старый код +if (this.ToastComponent.ToastSettings.IsEnabled) { } + +// ✅ Новый код - используем GetTestData() +const data = this.ToastComponent.GetTestData() +if (data.IsEnabled) { } ``` -## API Reference - -### Публичные методы - -#### InitializeToastSystem() +#### 2. ShowToast Duration ```typescript -InitializeToastSystem(): void -``` -**Описание:** Инициализирует систему с созданием UI контейнера -**Когда вызывать:** EventBeginPlay в main character, до использования ShowToast -**Эффекты:** Создает WBP_ToastContainer, устанавливает IsInitialized = true +// ❌ Старый код - 0 означал default +this.ShowToast("Message", E_MessageType.Info, 0) -#### ShowToast() -```typescript -ShowToast( - Message: Text = '', - Type: E_MessageType = E_MessageType.Info, - Duration: Float = 0 -): Integer -``` -**Параметры:** -- `Message` - Текст уведомления (default: пустая строка) -- `Type` - Тип сообщения для стилизации (default: Info) -- `Duration` - Время жизни, 0 = default (default: используется DefaultDuration) - -**Возвращает:** Toast ID > 0 при успехе, -1 при ошибке -**Требования:** Система должна быть инициализирована - -#### UpdateToastSystem() -```typescript -UpdateToastSystem(): void -``` -**Описание:** Main update loop, удаляет expired toast -**Когда вызывать:** EventTick в main character каждый frame -**Эффекты:** Автоматическое удаление истекших уведомлений - -#### GetTestData() -```typescript -GetTestData(): UEArray -``` -**Описание:** Возвращает активные toast widgets для тестирования -**Use case:** Валидация в автотестах, debug проверки - -### Публичные свойства - -#### ToastSettings (Instance Editable) -```typescript -ToastSettings: S_ToastSettings = { - MaxVisibleToasts: 5, // Максимум одновременных уведомлений - DefaultDuration: 3.0, // Время жизни по умолчанию (секунды) - AlsoLogToConsole: true, // Дублирование в console.log - IsEnabled: true // Главный выключатель системы -} -``` - -### Приватные свойства - -#### IsInitialized (Read-only) -```typescript -private IsInitialized: boolean = false -``` -**Описание:** Флаг успешной инициализации системы -**Use case:** Проверка готовности в ShouldProcessToasts() - -#### NextToastID (Auto-increment) -```typescript -private NextToastID: Integer = 1 -``` -**Описание:** Счетчик для генерации уникальных ID -**Behavior:** Инкрементируется при каждом ShowToast() вызове - -## Расширяемость - -### Добавление новых типов сообщений -1. Расширить `E_MessageType` enum -2. Добавить цветовую схему в `BFL_Colors.GetColorByMessageType()` -3. Обновить test coverage в `FT_ToastsToastCreation` - -### Пример добавления "Critical" типа: -```typescript -// 1. Enum -enum E_MessageType { - // ... existing types - Critical = 'Critical' // Критические системные ошибки -} - -// 2. Color mapping -case E_MessageType.Critical: - return new Color(255, 0, 0, Alpha) // Ярко-красный - -// 3. Test coverage -private ToastTypes: UEArray = [ - // ... existing types - E_MessageType.Critical -] -``` - -### Новые функциональности -- **Toast priorities:** Разные приоритеты для разных типов -- **Interactive toasts:** Кликабельные уведомления с действиями -- **Toast animations:** Fade in/out эффекты при показе/скрытии -- **Persistent toasts:** Уведомления без auto-expire -- **Toast categories:** Группировка по системам (Debug, Movement, Audio) - -## Известные ограничения - -### Текущие ограничения -1. **Fixed capacity** - Жестко заданный лимит в 5 уведомлений -2. **No priority system** - FIFO удаление без учета важности -3. **Simple layout** - Только вертикальное расположение -4. **No persistence** - Все toast временные, нет постоянных - -### Архитектурные ограничения -1. **Single container** - Одно место отображения для всех toast -2. **No categorization** - Невозможно группировать по системам -3. **Linear time complexity** - RemoveExpiredToasts O(n) по количеству toast -4. **No animation system** - Статичное появление/исчезновение - -## Планы развития (Stage 3+) - -### Краткосрочные улучшения -1. **Animation system** - Плавные fade in/out переходы -2. **Priority queues** - Важные сообщения вытесняют менее важные -3. **Categorization** - Группировка toast по системам -4. **Interactive elements** - Кликабельные действия в уведомлениях - -### Долгосрочные цели -1. **Multiple containers** - Разные области экрана для разных типов -2. **Rich content support** - Иконки, прогресс-бары, форматированный текст -3. **Sound integration** - Audio feedback для разных типов уведомлений -4. **Network synchronization** - Синхронизация toast между клиентами - -## Интеграционные точки - -### С Audio System -- **Type-specific sounds:** Разные звуки для Success/Error/Warning -- **Audio cues:** Звуковое подтверждение важных уведомлений -- **Volume control:** Отдельная настройка громкости для toast sounds - -### С Input System -- **Hotkey dismiss:** Клавиша для ручного закрытия всех toast -- **Interactive toasts:** Keyboard/mouse взаимодействие с уведомлениями -- **Accessibility:** Screen reader поддержка для toast content - -### С Settings System -- **User preferences:** Настройки длительности, количества, типов -- **Profile persistence:** Сохранение настроек between sessions -- **Runtime configuration:** Изменение параметров без перезагрузки - -## Файловая структура - -``` -Content/ -├── Toasts/ -│ ├── Components/ -│ │ └── AC_ToastSystem.ts # Core toast management -│ ├── Structs/ -│ │ ├── S_ToastMessage.ts # Individual toast data -│ │ └── S_ToastSettings.ts # System configuration -│ ├── UI/ -│ │ ├── WBP_Toast.ts # Individual toast widget -│ │ └── WBP_ToastContainer.ts # Layout container -│ └── Tests/ -│ ├── FT_ToastLimit.ts # Capacity management -│ ├── FT_ToastsDurationHandling.ts # Basic functionality -│ ├── FT_ToastsEdgeCases.ts # Edge case handling -│ ├── FT_ToastsSystemInitialization.ts # Setup testing -│ └── FT_ToastsToastCreation.ts # Type coverage -├── UI/ -│ ├── Enums/ -│ │ └── E_MessageType.ts # Toast type definitions -│ └── Libraries/ -│ └── BFL_Colors.ts # Color scheme management -└── Blueprints/ - └── BP_MainCharacter.ts # Integration point +// ✅ Новый код - просто не передавать +this.ShowToast("Message", E_MessageType.Info) ``` ## Best Practices @@ -429,105 +245,77 @@ Content/ ```typescript // ✅ Хорошо - инициализация перед использованием this.ToastSystemComponent.InitializeToastSystem() -const toastId = this.ToastSystemComponent.ShowToast("Success!", E_MessageType.Success) +this.ToastSystemComponent.ShowToast("Success!", E_MessageType.Success) -// ✅ Хорошо - проверка системы -if (this.ToastSystemComponent.ToastSettings.IsEnabled) { - this.ToastSystemComponent.ShowToast("Debug info", E_MessageType.Debug) -} - -// ✅ Хорошо - кастомная длительность для важных сообщений -this.ToastSystemComponent.ShowToast( - "Critical error occurred", - E_MessageType.Error, - 10.0 // 10 секунд для критических ошибок -) +// ✅ Хорошо - кастомная длительность +this.ToastSystemComponent.ShowToast("Error!", E_MessageType.Error, 10.0) // ❌ Плохо - использование без инициализации -const toastId = this.ToastSystemComponent.ShowToast("Message") // может вернуть -1 - -// ❌ Плохо - игнорирование return value -this.ToastSystemComponent.ShowToast("Important") // не проверяем успешность +this.ToastSystemComponent.ShowToast("Message") // вернет -1 ``` -### Рекомендации по типам сообщений -- **Info:** Общая информация, подсказки пользователю -- **Success:** Подтверждение успешных операций (сохранение, загрузка) -- **Warning:** Предупреждения о потенциальных проблемах -- **Error:** Ошибки, требующие внимания пользователя -- **Debug:** Техническая информация для разработчиков +### Рекомендации по типам +- **Info:** Общая информация +- **Success:** Подтверждение операций +- **Warning:** Предупреждения +- **Error:** Критические ошибки +- **Debug:** Техническая информация -### Performance recommendations -- Используйте короткие сообщения для лучшей читаемости -- Избегайте spam toast - группируйте похожие уведомления -- Настройте AlsoLogToConsole = false в production для performance -- Регулируйте DefaultDuration based на важность системы - -## Статистика использования - -### Типичные паттерны использования -```typescript -// Debug system notifications (30% всех toast) -this.ToastComponent.ShowToast("Debug HUD Initialized", E_MessageType.Success) -this.ToastComponent.ShowToast("Visual Debug Enabled", E_MessageType.Info) - -// Error reporting (25% всех toast) -this.ToastComponent.ShowToast("Failed to create widget", E_MessageType.Error) -this.ToastComponent.ShowToast("Movement component invalid", E_MessageType.Error) - -// System status updates (25% всех toast) -this.ToastComponent.ShowToast("System ready", E_MessageType.Success) -this.ToastComponent.ShowToast("Configuration loaded", E_MessageType.Info) - -// Test notifications (20% всех toast) -this.ToastComponent.ShowToast("Test passed!", E_MessageType.Success) -this.ToastComponent.ShowToast("Limit test toast 1", E_MessageType.Info, 10) -``` - -### Usage metrics (из тестов) -- **Average toast lifetime:** 3.0 секунды (DefaultDuration) -- **Peak concurrent toasts:** 5 (MaxVisibleToasts) -- **Message length range:** 0-500 символов (edge case testing) -- **Success rate:** 99.9% (только при неинициализированной системе возврат -1) +### Рекомендации по Duration +- **1-2s:** Простые подтверждения +- **5s (default):** Большинство уведомлений +- **8-10s:** Errors, warnings, важные события ## Troubleshooting -### Частые проблемы -1. **Toast не отображаются** - - Проверить IsEnabled в ToastSettings - - Убедиться что InitializeToastSystem() вызван - - Проверить что UpdateToastSystem() вызывается в Tick +### Toast не отображаются +- ✅ Проверить что `InitializeToastSystem()` вызван +- ✅ Проверить `IsEnabled = true` через `GetTestData()` +- ✅ Проверить что `UpdateToastSystem()` вызывается -2. **Toast исчезают слишком быстро/медленно** - - Настроить DefaultDuration в ToastSettings - - Передавать кастомную Duration в ShowToast() - - Проверить что время не в milliseconds вместо seconds +### Toast исчезают слишком быстро +- ✅ Передавать кастомную Duration в ShowToast() +- ✅ Проверить что время в секундах -3. **Слишком много toast одновременно** - - Настроить MaxVisibleToasts в ToastSettings - - Группировать похожие уведомления - - Использовать different Duration для разных типов +### Слишком много toast +- ✅ Настроить MaxVisibleToasts в Blueprint +- ✅ Группировать похожие уведомления -4. **Memory leaks при большом количестве toast** - - Убедиться что UpdateToastSystem() вызывается для cleanup - - Проверить что expired toast корректно удаляются из массивов - - Мониторить ActiveToasts.length во время runtime +## Файловая структура + +``` +Content/ +├── Toasts/ +│ ├── Components/ +│ │ └── AC_ToastSystem.ts +│ ├── Structs/ +│ │ └── S_ToastMessage.ts +│ ├── UI/ +│ │ ├── WBP_Toast.ts +│ │ └── WBP_ToastContainer.ts +│ └── Tests/ +│ ├── FT_ToastLimit.ts +│ ├── FT_ToastsDurationHandling.ts +│ ├── FT_ToastsEdgeCases.ts +│ ├── FT_ToastsSystemInitialization.ts +│ └── FT_ToastsToastCreation.ts +├── UI/ +│ ├── Enums/ +│ │ └── E_MessageType.ts +│ └── Libraries/ +│ └── BFL_Colors.ts +└── Blueprints/ + └── BP_MainCharacter.ts +``` ## Заключение -Toast System представляет собой надежную и гибкую систему для отображения временных уведомлений в игровом интерфейсе. Система обеспечивает автоматическое управление жизненным циклом, типизированную стилизацию и эффективную интеграцию с другими системами проекта. +Toast System после рефакторинга представляет собой более чистую и maintainable архитектуру. **Ключевые достижения:** -- ✅ Полностью автоматическое управление lifecycle без memory leaks -- ✅ Comprehensive test coverage (5 test scenarios covering edge cases) -- ✅ Типизированная система с цветовой дифференциацией -- ✅ Контролируемая емкость с automatic oldest removal -- ✅ Production-ready performance (<0.1ms per operation) -- ✅ Seamless integration с Debug HUD и Main Character - -**Готовность к production:** -- Все автотесты покрывают edge cases и boundary conditions -- Performance benchmarks соответствуют real-time требованиям -- Memory management протестирован на длительных сессиях -- API documented и готово к расширению новыми функциями -- Integration points четко определены для других систем +- ✅ Упрощена структура (убрана S_ToastSettings) +- ✅ Улучшен API с явным default Duration = 5s +- ✅ GetTestData() предоставляет доступ к конфигурации +- ✅ Instance-editable переменные для Blueprint +- ✅ Полная test coverage +- ✅ Production-ready performance diff --git a/Content/Toasts/Tests/FT_ToastLimit.uasset b/Content/Toasts/Tests/FT_ToastLimit.uasset index 5d8d233..1bfd443 100644 --- a/Content/Toasts/Tests/FT_ToastLimit.uasset +++ b/Content/Toasts/Tests/FT_ToastLimit.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:625fea7bb0ee603082d5c3d05e9119aea890ae2f7eb55374c981348b5b230396 -size 92151 +oid sha256:e92225a1dd55ae5718efcdbbd9aacaf39f81c7814d2509ebfbc4ccd97cd02b31 +size 81664 diff --git a/Content/Toasts/Tests/FT_ToastsDurationHandling.uasset b/Content/Toasts/Tests/FT_ToastsDurationHandling.uasset index 2ce3173..d53bc88 100644 --- a/Content/Toasts/Tests/FT_ToastsDurationHandling.uasset +++ b/Content/Toasts/Tests/FT_ToastsDurationHandling.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bf6944970af52a7862fd71666e8ae39830c754f382b60eb5af1e8cc282124d0e -size 71006 +oid sha256:3703517197ed9d833208f96949c6e378be58f7a6232ee317ab15ba4442d13be3 +size 70681 diff --git a/Content/Toasts/Tests/FT_ToastsEdgeCases.uasset b/Content/Toasts/Tests/FT_ToastsEdgeCases.uasset index 9ce63b6..8824269 100644 --- a/Content/Toasts/Tests/FT_ToastsEdgeCases.uasset +++ b/Content/Toasts/Tests/FT_ToastsEdgeCases.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5eb6c61c49c4b0f909138c0cfe77a7286572e2c7da5163b1e90fd0bc8f764464 -size 125581 +oid sha256:c8120d1874e2d6a49f8a22984e642ea001d3434091376c06c79e5c6cd80f2759 +size 124669 diff --git a/Content/Toasts/Tests/FT_ToastsSystemInitialization.uasset b/Content/Toasts/Tests/FT_ToastsSystemInitialization.uasset index 45c2bc6..a75fd0d 100644 --- a/Content/Toasts/Tests/FT_ToastsSystemInitialization.uasset +++ b/Content/Toasts/Tests/FT_ToastsSystemInitialization.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1869b30aa3779d6f0f8aa367bd431ce107ebd1ff3627011655977811d461bf16 -size 57319 +oid sha256:6114ed8c34b1b8c731935af08bee6eaef7e497d22f8dd670d30c5e40deb07413 +size 52580 diff --git a/Content/Toasts/Tests/FT_ToastsToastCreation.uasset b/Content/Toasts/Tests/FT_ToastsToastCreation.uasset index 0613bd2..e534a69 100644 --- a/Content/Toasts/Tests/FT_ToastsToastCreation.uasset +++ b/Content/Toasts/Tests/FT_ToastsToastCreation.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:59d42d36416b31f366f03d4528d0f5e67bbb1a5f5244f4088f4f1dfcc581fd3c -size 72350 +oid sha256:128e0aa49cd1519a8b10d35a25cadbccbbfe1fc04fe466a2f0cfb64fc66c324b +size 71996