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.
This commit is contained in:
Binary file not shown.
@@ -44,17 +44,14 @@
|
|||||||
<AIImages.Settings.ApiSectionTooltip>Configure connection to Stable Diffusion API</AIImages.Settings.ApiSectionTooltip>
|
<AIImages.Settings.ApiSectionTooltip>Configure connection to Stable Diffusion API</AIImages.Settings.ApiSectionTooltip>
|
||||||
<AIImages.Settings.ApiEndpoint>API Endpoint</AIImages.Settings.ApiEndpoint>
|
<AIImages.Settings.ApiEndpoint>API Endpoint</AIImages.Settings.ApiEndpoint>
|
||||||
<AIImages.Settings.TestConnection>Test Connection</AIImages.Settings.TestConnection>
|
<AIImages.Settings.TestConnection>Test Connection</AIImages.Settings.TestConnection>
|
||||||
<AIImages.Settings.LoadModels>Load Available Models</AIImages.Settings.LoadModels>
|
<AIImages.Settings.LoadFromApi>Load from API</AIImages.Settings.LoadFromApi>
|
||||||
<AIImages.Settings.Model>Model</AIImages.Settings.Model>
|
<AIImages.Settings.Model>Model</AIImages.Settings.Model>
|
||||||
<AIImages.Settings.NoModelSelected>No model selected</AIImages.Settings.NoModelSelected>
|
<AIImages.Settings.NoModelSelected>No model selected</AIImages.Settings.NoModelSelected>
|
||||||
<AIImages.Settings.LoadModelsFirst>Load models first</AIImages.Settings.LoadModelsFirst>
|
<AIImages.Settings.LoadModelsFirst>Load models first</AIImages.Settings.LoadModelsFirst>
|
||||||
<AIImages.Settings.LoadSamplersSchedulers>Load Samplers & Schedulers</AIImages.Settings.LoadSamplersSchedulers>
|
|
||||||
<AIImages.Settings.ConnectionSuccess>Successfully connected to API!</AIImages.Settings.ConnectionSuccess>
|
<AIImages.Settings.ConnectionSuccess>Successfully connected to API!</AIImages.Settings.ConnectionSuccess>
|
||||||
<AIImages.Settings.ConnectionFailed>Failed to connect to API. Check endpoint and ensure Stable Diffusion WebUI is running.</AIImages.Settings.ConnectionFailed>
|
<AIImages.Settings.ConnectionFailed>Failed to connect to API. Check endpoint and ensure Stable Diffusion WebUI is running.</AIImages.Settings.ConnectionFailed>
|
||||||
<AIImages.Settings.ModelsLoaded>Loaded {0} models from API</AIImages.Settings.ModelsLoaded>
|
<AIImages.Settings.AllLoaded>Loaded {0} models, {1} samplers and {2} schedulers from API</AIImages.Settings.AllLoaded>
|
||||||
<AIImages.Settings.NoModelsFound>No models found. Check API connection.</AIImages.Settings.NoModelsFound>
|
<AIImages.Settings.NothingLoaded>Nothing loaded. Check API connection.</AIImages.Settings.NothingLoaded>
|
||||||
<AIImages.Settings.SamplersSchedulersLoaded>Loaded {0} samplers and {1} schedulers from API</AIImages.Settings.SamplersSchedulersLoaded>
|
|
||||||
<AIImages.Settings.NoSamplersSchedulersFound>No samplers or schedulers found. Check API connection.</AIImages.Settings.NoSamplersSchedulersFound>
|
|
||||||
<AIImages.Settings.GenerationSection>Generation Settings</AIImages.Settings.GenerationSection>
|
<AIImages.Settings.GenerationSection>Generation Settings</AIImages.Settings.GenerationSection>
|
||||||
<AIImages.Settings.GenerationSectionTooltip>Configure image generation parameters</AIImages.Settings.GenerationSectionTooltip>
|
<AIImages.Settings.GenerationSectionTooltip>Configure image generation parameters</AIImages.Settings.GenerationSectionTooltip>
|
||||||
<AIImages.Settings.ArtStyle>Art Style</AIImages.Settings.ArtStyle>
|
<AIImages.Settings.ArtStyle>Art Style</AIImages.Settings.ArtStyle>
|
||||||
|
|||||||
@@ -44,17 +44,14 @@
|
|||||||
<AIImages.Settings.ApiSectionTooltip>Настройка подключения к API Stable Diffusion</AIImages.Settings.ApiSectionTooltip>
|
<AIImages.Settings.ApiSectionTooltip>Настройка подключения к API Stable Diffusion</AIImages.Settings.ApiSectionTooltip>
|
||||||
<AIImages.Settings.ApiEndpoint>Адрес API</AIImages.Settings.ApiEndpoint>
|
<AIImages.Settings.ApiEndpoint>Адрес API</AIImages.Settings.ApiEndpoint>
|
||||||
<AIImages.Settings.TestConnection>Проверить соединение</AIImages.Settings.TestConnection>
|
<AIImages.Settings.TestConnection>Проверить соединение</AIImages.Settings.TestConnection>
|
||||||
<AIImages.Settings.LoadModels>Загрузить доступные модели</AIImages.Settings.LoadModels>
|
<AIImages.Settings.LoadFromApi>Загрузить из API</AIImages.Settings.LoadFromApi>
|
||||||
<AIImages.Settings.Model>Модель</AIImages.Settings.Model>
|
<AIImages.Settings.Model>Модель</AIImages.Settings.Model>
|
||||||
<AIImages.Settings.NoModelSelected>Модель не выбрана</AIImages.Settings.NoModelSelected>
|
<AIImages.Settings.NoModelSelected>Модель не выбрана</AIImages.Settings.NoModelSelected>
|
||||||
<AIImages.Settings.LoadModelsFirst>Сначала загрузите модели</AIImages.Settings.LoadModelsFirst>
|
<AIImages.Settings.LoadModelsFirst>Сначала загрузите модели</AIImages.Settings.LoadModelsFirst>
|
||||||
<AIImages.Settings.LoadSamplersSchedulers>Загрузить сэмплеры и планировщики</AIImages.Settings.LoadSamplersSchedulers>
|
|
||||||
<AIImages.Settings.ConnectionSuccess>Успешное подключение к API!</AIImages.Settings.ConnectionSuccess>
|
<AIImages.Settings.ConnectionSuccess>Успешное подключение к API!</AIImages.Settings.ConnectionSuccess>
|
||||||
<AIImages.Settings.ConnectionFailed>Не удалось подключиться к API. Проверьте адрес и убедитесь, что Stable Diffusion WebUI запущен.</AIImages.Settings.ConnectionFailed>
|
<AIImages.Settings.ConnectionFailed>Не удалось подключиться к API. Проверьте адрес и убедитесь, что Stable Diffusion WebUI запущен.</AIImages.Settings.ConnectionFailed>
|
||||||
<AIImages.Settings.ModelsLoaded>Загружено {0} моделей из API</AIImages.Settings.ModelsLoaded>
|
<AIImages.Settings.AllLoaded>Загружено {0} моделей, {1} сэмплеров и {2} планировщиков из API</AIImages.Settings.AllLoaded>
|
||||||
<AIImages.Settings.NoModelsFound>Модели не найдены. Проверьте подключение к API.</AIImages.Settings.NoModelsFound>
|
<AIImages.Settings.NothingLoaded>Ничего не загружено. Проверьте подключение к API.</AIImages.Settings.NothingLoaded>
|
||||||
<AIImages.Settings.SamplersSchedulersLoaded>Загружено {0} сэмплеров и {1} планировщиков из API</AIImages.Settings.SamplersSchedulersLoaded>
|
|
||||||
<AIImages.Settings.NoSamplersSchedulersFound>Сэмплеры и планировщики не найдены. Проверьте подключение к API.</AIImages.Settings.NoSamplersSchedulersFound>
|
|
||||||
<AIImages.Settings.GenerationSection>Настройки генерации</AIImages.Settings.GenerationSection>
|
<AIImages.Settings.GenerationSection>Настройки генерации</AIImages.Settings.GenerationSection>
|
||||||
<AIImages.Settings.GenerationSectionTooltip>Настройка параметров генерации изображений</AIImages.Settings.GenerationSectionTooltip>
|
<AIImages.Settings.GenerationSectionTooltip>Настройка параметров генерации изображений</AIImages.Settings.GenerationSectionTooltip>
|
||||||
<AIImages.Settings.ArtStyle>Художественный стиль</AIImages.Settings.ArtStyle>
|
<AIImages.Settings.ArtStyle>Художественный стиль</AIImages.Settings.ArtStyle>
|
||||||
|
|||||||
@@ -70,18 +70,13 @@ namespace AIImages
|
|||||||
_ = TestApiConnection(settings.apiEndpoint);
|
_ = TestApiConnection(settings.apiEndpoint);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (listingStandard.ButtonText("AIImages.Settings.LoadModels".Translate()))
|
if (listingStandard.ButtonText("AIImages.Settings.LoadFromApi".Translate()))
|
||||||
{
|
{
|
||||||
_ = LoadModelsFromApi(settings);
|
_ = LoadAllFromApi(settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
DrawModelDropdown(listingStandard, settings);
|
DrawModelDropdown(listingStandard, settings);
|
||||||
|
|
||||||
if (listingStandard.ButtonText("AIImages.Settings.LoadSamplersSchedulers".Translate()))
|
|
||||||
{
|
|
||||||
_ = LoadSamplersAndSchedulers(settings);
|
|
||||||
}
|
|
||||||
|
|
||||||
listingStandard.Gap(12f);
|
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
|
AIImagesModSettings settings
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
try
|
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);
|
var models = await AIImagesMod.ApiService.GetAvailableModels(settings.apiEndpoint);
|
||||||
settings.availableModels = models;
|
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(
|
Messages.Message(
|
||||||
"AIImages.Settings.ModelsLoaded".Translate(models.Count),
|
"AIImages.Settings.AllLoaded".Translate(
|
||||||
|
models.Count,
|
||||||
|
samplers.Count,
|
||||||
|
schedulers.Count
|
||||||
|
),
|
||||||
MessageTypeDefOf.PositiveEvent
|
MessageTypeDefOf.PositiveEvent
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Автовыбор модели
|
||||||
if (
|
if (
|
||||||
(
|
(
|
||||||
string.IsNullOrEmpty(settings.selectedModel)
|
string.IsNullOrEmpty(settings.selectedModel)
|
||||||
@@ -403,53 +418,8 @@ namespace AIImages
|
|||||||
{
|
{
|
||||||
settings.selectedModel = models[0];
|
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 (
|
if (
|
||||||
(
|
(
|
||||||
string.IsNullOrEmpty(settings.selectedSampler)
|
string.IsNullOrEmpty(settings.selectedSampler)
|
||||||
@@ -461,6 +431,7 @@ namespace AIImages
|
|||||||
settings.selectedSampler = samplers[0];
|
settings.selectedSampler = samplers[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Автовыбор scheduler
|
||||||
if (
|
if (
|
||||||
(
|
(
|
||||||
string.IsNullOrEmpty(settings.selectedScheduler)
|
string.IsNullOrEmpty(settings.selectedScheduler)
|
||||||
@@ -475,7 +446,7 @@ namespace AIImages
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
Messages.Message(
|
Messages.Message(
|
||||||
"AIImages.Settings.NoSamplersSchedulersFound".Translate(),
|
"AIImages.Settings.NothingLoaded".Translate(),
|
||||||
MessageTypeDefOf.RejectInput
|
MessageTypeDefOf.RejectInput
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -483,7 +454,7 @@ namespace AIImages
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Messages.Message(
|
Messages.Message(
|
||||||
$"Error loading samplers/schedulers: {ex.Message}",
|
$"Error loading from API: {ex.Message}",
|
||||||
MessageTypeDefOf.RejectInput
|
MessageTypeDefOf.RejectInput
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ namespace AIImages
|
|||||||
public override Vector2 InitialSize => new Vector2(900f, 800f);
|
public override Vector2 InitialSize => new Vector2(900f, 800f);
|
||||||
|
|
||||||
private Vector2 scrollPosition = Vector2.zero;
|
private Vector2 scrollPosition = Vector2.zero;
|
||||||
|
private Vector2 promptScrollPosition = Vector2.zero;
|
||||||
private float copiedMessageTime = 0f;
|
private float copiedMessageTime = 0f;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -337,13 +338,29 @@ namespace AIImages
|
|||||||
generationSettings
|
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);
|
||||||
|
|
||||||
// Рисуем промпт в скроллируемой области если он длинный
|
Rect promptOuterRect = new Rect(rect.x, rect.y + curY, rect.width, promptBoxHeight);
|
||||||
Widgets.DrawBoxSolid(promptRect, new Color(0.1f, 0.1f, 0.1f, 0.5f));
|
Rect promptViewRect = new Rect(0f, 0f, rect.width - 20f, actualPromptHeight);
|
||||||
Widgets.Label(promptRect.ContractedBy(5f), promptText);
|
|
||||||
curY += promptHeight + 10f;
|
// Рисуем фон
|
||||||
|
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 (
|
if (
|
||||||
|
|||||||
Reference in New Issue
Block a user