Continuing example and still working on adaption the CLAY macro

This commit is contained in:
Stowy 2025-01-01 19:28:22 +01:00
parent e9522005db
commit b7e1d69ca6
3 changed files with 108 additions and 9 deletions

View File

@ -76,18 +76,57 @@ main :: () {
};
Clay.BeginLayout();
if Clay.UI(
Clay.UI(
Clay.ID("OuterContainer"),
Clay.Rectangle(.{color = .{43, 41, 51, 255}}),
Clay.Layout(.{
layoutDirection = .TOP_TO_BOTTOM,
sizing = layout_expand,
padding = .{16, 16},
childGap = 16,
}),
Clay.Rectangle(.{color = .{43, 41, 51, 255}})
) {
children = #code {
Clay.UI(
Clay.ID("HeaderBar"),
Clay.Rectangle(content_background_config),
Clay.Layout(.{
sizing = .{
height = Clay.SizingFixed(60),
width = Clay.SizingGrow(),
},
padding = .{16, 16},
childGap = 16,
childAlignment = .{
y = .CENTER,
}
}),
children = #code {
Clay.UI(
Clay.ID("FileButton"),
Clay.Layout(.{padding = .{16, 8}}),
Clay.Rectangle(.{
color = .{140, 140, 140, 255},
cornerRadius = .{5, 5, 5, 5},
}),
children = #code {
Clay.Text("File", Clay.TextConfig(.{
fontId = FONT_ID_BODY_16,
fontSize = 16,
textColor = Clay.Color.{255, 255, 255, 255},
}));
}
file_menu_visible := Clay.PointerOver(Clay.GetElementId("FileButton")) ||
Clay.PointerOver(Clay.GetElementId("FileMenu"));
if file_menu_visible {
}
}
);
}
);
}
);
render_commands := Clay.EndLayout();

View File

@ -0,0 +1,21 @@
#import "Basic";
test :: () -> bool #must #expand {
print("one\n");
`defer print("two\n");
return true;
}
main :: () {
print("ichi\n");
if test() {
print("ni\n");
if test() {
print("san\n");
}
}
print("yon\n");
}

View File

@ -38,7 +38,7 @@ make_string :: (str: string) -> String {
}
// The way of handling this is inspired by the odin bindings
UI :: (configs: ..TypedConfig, $call := #caller_code) -> bool #must #expand {
UI :: (configs: ..TypedConfig, $children: Code = #code {}, $call := #caller_code) {
_OpenElement();
for config : configs {
if config.type == {
@ -56,13 +56,36 @@ UI :: (configs: ..TypedConfig, $call := #caller_code) -> bool #must #expand {
}
_ElementPostConfiguration();
// !IMPORTANT
// TODO Fix the need to have to add the namespace here
#insert,scope(call) #code defer Clay._CloseElement();;
#insert,scope(call) children;
return true;
_CloseElement();
}
// Not sure yet wich of these two methods is better
// Idealy there should be a way to mimic the style of how it's done in C
// ElementScope :: (configs: ..TypedConfig) #expand {
// _OpenElement();
// for config : configs {
// if config.type == {
// case .ID;
// _AttachId(config.id);
// case .LAYOUT;
// _AttachLayoutConfig(cast(*LayoutConfig, config.config));
// case;
// // config.config is a *void, it stores the address of the pointer that is stored in the union
// // as ElementConfigUnion is a union of structs. We can't cast pointers directly to structs,
// // we first cast the address of the *void and then dereference it.
// // Maybe there's a cast modifier to avoid this, but I don't know it (no_check and trunc didn't work).
// _AttachElementConfig(cast(*ElementConfigUnion, *config.config).*, config.type);
// }
// }
// _ElementPostConfiguration();
// `defer _CloseElement();
// }
ID :: (label: string, index: u32 = 0) -> TypedConfig {
return .{type = .ID, id = _HashString(make_string(label), index, 0)};
}
@ -78,10 +101,26 @@ Rectangle :: (config: RectangleElementConfig) -> TypedConfig {
};
}
Text :: (text: string, config: *TextElementConfig) {
_OpenTextElement(make_string(text), config);
}
TextConfig :: (config: TextElementConfig) -> *TextElementConfig {
return _StoreTextElementConfig(config);
}
SizingGrow :: (size_min_max: SizingMinMax = .{}) -> SizingAxis {
return .{type = .GROW, size = .{minMax = size_min_max}};
}
SizingFixed :: (size: float) -> SizingAxis {
return .{type = .FIXED, size = .{minMax = .{size, size}}};
}
GetElementId :: (str: string) -> ElementId {
return GetElementId(make_string(str));
}
#scope_module
Math :: #import "Math";