Skip to content

Commit 839f327

Browse files
authored
feature(lambda-rs): Refactor the current event system to allow components to only implement handlers for events they care about
2 parents 45ae58a + e1ca87c commit 839f327

24 files changed

+1215
-374
lines changed

crates/lambda-rs/examples/immediates.rs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22

33
use lambda::{
44
component::Component,
5-
events::WindowEvent,
5+
events::{
6+
EventMask,
7+
WindowEvent,
8+
},
69
logging,
710
math::{
811
matrix,
@@ -219,23 +222,20 @@ impl Component<ComponentResult, String> for ImmediatesExample {
219222
return Ok(ComponentResult::Success);
220223
}
221224

222-
fn on_event(
223-
&mut self,
224-
event: lambda::events::Events,
225-
) -> Result<ComponentResult, String> {
226-
// Only handle resizes.
225+
fn event_mask(&self) -> EventMask {
226+
return EventMask::WINDOW;
227+
}
228+
229+
fn on_window_event(&mut self, event: &WindowEvent) -> Result<(), String> {
227230
match event {
228-
lambda::events::Events::Window { event, issued_at } => match event {
229-
WindowEvent::Resize { width, height } => {
230-
self.width = width;
231-
self.height = height;
232-
logging::info!("Window resized to {}x{}", width, height);
233-
}
234-
_ => {}
235-
},
231+
WindowEvent::Resize { width, height } => {
232+
self.width = *width;
233+
self.height = *height;
234+
logging::info!("Window resized to {}x{}", width, height);
235+
}
236236
_ => {}
237-
};
238-
return Ok(ComponentResult::Success);
237+
}
238+
return Ok(());
239239
}
240240

241241
/// Update elapsed time every frame.

crates/lambda-rs/examples/indexed_multi_vertex_buffers.rs

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@
99
1010
use lambda::{
1111
component::Component,
12-
events::WindowEvent,
12+
events::{
13+
EventMask,
14+
WindowEvent,
15+
},
1316
logging,
1417
render::{
1518
buffer::{
@@ -227,22 +230,20 @@ impl Component<ComponentResult, String> for IndexedMultiBufferExample {
227230
return Ok(ComponentResult::Success);
228231
}
229232

230-
fn on_event(
231-
&mut self,
232-
event: lambda::events::Events,
233-
) -> Result<ComponentResult, String> {
233+
fn event_mask(&self) -> EventMask {
234+
return EventMask::WINDOW;
235+
}
236+
237+
fn on_window_event(&mut self, event: &WindowEvent) -> Result<(), String> {
234238
match event {
235-
lambda::events::Events::Window { event, .. } => match event {
236-
WindowEvent::Resize { width, height } => {
237-
self.width = width;
238-
self.height = height;
239-
logging::info!("Window resized to {}x{}", width, height);
240-
}
241-
_ => {}
242-
},
239+
WindowEvent::Resize { width, height } => {
240+
self.width = *width;
241+
self.height = *height;
242+
logging::info!("Window resized to {}x{}", width, height);
243+
}
243244
_ => {}
244245
}
245-
return Ok(ComponentResult::Success);
246+
return Ok(());
246247
}
247248

248249
fn on_update(

crates/lambda-rs/examples/instanced_quads.rs

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@
99
1010
use lambda::{
1111
component::Component,
12-
events::WindowEvent,
12+
events::{
13+
EventMask,
14+
WindowEvent,
15+
},
1316
logging,
1417
render::{
1518
buffer::{
@@ -255,22 +258,20 @@ impl Component<ComponentResult, String> for InstancedQuadsExample {
255258
return Ok(ComponentResult::Success);
256259
}
257260

258-
fn on_event(
259-
&mut self,
260-
event: lambda::events::Events,
261-
) -> Result<ComponentResult, String> {
261+
fn event_mask(&self) -> EventMask {
262+
return EventMask::WINDOW;
263+
}
264+
265+
fn on_window_event(&mut self, event: &WindowEvent) -> Result<(), String> {
262266
match event {
263-
lambda::events::Events::Window { event, .. } => match event {
264-
WindowEvent::Resize { width, height } => {
265-
self.width = width;
266-
self.height = height;
267-
logging::info!("Window resized to {}x{}", width, height);
268-
}
269-
_ => {}
270-
},
267+
WindowEvent::Resize { width, height } => {
268+
self.width = *width;
269+
self.height = *height;
270+
logging::info!("Window resized to {}x{}", width, height);
271+
}
271272
_ => {}
272273
}
273-
return Ok(ComponentResult::Success);
274+
return Ok(());
274275
}
275276

276277
fn on_update(

crates/lambda-rs/examples/offscreen_post.rs

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44
55
use lambda::{
66
component::Component,
7-
events::Events,
7+
events::{
8+
EventMask,
9+
WindowEvent,
10+
},
811
logging,
912
render::{
1013
bind::{
@@ -213,16 +216,19 @@ impl Component<ComponentResult, String> for OffscreenPostExample {
213216
return Ok(ComponentResult::Success);
214217
}
215218

216-
fn on_event(&mut self, event: Events) -> Result<ComponentResult, String> {
217-
if let Events::Window {
218-
event: lambda::events::WindowEvent::Resize { width, height },
219-
..
220-
} = event
221-
{
222-
self.width = width;
223-
self.height = height;
219+
fn event_mask(&self) -> EventMask {
220+
return EventMask::WINDOW;
221+
}
222+
223+
fn on_window_event(&mut self, event: &WindowEvent) -> Result<(), String> {
224+
match event {
225+
WindowEvent::Resize { width, height } => {
226+
self.width = *width;
227+
self.height = *height;
228+
}
229+
_ => {}
224230
}
225-
return Ok(ComponentResult::Success);
231+
return Ok(());
226232
}
227233

228234
fn on_update(

crates/lambda-rs/examples/reflective_room.rs

Lines changed: 67 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@
1414
1515
use lambda::{
1616
component::Component,
17+
events::{
18+
EventMask,
19+
Key,
20+
VirtualKey,
21+
WindowEvent,
22+
},
1723
logging,
1824
math::matrix::Matrix,
1925
render::{
@@ -203,77 +209,73 @@ impl Component<ComponentResult, String> for ReflectiveRoomExample {
203209
return Ok(ComponentResult::Success);
204210
}
205211

206-
fn on_event(
207-
&mut self,
208-
event: lambda::events::Events,
209-
) -> Result<ComponentResult, String> {
212+
fn event_mask(&self) -> EventMask {
213+
return EventMask::WINDOW | EventMask::KEYBOARD;
214+
}
215+
216+
fn on_window_event(&mut self, event: &WindowEvent) -> Result<(), String> {
217+
match event {
218+
WindowEvent::Resize { width, height } => {
219+
self.width = *width;
220+
self.height = *height;
221+
}
222+
_ => {}
223+
}
224+
return Ok(());
225+
}
226+
227+
fn on_keyboard_event(&mut self, event: &Key) -> Result<(), String> {
210228
match event {
211-
lambda::events::Events::Window { event, .. } => match event {
212-
lambda::events::WindowEvent::Resize { width, height } => {
213-
self.width = width;
214-
self.height = height;
229+
Key::Pressed {
230+
scan_code: _,
231+
virtual_key,
232+
} => match virtual_key {
233+
Some(VirtualKey::KeyM) => {
234+
self.msaa_samples = if self.msaa_samples > 1 { 1 } else { 4 };
235+
self.needs_rebuild = true;
236+
logging::info!("Toggled MSAA → {}x (key: M)", self.msaa_samples);
237+
}
238+
Some(VirtualKey::KeyS) => {
239+
self.stencil_enabled = !self.stencil_enabled;
240+
self.needs_rebuild = true;
241+
logging::info!("Toggled Stencil → {} (key: S)", self.stencil_enabled);
242+
}
243+
Some(VirtualKey::KeyD) => {
244+
self.depth_test_enabled = !self.depth_test_enabled;
245+
self.needs_rebuild = true;
246+
logging::info!(
247+
"Toggled Depth Test → {} (key: D)",
248+
self.depth_test_enabled
249+
);
250+
}
251+
Some(VirtualKey::KeyF) => {
252+
self.mirror_mode = !self.mirror_mode;
253+
logging::info!(
254+
"Toggled Mirror Mode (hide floor overlay) → {} (key: F)",
255+
self.mirror_mode
256+
);
257+
}
258+
Some(VirtualKey::KeyI) => {
259+
self.camera_pitch_turns =
260+
(self.camera_pitch_turns - 0.01).clamp(0.0, 0.25);
261+
logging::info!(
262+
"Camera pitch (turns) → {:.3}",
263+
self.camera_pitch_turns
264+
);
265+
}
266+
Some(VirtualKey::KeyK) => {
267+
self.camera_pitch_turns =
268+
(self.camera_pitch_turns + 0.01).clamp(0.0, 0.25);
269+
logging::info!(
270+
"Camera pitch (turns) → {:.3}",
271+
self.camera_pitch_turns
272+
);
215273
}
216-
_ => {}
217-
},
218-
lambda::events::Events::Keyboard { event, .. } => match event {
219-
lambda::events::Key::Pressed {
220-
scan_code: _,
221-
virtual_key,
222-
} => match virtual_key {
223-
Some(lambda::events::VirtualKey::KeyM) => {
224-
self.msaa_samples = if self.msaa_samples > 1 { 1 } else { 4 };
225-
self.needs_rebuild = true;
226-
logging::info!("Toggled MSAA → {}x (key: M)", self.msaa_samples);
227-
}
228-
Some(lambda::events::VirtualKey::KeyS) => {
229-
self.stencil_enabled = !self.stencil_enabled;
230-
self.needs_rebuild = true;
231-
logging::info!(
232-
"Toggled Stencil → {} (key: S)",
233-
self.stencil_enabled
234-
);
235-
}
236-
Some(lambda::events::VirtualKey::KeyD) => {
237-
self.depth_test_enabled = !self.depth_test_enabled;
238-
self.needs_rebuild = true;
239-
logging::info!(
240-
"Toggled Depth Test → {} (key: D)",
241-
self.depth_test_enabled
242-
);
243-
}
244-
Some(lambda::events::VirtualKey::KeyF) => {
245-
self.mirror_mode = !self.mirror_mode;
246-
logging::info!(
247-
"Toggled Mirror Mode (hide floor overlay) → {} (key: F)",
248-
self.mirror_mode
249-
);
250-
}
251-
// 'R' previously forced an unmasked reflection; now disabled.
252-
Some(lambda::events::VirtualKey::KeyI) => {
253-
// Pitch camera up (reduce downward angle)
254-
self.camera_pitch_turns =
255-
(self.camera_pitch_turns - 0.01).clamp(0.0, 0.25);
256-
logging::info!(
257-
"Camera pitch (turns) → {:.3}",
258-
self.camera_pitch_turns
259-
);
260-
}
261-
Some(lambda::events::VirtualKey::KeyK) => {
262-
// Pitch camera down (increase downward angle)
263-
self.camera_pitch_turns =
264-
(self.camera_pitch_turns + 0.01).clamp(0.0, 0.25);
265-
logging::info!(
266-
"Camera pitch (turns) → {:.3}",
267-
self.camera_pitch_turns
268-
);
269-
}
270-
_ => {}
271-
},
272274
_ => {}
273275
},
274276
_ => {}
275277
}
276-
return Ok(ComponentResult::Success);
278+
return Ok(());
277279
}
278280

279281
fn on_update(

crates/lambda-rs/examples/textured_cube.rs

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@
77
88
use lambda::{
99
component::Component,
10+
events::{
11+
EventMask,
12+
WindowEvent,
13+
},
1014
logging,
1115
math::matrix::Matrix,
1216
render::{
@@ -364,21 +368,19 @@ impl Component<ComponentResult, String> for TexturedCubeExample {
364368
return Ok(ComponentResult::Success);
365369
}
366370

367-
fn on_event(
368-
&mut self,
369-
event: lambda::events::Events,
370-
) -> Result<ComponentResult, String> {
371+
fn event_mask(&self) -> EventMask {
372+
return EventMask::WINDOW;
373+
}
374+
375+
fn on_window_event(&mut self, event: &WindowEvent) -> Result<(), String> {
371376
match event {
372-
lambda::events::Events::Window { event, .. } => match event {
373-
lambda::events::WindowEvent::Resize { width, height } => {
374-
self.width = width;
375-
self.height = height;
376-
}
377-
_ => {}
378-
},
377+
WindowEvent::Resize { width, height } => {
378+
self.width = *width;
379+
self.height = *height;
380+
}
379381
_ => {}
380382
}
381-
return Ok(ComponentResult::Success);
383+
return Ok(());
382384
}
383385

384386
fn on_update(

0 commit comments

Comments
 (0)