Skip to content

Глава 3.2: Формат файлов макетов (.layout)

Главная | << Предыдущая: Типы виджетов | Формат файлов макетов | Следующая: Размеры и позиционирование >>


Базовая структура

Файл .layout определяет дерево виджетов. Каждый файл имеет ровно один корневой виджет, содержащий вложенные дочерние элементы.

 WidgetTypeClass WidgetName {
 attribute value
 attribute "quoted value"
 {
  ChildWidgetTypeClass ChildName {
   attribute value
  }
 }
}

Ключевые правила:

  1. Корневой элемент --- всегда один виджет (обычно FrameWidgetClass).
  2. Имена типов виджетов используют имя класса макета, которое всегда заканчивается на Class (например, FrameWidgetClass, TextWidgetClass, ButtonWidgetClass).
  3. Каждый виджет имеет уникальное имя после своего типа класса.
  4. Атрибуты --- это пары ключ значение, по одному на строку.
  5. Имена атрибутов, содержащие пробелы, должны быть в кавычках: "text halign" center.
  6. Строковые значения заключаются в кавычки: text "Hello World".
  7. Числовые значения без кавычек: size 0.5 0.3.
  8. Дочерние элементы вложены внутри блоков { } после атрибутов родителя.

Справочник атрибутов

Позиционирование и размеры

АтрибутЗначенияОписание
positionx yПозиция виджета (пропорциональная 0-1 или пиксельные значения)
sizew hРазмеры виджета (пропорциональные 0-1 или пиксельные значения)
halignleft_ref, center_ref, right_refГоризонтальная точка привязки
valigntop_ref, center_ref, bottom_refВертикальная точка привязки
hexactpos0 или 10 = пропорциональная позиция X, 1 = пиксельная позиция X
vexactpos0 или 10 = пропорциональная позиция Y, 1 = пиксельная позиция Y
hexactsize0 или 10 = пропорциональная ширина, 1 = пиксельная ширина
vexactsize0 или 10 = пропорциональная высота, 1 = пиксельная высота
fixaspectfixwidth, fixheightСохранять пропорции, ограничивая одно измерение
scaled0 или 1Масштабировать с настройкой масштаба UI DayZ
priorityцелое числоZ-порядок (более высокие значения отрисовываются поверх)

Флаги hexactpos, vexactpos, hexactsize и vexactsize --- самые важные атрибуты во всей системе макетов. Они контролируют, использует ли каждое измерение пропорциональные (0.0 - 1.0 относительно родителя) или пиксельные (абсолютные пиксели экрана) единицы. См. 3.3 Размеры и позиционирование для подробного объяснения.

Визуальные атрибуты

АтрибутЗначенияОписание
visible0 или 1Начальная видимость (0 = скрыт)
colorr g b aЦвет в виде четырёх float, каждый 0.0 до 1.0
styleимя стиляПредопределённый визуальный стиль (напр., Default, Colorable)
draggable0 или 1Виджет может быть перетащен пользователем
clipchildren0 или 1Обрезать дочерние виджеты по границам этого виджета
inheritalpha0 или 1Дочерние наследуют значение альфа этого виджета
keepsafezone0 или 1Удерживать виджет в безопасной зоне экрана

Поведенческие атрибуты

АтрибутЗначенияОписание
ignorepointer0 или 1Виджет игнорирует ввод мыши (клики проходят сквозь)
disabled0 или 1Виджет отключён
"no focus"0 или 1Виджет не может получить фокус клавиатуры

Текстовые атрибуты

Применяются к TextWidgetClass, RichTextWidgetClass, MultilineTextWidgetClass, ButtonWidgetClass и другим виджетам с текстом.

АтрибутЗначенияОписание
text"строка"Текстовое содержимое по умолчанию
font"путь/к/шрифту"Путь к файлу шрифта
"text halign"left, center, rightГоризонтальное выравнивание текста внутри виджета
"text valign"top, center, bottomВертикальное выравнивание текста внутри виджета
"bold text"0 или 1Жирное отображение
"italic text"0 или 1Курсивное отображение
"exact text"0 или 1Использовать точный пиксельный размер шрифта вместо пропорционального
"exact text size"целое числоРазмер шрифта в пикселях (требует "exact text" 1)
"size to text h"0 или 1Изменить ширину виджета под текст
"size to text v"0 или 1Изменить высоту виджета под текст
"text sharpness"floatРезкость отрисовки текста
wrap0 или 1Включить перенос слов

Атрибуты изображения

Применяются к ImageWidgetClass.

АтрибутЗначенияОписание
image0"set:имя image:имя"Основное изображение из imageset
modeblend, additive, stretchРежим смешивания изображения
"src alpha"0 или 1Использовать исходный альфа-канал
stretch0 или 1Растянуть изображение для заполнения виджета
filter0 или 1Включить фильтрацию текстур
"flip u"0 или 1Отразить изображение по горизонтали
"flip v"0 или 1Отразить изображение по вертикали
"clamp mode"clamp, wrapПоведение краёв текстуры
"stretch mode"stretch_w_h, и т.д.Режим растягивания

Атрибуты спейсеров

Применяются к WrapSpacerWidgetClass и GridSpacerWidgetClass.

АтрибутЗначенияОписание
Paddingцелое числоВнутренний отступ в пикселях
Marginцелое числоРасстояние между дочерними элементами в пикселях
"Size To Content H"0 или 1Изменить ширину под содержимое
"Size To Content V"0 или 1Изменить высоту под содержимое
content_halignleft, center, rightГоризонтальное выравнивание содержимого
content_valigntop, center, bottomВертикальное выравнивание содержимого
Columnsцелое числоСтолбцы сетки (только GridSpacer)
Rowsцелое числоСтроки сетки (только GridSpacer)

Атрибуты кнопок

АтрибутЗначенияОписание
switchtoggleДелает кнопку переключаемой (остаётся нажатой)
styleимя стиляВизуальный стиль кнопки

Атрибуты ползунков

АтрибутЗначенияОписание
"fill in"0 или 1Показывать заполненную дорожку за ручкой ползунка
"listen to input"0 или 1Реагировать на ввод мыши

Атрибуты прокрутки

АтрибутЗначенияОписание
"Scrollbar V"0 или 1Показать вертикальную полосу прокрутки
"Scrollbar H"0 или 1Показать горизонтальную полосу прокрутки

Интеграция со скриптами

Атрибут scriptclass

Атрибут scriptclass привязывает виджет к классу Enforce Script. При загрузке макета движок создаёт экземпляр этого класса и вызывает его метод OnWidgetScriptInit(Widget w).

FrameWidgetClass MyPanel {
 size 1 1
 scriptclass "MyPanelHandler"
}

Класс скрипта должен наследовать от Managed и реализовать OnWidgetScriptInit:

c
class MyPanelHandler : Managed
{
    Widget m_Root;

    void OnWidgetScriptInit(Widget w)
    {
        m_Root = w;
    }
}

Блок ScriptParamsClass

Параметры могут быть переданы из макета в scriptclass через блок ScriptParamsClass. Этот блок появляется как второй дочерний блок { } после дочерних элементов виджета.

ImageWidgetClass Logo {
 image0 "set:dayz_gui image:DayZLogo"
 scriptclass "Bouncer"
 {
  ScriptParamsClass {
   amount 0.1
   speed 1
  }
 }
}

Класс скрипта считывает эти параметры в OnWidgetScriptInit, используя систему параметров скрипта виджета.

Привязка ViewBinding в DabsFramework

В модах, использующих DabsFramework MVC, паттерн scriptclass "ViewBinding" подключает виджеты к свойствам данных ViewController:

TextWidgetClass StatusLabel {
 scriptclass "ViewBinding"
 "text halign" center
 {
  ScriptParamsClass {
   Binding_Name "StatusText"
   Two_Way_Binding 0
  }
 }
}
ПараметрОписание
Binding_NameИмя свойства ViewController для привязки
Two_Way_Binding1 = изменения UI передаются обратно в контроллер
Relay_CommandИмя функции контроллера для вызова при клике/изменении виджета
Selected_ItemСвойство для привязки выбранного элемента (для списков)
Debug_Logging1 = включить подробное логирование для этой привязки

Вложение дочерних элементов

Дочерние элементы помещаются внутри блока { } после атрибутов родителя. В одном блоке может быть несколько дочерних элементов.

FrameWidgetClass Parent {
 size 1 1
 {
  TextWidgetClass Child1 {
   position 0 0
   size 1 0.1
   text "First"
  }
  TextWidgetClass Child2 {
   position 0 0.1
   size 1 0.1
   text "Second"
  }
 }
}

Дочерние элементы всегда позиционируются относительно родителя. Дочерний с position 0 0 и size 1 1 (пропорционально) заполняет родителя полностью.


Полный аннотированный пример

Вот полностью аннотированный файл макета для панели уведомлений --- такого типа UI, который вы можете создать для мода:

// Корневой контейнер -- невидимый фрейм, занимающий 30% ширины экрана
// Центрирован по горизонтали, расположен вверху экрана
FrameWidgetClass NotificationPanel {

 // Начать скрытым (скрипт покажет его)
 visible 0

 // Не блокировать клики мыши по объектам за этой панелью
 ignorepointer 1

 // Синий оттенок (R=0.2, G=0.6, B=1.0, A=0.9)
 color 0.2 0.6 1.0 0.9

 // Позиция: 0 пикселей от левого, 0 пикселей от верхнего края
 position 0 0
 hexactpos 1
 vexactpos 1

 // Размер: 30% ширины родителя, 30 пикселей высотой
 size 0.3 30
 hexactsize 0
 vexactsize 1

 // Центрировать по горизонтали внутри родителя
 halign center_ref

 // Блок дочерних элементов
 {
  // Текстовая метка заполняет всю панель уведомлений
  TextWidgetClass NotificationText {

   // Также игнорировать ввод мыши
   ignorepointer 1

   // Позиция в начале координат относительно родителя
   position 0 0
   hexactpos 1
   vexactpos 1

   // Заполнить родителя полностью (пропорционально)
   size 1 1
   hexactsize 0
   vexactsize 0

   // Центрировать текст в обоих направлениях
   "text halign" center
   "text valign" center

   // Использовать жирный шрифт
   font "gui/fonts/Metron-Bold"

   // Текст по умолчанию (будет переопределён скриптом)
   text "Notification"
  }
 }
}

А вот более сложный пример --- диалог с заголовком, прокручиваемым содержимым и кнопкой закрытия:

WrapSpacerWidgetClass MyDialog {
 clipchildren 1
 color 0.7059 0.7059 0.7059 0.7843
 size 0.35 0
 halign center_ref
 valign center_ref
 priority 998
 style Outline_1px_BlackBackground
 Padding 5
 "Size To Content H" 1
 "Size To Content V" 1
 content_halign center
 {
  // Строка заголовка
  FrameWidgetClass TitleBarRow {
   size 1 26
   hexactsize 0
   vexactsize 1
   draggable 1
   {
    PanelWidgetClass TitleBar {
     color 0.4196 0.6471 1 0.9412
     size 1 25
     style rover_sim_colorable
     {
      TextWidgetClass TitleText {
       size 0.85 0.9
       text "My Dialog"
       font "gui/fonts/Metron"
       "text halign" center
       "text valign" center
      }
      ButtonWidgetClass CloseBtn {
       size 0.15 0.9
       halign right_ref
       text "X"
      }
     }
    }
   }
  }

  // Прокручиваемая область содержимого
  ScrollWidgetClass ContentScroll {
   size 0.97 235
   hexactsize 0
   vexactsize 1
   "Scrollbar V" 1
   {
    WrapSpacerWidgetClass ContentItems {
     size 1 0
     hexactsize 0
     "Size To Content V" 1
    }
   }
  }
 }
}

Распространённые ошибки

  1. Забыт суффикс Class --- в макетах пишите TextWidgetClass, а не TextWidget.
  2. Смешивание пропорциональных и пиксельных значений --- если hexactsize 0, значения размера 0.0-1.0 пропорциональны. Если hexactsize 1, они пиксельные. Использование 300 с пропорциональным режимом означает 300x ширины родителя.
  3. Кавычки не заключены у многословных атрибутов --- пишите "text halign" center, а не text halign center.
  4. Размещение ScriptParamsClass в неправильном блоке --- он должен быть в отдельном блоке { } после блока дочерних элементов, а не внутри него.

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

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