From 3434927342fe1f8562fd95760eb88457b206525b Mon Sep 17 00:00:00 2001 From: Leonid Pershin Date: Sun, 26 Oct 2025 18:38:18 +0300 Subject: [PATCH] Refactor AIImages mod to streamline API loading functionality, consolidating model, sampler, and scheduler loading into a single method. Update localized strings in English and Russian for improved clarity and consistency. Enhance UI with scrollable prompt display for better user experience. Update AIImages.dll to reflect these changes. --- Assemblies/AIImages.dll | Bin 70144 -> 69120 bytes Languages/English/Keyed/AIImages.xml | 9 +-- Languages/Russian/Keyed/AIImages.xml | 9 +-- Source/AIImages/UI/AIImagesSettingsUI.cs | 89 ++++++++--------------- Source/AIImages/Window_AIImage.cs | 29 ++++++-- 5 files changed, 59 insertions(+), 77 deletions(-) diff --git a/Assemblies/AIImages.dll b/Assemblies/AIImages.dll index 8b8bc0f28965e82e5a7a7892b2a19fe6228d64fe..8dbc70794504ea1c3ebe9ba6bec02e98a9dddbf6 100644 GIT binary patch delta 29201 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%0A{F^||`60;pqxKOZ86lDpA{ir+F(Mfw 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 delta 29757 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 connection to Stable Diffusion API API Endpoint Test Connection - Load Available Models + Load from API Model No model selected Load models first - Load Samplers & Schedulers Successfully connected to API! Failed to connect to API. Check endpoint and ensure Stable Diffusion WebUI is running. - Loaded {0} models from API - No models found. Check API connection. - Loaded {0} samplers and {1} schedulers from API - No samplers or schedulers found. Check API connection. + Loaded {0} models, {1} samplers and {2} schedulers from API + Nothing loaded. Check API connection. Generation Settings Configure image generation parameters Art Style diff --git a/Languages/Russian/Keyed/AIImages.xml b/Languages/Russian/Keyed/AIImages.xml index 33070b5..cd277ab 100644 --- a/Languages/Russian/Keyed/AIImages.xml +++ b/Languages/Russian/Keyed/AIImages.xml @@ -44,17 +44,14 @@ Настройка подключения к API Stable Diffusion Адрес API Проверить соединение - Загрузить доступные модели + Загрузить из API Модель Модель не выбрана Сначала загрузите модели - Загрузить сэмплеры и планировщики Успешное подключение к API! Не удалось подключиться к API. Проверьте адрес и убедитесь, что Stable Diffusion WebUI запущен. - Загружено {0} моделей из API - Модели не найдены. Проверьте подключение к API. - Загружено {0} сэмплеров и {1} планировщиков из API - Сэмплеры и планировщики не найдены. Проверьте подключение к API. + Загружено {0} моделей, {1} сэмплеров и {2} планировщиков из API + Ничего не загружено. Проверьте подключение к API. Настройки генерации Настройка параметров генерации изображений Художественный стиль diff --git a/Source/AIImages/UI/AIImagesSettingsUI.cs b/Source/AIImages/UI/AIImagesSettingsUI.cs index 3efd7c5..d09ffc1 100644 --- a/Source/AIImages/UI/AIImagesSettingsUI.cs +++ b/Source/AIImages/UI/AIImagesSettingsUI.cs @@ -70,18 +70,13 @@ namespace AIImages _ = TestApiConnection(settings.apiEndpoint); } - if (listingStandard.ButtonText("AIImages.Settings.LoadModels".Translate())) + if (listingStandard.ButtonText("AIImages.Settings.LoadFromApi".Translate())) { - _ = LoadModelsFromApi(settings); + _ = LoadAllFromApi(settings); } DrawModelDropdown(listingStandard, settings); - if (listingStandard.ButtonText("AIImages.Settings.LoadSamplersSchedulers".Translate())) - { - _ = LoadSamplersAndSchedulers(settings); - } - listingStandard.Gap(12f); } @@ -376,23 +371,43 @@ namespace AIImages } } - private static async System.Threading.Tasks.Task LoadModelsFromApi( + private static async System.Threading.Tasks.Task LoadAllFromApi( AIImagesModSettings settings ) { try { - Log.Message("[AI Images] Loading models from API..."); + Log.Message("[AI Images] Loading models, samplers and schedulers from API..."); + + // Загружаем модели var models = await AIImagesMod.ApiService.GetAvailableModels(settings.apiEndpoint); settings.availableModels = models; - if (models.Count > 0) + // Загружаем семплеры + var samplers = await AIImagesMod.ApiService.GetAvailableSamplers( + settings.apiEndpoint + ); + settings.availableSamplers = samplers; + + // Загружаем schedulers + var schedulers = await AIImagesMod.ApiService.GetAvailableSchedulers( + settings.apiEndpoint + ); + settings.availableSchedulers = schedulers; + + int totalCount = models.Count + samplers.Count + schedulers.Count; + if (totalCount > 0) { Messages.Message( - "AIImages.Settings.ModelsLoaded".Translate(models.Count), + "AIImages.Settings.AllLoaded".Translate( + models.Count, + samplers.Count, + schedulers.Count + ), MessageTypeDefOf.PositiveEvent ); + // Автовыбор модели if ( ( string.IsNullOrEmpty(settings.selectedModel) @@ -403,53 +418,8 @@ namespace AIImages { settings.selectedModel = models[0]; } - } - else - { - Messages.Message( - "AIImages.Settings.NoModelsFound".Translate(), - MessageTypeDefOf.RejectInput - ); - } - } - catch (Exception ex) - { - Messages.Message( - $"Error loading models: {ex.Message}", - MessageTypeDefOf.RejectInput - ); - } - } - - private static async System.Threading.Tasks.Task LoadSamplersAndSchedulers( - AIImagesModSettings settings - ) - { - try - { - Log.Message("[AI Images] Loading samplers and schedulers from API..."); - - var samplers = await AIImagesMod.ApiService.GetAvailableSamplers( - settings.apiEndpoint - ); - settings.availableSamplers = samplers; - - var schedulers = await AIImagesMod.ApiService.GetAvailableSchedulers( - settings.apiEndpoint - ); - settings.availableSchedulers = schedulers; - - int totalCount = samplers.Count + schedulers.Count; - if (totalCount > 0) - { - Messages.Message( - "AIImages.Settings.SamplersSchedulersLoaded".Translate( - samplers.Count, - schedulers.Count - ), - MessageTypeDefOf.PositiveEvent - ); + // Автовыбор семплера if ( ( string.IsNullOrEmpty(settings.selectedSampler) @@ -461,6 +431,7 @@ namespace AIImages settings.selectedSampler = samplers[0]; } + // Автовыбор scheduler if ( ( string.IsNullOrEmpty(settings.selectedScheduler) @@ -475,7 +446,7 @@ namespace AIImages else { Messages.Message( - "AIImages.Settings.NoSamplersSchedulersFound".Translate(), + "AIImages.Settings.NothingLoaded".Translate(), MessageTypeDefOf.RejectInput ); } @@ -483,7 +454,7 @@ namespace AIImages catch (Exception ex) { Messages.Message( - $"Error loading samplers/schedulers: {ex.Message}", + $"Error loading from API: {ex.Message}", MessageTypeDefOf.RejectInput ); } diff --git a/Source/AIImages/Window_AIImage.cs b/Source/AIImages/Window_AIImage.cs index 0719248..6dfca8a 100644 --- a/Source/AIImages/Window_AIImage.cs +++ b/Source/AIImages/Window_AIImage.cs @@ -49,6 +49,7 @@ namespace AIImages public override Vector2 InitialSize => new Vector2(900f, 800f); private Vector2 scrollPosition = Vector2.zero; + private Vector2 promptScrollPosition = Vector2.zero; private float copiedMessageTime = 0f; /// @@ -337,13 +338,29 @@ namespace AIImages generationSettings ); - float promptHeight = Mathf.Min(Text.CalcHeight(promptText, rect.width), 150f); - Rect promptRect = new Rect(rect.x, rect.y + curY, rect.width, promptHeight); + // Фиксированная высота для области промпта + float promptBoxHeight = 150f; + float actualPromptHeight = Text.CalcHeight(promptText, rect.width - 20f); - // Рисуем промпт в скроллируемой области если он длинный - Widgets.DrawBoxSolid(promptRect, new Color(0.1f, 0.1f, 0.1f, 0.5f)); - Widgets.Label(promptRect.ContractedBy(5f), promptText); - curY += promptHeight + 10f; + Rect promptOuterRect = new Rect(rect.x, rect.y + curY, rect.width, promptBoxHeight); + Rect promptViewRect = new Rect(0f, 0f, rect.width - 20f, actualPromptHeight); + + // Рисуем фон + Widgets.DrawBoxSolid(promptOuterRect, new Color(0.1f, 0.1f, 0.1f, 0.5f)); + + // Рисуем промпт с прокруткой + Widgets.BeginScrollView( + promptOuterRect.ContractedBy(5f), + ref promptScrollPosition, + promptViewRect + ); + Widgets.Label( + new Rect(0f, 0f, promptViewRect.width, promptViewRect.height), + promptText + ); + Widgets.EndScrollView(); + + curY += promptBoxHeight + 10f; // Кнопка копирования промпта if (