From 5d38cea63a12d18f93e1933490020a4af4bd69be Mon Sep 17 00:00:00 2001 From: Marcius Date: Mon, 8 Jan 2024 21:53:25 +0000 Subject: [PATCH] feat: implemented widget iterator --- src/WidgetIter.zig | 27 +++++++++++++++++++++++++++ src/main.zig | 2 ++ 2 files changed, 29 insertions(+) create mode 100644 src/WidgetIter.zig diff --git a/src/WidgetIter.zig b/src/WidgetIter.zig new file mode 100644 index 0000000..f2b00c3 --- /dev/null +++ b/src/WidgetIter.zig @@ -0,0 +1,27 @@ +//! This is a iterator to iterate over the widget tree +//! Depth-first +const std = @import("std"); + +const Widget = @import("widget.zig").Widget; + +current: *Widget, + +const WidgetIter = @This(); + +pub fn next(self: *WidgetIter) ?*Widget { + var last: ?*Widget = null; + while (true) { + const children = self.current.children(); + const slice = if (last) |l| + children[std.mem.indexOfScalar(*Widget, children, l).? + 1 ..] + else + children; + if (slice.len == 0) { + last = self.current; + self.current = self.current.data.parent orelse return null; + } else { + self.current = slice[0]; + return self.current; + } + } +} diff --git a/src/main.zig b/src/main.zig index e5696e6..436e8cc 100644 --- a/src/main.zig +++ b/src/main.zig @@ -16,6 +16,7 @@ test { _ = widget; _ = Color; + _ = WidgetIter; } pub const attreebute = @import("attreebute.zig"); @@ -31,6 +32,7 @@ pub const util = @import("util.zig"); pub const widget = @import("widget.zig"); pub const Color = @import("Color.zig"); +pub const WidgetIter = @import("WidgetIter.zig"); /// List of the default widget implementations included with Zenolith. /// If you set zenolith_options.widget_impls, include this if you want to use Zenolith's widgets.