Skip to content

Capitulo 3.2: Formato de Archivos Layout (.layout)

Inicio | << Anterior: Tipos de Widget | Formato de Archivos Layout | Siguiente: Tamano y Posicionamiento >>


Estructura Basica

Un archivo .layout define un arbol de widgets. Cada archivo tiene exactamente un widget raiz, que contiene hijos anidados.

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

Reglas clave:

  1. El elemento raiz es siempre un unico widget (tipicamente FrameWidgetClass).
  2. Los nombres de tipo de widget usan el nombre de clase de layout, que siempre termina con Class (ej., FrameWidgetClass, TextWidgetClass, ButtonWidgetClass).
  3. Cada widget tiene un nombre unico que sigue a su tipo de clase.
  4. Los atributos son pares clave valor, uno por linea.
  5. Los nombres de atributos que contienen espacios deben estar entre comillas: "text halign" center.
  6. Los valores de string van entre comillas: text "Hello World".
  7. Los valores numericos no van entre comillas: size 0.5 0.3.
  8. Los hijos se anidan dentro de bloques { } despues de los atributos del padre.

Referencia de Atributos

Posicionamiento y Tamano

AtributoValoresDescripcion
positionx yPosicion del widget (proporcional 0-1 o valores en pixeles)
sizew hDimensiones del widget (proporcional 0-1 o valores en pixeles)
halignleft_ref, center_ref, right_refPunto de referencia de alineacion horizontal
valigntop_ref, center_ref, bottom_refPunto de referencia de alineacion vertical
hexactpos0 o 10 = posicion X proporcional, 1 = posicion X en pixeles
vexactpos0 o 10 = posicion Y proporcional, 1 = posicion Y en pixeles
hexactsize0 o 10 = ancho proporcional, 1 = ancho en pixeles
vexactsize0 o 10 = alto proporcional, 1 = alto en pixeles
fixaspectfixwidth, fixheightMantener la relacion de aspecto restringiendo una dimension
scaled0 o 1Escalar con la configuracion de escala de UI de DayZ
priorityenteroOrden Z (valores mas altos se renderizan encima)

Los flags hexactpos, vexactpos, hexactsize y vexactsize son los atributos mas importantes en todo el sistema de layouts. Controlan si cada dimension usa unidades proporcionales (0.0 - 1.0 relativo al padre) o de pixeles (pixeles absolutos de pantalla). Consulta 3.3 Tamano y Posicionamiento para una explicacion completa.

Atributos Visuales

AtributoValoresDescripcion
visible0 o 1Visibilidad inicial (0 = oculto)
colorr g b aColor como cuatro floats, cada uno de 0.0 a 1.0
stylenombre de estiloEstilo visual predefinido (ej., Default, Colorable)
draggable0 o 1El widget puede ser arrastrado por el usuario
clipchildren0 o 1Recortar widgets hijos a los limites de este widget
inheritalpha0 o 1Los hijos heredan el valor alfa de este widget
keepsafezone0 o 1Mantener el widget dentro de la zona segura de pantalla

Atributos de Comportamiento

AtributoValoresDescripcion
ignorepointer0 o 1El widget ignora la entrada del mouse (los clics pasan a traves)
disabled0 o 1El widget esta deshabilitado
"no focus"0 o 1El widget no puede recibir foco de teclado

Atributos de Texto

Estos aplican a TextWidgetClass, RichTextWidgetClass, MultilineTextWidgetClass, ButtonWidgetClass y otros widgets que contienen texto.

AtributoValoresDescripcion
text"string"Contenido de texto predeterminado
font"ruta/a/fuente"Ruta del archivo de fuente
"text halign"left, center, rightAlineacion horizontal del texto dentro del widget
"text valign"top, center, bottomAlineacion vertical del texto dentro del widget
"bold text"0 o 1Renderizado en negrita
"italic text"0 o 1Renderizado en italica
"exact text"0 o 1Usar tamano de fuente exacto en pixeles en lugar de proporcional
"exact text size"enteroTamano de fuente en pixeles (requiere "exact text" 1)
"size to text h"0 o 1Redimensionar ancho del widget para ajustar al texto
"size to text v"0 o 1Redimensionar alto del widget para ajustar al texto
"text sharpness"floatNitidez de renderizado del texto
wrap0 o 1Habilitar ajuste de palabras

Atributos de Imagen

Estos aplican a ImageWidgetClass.

AtributoValoresDescripcion
image0"set:nombre image:nombre"Imagen principal desde un imageset
modeblend, additive, stretchModo de mezcla de imagen
"src alpha"0 o 1Usar el canal alfa fuente
stretch0 o 1Estirar imagen para llenar el widget
filter0 o 1Habilitar filtrado de textura
"flip u"0 o 1Voltear imagen horizontalmente
"flip v"0 o 1Voltear imagen verticalmente
"clamp mode"clamp, wrapComportamiento de bordes de textura
"stretch mode"stretch_w_h, etc.Modo de estiramiento

Atributos de Espaciador

Estos aplican a WrapSpacerWidgetClass y GridSpacerWidgetClass.

AtributoValoresDescripcion
PaddingenteroPadding interno en pixeles
MarginenteroEspacio entre items hijos en pixeles
"Size To Content H"0 o 1Redimensionar ancho para coincidir con hijos
"Size To Content V"0 o 1Redimensionar alto para coincidir con hijos
content_halignleft, center, rightAlineacion horizontal del contenido hijo
content_valigntop, center, bottomAlineacion vertical del contenido hijo
ColumnsenteroColumnas de grilla (solo GridSpacer)
RowsenteroFilas de grilla (solo GridSpacer)

Atributos de Boton

AtributoValoresDescripcion
switchtoggleHace que el boton sea un toggle (permanece presionado)
stylenombre de estiloEstilo visual para el boton

Atributos de Slider

AtributoValoresDescripcion
"fill in"0 o 1Mostrar una pista rellena detras del handle del slider
"listen to input"0 o 1Responder a entrada del mouse

Atributos de Scroll

AtributoValoresDescripcion
"Scrollbar V"0 o 1Mostrar barra de scroll vertical
"Scrollbar H"0 o 1Mostrar barra de scroll horizontal

Integracion con Scripts

El Atributo scriptclass

El atributo scriptclass vincula un widget a una clase de Enforce Script. Cuando el layout se carga, el motor crea una instancia de esa clase y llama a su metodo OnWidgetScriptInit(Widget w).

FrameWidgetClass MyPanel {
 size 1 1
 scriptclass "MyPanelHandler"
}

La clase del script debe heredar de Managed e implementar OnWidgetScriptInit:

c
class MyPanelHandler : Managed
{
    Widget m_Root;

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

El Bloque ScriptParamsClass

Los parametros pueden pasarse desde el layout al scriptclass via un bloque ScriptParamsClass. Este bloque aparece como un segundo bloque hijo { } despues de los hijos del widget.

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

La clase del script lee estos parametros en OnWidgetScriptInit usando el sistema de parametros de script del widget.

ViewBinding de DabsFramework

En mods que usan DabsFramework MVC, el patron scriptclass "ViewBinding" conecta widgets a las propiedades de datos de un ViewController:

TextWidgetClass StatusLabel {
 scriptclass "ViewBinding"
 "text halign" center
 {
  ScriptParamsClass {
   Binding_Name "StatusText"
   Two_Way_Binding 0
  }
 }
}
ParametroDescripcion
Binding_NameNombre de la propiedad del ViewController a la que vincular
Two_Way_Binding1 = los cambios en la UI se propagan de vuelta al controlador
Relay_CommandNombre de funcion en el controlador a llamar cuando el widget es clickeado/cambiado
Selected_ItemPropiedad a la que vincular el item seleccionado (para listas)
Debug_Logging1 = habilitar logging detallado para este binding

Anidamiento de Hijos

Los hijos se colocan dentro de un bloque { } despues de los atributos del padre. Multiples hijos pueden existir en el mismo bloque.

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

Los hijos siempre se posicionan relativos a su padre. Un hijo con position 0 0 y size 1 1 (proporcional) llena a su padre completamente.


Ejemplo Completo Anotado

Aqui hay un archivo layout completamente anotado para un panel de notificaciones --- el tipo de UI que podrias construir para un mod:

// Contenedor raiz -- frame invisible que cubre 30% del ancho de pantalla
// Centrado horizontalmente, posicionado en la parte superior de la pantalla
FrameWidgetClass NotificationPanel {

 // Empieza oculto (el script lo mostrara)
 visible 0

 // No bloquear clics del mouse en cosas detras de este panel
 ignorepointer 1

 // Color con tinte azul (R=0.2, G=0.6, B=1.0, A=0.9)
 color 0.2 0.6 1.0 0.9

 // Posicion: 0 pixeles desde la izquierda, 0 pixeles desde arriba
 position 0 0
 hexactpos 1
 vexactpos 1

 // Tamano: 30% del ancho del padre, 30 pixeles de alto
 size 0.3 30
 hexactsize 0
 vexactsize 1

 // Centrar horizontalmente dentro del padre
 halign center_ref

 // Bloque de hijos
 {
  // Etiqueta de texto llena todo el panel de notificacion
  TextWidgetClass NotificationText {

   // Tambien ignorar entrada del mouse
   ignorepointer 1

   // Posicion en el origen relativo al padre
   position 0 0
   hexactpos 1
   vexactpos 1

   // Llenar el padre completamente (proporcional)
   size 1 1
   hexactsize 0
   vexactsize 0

   // Centrar el texto en ambas direcciones
   "text halign" center
   "text valign" center

   // Usar una fuente en negrita
   font "gui/fonts/Metron-Bold"

   // Texto predeterminado (sera sobreescrito por el script)
   text "Notification"
  }
 }
}

Y aqui hay un ejemplo mas complejo --- un dialogo con barra de titulo, contenido con scroll y un boton de cerrar:

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
 {
  // Fila de la 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 contenido con scroll
  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
    }
   }
  }
 }
}

Errores Comunes

  1. Olvidar el sufijo Class -- En layouts, escribe TextWidgetClass, no TextWidget.
  2. Mezclar valores proporcionales y de pixeles -- Si hexactsize 0, los valores de tamano son proporcionales 0.0-1.0. Si hexactsize 1, son valores en pixeles. Usar 300 con modo proporcional significa 300 veces el ancho del padre.
  3. No usar comillas en atributos de multiples palabras -- Escribe "text halign" center, no text halign center.
  4. Colocar ScriptParamsClass en el bloque equivocado -- Debe estar en un bloque { } separado despues del bloque de hijos, no dentro de el.

Siguientes Pasos

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