Skip to content

Commit

Permalink
use zig style guide
Browse files Browse the repository at this point in the history
see https://ziglang.org/documentation/0.11.0/#Style-Guide
Functions like capy.Column are renamed to capy.column as it returns values.
It also allows to have the cleaner capy.Container as a type name instead of capy.Container_Impl where the _Impl suffix felt hacky.
  • Loading branch information
zenith391 committed Sep 17, 2023
1 parent e6f838d commit 50606cc
Show file tree
Hide file tree
Showing 44 changed files with 708 additions and 690 deletions.
14 changes: 7 additions & 7 deletions README.md
Expand Up @@ -37,15 +37,15 @@ pub fn main() !void {
var window = try capy.Window.init();
try window.set(
capy.Column(.{ .spacing = 10 }, .{ // have 10px spacing between each column's element
capy.Row(.{ .spacing = 5 }, .{ // have 5px spacing between each row's element
capy.Button(.{ .label = "Save", .onclick = buttonClicked }),
capy.Button(.{ .label = "Run", .onclick = buttonClicked })
capy.column(.{ .spacing = 10 }, .{ // have 10px spacing between each column's element
capy.row(.{ .spacing = 5 }, .{ // have 5px spacing between each row's element
capy.button(.{ .label = "Save", .onclick = &buttonClicked }),
capy.button(.{ .label = "Run", .onclick = &buttonClicked })
}),
// Expanded means the widget will take all the space it can
// in the parent container
capy.Expanded(
capy.TextArea(.{ .text = "Hello World!" })
capy.expanded(
capy.textArea(.{ .text = "Hello World!" })
)
})
);
Expand All @@ -55,7 +55,7 @@ pub fn main() !void {
capy.runEventLoop();
}
fn buttonClicked(button: *capy.Button_Impl) !void {
fn buttonClicked(button: *capy.Button) !void {
std.log.info("You clicked button with text {s}", .{button.getLabel()});
}
```
Expand Down
4 changes: 2 additions & 2 deletions examples/300-buttons.zig
Expand Up @@ -17,11 +17,11 @@ pub fn main() !void {
defer labelArena.deinit();
const labelAllocator = labelArena.child_allocator;

var row = try capy.Row(.{ .wrapping = true }, .{});
var row = try capy.row(.{ .wrapping = true }, .{});
var i: usize = 0;
while (i < NUM_BUTTONS) : (i += 1) {
const buttonLabel = try std.fmt.allocPrintZ(labelAllocator, "Button #{d}", .{i});
try row.add(capy.Button(.{ .label = buttonLabel }));
try row.add(capy.button(.{ .label = buttonLabel }));
}

try window.set(row);
Expand Down
8 changes: 4 additions & 4 deletions examples/7gui/counter.zig
Expand Up @@ -34,12 +34,12 @@ pub fn main() !void {
var format = try capy.FormattedAtom(capy.internal.lasting_allocator, "{d}", .{&count});
defer format.deinit();

try window.set(capy.Align(
try window.set(capy.alignment(
.{},
capy.Row(.{ .spacing = 5 }, .{
capy.TextField(.{ .readOnly = true, .name = "text-field" })
capy.row(.{ .spacing = 5 }, .{
capy.textField(.{ .readOnly = true, .name = "text-field" })
.bind("text", format),
capy.Button(.{ .label = "Count", .onclick = increment }),
capy.button(.{ .label = "Count", .onclick = increment }),
}),
));

Expand Down
44 changes: 22 additions & 22 deletions examples/7gui/flight-booker.zig
Expand Up @@ -2,63 +2,63 @@ const std = @import("std");
const capy = @import("capy");
pub usingnamespace capy.cross_platform;

var selectedIndex: capy.Atom(usize) = capy.Atom(usize).of(0);
var selected_index: capy.Atom(usize) = capy.Atom(usize).of(0);

pub fn main() !void {
try capy.backend.init();

var window = try capy.Window.init();
try window.set(capy.Column(.{}, .{
capy.Button(.{ .label = "one-way flight", .onclick = oneWay }),
capy.Button(.{ .label = "return flight", .onclick = returnFlight }),
capy.TextField(.{ .name = "start-date", .text = "27.03.2014" }),
capy.TextField(.{ .name = "return-date", .text = "27.03.2014" }),
capy.Button(.{ .name = "book-button", .label = "Book", .onclick = bookFlight }),
try window.set(capy.column(.{}, .{
capy.button(.{ .label = "one-way flight", .onclick = oneWay }),
capy.button(.{ .label = "return flight", .onclick = returnFlight }),
capy.textField(.{ .name = "start-date", .text = "27.03.2014" }),
capy.textField(.{ .name = "return-date", .text = "27.03.2014" }),
capy.button(.{ .name = "book-button", .label = "Book", .onclick = bookFlight }),
}));

window.setTitle("Book Flight");
window.show();

const root = window.getChild().?.as(capy.Container_Impl);
const start_field = root.getChildAs(capy.TextField_Impl, "start-date").?;
const return_field = root.getChildAs(capy.TextField_Impl, "return-date").?;
const book_button = root.getChildAs(capy.Button_Impl, "book-button").?;
const root = window.getChild().?.as(capy.Container);
const start_field = root.getChildAs(capy.TextField, "start-date").?;
const return_field = root.getChildAs(capy.TextField, "return-date").?;
const book_button = root.getChildAs(capy.Button, "book-button").?;

try return_field.readOnly.dependOn(.{&selectedIndex}, &(struct {
try return_field.readOnly.dependOn(.{&selected_index}, &(struct {
fn a(index: usize) bool {
return index != 1; // only enabled for return flight
}
}.a));

// Quite literally, the 'enabled' property of button depends on start field's text and return field's text
try book_button.enabled.dependOn(.{ &start_field.text, &return_field.text }, &(struct {
fn a(start_text: []const u8, return_text: []const u8) bool {
try book_button.enabled.dependOn(.{ &start_field.text, &return_field.text, &selected_index }, &(struct {
fn a(start_text: []const u8, return_text: []const u8, index: usize) bool {
const start_date = parseDate(start_text) catch return false;
const return_date = parseDate(return_text) catch return false;

// return date must be after departure date
return return_date > start_date;
return return_date > start_date or index == 0;
}
}.a));

capy.runEventLoop();
}

// TODO: switch back to *capy.Button_Impl when ziglang/zig#12325 is fixed
// TODO: switch back to *capy.Button when ziglang/zig#12325 is fixed
fn oneWay(_: *anyopaque) !void {
selectedIndex.set(0);
selected_index.set(0);
}

// TODO: switch back to *capy.Button_Impl when ziglang/zig#12325 is fixed
// TODO: switch back to *capy.Button when ziglang/zig#12325 is fixed
fn returnFlight(_: *anyopaque) !void {
selectedIndex.set(1);
selected_index.set(1);
}

// TODO: switch back to *capy.Button_Impl when ziglang/zig#12325 is fixed
// TODO: switch back to *capy.Button when ziglang/zig#12325 is fixed
fn bookFlight(button_: *anyopaque) !void {
const button = @as(*capy.Button_Impl, @ptrCast(@alignCast(button_)));
const button = @as(*capy.Button, @ptrCast(@alignCast(button_)));

const root = button.getRoot().?.as(capy.Container_Impl);
const root = button.getRoot().?.as(capy.Container);
_ = root;
}

Expand Down
12 changes: 6 additions & 6 deletions examples/7gui/temperature-converter.zig
Expand Up @@ -14,15 +14,15 @@ pub fn main() !void {

var window = try capy.Window.init();

try window.set(capy.Align(
try window.set(capy.alignment(
.{},
capy.Row(.{ .spacing = 5 }, .{
capy.TextField(.{})
capy.row(.{ .spacing = 5 }, .{
capy.textField(.{})
.bind("text", &celsius),
capy.Label(.{ .text = "Celsius =" }),
capy.TextField(.{})
capy.label(.{ .text = "Celsius =" }),
capy.textField(.{})
.bind("text", &fahrenheit),
capy.Label(.{ .text = "Fahrenheit" }),
capy.label(.{ .text = "Fahrenheit" }),
}),
));

Expand Down
20 changes: 10 additions & 10 deletions examples/balls.zig
Expand Up @@ -39,7 +39,7 @@ pub fn main() !void {
});
}

var canvas = capy.Canvas(.{
var canvas = capy.canvas(.{
.preferredSize = capy.Size.init(500, 500),
.ondraw = @as(*const fn (*anyopaque, *capy.DrawContext) anyerror!void, @ptrCast(&onDraw)),
.name = "ball-canvas",
Expand All @@ -51,11 +51,11 @@ pub fn main() !void {
defer totalEnergyFormat.deinit();

var window = try capy.Window.init();
try window.set(capy.Column(.{}, .{
capy.Label(.{ .text = "Balls with attraction and friction" }),
capy.Label(.{})
try window.set(capy.column(.{}, .{
capy.label(.{ .text = "Balls with attraction and friction" }),
capy.label(.{})
.bind("text", totalEnergyFormat),
capy.Align(.{}, &canvas),
capy.alignment(.{}, &canvas),
}));

window.setTitle("Balls");
Expand All @@ -68,7 +68,7 @@ pub fn main() !void {
capy.runEventLoop();
}

fn onMouseButton(widget: *capy.Canvas_Impl, button: capy.MouseButton, pressed: bool, x: i32, y: i32) !void {
fn onMouseButton(widget: *capy.Canvas, button: capy.MouseButton, pressed: bool, x: i32, y: i32) !void {
mouseX = x;
mouseY = y;
if (button == .Left) {
Expand All @@ -90,15 +90,15 @@ fn onMouseButton(widget: *capy.Canvas_Impl, button: capy.MouseButton, pressed: b
}
}

fn onMouseMotion(widget: *capy.Canvas_Impl, x: i32, y: i32) !void {
fn onMouseMotion(widget: *capy.Canvas, x: i32, y: i32) !void {
if (selected_ball_index != null) {
mouseX = x;
mouseY = y;
try widget.requestDraw();
}
}

fn onDraw(widget: *capy.Canvas_Impl, ctx: *capy.DrawContext) !void {
fn onDraw(widget: *capy.Canvas, ctx: *capy.DrawContext) !void {
const width = widget.getWidth();
const height = widget.getHeight();

Expand Down Expand Up @@ -126,8 +126,8 @@ fn onDraw(widget: *capy.Canvas_Impl, ctx: *capy.DrawContext) !void {
}

fn simulationThread(window: *capy.Window) !void {
const root = window.getChild().?.as(capy.Container_Impl);
const canvas = root.getChild("ball-canvas").?.as(capy.Canvas_Impl);
const root = window.getChild().?.as(capy.Container);
const canvas = root.getChild("ball-canvas").?.as(capy.Canvas);

while (true) {
const delta = 1.0 / 60.0;
Expand Down
18 changes: 9 additions & 9 deletions examples/border-layout.zig
Expand Up @@ -6,18 +6,18 @@ pub fn main() !void {
try capy.backend.init();

var window = try capy.Window.init();
try window.set(capy.Column(.{}, .{
capy.Label(.{ .text = "Top" }),
capy.Expanded(
capy.Row(.{}, .{
capy.Label(.{ .text = "Left" }),
capy.Expanded(
capy.Label(.{ .text = "Center" }),
try window.set(capy.column(.{}, .{
capy.label(.{ .text = "Top", .alignment = .Center }),
capy.expanded(
capy.row(.{}, .{
capy.label(.{ .text = "Left", .alignment = .Center }),
capy.expanded(
capy.label(.{ .text = "Center", .alignment = .Center }),
),
capy.Label(.{ .text = "Right" }),
capy.label(.{ .text = "Right", .alignment = .Center }),
}),
),
capy.Label(.{ .text = "Bottom " }),
capy.label(.{ .text = "Bottom ", .alignment = .Center }),
}));

window.setTitle("Hello");
Expand Down
63 changes: 30 additions & 33 deletions examples/calculator.zig
Expand Up @@ -3,19 +3,14 @@ const capy = @import("capy");
pub usingnamespace capy.cross_platform;

// Short names to avoid writing 'capy.' each time
const Button = capy.Button;
const Margin = capy.Margin;
const Expanded = capy.Expanded;
const Row = capy.Row;

const Allocator = std.mem.Allocator;

var computationLabel: capy.Label_Impl = undefined;
var computationLabel: capy.Label = undefined;
var allocator: Allocator = undefined;

// TODO: switch back to *capy.Button_Impl when ziglang/zig#12325 is fixed
// TODO: switch back to *capy.button_Impl when ziglang/zig#12325 is fixed
pub fn pressedKey(button_: *anyopaque) !void {
const button = @as(*capy.Button_Impl, @ptrCast(@alignCast(button_)));
const button = @as(*capy.Button, @ptrCast(@alignCast(button_)));

const buttonLabel = button.getLabel();
const labelText = computationLabel.getText();
Expand All @@ -29,7 +24,7 @@ pub fn pressedKey(button_: *anyopaque) !void {
allocator.free(labelText);
}

// TODO: switch back to *capy.Button_Impl when ziglang/zig#12325 is fixed
// TODO: switch back to *capy.button_Impl when ziglang/zig#12325 is fixed
pub fn erase(_: *anyopaque) !void {
allocator.free(computationLabel.getText());
computationLabel.setText("");
Expand All @@ -39,7 +34,7 @@ fn findOperator(computation: []const u8, pos: usize) ?usize {
return std.mem.indexOfScalarPos(u8, computation, pos, '+') orelse std.mem.indexOfScalarPos(u8, computation, pos, '-') orelse std.mem.indexOfScalarPos(u8, computation, pos, '*') orelse std.mem.indexOfScalarPos(u8, computation, pos, '/');
}

// TODO: switch back to *capy.Button_Impl when ziglang/zig#12325 is fixed
// TODO: switch back to *capy.button_Impl when ziglang/zig#12325 is fixed
pub fn compute(_: *anyopaque) !void {
const rawText = computationLabel.getText();
const computation = rawText;
Expand Down Expand Up @@ -96,35 +91,37 @@ pub fn main() !void {
}

var window = try capy.Window.init();
computationLabel = capy.Label(.{ .text = "", .alignment = .Left });
computationLabel = capy.label(.{ .text = "", .alignment = .Left });
defer allocator.free(computationLabel.getText());
try window.set(capy.Column(.{ .expand = .Fill, .spacing = 10 }, .{
try window.set(capy.column(.{ .expand = .Fill, .spacing = 10 }, .{
&computationLabel,
Expanded(Row(.{ .expand = .Fill, .spacing = 10 }, .{
Button(.{ .label = "7", .onclick = pressedKey }),
Button(.{ .label = "8", .onclick = pressedKey }),
Button(.{ .label = "9", .onclick = pressedKey }),
Button(.{ .label = "+", .onclick = pressedKey }),
capy.expanded(capy.row(.{ .expand = .Fill, .spacing = 10 }, .{
capy.button(.{ .label = "7", .onclick = pressedKey }),
capy.button(.{ .label = "8", .onclick = pressedKey }),
capy.button(.{ .label = "9", .onclick = pressedKey }),
capy.button(.{ .label = "+", .onclick = pressedKey }),
})),
Expanded(Row(.{ .expand = .Fill, .spacing = 10 }, .{
Button(.{ .label = "4", .onclick = pressedKey }),
Button(.{ .label = "5", .onclick = pressedKey }),
Button(.{ .label = "6", .onclick = pressedKey }),
Button(.{ .label = "-", .onclick = pressedKey }),
capy.expanded(capy.row(.{ .expand = .Fill, .spacing = 10 }, .{
capy.button(.{ .label = "4", .onclick = pressedKey }),
capy.button(.{ .label = "5", .onclick = pressedKey }),
capy.button(.{ .label = "6", .onclick = pressedKey }),
capy.button(.{ .label = "-", .onclick = pressedKey }),
})),
Expanded(Row(.{ .expand = .Fill, .spacing = 10 }, .{
Button(.{ .label = "1", .onclick = pressedKey }),
Button(.{ .label = "2", .onclick = pressedKey }),
Button(.{ .label = "3", .onclick = pressedKey }),
Button(.{ .label = "*", .onclick = pressedKey }),
capy.expanded(capy.row(.{ .expand = .Fill, .spacing = 10 }, .{
capy.button(.{ .label = "1", .onclick = pressedKey }),
capy.button(.{ .label = "2", .onclick = pressedKey }),
capy.button(.{ .label = "3", .onclick = pressedKey }),
capy.button(.{ .label = "*", .onclick = pressedKey }),
})),
Expanded(Row(.{ .expand = .Fill, .spacing = 10 }, .{
Button(.{ .label = "/", .onclick = pressedKey }),
Button(.{ .label = "0", .onclick = pressedKey }),
Button(.{ .label = "CE", .onclick = erase }),
Button(.{ .label = ".", .onclick = pressedKey }),
capy.expanded(capy.row(.{ .expand = .Fill, .spacing = 10 }, .{
capy.button(.{ .label = "/", .onclick = pressedKey }),
capy.button(.{ .label = "0", .onclick = pressedKey }),
capy.button(.{ .label = "CE", .onclick = erase }),
capy.button(.{ .label = ".", .onclick = pressedKey }),
})),
Expanded(Button(.{ .label = "=", .onclick = compute })),
capy.expanded(
capy.button(.{ .label = "=", .onclick = compute }),
),
}));
window.setPreferredSize(400, 500);
window.setTitle("Calculator");
Expand Down
14 changes: 7 additions & 7 deletions examples/colors.zig
Expand Up @@ -7,10 +7,10 @@ var random = prng.random();

pub fn animateRandomColor(button_: *anyopaque) !void {
// This part is a workaround to ziglang/zig#12325
const button: *capy.Button_Impl = @ptrCast(@alignCast(button_));
const button: *capy.Button = @ptrCast(@alignCast(button_));

const root = button.getRoot().?.as(capy.Container_Impl);
const rect = root.getChild("background-rectangle").?.as(capy.Rect_Impl);
const root = button.getRoot().?.as(capy.Container);
const rect = root.getChild("background-rectangle").?.as(capy.Rect);
const randomColor = capy.Color{ .red = random.int(u8), .green = random.int(u8), .blue = random.int(u8) };
rect.color.animate(capy.Easings.InOut, randomColor, 1000);
}
Expand All @@ -21,10 +21,10 @@ pub fn main() !void {
prng = std.rand.DefaultPrng.init(@as(u64, @bitCast(std.time.milliTimestamp())));

window.setPreferredSize(800, 600);
try window.set(capy.Stack(.{
capy.Rect(.{ .name = "background-rectangle", .color = capy.Color.transparent }),
capy.Column(.{}, .{
capy.Align(.{}, capy.Button(.{ .label = "Random color", .onclick = animateRandomColor })),
try window.set(capy.stack(.{
capy.rect(.{ .name = "background-rectangle", .color = capy.Color.transparent }),
capy.column(.{}, .{
capy.alignment(.{}, capy.button(.{ .label = "Random color", .onclick = animateRandomColor })),
}),
}));
window.show();
Expand Down

0 comments on commit 50606cc

Please sign in to comment.