zcatgui/examples/hello.zig
R.Eugenio f9179b4e9a build: Migrar a Zig 0.16
- Crear src/utils/time.zig para centralizar helpers de tiempo (timestamp, milliTimestamp, nanoTimestamp).
- Reemplazar std.io.fixedBufferStream por std.Io.Writer.fixed.
- Migrar de std.fs.cwd() a std.Io.Dir.cwd() y actualizar firmas de lectura/escritura.
- Reemplazar std.Thread.sleep por std.posix.system.nanosleep.
- Corregir capturas descartadas en switches (text_input => {}).
- Actualizar tests y ejemplos para compatibilidad con std.Io y nuevos helpers.
- Actualizar build.zig.zon a 0.16.0.

Co-Authored-By: Gemini <noreply@google.com>
2026-01-18 02:01:04 +01:00

82 lines
2.4 KiB
Zig

//! Hello World - Basic zcatgui example
//!
//! Demonstrates:
//! - Initializing the backend
//! - Creating a framebuffer
//! - Basic rendering
//! - Event loop
const std = @import("std");
const zcatgui = @import("zcatgui");
const Framebuffer = zcatgui.render.Framebuffer;
const SoftwareRenderer = zcatgui.render.SoftwareRenderer;
const Sdl2Backend = zcatgui.backend.Sdl2Backend;
const Color = zcatgui.Color;
const Command = zcatgui.Command;
pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
const allocator = gpa.allocator();
// Initialize backend
var backend = try Sdl2Backend.init("zcatgui - Hello World", 800, 600);
defer backend.deinit();
// Create framebuffer
var fb = try Framebuffer.init(allocator, 800, 600);
defer fb.deinit();
// Create renderer
var renderer = SoftwareRenderer.init(&fb);
var running = true;
var frame: u32 = 0;
while (running) {
// Poll events
while (backend.pollEvent()) |event| {
switch (event) {
.quit => running = false,
.key => |key| {
if (key.key == .escape and key.pressed) {
running = false;
}
},
.resize => |size| {
try fb.resize(size.width, size.height);
},
else => {},
}
}
// Clear
renderer.clear(Color.background);
// Draw some rectangles
renderer.execute(Command.rect(50, 50, 200, 100, Color.primary));
renderer.execute(Command.rect(300, 50, 200, 100, Color.success));
renderer.execute(Command.rect(550, 50, 200, 100, Color.danger));
// Draw rectangle outline
renderer.execute(Command.rectOutline(50, 200, 700, 100, Color.border));
// Animate a rectangle
const x = @as(i32, @intCast(50 + (frame % 600)));
renderer.execute(Command.rect(x, 350, 100, 100, Color.warning));
// Draw some lines
renderer.execute(Command.line(50, 500, 750, 500, Color.foreground));
renderer.execute(Command.line(400, 450, 400, 550, Color.foreground));
// Present
backend.present(&fb);
frame += 1;
// Control frame rate (approx 60 FPS)
const ts = std.posix.timespec{ .sec = 0, .nsec = 16 * std.time.ns_per_ms };
_ = std.posix.system.nanosleep(&ts, null);
}
}