changed flags to a packed struct

master
Patrick Cleavelin 2023-06-21 22:26:11 -05:00
parent d0880ab419
commit b6c90c9ead
1 changed files with 36 additions and 24 deletions

View File

@ -1,11 +1,10 @@
const std = @import("std"); const std = @import("std");
const raylib = @import("raylib"); const raylib = @import("raylib");
const UI_Flags = enum(u32) { const UI_Flags = packed struct(u3) {
nothing = 0, clickable: bool = false,
clickable = (1 << 0), drawText: bool = false,
drawText = (1 << 1), drawBorder: bool = false,
drawBorder = (1 << 2),
}; };
const Vec2 = struct { const Vec2 = struct {
@ -26,7 +25,7 @@ const UI_Box = struct {
parent: ?*UI_Box, parent: ?*UI_Box,
/// the assigned features /// the assigned features
flags: u32, flags: UI_Flags,
/// the label? /// the label?
label: [:0]const u8, label: [:0]const u8,
@ -69,7 +68,7 @@ fn MakeBox(label: [:0]const u8, flags: UI_Flags) anyerror!bool {
// Attempt to re-use cache // Attempt to re-use cache
if (std.mem.eql(u8, next.label, label)) { if (std.mem.eql(u8, next.label, label)) {
//std.debug.print("using cache for '{s}'\n", .{next.label}); //std.debug.print("using cache for '{s}'\n", .{next.label});
next.flags = @enumToInt(flags); next.flags = flags;
if (next.parent) |parent| { if (next.parent) |parent| {
parent.last = next; parent.last = next;
} }
@ -82,7 +81,7 @@ fn MakeBox(label: [:0]const u8, flags: UI_Flags) anyerror!bool {
next.* = UI_Box{ next.* = UI_Box{
.label = label, .label = label,
.flags = @enumToInt(flags), .flags = flags,
.first = null, .first = null,
.last = null, .last = null,
@ -104,7 +103,7 @@ fn MakeBox(label: [:0]const u8, flags: UI_Flags) anyerror!bool {
var new_box = try box_allocator.create(UI_Box); var new_box = try box_allocator.create(UI_Box);
new_box.* = UI_Box{ new_box.* = UI_Box{
.label = label, .label = label,
.flags = @enumToInt(flags), .flags = flags,
.first = null, .first = null,
.last = null, .last = null,
@ -126,7 +125,7 @@ fn MakeBox(label: [:0]const u8, flags: UI_Flags) anyerror!bool {
var new_box = try box_allocator.create(UI_Box); var new_box = try box_allocator.create(UI_Box);
new_box.* = UI_Box{ new_box.* = UI_Box{
.label = label, .label = label,
.flags = @enumToInt(flags), .flags = flags,
.first = null, .first = null,
.last = null, .last = null,
@ -141,7 +140,7 @@ fn MakeBox(label: [:0]const u8, flags: UI_Flags) anyerror!bool {
} }
if (current_box) |box| { if (current_box) |box| {
if (box.flags & @enumToInt(UI_Flags.clickable) > 0) { if (box.flags.clickable) {
return TestBoxClick(box); return TestBoxClick(box);
} }
} }
@ -168,7 +167,7 @@ fn PushBox(label: [:0]const u8, flags: UI_Flags) anyerror!bool {
// check if the same // check if the same
if (std.mem.eql(u8, first.label, label)) { if (std.mem.eql(u8, first.label, label)) {
//std.debug.print("using cache for '{s}'\n", .{first.label}); //std.debug.print("using cache for '{s}'\n", .{first.label});
first.flags = @enumToInt(flags); first.flags = flags;
current_box = first; current_box = first;
if (first.parent) |parent| { if (first.parent) |parent| {
@ -182,7 +181,7 @@ fn PushBox(label: [:0]const u8, flags: UI_Flags) anyerror!bool {
first.* = UI_Box{ first.* = UI_Box{
.label = label, .label = label,
.flags = @enumToInt(flags), .flags = flags,
.first = null, .first = null,
.last = null, .last = null,
@ -203,7 +202,7 @@ fn PushBox(label: [:0]const u8, flags: UI_Flags) anyerror!bool {
var new_box = try box_allocator.create(UI_Box); var new_box = try box_allocator.create(UI_Box);
new_box.* = UI_Box{ new_box.* = UI_Box{
.label = label, .label = label,
.flags = @enumToInt(flags), .flags = flags,
.first = null, .first = null,
.last = null, .last = null,
@ -226,7 +225,7 @@ fn PushBox(label: [:0]const u8, flags: UI_Flags) anyerror!bool {
} }
if (current_box) |box| { if (current_box) |box| {
if (box.flags & @enumToInt(UI_Flags.clickable) > 0) { if (box.flags.clickable) {
return TestBoxClick(box); return TestBoxClick(box);
} }
} }
@ -254,7 +253,11 @@ fn TestBoxClick(box: *UI_Box) bool {
} }
fn MakeButton(label: [:0]const u8) !bool { fn MakeButton(label: [:0]const u8) !bool {
return try MakeBox(label, UI_Flags.clickable); return try MakeBox(label, .{
.clickable = true,
.drawText = true,
.drawBorder = true,
});
} }
fn CountChildren(box: *UI_Box) u32 { fn CountChildren(box: *UI_Box) u32 {
@ -307,12 +310,16 @@ fn DrawUI(box: *UI_Box, parent: ?*UI_Box, parent_pos: Vec2, parent_size: Vec2) v
}; };
box.computed_pos = Vec2{ box.computed_pos = Vec2{
.x = box.computed_size.x * @intToFloat(f32, my_index) + parent_pos.x, .x = box.computed_size.x * @intToFloat(f32, my_index) + parent_pos.x,
.y = parent_pos.y + 12, .y = parent_pos.y,
//.y = box.computed_size.y * @intToFloat(f32, my_index) + parent_pos.y, //.y = box.computed_size.y * @intToFloat(f32, my_index) + parent_pos.y,
}; };
raylib.DrawRectangleLines(@floatToInt(i32, box.computed_pos.x), @floatToInt(i32, box.computed_pos.y), @floatToInt(i32, box.computed_size.x), @floatToInt(i32, box.computed_size.y), raylib.BLUE); if (box.flags.drawBorder) {
raylib.DrawText(box.label, @floatToInt(i32, box.computed_pos.x), @floatToInt(i32, box.computed_pos.y), 10, raylib.RED); raylib.DrawRectangleLines(@floatToInt(i32, box.computed_pos.x), @floatToInt(i32, box.computed_pos.y), @floatToInt(i32, box.computed_size.x), @floatToInt(i32, box.computed_size.y), raylib.BLUE);
}
if (box.flags.drawText) {
raylib.DrawText(box.label, @floatToInt(i32, box.computed_pos.x), @floatToInt(i32, box.computed_pos.y), 10, raylib.RED);
}
// draw children // draw children
var child = box.first; var child = box.first;
@ -333,7 +340,7 @@ pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){}; var gpa = std.heap.GeneralPurposeAllocator(.{}){};
box_allocator = gpa.allocator(); box_allocator = gpa.allocator();
_ = try PushBox("RootContainer", UI_Flags.nothing); _ = try PushBox("RootContainer", .{});
root_box = current_box; root_box = current_box;
//std.debug.print("Starting main loop\n", .{}); //std.debug.print("Starting main loop\n", .{});
@ -352,7 +359,7 @@ pub fn main() !void {
raylib.ClearBackground(raylib.BLACK); raylib.ClearBackground(raylib.BLACK);
_ = try PushBox("ButtonArray", UI_Flags.nothing); _ = try PushBox("ButtonArray", .{});
if (try MakeButton("click me")) { if (try MakeButton("click me")) {
std.debug.print("button clicked\n", .{}); std.debug.print("button clicked\n", .{});
} }
@ -361,9 +368,14 @@ pub fn main() !void {
} }
PopBox(); PopBox();
_ = try PushBox("TextArray", UI_Flags.nothing); _ = try PushBox("TextArray", .{});
_ = try MakeBox("This is some text", UI_Flags.nothing); if (try MakeBox("This is some text", .{
_ = try MakeBox("So is this", UI_Flags.nothing); .drawText = true,
.clickable = true,
})) {
std.debug.print("text clicked\n", .{});
}
_ = try MakeBox("So is this", .{ .drawText = true });
PopBox(); PopBox();
if (root_box) |box| { if (root_box) |box| {