mirror of
https://github.com/nicbarker/clay.git
synced 2025-04-15 10:48:04 +00:00
165 lines
5.3 KiB
Odin
165 lines
5.3 KiB
Odin
package clay
|
|
|
|
import "core:c"
|
|
import "core:strings"
|
|
|
|
when ODIN_OS == .Windows {
|
|
foreign import Clay "windows/clay.lib"
|
|
} else when ODIN_OS == .Linux {
|
|
foreign import Clay "linux/clay.a"
|
|
} else when ODIN_OS == .Darwin {
|
|
when ODIN_ARCH == .arm64 {
|
|
foreign import Clay "macos-arm64/clay.a"
|
|
} else {
|
|
foreign import Clay "macos/clay.a"
|
|
}
|
|
} else when ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 {
|
|
foreign import Clay "wasm/clay.o"
|
|
}
|
|
|
|
when ODIN_OS == .Windows {
|
|
EnumBackingType :: u32
|
|
} else {
|
|
EnumBackingType :: u8
|
|
}
|
|
|
|
{{enums}}
|
|
|
|
Context :: struct {
|
|
|
|
}
|
|
|
|
ClayArray :: struct($type: typeid) {
|
|
capacity: i32,
|
|
length: i32,
|
|
internalArray: [^]type,
|
|
}
|
|
|
|
SizingConstraints :: struct #raw_union {
|
|
sizeMinMax: SizingConstraintsMinMax,
|
|
sizePercent: c.float,
|
|
}
|
|
|
|
TypedConfig :: struct {
|
|
type: ElementConfigType,
|
|
config: rawptr,
|
|
id: ElementId,
|
|
}
|
|
|
|
{{structs}}
|
|
|
|
@(link_prefix = "Clay_", default_calling_convention = "c")
|
|
foreign Clay {
|
|
{{public_functions}}
|
|
}
|
|
|
|
@(link_prefix = "Clay_", default_calling_convention = "c", private)
|
|
foreign Clay {
|
|
{{private_functions}}
|
|
}
|
|
|
|
@(require_results, deferred_none = _CloseElement)
|
|
UI :: proc(configs: ..TypedConfig) -> bool {
|
|
_OpenElement()
|
|
for config in configs {
|
|
#partial switch (config.type) {
|
|
case ElementConfigType.Id:
|
|
_AttachId(config.id)
|
|
case ElementConfigType.Layout:
|
|
_AttachLayoutConfig(cast(^LayoutConfig)config.config)
|
|
case:
|
|
_AttachElementConfig(config.config, config.type)
|
|
}
|
|
}
|
|
_ElementPostConfiguration()
|
|
return true
|
|
}
|
|
|
|
Layout :: proc(config: LayoutConfig) -> TypedConfig {
|
|
return {type = ElementConfigType.Layout, config = _StoreLayoutConfig(config) }
|
|
}
|
|
|
|
PaddingAll :: proc (padding: u16) -> Padding {
|
|
return { padding, padding, padding, padding }
|
|
}
|
|
|
|
Rectangle :: proc(config: RectangleElementConfig) -> TypedConfig {
|
|
return {type = ElementConfigType.Rectangle, config = _StoreRectangleElementConfig(config)}
|
|
}
|
|
|
|
Text :: proc(text: string, config: ^TextElementConfig) {
|
|
_OpenTextElement(MakeString(text), config)
|
|
}
|
|
|
|
TextConfig :: proc(config: TextElementConfig) -> ^TextElementConfig {
|
|
return _StoreTextElementConfig(config)
|
|
}
|
|
|
|
Image :: proc(config: ImageElementConfig) -> TypedConfig {
|
|
return {type = ElementConfigType.Image, config = _StoreImageElementConfig(config)}
|
|
}
|
|
|
|
Floating :: proc(config: FloatingElementConfig) -> TypedConfig {
|
|
return {type = ElementConfigType.Floating, config = _StoreFloatingElementConfig(config)}
|
|
}
|
|
|
|
Custom :: proc(config: CustomElementConfig) -> TypedConfig {
|
|
return {type = ElementConfigType.Custom, config = _StoreCustomElementConfig(config)}
|
|
}
|
|
|
|
Scroll :: proc(config: ScrollElementConfig) -> TypedConfig {
|
|
return {type = ElementConfigType.Scroll, config = _StoreScrollElementConfig(config)}
|
|
}
|
|
|
|
Border :: proc(config: BorderElementConfig) -> TypedConfig {
|
|
return {type = ElementConfigType.Border, config = _StoreBorderElementConfig(config)}
|
|
}
|
|
|
|
BorderOutside :: proc(outsideBorders: BorderData) -> TypedConfig {
|
|
return { type = ElementConfigType.Border, config = _StoreBorderElementConfig((BorderElementConfig){left = outsideBorders, right = outsideBorders, top = outsideBorders, bottom = outsideBorders}) }
|
|
}
|
|
|
|
BorderOutsideRadius :: proc(outsideBorders: BorderData, radius: f32) -> TypedConfig {
|
|
return { type = ElementConfigType.Border, config = _StoreBorderElementConfig(
|
|
(BorderElementConfig){left = outsideBorders, right = outsideBorders, top = outsideBorders, bottom = outsideBorders, cornerRadius = {radius, radius, radius, radius}},
|
|
) }
|
|
}
|
|
|
|
BorderAll :: proc(allBorders: BorderData) -> TypedConfig {
|
|
return { type = ElementConfigType.Border, config = _StoreBorderElementConfig((BorderElementConfig){left = allBorders, right = allBorders, top = allBorders, bottom = allBorders, betweenChildren = allBorders}) }
|
|
}
|
|
|
|
BorderAllRadius :: proc(allBorders: BorderData, radius: f32) -> TypedConfig {
|
|
return { type = ElementConfigType.Border, config = _StoreBorderElementConfig(
|
|
(BorderElementConfig){left = allBorders, right = allBorders, top = allBorders, bottom = allBorders, cornerRadius = {radius, radius, radius, radius}},
|
|
) }
|
|
}
|
|
|
|
CornerRadiusAll :: proc(radius: f32) -> CornerRadius {
|
|
return CornerRadius{radius, radius, radius, radius}
|
|
}
|
|
|
|
SizingFit :: proc(sizeMinMax: SizingConstraintsMinMax) -> SizingAxis {
|
|
return SizingAxis{type = SizingType.FIT, constraints = {sizeMinMax = sizeMinMax}}
|
|
}
|
|
|
|
SizingGrow :: proc(sizeMinMax: SizingConstraintsMinMax) -> SizingAxis {
|
|
return SizingAxis{type = SizingType.GROW, constraints = {sizeMinMax = sizeMinMax}}
|
|
}
|
|
|
|
SizingFixed :: proc(size: c.float) -> SizingAxis {
|
|
return SizingAxis{type = SizingType.FIXED, constraints = {sizeMinMax = {size, size}}}
|
|
}
|
|
|
|
SizingPercent :: proc(sizePercent: c.float) -> SizingAxis {
|
|
return SizingAxis{type = SizingType.PERCENT, constraints = {sizePercent = sizePercent}}
|
|
}
|
|
|
|
MakeString :: proc(label: string) -> String {
|
|
return String{chars = raw_data(label), length = cast(c.int)len(label)}
|
|
}
|
|
|
|
ID :: proc(label: string, index: u32 = 0) -> TypedConfig {
|
|
return { type = ElementConfigType.Id, id = _HashString(MakeString(label), index, 0) }
|
|
}
|