Тема интерфейса редактора для инструментов
Наследование темы, иконки, масштаб и локальные переопределения.
Тема инструментов редактора
Панель EditorPlugin должна следовать текущей теме и масштабу редактора. Это отдельная задача от оформления интерфейса игры и веб-портала: Theme проекта игры не заменяет общую тему редактора.
Начать с наследования
Добавьте обычные Button, Label и Container в принадлежащий плагину EditorDock. Наследование темы уже даёт согласованные шрифты, цвета и состояния. Не назначайте каждому контролу собственный Theme без необходимости: так легко потерять состояния фокуса, disabled и hover.
Получайте текущую тему через EditorInterface.Singleton.GetEditorTheme(), а масштаб через GetEditorScale(). Иконки редактора находятся в типе темы EditorIcons. Перед чтением необязательной иконки используйте HasIcon, чтобы отсутствие имени не создало ошибку в логе.
Пример создаёт кнопку для уже существующего Tool-плагина. Вызывающий код добавляет её в свои контролы и удаляет вместе с панелью:
using System;
using Reckfell;
public static class EditorButtons
{
// Call from a Tool EditorPlugin; add the result to its owned controls.
public static Button Create(string text, string iconName = "Add")
{
if (!Engine.IsEditorHint())
throw new InvalidOperationException("Editor context required.");
var button = new Button { Text = text };
void Refresh()
{
var editor = EditorInterface.Singleton;
var theme = editor.GetEditorTheme();
button.Icon = theme.HasIcon(iconName, "EditorIcons")
? theme.GetIcon(iconName, "EditorIcons") : null;
button.CustomMinimumSize = new Vector2(0, 32 * editor.GetEditorScale());
}
button.ThemeChanged += Refresh;
Refresh();
return button;
}
}Текст передаётся извне: локализуйте его там, где определена команда. Ширина не фиксируется, чтобы длинная подпись могла увеличить минимальный размер; контейнер и доступная ширина всё равно должны быть проверены визуально. Высота учитывает текущий масштаб редактора.
ThemeChanged перечитывает иконку и размер. Это обновление данных по уведомлению, а не обещание поддержки всех переключений DPI и тем на любой ОС. В примере нет глобальной подписки на EditorSettings: обработчик принадлежит самой кнопке и уходит вместе с её панелью.
Локально изменить внешний вид
- Сначала используйте стандартный контрол и подходящий контейнер.
- Если стандартных состояний недостаточно, примените локальное theme override или подходящую вариацию темы.
- Перед изменением общего StyleBox создайте его копию. Изменение разделяемого ресурса темы может изменить другие контролы.
- Не считайте имя вариации из старой статьи обязательным для текущей темы. Проверьте её наличие и поведение в выбранном оформлении.
- Не задавайте вручную цвет текста только для normal: фокус, disabled, hover и контраст тоже должны оставаться читаемыми.
Что проверить перед публикацией инструмента
| Сценарий | Проверка |
|---|---|
| Обычный и длинный перевод | Подпись не обрезается, соседние кнопки и поля доступны. |
| Маленькое окно | Контейнер переносит или прокручивает содержимое по назначению; команды не исчезают за краем. |
| Масштаб интерфейса | Размеры, иконки и интервалы остаются согласованными; фиксированная ширина не ломает подписи. |
| Клавиатура | Видны фокус и порядок перехода; действие доступно без мыши, где это требуется. |
| Смена темы | Собственные цвета и скопированные стили перечитаны, а состояния контролов не смешались. |
| Выключение плагина | Панель, кнопки и их обработчики удалены; повторное включение не создаёт дубликаты. |
Для этой статьи выполнен функциональный прогон в установленном headless-редакторе: тема, иконка Add, fallback для неизвестной иконки, масштабированная высота, минимальная ширина длинного RU-текста, нативные сигналы и очистка панели. Реальные переключения темы/DPI, клавиатурная навигация и отрисованная вёрстка на разных ОС этим не проверены. Новые скриншоты интерфейса не добавлялись.
Полный жизненный цикл панели — в EditorPlugin и EditorDock; устройство встроенного интерфейса — в архитектуре редактора.