Skip to content

Глава 3.1: Типы виджетов

Главная | Типы виджетов | Далее: Файлы Layout >>


Система GUI в DayZ построена на виджетах — переиспользуемых UI-компонентах, начиная от простых контейнеров и заканчивая сложными интерактивными элементами управления. Каждый видимый элемент на экране — это виджет, и знание полного каталога необходимо для создания UI модов.

Эта глава содержит полный справочник по всем типам виджетов, доступным в Enforce Script.


Как работают виджеты

Каждый виджет в DayZ наследует от базового класса Widget. Виджеты организованы в дерево «родитель-потомок», где корнем обычно является WorkspaceWidget, получаемый через GetGame().GetWorkspace().

У каждого типа виджета есть три связанных идентификатора:

ИдентификаторПримерИспользуется для
Класс скриптаTextWidgetСсылки в коде, приведение типов
Класс layoutTextWidgetClassОбъявления в файлах .layout
Константа TypeIDTextWidgetTypeIDПрограммное создание через CreateWidget()

В файлах .layout всегда используется имя класса layout (заканчивающееся на Class). В скриптах вы работаете с именем класса скрипта.


Виджеты-контейнеры / Компоновка

Виджеты-контейнеры содержат и организуют дочерние виджеты. Они сами не отображают контент (за исключением PanelWidget, который рисует цветной прямоугольник).

Класс скриптаКласс LayoutНазначение
WidgetWidgetClassАбстрактный базовый класс для всех виджетов. Никогда не создавайте экземпляр напрямую.
WorkspaceWidgetWorkspaceWidgetClassКорневое рабочее пространство. Получается через GetGame().GetWorkspace(). Используется для программного создания виджетов.
FrameWidgetFrameWidgetClassУниверсальный контейнер. Самый часто используемый виджет в DayZ.
PanelWidgetPanelWidgetClassЦветной прямоугольник. Используйте для фонов, разделителей, разграничителей.
WrapSpacerWidgetWrapSpacerWidgetClassПоточная компоновка. Располагает дочерние элементы последовательно с переносом, отступами и полями.
GridSpacerWidgetGridSpacerWidgetClassСеточная компоновка. Располагает дочерние элементы в сетке, определяемой Columns и Rows.
ScrollWidgetScrollWidgetClassПрокручиваемая область. Включает вертикальную/горизонтальную прокрутку дочернего контента.
SpacerBaseWidget--Абстрактный базовый класс для WrapSpacerWidget и GridSpacerWidget.

FrameWidget

Рабочая лошадка UI DayZ. Используйте FrameWidget как контейнер по умолчанию, когда нужно сгруппировать виджеты. Он не имеет визуального представления — он чисто структурный.

Ключевые методы:

  • Все базовые методы Widget (позиция, размер, цвет, дочерние элементы, флаги)

Когда использовать: Практически везде. Оборачивайте группы связанных виджетов. Используйте как корень диалогов, панелей и элементов HUD.

c
// Найти frame-виджет по имени
FrameWidget panel = FrameWidget.Cast(root.FindAnyWidget("MyPanel"));
panel.Show(true);

PanelWidget

Видимый прямоугольник с заливкой цветом. В отличие от FrameWidget, PanelWidget действительно отображает что-то на экране.

Ключевые методы:

  • SetColor(int argb) — Установить цвет фона
  • SetAlpha(float alpha) — Установить прозрачность

Когда использовать: Фон за текстом, цветные разделители, прямоугольники наложения, тонирующие слои.

c
PanelWidget bg = PanelWidget.Cast(root.FindAnyWidget("Background"));
bg.SetColor(ARGB(200, 0, 0, 0));  // Полупрозрачный чёрный

WrapSpacerWidget

Автоматически располагает дочерние элементы в поточной компоновке. Дочерние элементы размещаются один за другим с переносом на следующую строку, когда место заканчивается.

Ключевые атрибуты компоновки:

  • Padding — Внутренние отступы (пиксели)
  • Margin — Внешние отступы (пиксели)
  • "Size To Content H" 1 — Изменить ширину под содержимое
  • "Size To Content V" 1 — Изменить высоту под содержимое
  • content_halign — Горизонтальное выравнивание содержимого (left, center, right)
  • content_valign — Вертикальное выравнивание содержимого (top, center, bottom)

Когда использовать: Динамические списки, облака тегов, ряды кнопок, любая компоновка с элементами разного размера.

GridSpacerWidget

Располагает дочерние элементы в фиксированной сетке. Каждая ячейка имеет одинаковый размер.

Ключевые атрибуты компоновки:

  • Columns — Количество столбцов
  • Rows — Количество строк
  • Margin — Расстояние между ячейками
  • "Size To Content V" 1 — Изменить высоту под содержимое

Когда использовать: Сетки инвентаря, галереи иконок, панели настроек с однородными строками.

ScrollWidget

Обеспечивает прокручиваемую область для контента, превышающего видимую область.

Ключевые атрибуты компоновки:

  • "Scrollbar V" 1 — Включить вертикальную полосу прокрутки
  • "Scrollbar H" 1 — Включить горизонтальную полосу прокрутки

Ключевые методы:

  • VScrollToPos(float pos) — Прокрутить до вертикальной позиции
  • GetVScrollPos() — Получить текущую позицию вертикальной прокрутки
  • GetContentHeight() — Получить полную высоту содержимого
  • VScrollStep(int step) — Прокрутить на величину шага

Когда использовать: Длинные списки, панели конфигурации, окна чата, просмотрщики логов.


Виджеты отображения

Виджеты отображения показывают контент пользователю, но не являются интерактивными.

Класс скриптаКласс LayoutНазначение
TextWidgetTextWidgetClassОднострочное отображение текста
MultilineTextWidgetMultilineTextWidgetClassМногострочный текст только для чтения
RichTextWidgetRichTextWidgetClassТекст со встроенными изображениями (теги <image>)
ImageWidgetImageWidgetClassОтображение изображений (из imageset-ов или файлов)
CanvasWidgetCanvasWidgetClassПрограммируемая поверхность рисования
VideoWidgetVideoWidgetClassВоспроизведение видеофайлов
RTTextureWidgetRTTextureWidgetClassПоверхность рендера в текстуру
RenderTargetWidgetRenderTargetWidgetClassЦель рендера 3D-сцены
ItemPreviewWidgetItemPreviewWidgetClass3D-превью предмета DayZ
PlayerPreviewWidgetPlayerPreviewWidgetClass3D-превью модели персонажа
MapWidgetMapWidgetClassИнтерактивная карта мира

TextWidget

Самый распространённый виджет отображения. Показывает одну строку текста.

Ключевые методы:

c
TextWidget tw;
tw.SetText("Hello World");
tw.GetText();                           // Возвращает string
tw.GetTextSize(out int w, out int h);   // Размеры отрисованного текста в пикселях
tw.SetTextExactSize(float size);        // Установить размер шрифта в пикселях
tw.SetOutline(int size, int color);     // Добавить обводку текста
tw.GetOutlineSize();                    // Возвращает int
tw.GetOutlineColor();                   // Возвращает int (ARGB)
tw.SetColor(int argb);                  // Цвет текста

Ключевые атрибуты layout: text, font, "text halign", "text valign", "exact text", "exact text size", "bold text", "size to text h", "size to text v", wrap.

MultilineTextWidget

Отображает несколько строк текста только для чтения. Текст автоматически переносится по ширине виджета.

Когда использовать: Панели описания, текст справки, отображение логов.

RichTextWidget

Поддерживает встроенные изображения внутри текста с помощью тегов <image>. Также поддерживает перенос текста.

Ключевые атрибуты layout:

  • wrap 1 — Включить перенос слов

Использование в тексте:

"Health: <image set:dayz_gui image:iconHealth0 /> OK"

Когда использовать: Текст со статусом и иконками, форматированные сообщения, чат со встроенными изображениями.

ImageWidget

Отображает изображения из imageset-ов (атласов спрайтов) или загруженные из файлов.

Ключевые методы:

c
ImageWidget iw;
iw.SetImage(int index);                    // Переключение между image0, image1 и т.д.
iw.LoadImageFile(int slot, string path);   // Загрузить изображение из файла
iw.LoadMaskTexture(string path);           // Загрузить текстуру маски
iw.SetMaskProgress(float progress);        // 0-1 для переходов стирания/раскрытия

Ключевые атрибуты layout:

  • image0 "set:dayz_gui image:icon_refresh" — Изображение из imageset-а
  • mode blend — Режим смешивания (blend, additive, stretch)
  • "src alpha" 1 — Использовать альфа-канал исходника
  • stretch 1 — Растянуть изображение для заполнения виджета
  • "flip u" 1 — Отразить горизонтально
  • "flip v" 1 — Отразить вертикально

Когда использовать: Иконки, логотипы, фоны, маркеры на карте, индикаторы состояния.

CanvasWidget

Поверхность для рисования, где можно программно отрисовывать линии.

Ключевые методы:

c
CanvasWidget cw;
cw.DrawLine(float x1, float y1, float x2, float y2, float width, int color);
cw.Clear();

Когда использовать: Пользовательские графики, линии связи между узлами, отладочные оверлеи.

MapWidget

Полная интерактивная карта мира. Поддерживает панорамирование, масштабирование и преобразование координат.

Ключевые методы:

c
MapWidget mw;
mw.SetMapPos(vector pos);              // Центрировать на мировой позиции
mw.GetMapPos();                        // Текущая центральная позиция
mw.SetScale(float scale);             // Уровень масштабирования
mw.GetScale();                        // Текущий масштаб
mw.MapToScreen(vector world_pos);     // Мировые координаты в экранные
mw.ScreenToMap(vector screen_pos);    // Экранные координаты в мировые

Когда использовать: Карты миссий, GPS-системы, выбор локаций.

ItemPreviewWidget

Отрисовывает 3D-превью любого предмета инвентаря DayZ.

Когда использовать: Экраны инвентаря, превью лута, интерфейсы магазинов.

PlayerPreviewWidget

Отрисовывает 3D-превью модели персонажа игрока.

Когда использовать: Экраны создания персонажа, превью экипировки, системы гардероба.

RTTextureWidget

Отрисовывает своих потомков в поверхность текстуры, а не напрямую на экран.

Когда использовать: Рендер мини-карты, эффекты «картинка в картинке», компоновка UI вне экрана.


Интерактивные виджеты

Интерактивные виджеты реагируют на пользовательский ввод и генерируют события.

Класс скриптаКласс LayoutНазначение
ButtonWidgetButtonWidgetClassНажимаемая кнопка
CheckBoxWidgetCheckBoxWidgetClassБулевый флажок
EditBoxWidgetEditBoxWidgetClassОднострочный ввод текста
MultilineEditBoxWidgetMultilineEditBoxWidgetClassМногострочный ввод текста
PasswordEditBoxWidgetPasswordEditBoxWidgetClassМаскированный ввод пароля
SliderWidgetSliderWidgetClassГоризонтальный ползунок
XComboBoxWidgetXComboBoxWidgetClassВыпадающий список выбора
TextListboxWidgetTextListboxWidgetClassСписок с выбираемыми строками
ProgressBarWidgetProgressBarWidgetClassИндикатор прогресса
SimpleProgressBarWidgetSimpleProgressBarWidgetClassМинимальный индикатор прогресса

ButtonWidget

Основной интерактивный элемент управления. Поддерживает как мгновенное нажатие, так и режим переключения.

Ключевые методы:

c
ButtonWidget bw;
bw.SetText("Click Me");
bw.GetState();              // Возвращает bool (только для кнопок-переключателей)
bw.SetState(bool state);    // Установить состояние переключения

Ключевые атрибуты layout:

  • text "Label" — Текст метки кнопки
  • switch toggle — Сделать кнопку переключателем
  • style Default — Визуальный стиль

Генерируемые события: OnClick(Widget w, int x, int y, int button)

CheckBoxWidget

Булевый элемент управления переключением.

Ключевые методы:

c
CheckBoxWidget cb;
cb.IsChecked();                 // Возвращает bool
cb.SetChecked(bool checked);    // Установить состояние

Генерируемые события: OnChange(Widget w, int x, int y, bool finished)

EditBoxWidget

Однострочное поле ввода текста.

Ключевые методы:

c
EditBoxWidget eb;
eb.GetText();               // Возвращает string
eb.SetText("default");      // Установить текст

Генерируемые события: OnChange(Widget w, int x, int y, bool finished)finished равен true, когда нажат Enter.

SliderWidget

Горизонтальный ползунок для числовых значений.

Ключевые методы:

c
SliderWidget sw;
sw.GetCurrent();            // Возвращает float (0-1)
sw.SetCurrent(float val);   // Установить позицию

Ключевые атрибуты layout:

  • "fill in" 1 — Показать заполненную дорожку за ручкой
  • "listen to input" 1 — Реагировать на ввод мышью

Генерируемые события: OnChange(Widget w, int x, int y, bool finished)finished равен true, когда пользователь отпускает ползунок.

XComboBoxWidget

Выпадающий список выбора.

Ключевые методы:

c
XComboBoxWidget xcb;
xcb.AddItem("Option A");
xcb.AddItem("Option B");
xcb.SetCurrentItem(0);         // Выбрать по индексу
xcb.GetCurrentItem();          // Возвращает выбранный индекс
xcb.ClearAll();                // Удалить все элементы

TextListboxWidget

Прокручиваемый список текстовых строк. Поддерживает выбор и многоколоночные данные.

Ключевые методы:

c
TextListboxWidget tlb;
tlb.AddItem("Row text", null, 0);   // текст, userData, столбец
tlb.GetSelectedRow();               // Возвращает int (-1 если ничего не выбрано)
tlb.SetRow(int row);                // Выбрать строку
tlb.RemoveRow(int row);
tlb.ClearItems();

Генерируемые события: OnItemSelected

ProgressBarWidget

Отображает индикатор прогресса.

Ключевые методы:

c
ProgressBarWidget pb;
pb.SetCurrent(float value);    // 0-100

Когда использовать: Полосы загрузки, полосы здоровья, прогресс миссии, индикаторы перезарядки.


Полный справочник TypeID

Используйте эти константы с GetGame().GetWorkspace().CreateWidget() для программного создания виджетов:

FrameWidgetTypeID
TextWidgetTypeID
MultilineTextWidgetTypeID
MultilineEditBoxWidgetTypeID
RichTextWidgetTypeID
RenderTargetWidgetTypeID
ImageWidgetTypeID
VideoWidgetTypeID
RTTextureWidgetTypeID
ButtonWidgetTypeID
CheckBoxWidgetTypeID
SimpleProgressBarWidgetTypeID
ProgressBarWidgetTypeID
SliderWidgetTypeID
TextListboxWidgetTypeID
EditBoxWidgetTypeID
PasswordEditBoxWidgetTypeID
WorkspaceWidgetTypeID
GridSpacerWidgetTypeID
WrapSpacerWidgetTypeID
ScrollWidgetTypeID

Выбор правильного виджета

Мне нужно...Используйте этот виджет
Сгруппировать виджеты (невидимо)FrameWidget
Нарисовать цветной прямоугольникPanelWidget
Показать текстTextWidget
Показать многострочный текстMultilineTextWidget или RichTextWidget с wrap 1
Показать текст со встроенными иконкамиRichTextWidget
Отобразить изображение/иконкуImageWidget
Создать нажимаемую кнопкуButtonWidget
Создать переключатель (вкл/выкл)CheckBoxWidget или ButtonWidget с switch toggle
Принять текстовый вводEditBoxWidget
Принять многострочный текстовый вводMultilineEditBoxWidget
Принять парольPasswordEditBoxWidget
Позволить пользователю выбрать числоSliderWidget
Позволить пользователю выбрать из спискаXComboBoxWidget (выпадающий) или TextListboxWidget (видимый список)
Показать прогрессProgressBarWidget или SimpleProgressBarWidget
Расположить дочерние элементы потокомWrapSpacerWidget
Расположить дочерние элементы в сеткеGridSpacerWidget
Сделать контент прокручиваемымScrollWidget
Показать 3D-модель предметаItemPreviewWidget
Показать модель игрокаPlayerPreviewWidget
Показать карту мираMapWidget
Рисовать пользовательские линии/фигурыCanvasWidget
Рендерить в текстуруRTTextureWidget

Следующие шаги


Лучшие практики

  • Используйте FrameWidget как контейнер по умолчанию. Используйте PanelWidget только когда нужен видимый цветной фон.
  • Предпочитайте RichTextWidget вместо TextWidget, если в будущем могут понадобиться встроенные иконки — смена типов в существующем layout утомительна.
  • Всегда проверяйте на null после FindAnyWidget() и Cast(). Отсутствующие имена виджетов тихо возвращают null и вызывают крэши при следующем вызове метода.
  • Используйте WrapSpacerWidget для динамических списков и GridSpacerWidget для фиксированных сеток. Не позиционируйте дочерние элементы вручную в поточной компоновке.
  • Избегайте CanvasWidget для продакшн UI — он перерисовывается каждый кадр и не имеет батчинга. Используйте его только для отладочных оверлеев.

Теория и практика

КонцепцияТеорияРеальность
ScrollWidget автоматически прокручивается к контентуПолоса прокрутки появляется, когда контент превышает границыВы должны вызывать VScrollToPos() вручную для прокрутки к новому контенту; виджет не прокручивается автоматически при добавлении дочерних элементов
SliderWidget генерирует непрерывные событияOnChange вызывается на каждый пиксель перетаскиванияПараметр finished равен false во время перетаскивания и true при отпускании; обновляйте тяжёлую логику только при finished == true
XComboBoxWidget поддерживает много элементовВыпадающий список работает с любым количествомПроизводительность заметно падает при 100+ элементах; используйте TextListboxWidget для длинных списков
ItemPreviewWidget показывает любой предметПередайте любое classname для 3D-превьюВиджету нужна загруженная .p3d модель предмета; для моддированных предметов должен присутствовать их Data PBO
MapWidget — простое отображениеПросто показывает картуОн перехватывает весь ввод мыши по умолчанию; вы должны аккуратно управлять флагами IGNOREPOINTER, иначе он блокирует клики по перекрывающимся виджетам

Совместимость и влияние

  • Мультимод: TypeID виджетов — это константы движка, общие для всех модов. Два мода, создающие виджеты с одинаковым именем под одним родителем, столкнутся. Используйте уникальные имена виджетов с префиксом вашего мода.
  • Производительность: TextListboxWidget и ScrollWidget с сотнями дочерних элементов вызывают просадки кадров. Используйте пулинг и переиспользование виджетов для списков, превышающих 50 элементов.

Released under CC BY-SA 4.0 | Code examples under MIT License