diff --git a/Assemblies/AIImages.dll b/Assemblies/AIImages.dll index 8b8bc0f..8dbc707 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 3e9adf6..bc0560e 100644 --- a/Languages/English/Keyed/AIImages.xml +++ b/Languages/English/Keyed/AIImages.xml @@ -44,17 +44,14 @@ Configure 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 (