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 (