aboutsummaryrefslogtreecommitdiff
path: root/src/widgets/systems.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/widgets/systems.rs')
-rw-r--r--src/widgets/systems.rs35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/widgets/systems.rs b/src/widgets/systems.rs
new file mode 100644
index 0000000..69a84e3
--- /dev/null
+++ b/src/widgets/systems.rs
@@ -0,0 +1,35 @@
+use bevy::prelude::*;
+
+use crate::{display::resources::Terminal, input::events::TerminalInputEvent};
+
+use super::components::Widget;
+
+/// Invokes every enabled widget's `render` method
+pub fn draw_widgets(mut terminal: ResMut<Terminal>, mut widgets: Query<&mut Widget>) {
+ terminal
+ .0
+ .draw(|frame| {
+ let mut active_widgets = widgets
+ .iter_mut()
+ .filter(|widget| widget.enabled)
+ .collect::<Vec<_>>();
+ active_widgets.sort_by(|a, b| a.depth.cmp(&b.depth));
+ for mut widget in active_widgets {
+ widget.widget.render(frame, frame.size());
+ }
+ })
+ .unwrap();
+}
+
+/// Invokes every enabled widget's `handle_events` methods for each incoming input event
+pub fn widget_input_handling(
+ mut widgets: Query<&mut Widget>,
+ mut event_reader: EventReader<TerminalInputEvent>,
+ mut commands: Commands,
+) {
+ for event in event_reader.read() {
+ for mut widget in widgets.iter_mut().filter(|widget| widget.enabled) {
+ widget.widget.handle_events(event, &mut commands);
+ }
+ }
+}