Layout and Styling with OSUI
OSUI provides a robust system for controlling the position, size, and visual appearance of your UI elements using Transform
and Style
components.
1. Controlling Layout with Transform
The Transform
component defines how a widget is positioned and sized relative to its parent. It's designed for flexibility, allowing both fixed values and dynamic rules.
// Defined using the component! macro in src/style.rs
component!(Transform {
pub x: Position,
pub y: Position,
pub mx: i32,
pub my: i32,
pub px: u16,
pub py: u16,
pub width: Dimension,
pub height: Dimension,
});
x
,y
: Horizontal and vertical position, defined by thePosition
enum.mx
,my
: Margins (offsets) from the calculated position. Can be positive or negative.px
,py
: Padding (internal spacing) around the content within the widget's bounds.width
,height
: Sizing rules for dimensions, defined by theDimension
enum.
Position
Enum
Controls horizontal or vertical alignment:
Const(u16)
: Fixed position in cells from the origin (top-left).x: Position::Const(10)
or simplyx: 10
(due toFrom<u16> for Position
impl).
Center
: Centers the widget in the parent's available space.End
: Aligns the widget to the end (right or bottom) of the parent.
Dimension
Enum
Controls sizing:
Full
: Fills the available space from the parent.Content
: Automatically sized to fit content. This is the default. The element'srender
method will typically update theRenderScope
's size to match its content.Const(u16)
: Fixed size in cells.width: Dimension::Const(50)
or simplywidth: 50
.
Fluent API for Transform
Transform
provides a fluent builder pattern for easy configuration:
Transform::new()
: Creates a default transform: top-left aligned (x: 0
,y: 0
), content sizing (width: Content
,height: Content
), no margins or padding.Transform::center()
: Shortcut forx: Center
,y: Center
.transform.bottom()
: Setsy: End
.transform.right()
: Setsx: End
.transform.margin(x, y)
: Setsmx
andmy
.transform.padding(x, y)
: Setspx
andpy
.transform.dimensions(width, height)
: Setswidth: Const(width)
andheight: Const(height)
.
Examples of Transform
Usage
Attach Transform
as a component to any element using the @
syntax in rsx!
:
use osui::prelude::*;
rsx! {
// Center a Div on the screen
@Transform::center();
Div { "I am centered." }
// Place a Div at (10, 5) with fixed dimensions and padding
@Transform::new().x(10).y(5).dimensions(30, 7).padding(2, 1);
Div { "Fixed size box with padding." }
// Align a Div to the bottom-right with margin
@Transform::new().bottom().right().margin(-5, -3); // Negative margin pulls it closer to edge
Div { "Bottom right with margin." }
// A FlexRow that takes full width and automatically sizes height
@Transform::new().width(Full);
FlexRow { "Full width content." }
}
The transform!
macro provides a more concise way to create and set properties on a Transform
:
use osui::prelude::*;
rsx! {
// Equivalent to Transform::new().x(10).y(5).dimensions(30, 7).padding(2, 1);
@transform!(x: 10, y: 5, width: 30, height: 7, px: 2, py: 1);
Div { "Shorter syntax for transform." }
// Using Position and Dimension enums directly
@transform!(x: Center, y: End, width: Full);
Div { "Centered horizontally, at bottom, full width." }
}
2. Defining Style with Style
The Style
component defines the visual appearance, specifically background and foreground colors.
// Defined using the component! macro in src/style.rs
component!(Style {
pub background: Background,
pub foreground: Option<u32>,
});
pub enum Background {
NoBackground, // No background drawn
Outline(u32), // Draws a basic rectangular outline
RoundedOutline(u32),// Draws a rounded rectangular outline
Solid(u32), // Fills the background with a solid color
}
background
: Determines how the background of the widget's calculated area is rendered.foreground
: AnOption<u32>
whereu32
represents a 24-bit RGB color (e.g.,0xFF0000
for red,0x00FF00
for green). IfNone
, the default terminal foreground color is used.
Examples of Style
Usage
Attach Style
as a component:
use osui::prelude::*;
rsx! {
// A div with a solid blue background and white text
@Transform::new().dimensions(25, 3);
@Style { background: Background::Solid(0x0000FF), foreground: Some(0xFFFFFF) };
Div { "Hello, Blue World!" }
// A div with a green rounded outline
@Transform::new().dimensions(25, 3).margin(0, 4);
@Style { background: Background::RoundedOutline(0x00FF00), foreground: Some(0xFFFFFF) };
Div { "Rounded green box." }
// A div with a red square outline
@Transform::new().dimensions(25, 3).margin(0, 8);
@Style { background: Background::Outline(0xFF0000), foreground: Some(0xFFFFFF) };
Div { "Square red box." }
}
By combining Transform
and Style
, you can precisely control both the layout and visual aesthetics of your OSUI applications.