diff --git a/Assemblies/AIImages.dll b/Assemblies/AIImages.dll index 6c02d36..c014e8e 100644 Binary files a/Assemblies/AIImages.dll and b/Assemblies/AIImages.dll differ diff --git a/Languages/English/Keyed/AIImages.xml b/Languages/English/Keyed/AIImages.xml index 3c26cac..e3211d3 100644 --- a/Languages/English/Keyed/AIImages.xml +++ b/Languages/English/Keyed/AIImages.xml @@ -80,4 +80,7 @@ Show technical information Save generation history Save Path + 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) diff --git a/Languages/Russian/Keyed/AIImages.xml b/Languages/Russian/Keyed/AIImages.xml index 41333ff..f2f2d64 100644 --- a/Languages/Russian/Keyed/AIImages.xml +++ b/Languages/Russian/Keyed/AIImages.xml @@ -80,4 +80,7 @@ Показывать техническую информацию Сохранять историю генераций Путь для сохранения + Очистить все сгенерированные изображения + Вы уверены, что хотите удалить все сгенерированные портреты? Это действие нельзя отменить. + Успешно удалено {0} изображений портретов diff --git a/Source/AIImages/Helpers/PawnPortraitHelper.cs b/Source/AIImages/Helpers/PawnPortraitHelper.cs index 39b3240..426738f 100644 --- a/Source/AIImages/Helpers/PawnPortraitHelper.cs +++ b/Source/AIImages/Helpers/PawnPortraitHelper.cs @@ -86,5 +86,59 @@ namespace AIImages.Helpers comp.PortraitPath = null; } } + + /// + /// Очистить все сгенерированные портреты + /// + public static int ClearAllPortraits(string savePath) + { + int deletedCount = 0; + + // Очищаем компоненты всех пешек + if (Current.Game != null && Current.Game.Maps != null) + { + foreach (var map in Current.Game.Maps) + { + foreach (var pawn in map.mapPawns.AllPawns) + { + var comp = GetPortraitComp(pawn); + if (comp != null && comp.HasPortrait) + { + comp.PortraitPath = null; + } + } + } + } + + // Удаляем файлы из директории + string fullPath = Path.Combine(GenFilePaths.SaveDataFolderPath, savePath); + + if (Directory.Exists(fullPath)) + { + try + { + var files = Directory.GetFiles(fullPath, "*.png"); + foreach (var file in files) + { + try + { + File.Delete(file); + deletedCount++; + } + catch (System.Exception ex) + { + Log.Warning($"[AI Images] Failed to delete file {file}: {ex.Message}"); + } + } + Log.Message($"[AI Images] Deleted {deletedCount} portrait files"); + } + catch (System.Exception ex) + { + Log.Error($"[AI Images] Error cleaning portraits directory: {ex.Message}"); + } + } + + return deletedCount; + } } } diff --git a/Source/AIImages/UI/AIImagesSettingsUI.cs b/Source/AIImages/UI/AIImagesSettingsUI.cs index 2d10b37..8db4884 100644 --- a/Source/AIImages/UI/AIImagesSettingsUI.cs +++ b/Source/AIImages/UI/AIImagesSettingsUI.cs @@ -366,6 +366,14 @@ namespace AIImages listingStandard.Label("AIImages.Settings.SavePath".Translate() + ":"); settings.savePath = listingStandard.TextEntry(settings.savePath); + + listingStandard.Gap(12f); + + // Кнопка очистки всех изображений + if (listingStandard.ButtonText("AIImages.Settings.ClearAllImages".Translate())) + { + ClearAllGeneratedImages(settings); + } } private static void TestApiConnection( @@ -476,5 +484,23 @@ namespace AIImages selectedValue = availableValues[0]; } } + + private static void ClearAllGeneratedImages(AIImagesModSettings settings) + { + Find.WindowStack.Add( + Dialog_MessageBox.CreateConfirmation( + "AIImages.Settings.ClearAllImagesConfirm".Translate(), + delegate + { + int deletedCount = PawnPortraitHelper.ClearAllPortraits(settings.savePath); + Messages.Message( + "AIImages.Settings.ClearAllImagesSuccess".Translate(deletedCount), + MessageTypeDefOf.PositiveEvent + ); + }, + destructive: true + ) + ); + } } }