332 lines
5.0 KiB
Markdown
332 lines
5.0 KiB
Markdown
---
|
|
title: UI Syntax
|
|
type: docs
|
|
weight: 11
|
|
---
|
|
|
|
This page covers the complete syntax of Hytale's UI markup language.
|
|
|
|
## Comments
|
|
|
|
```
|
|
// Single line comment
|
|
|
|
/* Multi-line
|
|
comment */
|
|
```
|
|
|
|
## Variables
|
|
|
|
### Local Variables
|
|
|
|
Define variables with `@` prefix:
|
|
|
|
```
|
|
@MyNumber = 50;
|
|
@MyString = "Hello";
|
|
@MyColor = #ff5500;
|
|
@MyObject = (Key: value, Other: 123);
|
|
```
|
|
|
|
### Variable Types
|
|
|
|
| Type | Example |
|
|
|------|---------|
|
|
| Number | `@Size = 50;` |
|
|
| String | `@Text = "Hello";` |
|
|
| Color | `@Color = #ff5500;` |
|
|
| Object | `@Obj = (Width: 100, Height: 50);` |
|
|
| Array | `@List = [item1, item2, item3];` |
|
|
| Boolean | `@Visible = true;` |
|
|
|
|
### Using Variables
|
|
|
|
Reference variables with `@`:
|
|
|
|
```
|
|
Group {
|
|
Anchor: (Height: @MyNumber);
|
|
Background: (Color: @MyColor);
|
|
}
|
|
```
|
|
|
|
## Imports
|
|
|
|
### Import Files
|
|
|
|
Use `$` prefix to import external files:
|
|
|
|
```
|
|
$Common = "Common.ui";
|
|
$Sounds = "../Sounds.ui";
|
|
$ClientCommon = "../../Common.ui";
|
|
```
|
|
|
|
### Reference Imported Variables
|
|
|
|
Access imported variables with dot notation:
|
|
|
|
```
|
|
$Common.@DefaultButtonStyle
|
|
$Sounds.@ButtonsLight
|
|
```
|
|
|
|
### Use Imported Templates
|
|
|
|
Instantiate templates from imports:
|
|
|
|
```
|
|
$Common.@TextButton {
|
|
@Text = "Click Me";
|
|
}
|
|
```
|
|
|
|
## Colors
|
|
|
|
### Hexadecimal
|
|
|
|
```
|
|
@Color1 = #ff5500; // RGB
|
|
@Color2 = #ff5500ff; // RGBA
|
|
```
|
|
|
|
### With Opacity
|
|
|
|
```
|
|
@Color3 = #ff5500(0.5); // 50% opacity
|
|
@Color4 = #000000(0.8); // 80% opacity
|
|
```
|
|
|
|
## Objects
|
|
|
|
### Basic Object
|
|
|
|
```
|
|
@Style = (
|
|
FontSize: 16,
|
|
TextColor: #ffffff,
|
|
RenderBold: true
|
|
);
|
|
```
|
|
|
|
### Nested Objects
|
|
|
|
```
|
|
@ButtonStyle = (
|
|
Default: (
|
|
Background: (TexturePath: "Button.png", Border: 12)
|
|
),
|
|
Hovered: (
|
|
Background: (TexturePath: "ButtonHovered.png", Border: 12)
|
|
)
|
|
);
|
|
```
|
|
|
|
## Spread Operator
|
|
|
|
Use `...` to extend/merge objects:
|
|
|
|
```
|
|
@BaseStyle = (
|
|
FontSize: 16,
|
|
TextColor: #ffffff
|
|
);
|
|
|
|
@ExtendedStyle = (
|
|
...@BaseStyle, // Inherit all properties from @BaseStyle
|
|
RenderBold: true // Add/override properties
|
|
);
|
|
```
|
|
|
|
Spread works in any object context:
|
|
|
|
```
|
|
Style: (
|
|
...$Common.@DefaultButtonStyle,
|
|
Sounds: (
|
|
...$Sounds.@ButtonsLight,
|
|
Activate: (Volume: 10)
|
|
)
|
|
);
|
|
```
|
|
|
|
## Templates (Macros)
|
|
|
|
### Define a Template
|
|
|
|
Templates are reusable widget definitions with parameters:
|
|
|
|
```
|
|
@MyButton = TextButton {
|
|
@Text = ""; // Parameter with default
|
|
@Anchor = Anchor(); // Parameter with default
|
|
@Sounds = (); // Empty default
|
|
|
|
Style: @DefaultTextButtonStyle;
|
|
Anchor: (...@Anchor, Height: 44);
|
|
Text: @Text;
|
|
};
|
|
```
|
|
|
|
### Instantiate a Template
|
|
|
|
```
|
|
// Use with defaults
|
|
@MyButton {}
|
|
|
|
// Override parameters
|
|
@MyButton {
|
|
@Text = "Submit";
|
|
@Anchor = (Width: 200);
|
|
}
|
|
|
|
// From import
|
|
$Common.@TextButton {
|
|
@Text = %ui.button.confirm;
|
|
}
|
|
```
|
|
|
|
## Widget Declarations
|
|
|
|
### Basic Widget
|
|
|
|
```
|
|
WidgetType {
|
|
Property: value;
|
|
}
|
|
```
|
|
|
|
### Widget with ID
|
|
|
|
IDs start with `#` and allow targeting from Java. IDs must be in **UpperCamelCase** format (no hyphens or underscores):
|
|
|
|
```
|
|
Label #PlayerName {
|
|
Text: "Unknown";
|
|
}
|
|
|
|
// Valid IDs
|
|
#MainPanel
|
|
#ConfirmButton
|
|
#PlayerHealthBar
|
|
|
|
// Invalid IDs (will cause errors)
|
|
#main-panel // No hyphens allowed
|
|
#confirm_button // No underscores allowed
|
|
#playerhealthbar // Should be UpperCamelCase
|
|
```
|
|
|
|
### Nested Widgets
|
|
|
|
```
|
|
Group #Container {
|
|
Label #Title {
|
|
Text: "Header";
|
|
}
|
|
|
|
Group #Content {
|
|
Label {
|
|
Text: "Body text";
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Anonymous Widgets
|
|
|
|
Widgets without ID are anonymous:
|
|
|
|
```
|
|
Group {
|
|
Label { Text: "No ID"; }
|
|
}
|
|
```
|
|
|
|
## Selectors
|
|
|
|
Selectors are strings starting with `#` used to target elements:
|
|
|
|
```java
|
|
// In Java code
|
|
builder.set("#PlayerName", "Steve");
|
|
builder.append("#Container", "ui/child_template");
|
|
builder.clear("#Content");
|
|
```
|
|
|
|
## Translation Keys
|
|
|
|
Use `%` prefix for localized strings:
|
|
|
|
```
|
|
Label {
|
|
Text: %server.ui.shop.title;
|
|
}
|
|
|
|
TextButton {
|
|
Text: %client.button.confirm;
|
|
}
|
|
```
|
|
|
|
## Typed Constructors
|
|
|
|
Some complex types use function-style constructors:
|
|
|
|
```
|
|
// Style constructors
|
|
@Style = LabelStyle(FontSize: 16, TextColor: #fff);
|
|
@BtnStyle = ButtonStyle(Default: (...), Hovered: (...));
|
|
|
|
// Layout constructors
|
|
@Pad = Padding(Full: 10);
|
|
@Anch = Anchor(Width: 100, Height: 50);
|
|
|
|
// Visual constructors
|
|
@Bg = PatchStyle(TexturePath: "bg.png", Border: 12);
|
|
@Scroll = ScrollbarStyle(Size: 6, Spacing: 8);
|
|
```
|
|
|
|
## Complete Example
|
|
|
|
```
|
|
$Common = "Common.ui";
|
|
$Sounds = "Sounds.ui";
|
|
|
|
@PanelWidth = 400;
|
|
@PanelHeight = 300;
|
|
@TitleColor = #b4c8c9;
|
|
|
|
@PanelTitle = Label {
|
|
@Text = "";
|
|
|
|
Style: (
|
|
FontSize: 20,
|
|
TextColor: @TitleColor,
|
|
RenderBold: true,
|
|
HorizontalAlignment: Center
|
|
);
|
|
Text: @Text;
|
|
};
|
|
|
|
Group #MainPanel {
|
|
Anchor: (Width: @PanelWidth, Height: @PanelHeight);
|
|
Background: (TexturePath: "Panel.png", Border: 20);
|
|
LayoutMode: Top;
|
|
Padding: (Full: 16);
|
|
|
|
@PanelTitle {
|
|
@Text = %ui.panel.title;
|
|
}
|
|
|
|
Group #Content {
|
|
FlexWeight: 1;
|
|
LayoutMode: TopScrolling;
|
|
ScrollbarStyle: $Common.@DefaultScrollbarStyle;
|
|
}
|
|
|
|
$Common.@TextButton #ConfirmButton {
|
|
@Text = %ui.button.confirm;
|
|
@Sounds = $Sounds.@ButtonsLight;
|
|
}
|
|
}
|
|
```
|