Skip to content

Kapitel 3.2: Layout-Dateiformat (.layout)

Startseite | << Zurück: Widget-Typen | Layout-Dateiformat | Weiter: Größe & Positionierung >>


Grundstruktur

Eine .layout-Datei definiert einen Baum von Widgets. Jede Datei hat genau ein Wurzel-Widget, das verschachtelte Kinder enthält.

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

Wichtige Regeln:

  1. Das Wurzelelement ist immer ein einzelnes Widget (typischerweise FrameWidgetClass).
  2. Widget-Typnamen verwenden den Layout-Klassennamen, der immer mit Class endet (z.B. FrameWidgetClass, TextWidgetClass, ButtonWidgetClass).
  3. Jedes Widget hat einen eindeutigen Namen nach seinem Typklassennamen.
  4. Attribute sind Schlüssel Wert-Paare, eines pro Zeile.
  5. Attributnamen mit Leerzeichen müssen in Anführungszeichen stehen: "text halign" center.
  6. String-Werte stehen in Anführungszeichen: text "Hello World".
  7. Numerische Werte stehen ohne Anführungszeichen: size 0.5 0.3.
  8. Kinder werden in { }-Blöcken nach den Attributen des Elternteils verschachtelt.

Attribut-Referenz

Positionierung & Größe

AttributWerteBeschreibung
positionx yWidget-Position (proportional 0-1 oder Pixelwerte)
sizew hWidget-Dimensionen (proportional 0-1 oder Pixelwerte)
halignleft_ref, center_ref, right_refHorizontaler Ausrichtungs-Referenzpunkt
valigntop_ref, center_ref, bottom_refVertikaler Ausrichtungs-Referenzpunkt
hexactpos0 oder 10 = proportionale X-Position, 1 = Pixel-X-Position
vexactpos0 oder 10 = proportionale Y-Position, 1 = Pixel-Y-Position
hexactsize0 oder 10 = proportionale Breite, 1 = Pixel-Breite
vexactsize0 oder 10 = proportionale Höhe, 1 = Pixel-Höhe
fixaspectfixwidth, fixheightSeitenverhältnis beibehalten durch Einschränkung einer Dimension
scaled0 oder 1Mit DayZ-UI-Skalierungseinstellung skalieren
priorityGanzzahlZ-Reihenfolge (höhere Werte werden oben gerendert)

Die hexactpos-, vexactpos-, hexactsize- und vexactsize-Flags sind die wichtigsten Attribute im gesamten Layout-System. Sie steuern, ob jede Dimension proportionale (0.0 - 1.0 relativ zum Elternteil) oder Pixel- (absolute Bildschirmpixel) Einheiten verwendet. Siehe 3.3 Größe & Positionierung für eine ausführliche Erklärung.

Visuelle Attribute

AttributWerteBeschreibung
visible0 oder 1Anfangs-Sichtbarkeit (0 = versteckt)
colorr g b aFarbe als vier Floats, jeweils 0.0 bis 1.0
styleStyle-NameVordefinierter visueller Style (z.B. Default, Colorable)
draggable0 oder 1Widget kann vom Benutzer gezogen werden
clipchildren0 oder 1Kind-Widgets an die Grenzen dieses Widgets beschneiden
inheritalpha0 oder 1Kinder erben den Alpha-Wert dieses Widgets
keepsafezone0 oder 1Widget innerhalb der Bildschirm-Sicherheitszone halten

Verhaltens-Attribute

AttributWerteBeschreibung
ignorepointer0 oder 1Widget ignoriert Mauseingabe (Klicks gehen hindurch)
disabled0 oder 1Widget ist deaktiviert
"no focus"0 oder 1Widget kann keinen Tastaturfokus erhalten

Text-Attribute

Diese gelten für TextWidgetClass, RichTextWidgetClass, MultilineTextWidgetClass, ButtonWidgetClass und andere texttragende Widgets.

AttributWerteBeschreibung
text"string"Standard-Textinhalt
font"pfad/zur/schrift"Schriftdateipfad
"text halign"left, center, rightHorizontale Textausrichtung innerhalb des Widgets
"text valign"top, center, bottomVertikale Textausrichtung innerhalb des Widgets
"bold text"0 oder 1Fette Darstellung
"italic text"0 oder 1Kursive Darstellung
"exact text"0 oder 1Exakte Pixel-Schriftgröße statt proportional verwenden
"exact text size"GanzzahlSchriftgröße in Pixeln (erfordert "exact text" 1)
"size to text h"0 oder 1Widget-Breite an Text anpassen
"size to text v"0 oder 1Widget-Höhe an Text anpassen
"text sharpness"FloatText-Rendering-Schärfe
wrap0 oder 1Wortumbruch aktivieren

Bild-Attribute

Diese gelten für ImageWidgetClass.

AttributWerteBeschreibung
image0"set:name image:name"Primärbild aus einem ImageSet
modeblend, additive, stretchBild-Mischmodus
"src alpha"0 oder 1Quell-Alpha-Kanal verwenden
stretch0 oder 1Bild auf Widget-Größe dehnen
filter0 oder 1Texturfilterung aktivieren
"flip u"0 oder 1Bild horizontal spiegeln
"flip v"0 oder 1Bild vertikal spiegeln
"clamp mode"clamp, wrapTextur-Kantenverhalten
"stretch mode"stretch_w_h, etc.Dehnungsmodus

Spacer-Attribute

Diese gelten für WrapSpacerWidgetClass und GridSpacerWidgetClass.

AttributWerteBeschreibung
PaddingGanzzahlInnerer Abstand in Pixeln
MarginGanzzahlAbstand zwischen Kind-Elementen in Pixeln
"Size To Content H"0 oder 1Breite an Kinder anpassen
"Size To Content V"0 oder 1Höhe an Kinder anpassen
content_halignleft, center, rightHorizontale Ausrichtung des Kind-Inhalts
content_valigntop, center, bottomVertikale Ausrichtung des Kind-Inhalts
ColumnsGanzzahlRasterspalten (nur GridSpacer)
RowsGanzzahlRasterzeilen (nur GridSpacer)

Button-Attribute

AttributWerteBeschreibung
switchtoggleMacht den Button zu einem Toggle (bleibt gedrückt)
styleStyle-NameVisueller Style für den Button

Slider-Attribute

AttributWerteBeschreibung
"fill in"0 oder 1Gefuellte Spur hinter dem Slider-Griff anzeigen
"listen to input"0 oder 1Auf Mauseingabe reagieren

Scroll-Attribute

AttributWerteBeschreibung
"Scrollbar V"0 oder 1Vertikale Scrollleiste anzeigen
"Scrollbar H"0 oder 1Horizontale Scrollleiste anzeigen

Skript-Integration

Das scriptclass-Attribut

Das scriptclass-Attribut bindet ein Widget an eine Enforce-Script-Klasse. Wenn das Layout geladen wird, erstellt die Engine eine Instanz dieser Klasse und ruft deren OnWidgetScriptInit(Widget w)-Methode auf.

FrameWidgetClass MyPanel {
 size 1 1
 scriptclass "MyPanelHandler"
}

Die Skript-Klasse muss von Managed erben und OnWidgetScriptInit implementieren:

c
class MyPanelHandler : Managed
{
    Widget m_Root;

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

Der ScriptParamsClass-Block

Parameter können vom Layout an die scriptclass über einen ScriptParamsClass-Block übergeben werden. Dieser Block erscheint als zweiter { }-Kindblock nach den Kindern des Widgets.

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

Die Skript-Klasse liest diese Parameter in OnWidgetScriptInit über das Skriptparameter-System des Widgets.

DabsFramework ViewBinding

In Mods, die DabsFramework MVC verwenden, verbindet das scriptclass "ViewBinding"-Muster Widgets mit den Dateneigenschaften eines ViewControllers:

TextWidgetClass StatusLabel {
 scriptclass "ViewBinding"
 "text halign" center
 {
  ScriptParamsClass {
   Binding_Name "StatusText"
   Two_Way_Binding 0
  }
 }
}
ParameterBeschreibung
Binding_NameName der ViewController-Eigenschaft, an die gebunden wird
Two_Way_Binding1 = UI-Änderungen werden an den Controller zurückgepusht
Relay_CommandFunktionsname am Controller, der bei Klick/Änderung des Widgets aufgerufen wird
Selected_ItemEigenschaft, an die das ausgewählte Element gebunden wird (für Listen)
Debug_Logging1 = ausführliches Logging für diese Bindung aktivieren

Kinder-Verschachtelung

Kinder werden in einem { }-Block nach den Attributen des Elternteils platziert. Mehrere Kinder können im selben Block existieren.

FrameWidgetClass Parent {
 size 1 1
 {
  TextWidgetClass Child1 {
   position 0 0
   size 1 0.1
   text "Erstes"
  }
  TextWidgetClass Child2 {
   position 0 0.1
   size 1 0.1
   text "Zweites"
  }
 }
}

Kinder werden immer relativ zu ihrem Elternteil positioniert. Ein Kind mit position 0 0 und size 1 1 (proportional) fuellt sein Elternteil vollständig.


Vollständig kommentiertes Beispiel

Hier ist eine vollständig kommentierte Layout-Datei für ein Benachrichtigungs-Panel -- die Art von UI, die Sie für eine Mod erstellen könnten:

// Wurzelcontainer -- unsichtbarer Frame der 30% der Bildschirmbreite abdeckt
// Horizontal zentriert, am oberen Bildschirmrand positioniert
FrameWidgetClass NotificationPanel {

 // Zu Beginn versteckt (Skript zeigt es an)
 visible 0

 // Keine Mausklicks auf Dinge hinter diesem Panel blockieren
 ignorepointer 1

 // Blauer Farbton (R=0.2, G=0.6, B=1.0, A=0.9)
 color 0.2 0.6 1.0 0.9

 // Position: 0 Pixel von links, 0 Pixel von oben
 position 0 0
 hexactpos 1
 vexactpos 1

 // Größe: 30% der Elternbreite, 30 Pixel hoch
 size 0.3 30
 hexactsize 0
 vexactsize 1

 // Horizontal innerhalb des Elternteils zentrieren
 halign center_ref

 // Kinder-Block
 {
  // Textlabel fuellt das gesamte Benachrichtigungs-Panel
  TextWidgetClass NotificationText {

   // Ebenfalls Mauseingabe ignorieren
   ignorepointer 1

   // Position am Ursprung relativ zum Elternteil
   position 0 0
   hexactpos 1
   vexactpos 1

   // Elternteil vollständig fuellen (proportional)
   size 1 1
   hexactsize 0
   vexactsize 0

   // Text in beide Richtungen zentrieren
   "text halign" center
   "text valign" center

   // Fette Schrift verwenden
   font "gui/fonts/Metron-Bold"

   // Standardtext (wird vom Skript überschrieben)
   text "Benachrichtigung"
  }
 }
}

Und hier ein komplexeres Beispiel -- ein Dialog mit Titelleiste, scrollbarem Inhalt und einem Schliessen-Button:

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
 {
  // Titelleisten-Zeile
  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 "Mein Dialog"
       font "gui/fonts/Metron"
       "text halign" center
       "text valign" center
      }
      ButtonWidgetClass CloseBtn {
       size 0.15 0.9
       halign right_ref
       text "X"
      }
     }
    }
   }
  }

  // Scrollbarer Inhaltsbereich
  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
    }
   }
  }
 }
}

Häufige Fehler

  1. Das Class-Suffix vergessen -- In Layouts schreiben Sie TextWidgetClass, nicht TextWidget.
  2. Proportionale und Pixelwerte mischen -- Wenn hexactsize 0, sind die Größenwerte 0.0-1.0 proportional. Wenn hexactsize 1, sind es Pixelwerte. 300 im proportionalen Modus zu verwenden bedeutet das 300-fache der Elternbreite.
  3. Mehrwort-Attribute nicht in Anführungszeichen setzen -- Schreiben Sie "text halign" center, nicht text halign center.
  4. ScriptParamsClass im falschen Block platzieren -- Es muss in einem separaten { }-Block nach dem Kinder-Block stehen, nicht darin.

Nächste Schritte

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