From a99fa16763a5b510c70b0369e8568d079a419f82 Mon Sep 17 00:00:00 2001 From: Leonid Pershin Date: Fri, 31 Oct 2025 18:20:39 +0300 Subject: [PATCH] Implement AI Images gallery feature in RimWorld mod, allowing users to view, delete, and manage generated images. Update UI components to include a gallery button and enhance image management functionality. Add localization strings for gallery features in English and Russian. Update AIImages.dll to reflect these changes. --- Assemblies/AIImages.dll | Bin 106496 -> 112640 bytes Languages/English/Keyed/AIImages.xml | 14 + Languages/Russian/Keyed/AIImages.xml | 14 + README.md | 222 ++++++++++ .../AIImages/Components/PawnPortraitComp.cs | 101 ++++- Source/AIImages/Helpers/PawnPortraitHelper.cs | 45 +- Source/AIImages/Window_AIGallery.cs | 413 ++++++++++++++++++ Source/AIImages/Window_AIImage.cs | 26 +- 8 files changed, 799 insertions(+), 36 deletions(-) create mode 100644 Source/AIImages/Window_AIGallery.cs diff --git a/Assemblies/AIImages.dll b/Assemblies/AIImages.dll index 9b40a6c83d2bf25baa007a8ef2268d6cf9bd2b02..dc6df03043a4d9a06199f328fae626964625bf7d 100644 GIT binary patch literal 112640 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

Q{h#y6WJd$ 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 diff --git a/Languages/English/Keyed/AIImages.xml b/Languages/English/Keyed/AIImages.xml index 2c8fdbf..3f4b609 100644 --- a/Languages/English/Keyed/AIImages.xml +++ b/Languages/English/Keyed/AIImages.xml @@ -104,4 +104,18 @@ Clear All Generated Images Are you sure you want to delete all generated portrait images? This action cannot be undone. Successfully deleted {0} portrait image(s) + + AI Images Gallery + Total images: {0} + Gallery is empty + Load error + Delete selected + Delete all ({0}) + Delete selected image? + Delete all {0} images? This action cannot be undone. + Delete error: {0} + Image successfully deleted + Successfully deleted {0} images + Open gallery + ({0}) diff --git a/Languages/Russian/Keyed/AIImages.xml b/Languages/Russian/Keyed/AIImages.xml index c5dd326..0cd8ad0 100644 --- a/Languages/Russian/Keyed/AIImages.xml +++ b/Languages/Russian/Keyed/AIImages.xml @@ -104,4 +104,18 @@ Очистить все сгенерированные изображения Вы уверены, что хотите удалить все сгенерированные портреты? Это действие нельзя отменить. Успешно удалено {0} изображений портретов + + Галерея AI изображений + Всего изображений: {0} + В галерее пока нет изображений + Ошибка загрузки + Удалить выбранное + Удалить всё ({0}) + Удалить выбранное изображение? + Удалить все {0} изображений? Это действие нельзя отменить. + Ошибка удаления: {0} + Изображение успешно удалено + Успешно удалено {0} изображений + Открыть галерею + ({0}) diff --git a/README.md b/README.md index e69de29..626296c 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,222 @@ +# AI Images - RimWorld Mod + +Мод для RimWorld, который генерирует AI-изображения персонажей (пешек) с помощью Stable Diffusion API. + +## 🌟 Возможности + +### 📸 Генерация AI-изображений +- **Автоматическое описание персонажей** на основе: + - Внешности (пол, возраст, тип тела, цвет кожи) + - Прически и цвета волос + - Одежды с материалами, качеством и цветами + - Черт характера + - Генов (биотехнологии) + - Состояний здоровья + +### 🎨 Гибкая настройка стилей +- **9 предустановленных художественных стилей**: + - Реалистичный (Photorealistic) + - Полуреалистичный (Semi-Realistic) + - Аниме + - Концепт-арт + - Цифровая живопись + - Масляная живопись + - Эскиз + - Cel-shaded + - Без стиля (кастомные промпты) + +- **Возможность создания собственных стилей** через XML-конфигурацию +- Базовые промпты и негативные промпты +- Автоматическое добавление качественных тегов + +### 📐 Размеры изображений +- **Предустановки**: квадратные, портретные, ландшафтные +- **Кастомные размеры**: полный контроль над шириной и высотой +- **Два типа генерации**: портрет или полное тело + +### 🖼️ Галерея изображений +- **Отдельная галерея** для каждого персонажа +- **Просмотр всех сгенерированных изображений** в удобной сетке +- **Выбор изображений** кликом по миниатюре +- **Удаление** отдельных или всех изображений +- **Отображение даты создания** и имени файла + +### ⚙️ Настройки Stable Diffusion +- **Полная интеграция с Stable Diffusion WebUI** +- Загрузка моделей, сэмплеров и планировщиков из API +- Настройка количества шагов, CFG Scale, seed +- Превью промптов с возможностью копирования +- Прогресс-бар генерации с ETA + +### 🎛️ Продвинутые функции +- **Автоматическое сохранение** изображений +- **История генераций** для каждого персонажа +- **Обратная совместимость** со старыми сохранениями +- **Двуязычный интерфейс** (русский/английский) +- **Отладочные логи** для диагностики + +## 🚀 Установка + +### Требования +- **RimWorld** версии 1.6 +- **Harmony** (автоматически подтягивается через зависимости) +- **Stable Diffusion WebUI** (локально или удаленно) + +### Зависимости +Мод использует следующие зависимости (автоматически подтягиваются): +- `brrainz.harmony` - Harmony +- `rim.job.world` - RimJobWorld (необязательно, но в зависимостях) + +### Шаги установки +1. Клонируйте репозиторий или скачайте релиз +2. Скопируйте папку `ai-images` в директорию `Mods` RimWorld +3. Запустите Stable Diffusion WebUI +4. В настройках RimWorld включите мод AI Images +5. В настройках мода укажите адрес API Stable Diffusion (по умолчанию `http://127.0.0.1:7860`) + +## 📖 Использование + +### Генерация изображений + +1. **Откройте окно AI Images**: + - Нажмите на кнопку "AI Портрет" в панели действий персонажа + +2. **Настройте параметры**: + - Выберите художественный стиль + - Выберите тип изображения (портрет/полное тело) + - Настройте размер изображения + - При необходимости измените другие параметры + +3. **Сгенерируйте изображение**: + - Нажмите кнопку "Сгенерировать изображение" + - Дождитесь завершения генерации + - Изображение автоматически сохранится + +### Просмотр галереи + +1. **Откройте галерею**: + - В окне генерации нажмите кнопку "Открыть галерею" + - Откроется окно со всеми изображениями персонажа + +2. **Управление изображениями**: + - Кликните по изображению для выбора + - Нажмите "Удалить выбранное" для удаления конкретного изображения + - Нажмите "Удалить всё" для очистки галереи + +### Настройка стилей + +Мод использует XML-конфигурацию для определения стилей. Вы можете создать свои собственные стили, редактируя файл `Defs/ArtStyleDefs.xml`. + +Пример создания нового стиля: + +```xml + + ArtStyle_MyCustomStyle + + Описание вашего стиля + ваши ключевые слова здесь + чего избегать + дополнительные теги качества + true + true + 100 + +``` + +Подробнее о конфигурации стилей в [Defs/README.md](Defs/README.md). + +## 🎯 Особенности + +### Умная генерация промптов +Мод автоматически анализирует персонажа и создает детальные промпты для Stable Diffusion: +- Описывает цвет кожи естественным языком +- Добавляет информацию об одежде с материалами и качествами +- Учитывает черты характера персонажа +- Включает данные о генах из Biotech DLC +- Адаптирует промпт в зависимости от типа изображения + +### Оптимизация +- Асинхронная генерация без блокировки игры +- Возможность отмены генерации +- Прогресс-бар с реальным временем выполнения +- Эффективное управление памятью для текстур + +### Обратная совместимость +Старые сохранения с одним портретом автоматически мигрируют в новую систему галереи. + +## 🛠️ Разработка + +### Структура проекта +``` +ai-images/ +├── About/ # Метаданные мода +├── Assemblies/ # Скомпилированные DLL +├── Defs/ # XML-конфигурации (стили, размеры) +├── Languages/ # Переводы +├── Source/ # Исходный код +│ └── AIImages/ +│ ├── Components/ # Компоненты пешек +│ ├── Defs/ # Классы определений +│ ├── Helpers/ # Вспомогательные классы +│ ├── Models/ # Модели данных +│ ├── Patches/ # Harmony патчи +│ ├── Services/ # Бизнес-логика +│ ├── Settings/ # Настройки мода +│ ├── UI/ # Пользовательский интерфейс +│ └── Window_AIImage.cs # Главное окно +└── Textures/ # Текстуры UI +``` + +### Сборка +```bash +cd Source/AIImages +dotnet build -c Release +``` + +### Языки +Мод поддерживает английский и русский языки. Переводы находятся в `Languages/`. + +## 📝 История версий + +### v1.0.0 +- Базовая генерация AI-изображений +- Интеграция с Stable Diffusion API +- 9 художественных стилей +- Галерея изображений +- Настройка размеров +- Двуязычный интерфейс + +## 🤝 Вклад + +Приветствуются любые вклады! Пожалуйста: +1. Форкните репозиторий +2. Создайте ветку для вашей функции +3. Закоммитьте изменения +4. Отправьте Pull Request + +## 📄 Лицензия + +См. файл [LICENSE](LICENSE) для деталей. + +## 🙏 Благодарности + +- Ludeon Studios за создание RimWorld +- Automattic1111 за Stable Diffusion WebUI +- Сообщество RimWorld за поддержку + +## ⚠️ Известные ограничения + +- Требует запущенный Stable Diffusion WebUI +- Генерация изображений может занимать время в зависимости от настроек +- Некоторые модели Stable Diffusion могут работать медленнее других + +## 🐛 Сообщение об ошибках + +Если вы нашли баг или хотите предложить улучшение, пожалуйста, создайте Issue на GitHub с подробным описанием. + +--- + +**Автор**: mrleo1nid +**Версия RimWorld**: 1.6 +**Версия мода**: 1.0.0 + diff --git a/Source/AIImages/Components/PawnPortraitComp.cs b/Source/AIImages/Components/PawnPortraitComp.cs index a97527b..20f17c5 100644 --- a/Source/AIImages/Components/PawnPortraitComp.cs +++ b/Source/AIImages/Components/PawnPortraitComp.cs @@ -1,22 +1,84 @@ +using System.Collections.Generic; +using System.Linq; using AIImages.Helpers; using Verse; namespace AIImages.Components { ///

- /// Компонент для хранения данных AI-сгенерированного портрета пешки + /// Компонент для хранения данных AI-сгенерированных портретов пешки /// public class PawnPortraitComp : ThingComp { /// - /// Путь к сохраненному портрету + /// Список путей к сохраненным портретам (галерея) /// - public string PortraitPath { get; set; } + private List portraitPaths = new List(); /// - /// Есть ли сохраненный портрет + /// Есть ли сохраненные портреты /// - public bool HasPortrait => !string.IsNullOrEmpty(PortraitPath); + public bool HasPortrait => portraitPaths != null && portraitPaths.Count > 0; + + /// + /// Количество портретов в галерее + /// + public int PortraitCount => portraitPaths?.Count ?? 0; + + /// + /// Получить все пути к портретам + /// + public List GetAllPortraits() => portraitPaths?.ToList() ?? new List(); + + /// + /// Получить последний портрет (для обратной совместимости) + /// + public string PortraitPath => HasPortrait ? portraitPaths.Last() : null; + + /// + /// Добавить новый портрет в галерею + /// + public void AddPortrait(string path) + { + if (string.IsNullOrEmpty(path)) + return; + + if (portraitPaths == null) + portraitPaths = new List(); + + portraitPaths.Add(path); + DebugLogger.Log($"[AI Images] Added portrait to gallery: {path}"); + } + + /// + /// Удалить портрет из галереи + /// + public bool RemovePortrait(string path) + { + if (portraitPaths == null || string.IsNullOrEmpty(path)) + return false; + + bool removed = portraitPaths.Remove(path); + if (removed) + { + DebugLogger.Log($"[AI Images] Removed portrait from gallery: {path}"); + } + + return removed; + } + + /// + /// Очистить все портреты + /// + public void ClearPortraits() + { + if (portraitPaths != null) + { + int count = portraitPaths.Count; + portraitPaths.Clear(); + DebugLogger.Log($"[AI Images] Cleared {count} portraits from gallery"); + } + } /// /// Сохранение/загрузка данных @@ -25,33 +87,30 @@ namespace AIImages.Components { base.PostExposeData(); - string portraitPath = PortraitPath; bool isSaving = Scribe.mode == LoadSaveMode.Saving; bool isLoading = Scribe.mode == LoadSaveMode.LoadingVars; DebugLogger.Log( - $"[AI Images] PostExposeData for {parent?.LabelShort} - Mode: {Scribe.mode}, Current path: '{PortraitPath}'" + $"[AI Images] PostExposeData for {parent?.LabelShort} - Mode: {Scribe.mode}, Portrait count: {PortraitCount}" ); - Scribe_Values.Look(ref portraitPath, "aiPortraitPath", null); + // Сохраняем список портретов + Scribe_Collections.Look(ref portraitPaths, "aiPortraitPaths", LookMode.Value); - if (isSaving) + // Обратная совместимость: если есть старый формат с одним портретом, добавляем его в список + if (isLoading && (portraitPaths == null || portraitPaths.Count == 0)) { - DebugLogger.Log( - $"[AI Images] Saving portrait path for {parent?.LabelShort}: '{portraitPath}'" - ); + string oldPortraitPath = null; + Scribe_Values.Look(ref oldPortraitPath, "aiPortraitPath", null); + if (!string.IsNullOrEmpty(oldPortraitPath)) + { + portraitPaths = new List { oldPortraitPath }; + DebugLogger.Log($"[AI Images] Migrated old single portrait to gallery: {oldPortraitPath}"); + } } - else if (isLoading) - { - DebugLogger.Log( - $"[AI Images] Loading portrait path for {parent?.LabelShort}: '{portraitPath}'" - ); - } - - PortraitPath = portraitPath; DebugLogger.Log( - $"[AI Images] PostExposeData completed for {parent?.LabelShort} - Final path: '{PortraitPath}', HasPortrait: {HasPortrait}" + $"[AI Images] PostExposeData completed for {parent?.LabelShort} - Portrait count: {PortraitCount}, HasPortrait: {HasPortrait}" ); } } diff --git a/Source/AIImages/Helpers/PawnPortraitHelper.cs b/Source/AIImages/Helpers/PawnPortraitHelper.cs index 5eb5d3c..7a2c148 100644 --- a/Source/AIImages/Helpers/PawnPortraitHelper.cs +++ b/Source/AIImages/Helpers/PawnPortraitHelper.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using System.IO; using System.Linq; using AIImages.Components; @@ -30,7 +31,7 @@ namespace AIImages.Helpers } /// - /// Сохранить путь к портрету на пешке + /// Сохранить путь к портрету на пешке (добавляет в галерею) /// public static void SavePortraitPath(Pawn pawn, string path) { @@ -41,14 +42,11 @@ namespace AIImages.Helpers var comp = GetPortraitComp(pawn); if (comp != null) { + comp.AddPortrait(path); DebugLogger.Log( - $"[AI Images] Found portrait component for {pawn.Name}, setting path from '{comp.PortraitPath}' to '{path}'" + $"[AI Images] Successfully added portrait path for {pawn.Name}: {path}" ); - comp.PortraitPath = path; - DebugLogger.Log( - $"[AI Images] Successfully saved portrait path for {pawn.Name}: {path}" - ); - DebugLogger.Log($"[AI Images] Component now has portrait: {comp.HasPortrait}"); + DebugLogger.Log($"[AI Images] Component now has {comp.PortraitCount} portraits"); } else { @@ -147,17 +145,44 @@ namespace AIImages.Helpers } /// - /// Очистить портрет пешки + /// Очистить портрет пешки (удаляет все портреты) /// public static void ClearPortrait(Pawn pawn) { var comp = GetPortraitComp(pawn); if (comp != null) { - comp.PortraitPath = null; + comp.ClearPortraits(); } } + /// + /// Получить все пути к портретам пешки (галерея) + /// + public static List GetAllPortraits(Pawn pawn) + { + var comp = GetPortraitComp(pawn); + return comp?.GetAllPortraits() ?? new List(); + } + + /// + /// Получить количество портретов в галерее + /// + public static int GetPortraitCount(Pawn pawn) + { + var comp = GetPortraitComp(pawn); + return comp?.PortraitCount ?? 0; + } + + /// + /// Удалить конкретный портрет из галереи + /// + public static bool RemovePortrait(Pawn pawn, string path) + { + var comp = GetPortraitComp(pawn); + return comp?.RemovePortrait(path) ?? false; + } + /// /// Очистить все сгенерированные портреты /// @@ -179,7 +204,7 @@ namespace AIImages.Helpers var comp = GetPortraitComp(pawn); if (comp != null && comp.HasPortrait) { - comp.PortraitPath = null; + comp.ClearPortraits(); } } } diff --git a/Source/AIImages/Window_AIGallery.cs b/Source/AIImages/Window_AIGallery.cs new file mode 100644 index 0000000..a124468 --- /dev/null +++ b/Source/AIImages/Window_AIGallery.cs @@ -0,0 +1,413 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using AIImages.Helpers; +using RimWorld; +using UnityEngine; +using Verse; + +#pragma warning disable IDE1006 // Naming Styles + +namespace AIImages +{ + /// + /// Окно галереи AI-сгенерированных изображений персонажа + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage( + "Style", + "IDE1006:Naming Styles", + Justification = "RimWorld Window naming convention" + )] + [System.Diagnostics.CodeAnalysis.SuppressMessage( + "Minor Code Smell", + "S101:Types should be named in PascalCase", + Justification = "RimWorld Window naming convention" + )] + public class Window_AIGallery : Window + { + private Pawn pawn; + private List portraitPaths = new List(); + private List portraitTextures = new List(); + private Vector2 mainScrollPosition = Vector2.zero; + private int selectedIndex = 0; + + public Window_AIGallery(Pawn pawn) + { + this.pawn = pawn; + this.doCloseX = true; + this.doCloseButton = true; + this.forcePause = false; + this.absorbInputAroundWindow = false; + this.draggable = true; + this.preventCameraMotion = false; + + LoadGallery(); + } + + public override Vector2 InitialSize => new Vector2(900f, 700f); + + /// + /// Загружает галерею изображений персонажа + /// + private void LoadGallery() + { + DebugLogger.Log($"[AI Gallery] Loading gallery for {pawn?.Name}"); + + // Очищаем старые текстуры + UnloadTextures(); + + // Загружаем пути к портретам + portraitPaths = PawnPortraitHelper.GetAllPortraits(pawn); + + // Загружаем текстуры + foreach (var path in portraitPaths) + { + if (File.Exists(path)) + { + try + { + byte[] imageData = File.ReadAllBytes(path); + Texture2D texture = new Texture2D(2, 2); + texture.LoadImage(imageData); + portraitTextures.Add(texture); + DebugLogger.Log($"[AI Gallery] Loaded texture from: {path}"); + } + catch (System.Exception ex) + { + DebugLogger.Warning($"[AI Gallery] Failed to load texture: {path}, Error: {ex.Message}"); + portraitTextures.Add(null); + } + } + else + { + DebugLogger.Warning($"[AI Gallery] File not found: {path}"); + portraitTextures.Add(null); + } + } + + DebugLogger.Log($"[AI Gallery] Loaded {portraitTextures.Count} textures for {pawn?.Name}"); + } + + /// + /// Освобождает ресурсы текстур + /// + private void UnloadTextures() + { + foreach (var texture in portraitTextures) + { + if (texture != null) + { + Object.Destroy(texture); + } + } + portraitTextures.Clear(); + } + + /// + /// Освобождает ресурсы при закрытии окна + /// + public override void PreClose() + { + base.PreClose(); + UnloadTextures(); + } + + /// + /// Отрисовка окна + /// + public override void DoWindowContents(Rect inRect) + { + // Заголовок + Text.Font = GameFont.Medium; + Widgets.Label( + new Rect(0f, 0f, inRect.width, 40f), + "AIImages.Gallery.Title".Translate() + ); + + // Имя персонажа + Text.Font = GameFont.Small; + Widgets.Label( + new Rect(0f, 40f, inRect.width, 30f), + "AIImages.Window.PawnLabel".Translate(pawn.NameShortColored.Resolve()) + ); + + // Количество изображений + Widgets.Label( + new Rect(0f, 70f, inRect.width, 25f), + "AIImages.Gallery.Count".Translate(portraitTextures.Count) + ); + + // Разделитель + Widgets.DrawLineHorizontal(0f, 100f, inRect.width); + + // Область для галереи + Rect galleryRect = new Rect(0f, 110f, inRect.width, inRect.height - 180f); + DrawGallery(galleryRect); + + // Кнопка обновления + if ( + Widgets.ButtonText( + new Rect(0f, inRect.height - 70f, inRect.width * 0.3f, 35f), + "AIImages.Window.Refresh".Translate() + ) + ) + { + LoadGallery(); + } + + // Кнопка удаления выбранного изображения + if ( + portraitTextures.Count > 0 + && selectedIndex >= 0 + && selectedIndex < portraitTextures.Count + && Widgets.ButtonText( + new Rect(inRect.width * 0.32f, inRect.height - 70f, inRect.width * 0.3f, 35f), + "AIImages.Gallery.DeleteSelected".Translate() + ) + ) + { + DeleteSelectedImage(); + } + + // Кнопка удаления всех изображений + if ( + portraitTextures.Count > 0 + && Widgets.ButtonText( + new Rect(inRect.width * 0.64f, inRect.height - 70f, inRect.width * 0.36f, 35f), + "AIImages.Gallery.DeleteAll".Translate(portraitTextures.Count) + ) + ) + { + DeleteAllImages(); + } + } + + /// + /// Отрисовка галереи изображений + /// + private void DrawGallery(Rect rect) + { + if (portraitTextures.Count == 0) + { + Text.Anchor = TextAnchor.MiddleCenter; + GUI.color = new Color(1f, 1f, 1f, 0.5f); + Widgets.Label(rect, "AIImages.Gallery.Empty".Translate()); + GUI.color = Color.white; + Text.Anchor = TextAnchor.UpperLeft; + return; + } + + // Параметры сетки + int columns = 3; + int rows = Mathf.CeilToInt((float)portraitTextures.Count / columns); + float cellWidth = (rect.width - 40f) / columns; + float cellHeight = cellWidth + 40f; // Высота ячейки (изображение + кнопки) + float spacing = 10f; + float viewHeight = rows * cellHeight + spacing; + + Rect viewRect = new Rect(0f, 0f, rect.width - 20f, viewHeight); + + Widgets.BeginScrollView(rect, ref mainScrollPosition, viewRect); + + for (int i = 0; i < portraitTextures.Count; i++) + { + int row = i / columns; + int col = i % columns; + + float x = col * (cellWidth + spacing); + float y = row * cellHeight; + + Rect cellRect = new Rect(x, y, cellWidth, cellHeight); + DrawGalleryItem(cellRect, i); + } + + Widgets.EndScrollView(); + } + + /// + /// Отрисовка одного элемента галереи + /// + private void DrawGalleryItem(Rect rect, int index) + { + // Подсветка выбранного элемента + if (index == selectedIndex) + { + Widgets.DrawBoxSolid(rect, new Color(0.3f, 0.5f, 0.8f, 0.2f)); + Widgets.DrawBox(rect, 2); + } + else + { + Widgets.DrawBox(rect); + } + + // Изображение + Texture2D texture = portraitTextures[index]; + if (texture != null) + { + Rect imageRect = new Rect( + rect.x + 5f, + rect.y + 5f, + rect.width - 10f, + rect.width - 10f + ); + + // Клик по изображению для выбора + if (Widgets.ButtonInvisible(imageRect)) + { + selectedIndex = index; + } + + GUI.DrawTexture(imageRect, texture); + } + else + { + Rect errorRect = new Rect(rect.x + 5f, rect.y + 5f, rect.width - 10f, rect.width - 10f); + Widgets.DrawBoxSolid(errorRect, new Color(0.5f, 0f, 0f, 0.5f)); + Text.Anchor = TextAnchor.MiddleCenter; + GUI.color = Color.white; + Widgets.Label(errorRect, "AIImages.Gallery.LoadError".Translate()); + GUI.color = Color.white; + Text.Anchor = TextAnchor.UpperLeft; + } + + // Информация под изображением + Text.Font = GameFont.Tiny; + Text.Anchor = TextAnchor.UpperLeft; + float infoY = rect.y + rect.width - 5f; + + // Имя файла + string fileName = Path.GetFileName(portraitPaths[index]); + if (fileName.Length > 30) + { + fileName = fileName.Substring(0, 27) + "..."; + } + + Widgets.Label( + new Rect(rect.x + 5f, infoY, rect.width - 10f, 20f), + fileName + ); + + // Дата создания + if (File.Exists(portraitPaths[index])) + { + try + { + var fileInfo = new FileInfo(portraitPaths[index]); + string dateStr = fileInfo.CreationTime.ToString("dd.MM.yyyy HH:mm"); + Widgets.Label( + new Rect(rect.x + 5f, infoY + 15f, rect.width - 10f, 20f), + dateStr + ); + } + catch + { + // Игнорируем ошибки чтения даты + } + } + } + + /// + /// Удаляет выбранное изображение + /// + private void DeleteSelectedImage() + { + if (selectedIndex < 0 || selectedIndex >= portraitPaths.Count) + return; + + string path = portraitPaths[selectedIndex]; + + // Подтверждение + Find.WindowStack.Add( + Dialog_MessageBox.CreateConfirmation( + "AIImages.Gallery.ConfirmDelete".Translate(), + delegate + { + // Удаляем из файловой системы + if (File.Exists(path)) + { + try + { + File.Delete(path); + DebugLogger.Log($"[AI Gallery] Deleted file: {path}"); + } + catch (System.Exception ex) + { + Messages.Message( + "AIImages.Gallery.DeleteError".Translate(ex.Message), + MessageTypeDefOf.RejectInput + ); + return; + } + } + + // Удаляем из компонента пешки + PawnPortraitHelper.RemovePortrait(pawn, path); + + // Обновляем галерею + LoadGallery(); + + // Сбрасываем выбор + if (selectedIndex >= portraitTextures.Count) + { + selectedIndex = portraitTextures.Count - 1; + } + + Messages.Message( + "AIImages.Gallery.Deleted".Translate(), + MessageTypeDefOf.PositiveEvent + ); + }, + destructive: true + ) + ); + } + + /// + /// Удаляет все изображения + /// + private void DeleteAllImages() + { + // Подтверждение + Find.WindowStack.Add( + Dialog_MessageBox.CreateConfirmation( + "AIImages.Gallery.ConfirmDeleteAll".Translate(portraitPaths.Count), + delegate + { + // Удаляем все файлы + int deletedCount = 0; + foreach (var path in portraitPaths) + { + if (File.Exists(path)) + { + try + { + File.Delete(path); + deletedCount++; + } + catch (System.Exception ex) + { + DebugLogger.Warning( + $"[AI Gallery] Failed to delete file: {path}, Error: {ex.Message}" + ); + } + } + } + + // Очищаем компонент пешки + PawnPortraitHelper.ClearPortrait(pawn); + + // Обновляем галерею + LoadGallery(); + selectedIndex = 0; + + Messages.Message( + "AIImages.Gallery.AllDeleted".Translate(deletedCount), + MessageTypeDefOf.PositiveEvent + ); + }, + destructive: true + ) + ); + } + } +} diff --git a/Source/AIImages/Window_AIImage.cs b/Source/AIImages/Window_AIImage.cs index 2e8cce9..6b5f9e9 100644 --- a/Source/AIImages/Window_AIImage.cs +++ b/Source/AIImages/Window_AIImage.cs @@ -1293,8 +1293,8 @@ namespace AIImages ? "AIImages.Generation.Cancel".Translate() : "AIImages.Generation.Generate".Translate(); - // Основная кнопка генерации (занимает 70% ширины) - float buttonWidth = rect.width * 0.7f; + // Основная кнопка генерации (занимает 40% ширины) + float buttonWidth = rect.width * 0.4f; if (Widgets.ButtonText(new Rect(rect.x, curY, buttonWidth, 35f), buttonLabel)) { if (isGenerating) @@ -1303,9 +1303,25 @@ namespace AIImages StartGeneration(); } - // Отладочная кнопка (занимает 25% ширины) - float debugButtonWidth = rect.width * 0.25f; - float debugButtonX = rect.x + buttonWidth + 10f; + // Кнопка галереи + float galleryButtonWidth = rect.width * 0.35f; + float galleryButtonX = rect.x + buttonWidth + 10f; + int imageCount = PawnPortraitHelper.GetPortraitCount(pawn); + string galleryLabel = "AIImages.Gallery.OpenGallery".Translate(); + if (imageCount > 0) + { + galleryLabel += " " + "AIImages.Gallery.ImagesCount".Translate(imageCount); + } + + if (Widgets.ButtonText(new Rect(galleryButtonX, curY, galleryButtonWidth, 35f), galleryLabel)) + { + var galleryWindow = new Window_AIGallery(pawn); + Find.WindowStack.Add(galleryWindow); + } + + // Отладочная кнопка (занимает 20% ширины) + float debugButtonWidth = rect.width * 0.2f; + float debugButtonX = galleryButtonX + galleryButtonWidth + 10f; if (Widgets.ButtonText(new Rect(debugButtonX, curY, debugButtonWidth, 35f), "Debug")) { DebugAllPawns();