add TextElement for "New Meld" button
parent
2dde105a58
commit
f0e6bc4e0d
77
src/main.zig
77
src/main.zig
|
@ -323,6 +323,7 @@ pub fn main() !void {
|
||||||
.{
|
.{
|
||||||
.hovered = if (hovered_action) |ha| ha.command else null,
|
.hovered = if (hovered_action) |ha| ha.command else null,
|
||||||
.deck = deck_sprites,
|
.deck = deck_sprites,
|
||||||
|
.font = canvas.font,
|
||||||
},
|
},
|
||||||
.{ 0, 0 },
|
.{ 0, 0 },
|
||||||
.{
|
.{
|
||||||
|
@ -344,6 +345,7 @@ pub fn main() !void {
|
||||||
.{
|
.{
|
||||||
.hovered = if (hovered_action) |ha| ha.command else null,
|
.hovered = if (hovered_action) |ha| ha.command else null,
|
||||||
.deck = deck_sprites,
|
.deck = deck_sprites,
|
||||||
|
.font = canvas.font,
|
||||||
},
|
},
|
||||||
.{ 0, 0 },
|
.{ 0, 0 },
|
||||||
.{
|
.{
|
||||||
|
@ -382,6 +384,7 @@ const Action = struct {
|
||||||
const RenderResources = struct {
|
const RenderResources = struct {
|
||||||
hovered: ?[]const u8,
|
hovered: ?[]const u8,
|
||||||
deck: DeckSprites,
|
deck: DeckSprites,
|
||||||
|
font: seizer.Canvas.Font,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub const Element = struct {
|
pub const Element = struct {
|
||||||
|
@ -835,6 +838,71 @@ pub const CardElement = struct {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
pub const TextElement = struct {
|
||||||
|
allocator: std.mem.Allocator,
|
||||||
|
text: []const u8,
|
||||||
|
command: ?[]const u8,
|
||||||
|
|
||||||
|
pub fn create(allocator: std.mem.Allocator, options: struct { text: []const u8, command: ?[]const u8 }) !*@This() {
|
||||||
|
const this = try allocator.create(@This());
|
||||||
|
errdefer allocator.destroy(this);
|
||||||
|
|
||||||
|
this.* = .{
|
||||||
|
.allocator = allocator,
|
||||||
|
.text = options.text,
|
||||||
|
.command = options.command,
|
||||||
|
};
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn element(this: *@This()) Element {
|
||||||
|
return Element{
|
||||||
|
.pointer = this,
|
||||||
|
.interface = &Element.Interface{
|
||||||
|
.minimum_size = &element_minimum_size,
|
||||||
|
.render = &element_render,
|
||||||
|
.get_actions = &element_get_actions,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn element_minimum_size(pointer: ?*anyopaque, render_resources: RenderResources) [2]f32 {
|
||||||
|
const this: *@This() = @ptrCast(@alignCast(pointer));
|
||||||
|
return render_resources.font.textSize(this.text, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn element_render(pointer: ?*anyopaque, canvas: *seizer.Canvas, render_resources: RenderResources, min: [2]f32, max: [2]f32) void {
|
||||||
|
const this: *@This() = @ptrCast(@alignCast(pointer));
|
||||||
|
_ = max;
|
||||||
|
|
||||||
|
const text_size = canvas.writeText(min, this.text, .{});
|
||||||
|
|
||||||
|
if (render_resources.hovered != null and this.command != null and std.mem.eql(u8, render_resources.hovered.?, this.command.?)) {
|
||||||
|
canvas.rect(
|
||||||
|
.{ min[0], min[1] },
|
||||||
|
text_size,
|
||||||
|
.{ .color = .{ 0xAA, 0xFF, 0xAA, 0x60 } },
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn element_get_actions(pointer: ?*anyopaque, actions: *std.ArrayList(Action), render_resources: RenderResources, min: [2]f32, max: [2]f32) Element.Error!void {
|
||||||
|
const this: *@This() = @ptrCast(@alignCast(pointer));
|
||||||
|
|
||||||
|
_ = render_resources;
|
||||||
|
|
||||||
|
if (this.command) |command| {
|
||||||
|
try actions.append(.{
|
||||||
|
.center = [2]f32{
|
||||||
|
(min[0] + max[0]) / 2,
|
||||||
|
(min[1] + max[1]) / 2,
|
||||||
|
},
|
||||||
|
.command = command,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/// Handler at the start of a turn, while the player is drawing a card.
|
/// Handler at the start of a turn, while the player is drawing a card.
|
||||||
fn drawCardHandler(arena: std.mem.Allocator, request: Request) HandlerError!Response {
|
fn drawCardHandler(arena: std.mem.Allocator, request: Request) HandlerError!Response {
|
||||||
if (request.command) |command| {
|
if (request.command) |command| {
|
||||||
|
@ -912,6 +980,14 @@ fn playerTurnHandler(arena: std.mem.Allocator, request: Request) HandlerError!Re
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var new_meld_text = try TextElement.create(arena, .{
|
||||||
|
.text = "New Meld",
|
||||||
|
.command = "new-meld",
|
||||||
|
});
|
||||||
|
|
||||||
|
var melds_hbox = try HBox.create(arena);
|
||||||
|
try melds_hbox.addElement(new_meld_text.element());
|
||||||
|
|
||||||
var draw_pile = try Pile.create(arena, request.game_state.draw_pile.items);
|
var draw_pile = try Pile.create(arena, request.game_state.draw_pile.items);
|
||||||
draw_pile.hidden = true;
|
draw_pile.hidden = true;
|
||||||
|
|
||||||
|
@ -934,6 +1010,7 @@ fn playerTurnHandler(arena: std.mem.Allocator, request: Request) HandlerError!Re
|
||||||
var page = try Page.create(arena);
|
var page = try Page.create(arena);
|
||||||
try page.addElement(.{ 0.5, 0.5 }, .{ 0.5, 0.5 }, draw_discard_hbox.element());
|
try page.addElement(.{ 0.5, 0.5 }, .{ 0.5, 0.5 }, draw_discard_hbox.element());
|
||||||
try page.addElement(.{ 0.5, 1 }, .{ 0.5, 1 }, hand.element());
|
try page.addElement(.{ 0.5, 1 }, .{ 0.5, 1 }, hand.element());
|
||||||
|
try page.addElement(.{ 0.5, 0 }, .{ 0.5, 0 }, melds_hbox.element());
|
||||||
|
|
||||||
return Response{ .page = page.element() };
|
return Response{ .page = page.element() };
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue