summaryrefslogtreecommitdiff
path: root/Base/usr/share
diff options
context:
space:
mode:
authorkleines Filmröllchen <filmroellchen@serenityos.org>2022-03-25 00:06:10 +0100
committerBrian Gianforcaro <b.gianfo@gmail.com>2022-03-31 22:13:49 -0700
commit426a09ca4a9bb890f5de5a0e22d7391baadb1f61 (patch)
tree9919d58270e41df502955c76e09d7142c91a78b7 /Base/usr/share
parent743922984c1e7b700df92b5a5eb7c6eb6f7813d0 (diff)
downloadserenity-426a09ca4a9bb890f5de5a0e22d7391baadb1f61.zip
Base: Extend and improve the GML documentation
This is a bundle of changes to the "new" GML documentation that I just noticed two hours ago. - Fix a bunch of typos, wording and style - Rework layout object documentation (they're not widgets!) - Document most of the common properties - Finish (as for now) GML syntax documentation - Extend GML usage explanation - Add symlink "GML" so that man gml works - Add a categorized GML page list to the introduction man page - Cross-link much more Much of the editing of existing docs is clearing up incorrect or imprecise statements. Note that because of massive changes in some places, git won't recognize renames as such.
Diffstat (limited to 'Base/usr/share')
-rw-r--r--Base/usr/share/man/man5/GML-CoreObject.md2
-rw-r--r--Base/usr/share/man/man5/GML-Define-property.md24
-rw-r--r--Base/usr/share/man/man5/GML-Define-widget.md20
-rw-r--r--Base/usr/share/man/man5/GML-Introduction.md65
-rw-r--r--Base/usr/share/man/man5/GML-Layout-HorizontalBoxLayout.md21
-rw-r--r--Base/usr/share/man/man5/GML-Layout-VerticalBoxLayout.md21
-rw-r--r--Base/usr/share/man/man5/GML-Layout.md19
-rw-r--r--Base/usr/share/man/man5/GML-Syntax.md229
-rw-r--r--Base/usr/share/man/man5/GML-Usage.md (renamed from Base/usr/share/man/man5/GML-Link-widget.md)16
-rw-r--r--Base/usr/share/man/man5/GML-Widget-Button.md15
-rw-r--r--Base/usr/share/man/man5/GML-Widget-CheckBox.md3
-rw-r--r--Base/usr/share/man/man5/GML-Widget-HorizontalBoxLayout.md19
-rw-r--r--Base/usr/share/man/man5/GML-Widget-HorizontalSeparator.md (renamed from Base/usr/share/man/man5/GML-Widget-HorizontalSeperator.md)4
-rw-r--r--Base/usr/share/man/man5/GML-Widget-VerticalBoxLayout.md19
-rw-r--r--Base/usr/share/man/man5/GML-Widget.md65
l---------Base/usr/share/man/man5/GML.md1
16 files changed, 430 insertions, 113 deletions
diff --git a/Base/usr/share/man/man5/GML-CoreObject.md b/Base/usr/share/man/man5/GML-CoreObject.md
index 520c2b7166..53e4ada731 100644
--- a/Base/usr/share/man/man5/GML-CoreObject.md
+++ b/Base/usr/share/man/man5/GML-CoreObject.md
@@ -1,6 +1,6 @@
## Name
-A brief description of Core::Object and how it relates to GML
+A brief description of Core::Object and how it relates to GML.
## Description
diff --git a/Base/usr/share/man/man5/GML-Define-property.md b/Base/usr/share/man/man5/GML-Define-property.md
index 5dcc3d17bc..de0869cc36 100644
--- a/Base/usr/share/man/man5/GML-Define-property.md
+++ b/Base/usr/share/man/man5/GML-Define-property.md
@@ -6,15 +6,35 @@ GML Property Definition
How to register property to a widget.
-**LIbGUI** widget definitions contain macros that define the properties that can be used for a given widget.
+**LibGUI** widget definitions contain macros that define the properties that can be used for a given widget. This is a useful feature to expose widget-type-specific configuration to GML.
-However, widgets also understand properties defined by their parents. Such as `x`, `y`, `name`, etc.
+Widgets understand all properties defined by their parents. Such as `x`, `y`, `name`, etc.
+
+## `REGISTER_*` macros
+
+There is one REGISTER macro for every generic property type, a list of which can be found in [GML Syntax(5)](help://man/5/GML-Syntax#Properties). If you need special behavior for one single property, it is usually enough to re-use one of the property types and do extra handling in the setter and getter.
+
+The general syntax of the macros is as follows:
+
+```cpp
+REGISTER_TYPENAME_PROPERTY(property_name, getter, setter [, additional parameters...]);
+```
+
+The macros are to be called in the constructor. `property_name` is a string that GML can use to set this property. `getter` is the name of a member function on this class that acts as a getter for the property. The getter receives value of the property's type, which is a C++ value for `int`, `string`, `readonly_string`, `enum`, and `bool`, or a JSON value for anything else. `setter` is the name of a member function on this class that acts as a setter for the property, taking no arguments and returning the exact type that the getter expects. It is not possible to omit either of the functions, but they may be no-ops if needed. For non-settable strings `REGISTER_READONLY_STRING_PROPERTY` is used.
+
+For some macros, additional parameters are required. Most of the macros and their parameters can be found in the `Core::Object` header; however some layout properties are situated in the `GUI::Layout` header.
## Examples
```cpp
+REGISTER_STRING_PROPERTY("alt_text", alt_text, set_alt_text);
+// The enum property requires that you specify all available enum fields plus their GML string representation.
REGISTER_ENUM_PROPERTY(
"button_style", button_style, set_button_style, Gfx::ButtonStyle,
{ Gfx::ButtonStyle::Normal, "Normal" },
{ Gfx::ButtonStyle::Coolbar, "Coolbar" });
```
+
+## See also
+
+- [GML Define widget(5)](help://man/5/GML-Define-widget)
diff --git a/Base/usr/share/man/man5/GML-Define-widget.md b/Base/usr/share/man/man5/GML-Define-widget.md
index 4628104c1e..a8c25605a0 100644
--- a/Base/usr/share/man/man5/GML-Define-widget.md
+++ b/Base/usr/share/man/man5/GML-Define-widget.md
@@ -4,7 +4,17 @@ Library or Application Defined Widgets
## Description
-Some applications and libraries find it useful to define their own **LibGUI** widgets.
+Some applications and libraries find it useful to define their own widgets.
+
+This is done using `REGISTER_WIDGET()`, just as in **LibGUI**. The syntax of the macro is as follows:
+
+```cpp
+REGISTER_WIDGET(namespace, class_name)
+```
+
+This means that every registered widget has to be placed in a namespace. For applications that usually do not need their own namespace, a common approach is to use the application name as the namespace for these registered widgets.
+
+Note that registered widgets need to be constructible without any arguments.
## Examples
@@ -17,9 +27,9 @@ Some applications and libraries find it useful to define their own **LibGUI** wi
}
```
-They are defined using `REGISTER_WIDGET()`, just as they are in **LIbGUI**.
-
```cpp
+// OutOfProcessWebView.cpp
+
REGISTER_WIDGET(Web, OutOfProcessWebView)
...
@@ -34,3 +44,7 @@ OutOfProcessWebView::OutOfProcessWebView()
...
```
+
+## See also
+
+- [GML Define property(5)](help://man/5/GML-Define-property)
diff --git a/Base/usr/share/man/man5/GML-Introduction.md b/Base/usr/share/man/man5/GML-Introduction.md
index 3b866e308b..6bdfbf0e2d 100644
--- a/Base/usr/share/man/man5/GML-Introduction.md
+++ b/Base/usr/share/man/man5/GML-Introduction.md
@@ -4,9 +4,9 @@ GUI Markup Language (GML)
## Description
-GML is Serenity's graphic user interface markup language. GML files are human-readable and have no easily detectable filemagic. The format is strongly influenced by QML, the Qt Modeling Language.
+GML is Serenity's graphic user interface (GUI) markup language. GML files are human-readable text files and have no easily detectable filemagic. The format is strongly influenced by QML, the Qt Modeling Language.
-It allows you to easily define GUI interfaces for your applications. It is easy to learn and link to your C++ code.
+It allows you to easily define GUI interfaces for your applications. It is easy to learn and use in C++.
You can easily add GML files to your project in Hack Studio either using
@@ -15,3 +15,64 @@ You can easily add GML files to your project in Hack Studio either using
Or right clicking on a folder in the TreeView and using
`New > GML File`
+
+## See also
+
+- [gml-format(1)](help://man/1/gml-format) formats your GML files.
+- [GML Playground(1)](help://man/1/Playground) is an interactive GML creation tool.
+
+### List of GML manpages
+
+- [Using GML](help://man/5/GML-Usage)
+- [GML syntax](help://man/5/GML-Syntax)
+- Extending GML
+ - [Define properties](help://man/5/GML-Define-property)
+ - [Define widgets](help://man/5/GML-Define-widget)
+- GML object and property reference
+ - [Core::Object](help://man/5/GML-CoreObject)
+ - Layouts
+ - [HorizontalBoxLayout](help://man/5/GML-Layout-HorizontalBoxLayout)
+ - [VerticalBoxLayout](help://man/5/GML-Layout-VerticalBoxLayout)
+ - Widgets
+ - [Breadcrumbbar](help://man/5/GML-Widget-Breadcrumbbar)
+ - [Button](help://man/5/GML-Widget-Button)
+ - [Calendar](help://man/5/GML-Widget-Calendar)
+ - [CheckBox](help://man/5/GML-Widget-CheckBox)
+ - [ColorInput](help://man/5/GML-Widget-ColorInput)
+ - [ComboBox](help://man/5/GML-Widget-ComboBox)
+ - [Frame](help://man/5/GML-Widget-Frame)
+ - [GroupBox](help://man/5/GML-Widget-GroupBox)
+ - [HorizontalProgressbar](help://man/5/GML-Widget-HorizontalProgressbar)
+ - [HorizontalSeparator](help://man/5/GML-Widget-HorizontalSeparator)
+ - [HorizontalSlider](help://man/5/GML-Widget-HorizontalSlider)
+ - [HorizontalSplitter](help://man/5/GML-Widget-HorizontalSplitter)
+ - [IconView](help://man/5/GML-Widget-IconView)
+ - [ImageWidget](help://man/5/GML-Widget-ImageWidget)
+ - [Label](help://man/5/GML-Widget-Label)
+ - [ListView](help://man/5/GML-Widget-ListView)
+ - [MultiView](help://man/5/GML-Widget-MultiView)
+ - [OpacitySlider](help://man/5/GML-Widget-OpacitySlider)
+ - [PasswordBox](help://man/5/GML-Widget-PasswordBox)
+ - [Progressbar](help://man/5/GML-Widget-Progressbar)
+ - [RadioButton](help://man/5/GML-Widget-RadioButton)
+ - [ScrollableContainerWidget](help://man/5/GML-Widget-ScrollableContainerWidget)
+ - [Scrollbar](help://man/5/GML-Widget-Scrollbar)
+ - [Slider](help://man/5/GML-Widget-Slider)
+ - [SpinBox](help://man/5/GML-Widget-SpinBox)
+ - [StackWidget](help://man/5/GML-Widget-StackWidget)
+ - [Statusbar](help://man/5/GML-Widget-Statusbar)
+ - [TableView](help://man/5/GML-Widget-TableView)
+ - [TabWidget](help://man/5/GML-Widget-TabWidget)
+ - [TextBox](help://man/5/GML-Widget-TextBox)
+ - [TextEditor](help://man/5/GML-Widget-TextEditor)
+ - [Toolbar](help://man/5/GML-Widget-Toolbar)
+ - [ToolbarContainer](help://man/5/GML-Widget-ToolbarContainer)
+ - [Tray](help://man/5/GML-Widget-Tray)
+ - [TreeView](help://man/5/GML-Widget-TreeView)
+ - [UrlBox](help://man/5/GML-Widget-UrlBox)
+ - [ValueSlider](help://man/5/GML-Widget-ValueSlider)
+ - [VerticalProgressbar](help://man/5/GML-Widget-VerticalProgressbar)
+ - [VerticalSeparator](help://man/5/GML-Widget-VerticalSeparator)
+ - [VerticalSlider](help://man/5/GML-Widget-VerticalSlider)
+ - [VerticalSplitter](help://man/5/GML-Widget-VerticalSplitter)
+ - [Widget](help://man/5/GML-Widget)
diff --git a/Base/usr/share/man/man5/GML-Layout-HorizontalBoxLayout.md b/Base/usr/share/man/man5/GML-Layout-HorizontalBoxLayout.md
new file mode 100644
index 0000000000..cee29347cd
--- /dev/null
+++ b/Base/usr/share/man/man5/GML-Layout-HorizontalBoxLayout.md
@@ -0,0 +1,21 @@
+## Name
+
+GML Horizontal Box Layout
+
+## Description
+
+Defines a horizontal GUI box layout. This is a layout object that lays out widgets side-by-side horizontally.
+
+## Examples
+
+```gml
+@GUI::Widget {
+ layout: @GUI::HorizontalBoxLayout {
+ spacing: 2
+ }
+}
+```
+
+## See also
+
+- [Layout](help://man/5/GML-Layout)
diff --git a/Base/usr/share/man/man5/GML-Layout-VerticalBoxLayout.md b/Base/usr/share/man/man5/GML-Layout-VerticalBoxLayout.md
new file mode 100644
index 0000000000..49731df478
--- /dev/null
+++ b/Base/usr/share/man/man5/GML-Layout-VerticalBoxLayout.md
@@ -0,0 +1,21 @@
+## Name
+
+GML Vertical Box Layout
+
+## Description
+
+Defines a vertical GUI box layout. This is a layout object that lays out widgets side-by-side vertically.
+
+## Examples
+
+```gml
+@GUI::Widget {
+ layout: @GUI::VerticalBoxLayout {
+ spacing: 2
+ }
+}
+```
+
+## See also
+
+- [Layout](help://man/5/GML-Layout)
diff --git a/Base/usr/share/man/man5/GML-Layout.md b/Base/usr/share/man/man5/GML-Layout.md
new file mode 100644
index 0000000000..33c94df459
--- /dev/null
+++ b/Base/usr/share/man/man5/GML-Layout.md
@@ -0,0 +1,19 @@
+## Name
+
+GML Layout object
+
+## Description
+
+Abstract base class for layout objects, not used directly. Common properties of all layout objects are defined here.
+
+## Registered properties
+
+| Property | Type | Possible values | Description |
+| -------- | ------- | --------------- | --------------------------------------------------- |
+| margins | margins | | Margins inside the container widget to the children |
+| spacing | int | | Spacing around each widget in the layout |
+
+## See also
+
+- [HorizontalBoxLayout](help://man/5/GML-Layout-HorizontalBoxLayout)
+- [VerticalBoxLayout](help://man/5/GML-Layout-VerticalBoxLayout)
diff --git a/Base/usr/share/man/man5/GML-Syntax.md b/Base/usr/share/man/man5/GML-Syntax.md
index 5c5e16e6b0..b236c595ae 100644
--- a/Base/usr/share/man/man5/GML-Syntax.md
+++ b/Base/usr/share/man/man5/GML-Syntax.md
@@ -1,39 +1,234 @@
## Name
-GML Basic Syntax
+GML Syntax
# Description
-How to write GML using proper syntax.
+Overview of the GML syntax.
## Basic Syntax
-Each widget begins with `@GUI::`, with the name of the widget following. To define the properties of this widget, we follow with curly brackets and a list of properties.
+For a start, GML can be thought of as a QML (Qt Markup Language) derivative. JSON is used as a sub-language in some places.
+
+Each widget (or `Core::Object`, more generally) begins with `@`, with the name of the widget following. As this name refers to an actual C++ class, we need to include namespaces and separate them with `::` as usual. To define the properties of this widget, we follow the object name with curly brackets and a list of properties.
+
+```gml
+// The base widget class, straight from LibGUI.
+@GUI::Widget {
+
+}
+// Some other common classes:
+@GUI::HorizontalBoxLayout {
+
+}
+// (for compactness)
+@GUI::Button {}
+@GUI::Label {}
+@GUI::TabWidget {}
+
+// If your application-specific widget is registered, you can do this:
+@MyApplication::CoolWidget {
+
+}
+```
+
+As seen above, C-style single line comments with `//` are possible.
+
+Inside an object, we declare the properties of the object as well as all of its children. The children are other widgets, specified plainly, while the properties take the form `key: value`. For almost all properties, the value is a JSON value, and each property expects a different kind of value. The documentation for each widget object contains information about the supported properties, their possible values, and what the properties do. Quite some properties are common to all widgets, see [GML-Widget(5)](help://man/5/GML-Widget).
+
+```gml
+// A 20x200 coolbar button with text.
+@GUI::Button {
+ width: 200
+ height: 20
+ text: "Operation failed successfully."
+ button_style: "Coolbar"
+}
+
+// Two tabs, named "Tab 1" and "Tab 2", each containing a label.
+@GUI::TabWidget {
+ min_width: 150
+ min_height: 200
+
+ @GUI::Label {
+ title: "Tab 1"
+ text: "This is the first tab"
+ }
+
+ @GUI::Label {
+ title: "Tab 2"
+ text: "This is the second tab. What did you expect?"
+ }
+}
+```
+
+For layouting purposes, we use the special property `layout` which takes a layout object instead of a JSON value. The exact positioning of the children not only depends on the layout, but also on the container widget type. A widget's documentation contains information about such special cases if they exist.
+
+```gml
+// Make a frame that has two buttons horizontally laid out.
+@GUI::Frame {
+ min_height: 16
+ min_width: 128
+
+ layout: @GUI::HorizontalBoxLayout {
+ // margin and spacing are frequent layouting properties.
+ spacing: 5
+ }
+ @GUI::Button {
+ text: "I'm the left button..."
+ }
+ @GUI::Button {
+ text: "...and I'm the right button!"
+ }
+}
+```
## Properties
-A property's `value` is required to be in the property's set `type`:
+A property's `value` is required to be either a JSON value or another object. Objects are only used for a few special properties which are documented with the widgets that need them.
+
+Among the supported JSON values, these types can be further distinguished:
-- `int`
-- `bool`
-- `string`
-- `readonly_string`
-- `enum`
-- `font_weight`
-- `text_alignment`
-- `text_wrapping`
-- `rect`
-- `size`
-- `margins`
+- `int`: Regular JSON integer, note that JSON floats are not currently used.
+- `bool`: Regular JSON boolean, may be enclosed in quotes but this is discouraged.
+- `string`: JSON string, also used as a basis for other types.
+- `readonly_string`: String-valued property that cannot be changed from C++ later.
+- `enum`: A JSON string with special semantics. This is always the value of some C++ enum, but it's enclosed in quotes.
+ - `font_weight`: Special case of `enum` for `Gfx::FontWeight`. One of `Thin`, `ExtraLight`, `Light`, `Regular`, `Medium`, `SemiBold`, `Bold`, `ExtraBold`, `Black`, `ExtraBlack`.
+ - `text_alignment`: Special case of `enum` for `Gfx::TextAlignment`. Supports values of the form `VerticalHorizontal`, where `Vertical` is the vertical alignment, one of `Center`, `Top`, `Bottom`, and `Horizontal` is the horizontal alignment, one of `Left`, `Right`, `Center`. The exception is the value `Center` (because `CenterCenter` is silly).
+ - `text_wrapping`: Special case of `enum` for `Gfx::TextWrapping`. One of `Wrap` or `DontWrap`.
+- `rect`: A JSON object of four `int`s specifying a rectangle. The keys are `x`, `y`, `width`, `height`.
+- `size`: A JSON array of two `int`s specifying two sizes in the format `[width, height]`.
+- `margins`: A JSON array or object specifying four-directional margins as `int`s. If this is a JSON object, the four keys `top`, `right`, `bottom`, `left` are used. If this is a JSON array, there can be one to four integers. These have the following meaning (see also `GUI::Margins`):
+ - `[ all_four_margins ]`
+ - `[ top_and_bottom, right_and_left ]`
+ - `[ top, right_and_left, bottom ]`
+ - `[ top, right, bottom, left ]`
-Properties are never ended with `;` or `,`, and the property name is never enclosed in quotes or double quotes.
+Properties are never ended with `;` or `,`, and the property key is never enclosed in quotes or double quotes.
-Properties are always surrounded by curly brackets (e.g. `{}`). If no properties are set however, no brackets are required.
+## See also
+
+- The SerenityOS source code is the best source of further information on GML. The GML parser and AST builder can be found in the `GML` subdirectory in the `LibGUI` library. The `AK` JSON parsers and data structures are used for all JSON values.
## Examples
+GML files can be found in the SerenityOS source tree with the `*.gml` extension.
+
```gml
@GUI::Widget {
name: "my_first_widget"
}
```
+
+```gml
+// A Browser window GML
+@GUI::Widget {
+ name: "browser"
+ fill_with_background_color: true
+ layout: @GUI::VerticalBoxLayout {}
+
+ @GUI::HorizontalSeparator {
+ name: "top_line"
+ fixed_height: 2
+ visible: false
+ }
+
+ @GUI::TabWidget {
+ name: "tab_widget"
+ container_margins: [0]
+ uniform_tabs: true
+ text_alignment: "CenterLeft"
+ }
+}
+```
+
+```gml
+// A SystemMonitor GML (abbreviated)
+// This makes use of quite some custom objects and properties.
+@GUI::Widget {
+ fill_with_background_color: true
+ layout: @GUI::VerticalBoxLayout {}
+
+ @GUI::Widget {
+ layout: @GUI::VerticalBoxLayout {
+ margins: [0, 4, 4]
+ }
+
+ @GUI::TabWidget {
+ name: "main_tabs"
+
+ @GUI::Widget {
+ title: "Processes"
+ name: "processes"
+
+ @GUI::TableView {
+ name: "process_table"
+ column_headers_visible: true
+ }
+ }
+
+ @GUI::Widget {
+ title: "Performance"
+ name: "performance"
+ background_role: "Button"
+ fill_with_background_color: true
+ layout: @GUI::VerticalBoxLayout {
+ margins: [4]
+ }
+
+ @GUI::GroupBox {
+ title: "CPU usage"
+ name: "cpu_graph"
+ layout: @GUI::VerticalBoxLayout {}
+ }
+
+ @GUI::GroupBox {
+ title: "Memory usage"
+ fixed_height: 120
+ layout: @GUI::VerticalBoxLayout {
+ margins: [6]
+ }
+
+ @SystemMonitor::GraphWidget {
+ stack_values: true
+ name: "memory_graph"
+ }
+ }
+
+ @SystemMonitor::MemoryStatsWidget {
+ name: "memory_stats"
+ // A custom property that refers back up to the GraphWidget for the memory graph.
+ memory_graph: "memory_graph"
+ }
+ }
+
+ @SystemMonitor::StorageTabWidget {
+ title: "Storage"
+ name: "storage"
+ layout: @GUI::VerticalBoxLayout {
+ margins: [4]
+ }
+
+ @GUI::TableView {
+ name: "storage_table"
+ }
+ }
+
+ @SystemMonitor::NetworkStatisticsWidget {
+ title: "Network"
+ name: "network"
+ }
+
+ @SystemMonitor::HardwareTabWidget {
+ // snip
+ }
+ }
+ }
+
+ @GUI::Statusbar {
+ segment_count: 3
+ name: "statusbar"
+ }
+}
+```
diff --git a/Base/usr/share/man/man5/GML-Link-widget.md b/Base/usr/share/man/man5/GML-Usage.md
index 6fcf198825..e36f346acc 100644
--- a/Base/usr/share/man/man5/GML-Link-widget.md
+++ b/Base/usr/share/man/man5/GML-Usage.md
@@ -1,36 +1,36 @@
## Name
-Linking to GML widgets
+GML Usage
## Description
-How to link to your GML widgets in C++
+How to use GML in SerenityOS C++ applications
## CMake
-Include `compile_gml()` your applications CMake file.
+Include `compile_gml()` your applications CMake file. The header file name and GML string name are not fixed but must follow this convention.
```cmake
-compile_gml(YourGMLFile.gml MyGML.h my_gml)
+compile_gml(MyApp.gml MyAppGML.h my_app_gml)
```
Include the name of the header file that will be compiled from your GML file in your `SOURCES`.
```cmake
set(SOURCES
- MyGML.h
+ MyAppGML.h
)
```
## C++
-You can then reference the variable you set (e.g. `calculator_gml`) in your main C++ file using `load_from_gml()`.
+You can then reference the variable you set (e.g. `my_app_gml`) in your main C++ file using `load_from_gml()`.
```cpp
-load_from_gml(my_gml);
+load_from_gml(my_app_gml);
```
-From there, you can use `find_descendant_of_type_named` to select widgets from your GML from their `name` property.
+From there, you can use `find_descendant_of_type_named` to select widgets from your GML by their `name` property.
```gml
@GUI::Button {
diff --git a/Base/usr/share/man/man5/GML-Widget-Button.md b/Base/usr/share/man/man5/GML-Widget-Button.md
index 1a8b07630d..05964f9575 100644
--- a/Base/usr/share/man/man5/GML-Widget-Button.md
+++ b/Base/usr/share/man/man5/GML-Widget-Button.md
@@ -19,15 +19,16 @@ Defines a GUI Button widget.
@GUI::Button {
name: "disabled_normal_button"
text: "Disabled"
- enabled: "false"
+ enabled: false
}
```
## Registered Properties
-| Property | Type | Possible values | Description |
-|--------------|--------|-----------------|------------------------------|
-| button_style | enum | Normal, Coolbar | Sets the style of the button |
-| text | string | Any string | Sets the label text |
-| checked | bool | true or false | |
-| checkable | bool | true or false | |
+| Property | Type | Possible values | Description |
+| ------------ | ------ | --------------- | ----------------------------------------------------------------------------------------------------- |
+| button_style | enum | Normal, Coolbar | Sets the style of the button |
+| text | string | Any string | Sets the label text |
+| checked | bool | true or false | Whether the button is checked; this only applies to checkable subclasses |
+| checkable | bool | true or false | Whether the button can be checked; this only applies to checkable subclasses |
+| exclusive | bool | true or false | Whether the button's check state is exclusive to its group; this only applies to checkable subclasses |
diff --git a/Base/usr/share/man/man5/GML-Widget-CheckBox.md b/Base/usr/share/man/man5/GML-Widget-CheckBox.md
index a150cec85f..b8937cacc8 100644
--- a/Base/usr/share/man/man5/GML-Widget-CheckBox.md
+++ b/Base/usr/share/man/man5/GML-Widget-CheckBox.md
@@ -30,3 +30,6 @@ Defines a GUI checkbox widget.
| Property | Type | Possible values | Description |
|----------|------|-----------------|--------------------------|
| autosize | bool | true or false | Determines if auto-sized |
+
+## See also
+- [GML Button](help://man/5/GML-Widget-Button)
diff --git a/Base/usr/share/man/man5/GML-Widget-HorizontalBoxLayout.md b/Base/usr/share/man/man5/GML-Widget-HorizontalBoxLayout.md
deleted file mode 100644
index 26dedaa80e..0000000000
--- a/Base/usr/share/man/man5/GML-Widget-HorizontalBoxLayout.md
+++ /dev/null
@@ -1,19 +0,0 @@
-## Name
-
-GML Horizontal Box Layout Widget
-
-## Description
-
-Defines a horizontal GUI box layout widget.
-
-## Synopsis
-
-`@GUI::HorizontalBoxLayout`
-
-## Examples
-
-```gml
-@GUI::HorizontalBoxLayout {
- spacing: 2
-}
-```
diff --git a/Base/usr/share/man/man5/GML-Widget-HorizontalSeperator.md b/Base/usr/share/man/man5/GML-Widget-HorizontalSeparator.md
index f1b520b2c5..30f42f5996 100644
--- a/Base/usr/share/man/man5/GML-Widget-HorizontalSeperator.md
+++ b/Base/usr/share/man/man5/GML-Widget-HorizontalSeparator.md
@@ -1,10 +1,10 @@
## Name
-GML Horizontal Seperator Widget
+GML Horizontal Separator Widget
## Description
-Defines a horizontal seperator widget. Creates a horizontal line separating elements.
+Defines a horizontal separator widget. Creates a horizontal line separating elements.
## Synopsis
diff --git a/Base/usr/share/man/man5/GML-Widget-VerticalBoxLayout.md b/Base/usr/share/man/man5/GML-Widget-VerticalBoxLayout.md
deleted file mode 100644
index aa0d003065..0000000000
--- a/Base/usr/share/man/man5/GML-Widget-VerticalBoxLayout.md
+++ /dev/null
@@ -1,19 +0,0 @@
-## Name
-
-GML Vertical Box Layout Widget
-
-## Description
-
-Defines a vertical GUI box layout.
-
-## Synopsis
-
-`@GUI::VerticalBoxLayout`
-
-## Examples
-
-```gml
-@GUI::VerticalBoxLayout {
- spacing: 2
-}
-```
diff --git a/Base/usr/share/man/man5/GML-Widget.md b/Base/usr/share/man/man5/GML-Widget.md
index c0fe2430b7..4b90e2bfa8 100644
--- a/Base/usr/share/man/man5/GML-Widget.md
+++ b/Base/usr/share/man/man5/GML-Widget.md
@@ -15,36 +15,35 @@ Defines a GUI widget.
## Registered Properties
-| Property | Type | Possible values | Description |
-|-----------------------------|-------------|----------------------------------------------------|------------------------------------------------|
-| x | int | | |
-| y | int | | |
-| visible | bool | | |
-| focused | bool | | |
-| enabled | bool | | |
-| tooltip | string | | |
-| min_size | size | | |
-| max_size | size | | |
-| width | int | | |
-| height | int | | |
-| min_width | int | | |
-| min_height | int | | |
-| max_width | int | | |
-| max_height | int | | |
-| fixed_width | int | | |
-| fixed_height | int | | |
-| fixed_size | size | | |
-| shrink_to_fit | bool | | |
-| font | string | | |
-| font_size | int | | |
-| font_weight | font_weight | | |
-| font_type | enum | FixedWidth, Normal | |
-| foreground_color | color | | |
-| foreground_role | string | | |
-| background_color | color | | |
-| background_role | string | | |
-| fill_width_background_color | bool | | |
-| layout | widget | @GUI::VerticalBoxLayout, @GUI::HorizontalBoxLayout | |
-| relative_rect | rect | | |
-| focus_policy | enum | ClickFocus, NoFocus, TabFocus, StrongFocus | |
-| margins | | | |
+| Property | Type | Possible values | Description |
+| --------------------------- | ------------- | ----------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
+| x | int | | x offset relative to parent |
+| y | int | | y offset relative to parent |
+| visible | bool | | Whether widget and children are drawn |
+| focused | bool | | Whether widget should be tab-focused on start |
+| focus_policy | enum | ClickFocus, NoFocus, TabFocus, StrongFocus | How the widget can receive focus |
+| enabled | bool | | Whether this widget is enabled for interactive purposes, e.g. can be clicked |
+| tooltip | string | | Mouse tooltip to show when hovering over this widget |
+| min_size | size | | Minimum size this widget wants to occupy |
+| max_size | size | | Maximum size this widget wants to occupy |
+| width | int | | Width of the widget, independent of its layout size calculation |
+| height | int | | Height of the widget, independent of its layout size calculation |
+| min_width | int | smaller than max_width | Minimum width this widget wants to occupy |
+| min_height | int | smaller than max_height | Minimum height this widget wants to occupy |
+| max_width | int | greater than min_width | Maximum width this widget wants to occupy |
+| max_height | int | greater than min_height | Maximum height this widget wants to occupy |
+| fixed_width | int | | Both maximum and minimum width; widget is fixed-width |
+| fixed_height | int | | Both maximum and minimum height; widget is fixed-height |
+| fixed_size | size | | Both maximum and minimum size; widget is fixed-size |
+| shrink_to_fit | bool | | Whether the widget shrinks as much as possible while still respecting its childrens minimum sizes |
+| font | string | Any system-known font | Font family |
+| font_size | int | Font size that is available on this family | Font size |
+| font_weight | font_weight | Font weight that is available on this family and size | Font weight |
+| font_type | enum | FixedWidth, Normal | Font type |
+| foreground_color | color | | Color of foreground elements such as text |
+| foreground_role | string | Any theme palette color role name | Palette color role (depends on system theme) for the foreground elements |
+| background_color | color | | Color of the widget background |
+| background_role | string | Any theme palette color role name | Palette color role (depends on system theme) for the widget background |
+| fill_width_background_color | bool | | Whether to fill the widget's background with the background color |
+| layout | layout object | | Layout object for layouting this widget's children |
+| relative_rect | rect | | Rectangle for relatively positioning the widget to the parent |
diff --git a/Base/usr/share/man/man5/GML.md b/Base/usr/share/man/man5/GML.md
new file mode 120000
index 0000000000..35d9c62a8e
--- /dev/null
+++ b/Base/usr/share/man/man5/GML.md
@@ -0,0 +1 @@
+GML-Introduction.md \ No newline at end of file