Skip to content

Chapter 3.2: Layout File Format (.layout)

Home | << Previous: Widget Types | Layout File Format | Next: Sizing & Positioning >>


Estrutura Basica

Um arquivo .layout define uma arvore de widgets. Todo arquivo tem exatamente um widget raiz, que contem filhos aninhados.

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

Regras principais:

  1. O elemento raiz e sempre um unico widget (tipicamente FrameWidgetClass).
  2. Nomes de tipo de widget usam o nome da classe de layout, que sempre termina com Class (ex: FrameWidgetClass, TextWidgetClass, ButtonWidgetClass).
  3. Cada widget tem um nome unico apos seu tipo de classe.
  4. Atributos sao pares chave valor, um por linha.
  5. Nomes de atributos contendo espacos devem ser citados: "text halign" center.
  6. Valores de string sao citados: text "Hello World".
  7. Valores numericos nao sao citados: size 0.5 0.3.
  8. Filhos sao aninhados dentro de blocos { } apos os atributos do pai.

Referencia de Atributos

Posicionamento e Dimensionamento

AtributoValoresDescricao
positionx yPosicao do widget (proporcional 0-1 ou valores em pixels)
sizew hDimensoes do widget (proporcional 0-1 ou valores em pixels)
halignleft_ref, center_ref, right_refPonto de referencia de alinhamento horizontal
valigntop_ref, center_ref, bottom_refPonto de referencia de alinhamento vertical
hexactpos0 ou 10 = posicao X proporcional, 1 = posicao X em pixels
vexactpos0 ou 10 = posicao Y proporcional, 1 = posicao Y em pixels
hexactsize0 ou 10 = largura proporcional, 1 = largura em pixels
vexactsize0 ou 10 = altura proporcional, 1 = altura em pixels
fixaspectfixwidth, fixheightManter proporcao restringindo uma dimensao
scaled0 ou 1Escalar com a configuracao de escala de UI do DayZ
priorityinteiroOrdem Z (valores maiores renderizam por cima)

As flags hexactpos, vexactpos, hexactsize e vexactsize sao os atributos mais importantes de todo o sistema de layout. Eles controlam se cada dimensao usa unidades proporcionais (0.0 - 1.0 relativas ao pai) ou em pixels (pixels absolutos da tela). Veja 3.3 Dimensionamento e Posicionamento para uma explicacao completa.

Atributos Visuais

AtributoValoresDescricao
visible0 ou 1Visibilidade inicial (0 = oculto)
colorr g b aCor como quatro floats, cada um de 0.0 a 1.0
stylenome do estiloEstilo visual predefinido (ex: Default, Colorable)
draggable0 ou 1Widget pode ser arrastado pelo usuario
clipchildren0 ou 1Recortar widgets filhos nos limites deste widget
inheritalpha0 ou 1Filhos herdam o valor alfa deste widget
keepsafezone0 ou 1Manter widget dentro da zona segura da tela

Atributos Comportamentais

AtributoValoresDescricao
ignorepointer0 ou 1Widget ignora entrada do mouse (cliques passam)
disabled0 ou 1Widget esta desabilitado
"no focus"0 ou 1Widget nao pode receber foco do teclado

Atributos de Texto

Estes se aplicam a TextWidgetClass, RichTextWidgetClass, MultilineTextWidgetClass, ButtonWidgetClass e outros widgets que contem texto.

AtributoValoresDescricao
text"string"Conteudo de texto padrao
font"caminho/da/fonte"Caminho do arquivo de fonte
"text halign"left, center, rightAlinhamento horizontal do texto dentro do widget
"text valign"top, center, bottomAlinhamento vertical do texto dentro do widget
"bold text"0 ou 1Renderizacao em negrito
"italic text"0 ou 1Renderizacao em italico
"exact text"0 ou 1Usar tamanho de fonte exato em pixels em vez de proporcional
"exact text size"inteiroTamanho da fonte em pixels (requer "exact text" 1)
"size to text h"0 ou 1Redimensionar largura do widget para caber no texto
"size to text v"0 ou 1Redimensionar altura do widget para caber no texto
"text sharpness"floatNitidez de renderizacao do texto
wrap0 ou 1Habilitar quebra de palavra

Atributos de Imagem

Estes se aplicam a ImageWidgetClass.

AtributoValoresDescricao
image0"set:nome image:nome"Imagem primaria de um imageset
modeblend, additive, stretchModo de blend da imagem
"src alpha"0 ou 1Usar o canal alfa de origem
stretch0 ou 1Esticar imagem para preencher o widget
filter0 ou 1Habilitar filtragem de textura
"flip u"0 ou 1Espelhar imagem horizontalmente
"flip v"0 ou 1Espelhar imagem verticalmente
"clamp mode"clamp, wrapComportamento de borda da textura
"stretch mode"stretch_w_h, etc.Modo de esticamento

Atributos de Spacer

Estes se aplicam a WrapSpacerWidgetClass e GridSpacerWidgetClass.

AtributoValoresDescricao
PaddinginteiroPadding interno em pixels
MargininteiroEspaco entre itens filhos em pixels
"Size To Content H"0 ou 1Redimensionar largura para corresponder aos filhos
"Size To Content V"0 ou 1Redimensionar altura para corresponder aos filhos
content_halignleft, center, rightAlinhamento horizontal do conteudo dos filhos
content_valigntop, center, bottomAlinhamento vertical do conteudo dos filhos
ColumnsinteiroColunas da grade (apenas GridSpacer)
RowsinteiroLinhas da grade (apenas GridSpacer)

Atributos de Botao

AtributoValoresDescricao
switchtoggleTorna o botao toggle (fica pressionado)
stylenome do estiloEstilo visual do botao

Atributos de Slider

AtributoValoresDescricao
"fill in"0 ou 1Mostrar trilha preenchida atras do handle do slider
"listen to input"0 ou 1Responder a entrada do mouse

Atributos de Scroll

AtributoValoresDescricao
"Scrollbar V"0 ou 1Mostrar barra de rolagem vertical
"Scrollbar H"0 ou 1Mostrar barra de rolagem horizontal

Integracao com Script

O Atributo scriptclass

O atributo scriptclass vincula um widget a uma classe Enforce Script. Quando o layout e carregado, o motor cria uma instancia daquela classe e chama seu metodo OnWidgetScriptInit(Widget w).

FrameWidgetClass MyPanel {
 size 1 1
 scriptclass "MyPanelHandler"
}

A classe de script deve herdar de Managed e implementar OnWidgetScriptInit:

c
class MyPanelHandler : Managed
{
    Widget m_Root;

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

O Bloco ScriptParamsClass

Parametros podem ser passados do layout para o scriptclass via um bloco ScriptParamsClass. Este bloco aparece como um segundo bloco { } filho apos os filhos do widget.

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

A classe de script le esses parametros em OnWidgetScriptInit usando o sistema de parametros de script do widget.

ViewBinding do DabsFramework

Em mods que usam DabsFramework MVC, o padrao scriptclass "ViewBinding" conecta widgets as propriedades de dados de um ViewController:

TextWidgetClass StatusLabel {
 scriptclass "ViewBinding"
 "text halign" center
 {
  ScriptParamsClass {
   Binding_Name "StatusText"
   Two_Way_Binding 0
  }
 }
}
ParametroDescricao
Binding_NameNome da propriedade do ViewController para vincular
Two_Way_Binding1 = mudancas na UI enviam de volta para o controller
Relay_CommandNome da funcao no controller para chamar quando o widget e clicado/alterado
Selected_ItemPropriedade para vincular o item selecionado (para listas)
Debug_Logging1 = habilitar logging detalhado para este binding

Aninhamento de Filhos

Filhos sao colocados dentro de um bloco { } apos os atributos do pai. Multiplos filhos podem existir no mesmo bloco.

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"
  }
 }
}

Filhos sao sempre posicionados relativos ao seu pai. Um filho com position 0 0 e size 1 1 (proporcional) preenche seu pai completamente.


Exemplo Completo Anotado

Aqui esta um arquivo de layout totalmente anotado para um painel de notificacao -- o tipo de UI que voce pode construir para um mod:

// Container raiz -- frame invisivel que cobre 30% da largura da tela
// Centralizado horizontalmente, posicionado no topo da tela
FrameWidgetClass NotificationPanel {

 // Comeca oculto (script vai mostra-lo)
 visible 0

 // Nao bloquear cliques do mouse em coisas atras deste painel
 ignorepointer 1

 // Cor azul (R=0.2, G=0.6, B=1.0, A=0.9)
 color 0.2 0.6 1.0 0.9

 // Posicao: 0 pixels da esquerda, 0 pixels do topo
 position 0 0
 hexactpos 1
 vexactpos 1

 // Tamanho: 30% da largura do pai, 30 pixels de altura
 size 0.3 30
 hexactsize 0
 vexactsize 1

 // Centralizar horizontalmente dentro do pai
 halign center_ref

 // Bloco de filhos
 {
  // Label de texto preenche todo o painel de notificacao
  TextWidgetClass NotificationText {

   // Tambem ignorar entrada do mouse
   ignorepointer 1

   // Posicao na origem relativa ao pai
   position 0 0
   hexactpos 1
   vexactpos 1

   // Preencher pai completamente (proporcional)
   size 1 1
   hexactsize 0
   vexactsize 0

   // Centralizar o texto em ambas direcoes
   "text halign" center
   "text valign" center

   // Usar uma fonte em negrito
   font "gui/fonts/Metron-Bold"

   // Texto padrao (sera sobrescrito por script)
   text "Notification"
  }
 }
}

E aqui um exemplo mais complexo -- um dialogo com barra de titulo, conteudo rolavel e um botao de fechar:

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
 {
  // Linha da barra de titulo
  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"
      }
     }
    }
   }
  }

  // Area de conteudo rolavel
  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
    }
   }
  }
 }
}

Erros Comuns

  1. Esquecer o sufixo Class -- Em layouts, escreva TextWidgetClass, nao TextWidget.
  2. Misturar valores proporcionais e em pixels -- Se hexactsize 0, os valores de size sao 0.0-1.0 proporcionais. Se hexactsize 1, sao valores em pixels. Usar 300 com modo proporcional significa 300x a largura do pai.
  3. Nao citar atributos de multiplas palavras -- Escreva "text halign" center, nao text halign center.
  4. Colocar ScriptParamsClass no bloco errado -- Deve estar em um bloco { } separado apos o bloco de filhos, nao dentro dele.

Proximos Passos

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