mod(mouse): fix input.Mouse.in method
All checks were successful
Zig Project Action / Lint, Spell-check and test zig project (push) Successful in 46s

Pass through mouse events where they actually match the corresponding
`Container`. Adopt mouse event accordingly in `Scrollable` `Element`
trait when passing through the mouse event to the scrollable
`Container`.
This commit is contained in:
2025-02-18 19:09:03 +01:00
parent f66a870223
commit f55d71a7cb
3 changed files with 17 additions and 2 deletions

View File

@@ -387,6 +387,10 @@ pub fn Container(comptime Event: type) type {
try element.handle(.{ .resize = element_size });
}
},
.mouse => |mouse| if (mouse.in(this.size)) {
try this.element.handle(event);
for (this.elements.items) |*element| try element.handle(event);
},
else => {
try this.element.handle(event);
for (this.elements.items) |*element| try element.handle(event);

View File

@@ -112,6 +112,17 @@ pub fn Scrollable(Event: type) type {
// TODO: not just pass through the given size, but rather the size that is necessary for scrollable content
try this.container.handle(.{ .resize = size });
},
.mouse => |mouse| {
std.log.debug("mouse event detected in scrollable element {any}", .{mouse.in(this.size)});
try this.container.handle(.{
.mouse = .{
.col = mouse.col + this.anchor.col,
.row = mouse.row + this.anchor.row,
.button = mouse.button,
.kind = mouse.kind,
},
});
},
else => try this.container.handle(event),
}
}

View File

@@ -36,8 +36,8 @@ pub const Mouse = packed struct {
}
pub fn in(this: @This(), size: Size) bool {
return this.col >= size.anchor.col and this.col <= size.cols -| size.anchor.col and
this.row >= size.anchor.row and this.row <= size.rows -| size.anchor.row;
return this.col >= size.anchor.col and this.col <= size.cols + size.anchor.col and
this.row >= size.anchor.row and this.row <= size.rows + size.anchor.row;
}
};