Skip to content

Commit 9e3ce99

Browse files
authored
Unify viewer callbacks into a single Event interface (#9739)
1 parent 3c8dd8a commit 9e3ce99

File tree

19 files changed

+788
-685
lines changed

19 files changed

+788
-685
lines changed

.prettierrc.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,7 @@ options = { semi = true, tabWidth = 2 }
1313
[[overrides]]
1414
files = [".prettierrc", "*.json", "*.css", "*.html"]
1515
options = { tabWidth = 2 }
16+
17+
[[overrides]]
18+
files = ["*.ts"]
19+
options = { parser = "typescript" }

crates/top/rerun/src/commands/entrypoint.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -700,7 +700,7 @@ fn run_impl(
700700
force_wgpu_backend: args.renderer.clone(),
701701
video_decoder_hw_acceleration,
702702

703-
callbacks: None,
703+
on_event: None,
704704

705705
panel_state_overrides: Default::default(),
706706
}

crates/viewer/re_viewer/src/app.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ use crate::{
2626
app_blueprint::{AppBlueprint, PanelStateOverrides},
2727
app_state::WelcomeScreenState,
2828
background_tasks::BackgroundTasks,
29-
callback::Callbacks,
29+
event::ViewerEventDispatcher,
3030
AppState,
3131
};
3232
// ----------------------------------------------------------------------------
@@ -123,7 +123,7 @@ pub struct App {
123123
reflection: re_types_core::reflection::Reflection,
124124

125125
/// External interactions with the Viewer host (JS, custom egui app, notebook, etc.).
126-
pub callbacks: Option<Callbacks>,
126+
pub event_dispatcher: Option<ViewerEventDispatcher>,
127127

128128
/// The async runtime that should be used for all asynchronous operations.
129129
///
@@ -259,7 +259,10 @@ impl App {
259259
Default::default()
260260
});
261261

262-
let callbacks = startup_options.callbacks.clone();
262+
let event_dispatcher = startup_options
263+
.on_event
264+
.clone()
265+
.map(ViewerEventDispatcher::new);
263266

264267
if !state.redap_servers.is_empty() {
265268
command_sender.send_ui(UICommand::ExpandBlueprintPanel);
@@ -316,7 +319,7 @@ impl App {
316319

317320
reflection,
318321

319-
callbacks,
322+
event_dispatcher,
320323
async_runtime: tokio_runtime,
321324
}
322325
}
@@ -1329,7 +1332,7 @@ impl App {
13291332
opacity: self.welcome_screen_opacity(egui_ctx),
13301333
},
13311334
is_history_enabled,
1332-
self.callbacks.as_ref(),
1335+
self.event_dispatcher.as_ref(),
13331336
);
13341337
render_ctx.before_submit();
13351338
}

crates/viewer/re_viewer/src/app_state.rs

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ use re_viewport_blueprint::ViewportBlueprint;
2323

2424
use crate::{
2525
app_blueprint::AppBlueprint,
26+
event::ViewerEventDispatcher,
2627
ui::{recordings_panel_ui, settings_screen_ui},
2728
};
2829

@@ -173,7 +174,7 @@ impl AppState {
173174
command_sender: &CommandSender,
174175
welcome_screen_state: &WelcomeScreenState,
175176
is_history_enabled: bool,
176-
callbacks: Option<&crate::callback::Callbacks>,
177+
event_dispatcher: Option<&crate::event::ViewerEventDispatcher>,
177178
) {
178179
re_tracing::profile_function!();
179180

@@ -237,8 +238,12 @@ impl AppState {
237238
);
238239

239240
if let SelectionChange::SelectionChanged(selection) = selection_change {
240-
if let Some(callbacks) = callbacks {
241-
callbacks.on_selection_change(selection, &viewport_ui.blueprint);
241+
if let Some(event_dispatcher) = event_dispatcher {
242+
event_dispatcher.on_selection_change(
243+
store_context.recording,
244+
selection,
245+
&viewport_ui.blueprint,
246+
);
242247
}
243248
}
244249

@@ -321,7 +326,7 @@ impl AppState {
321326

322327
// We move the time at the very start of the frame,
323328
// so that we always show the latest data when we're in "follow" mode.
324-
move_time(&ctx, recording, rx_log, callbacks);
329+
move_time(&ctx, recording, rx_log, event_dispatcher);
325330

326331
// Update the viewport. May spawn new views and handle queued requests (like screenshots).
327332
viewport_ui.on_frame_start(&ctx);
@@ -704,7 +709,7 @@ fn move_time(
704709
ctx: &ViewerContext<'_>,
705710
recording: &EntityDb,
706711
rx: &ReceiveSet<LogMsg>,
707-
callbacks: Option<&crate::callback::Callbacks>,
712+
events: Option<&ViewerEventDispatcher>,
708713
) {
709714
let dt = ctx.egui_ctx().input(|i| i.stable_dt);
710715

@@ -725,7 +730,7 @@ fn move_time(
725730
should_diff_time_ctrl,
726731
);
727732

728-
handle_time_ctrl_callbacks(callbacks, &recording_time_ctrl_response);
733+
handle_time_ctrl_event(recording, events, &recording_time_ctrl_response);
729734

730735
let recording_needs_repaint = recording_time_ctrl_response.needs_repaint;
731736

@@ -752,28 +757,25 @@ fn move_time(
752757
}
753758
}
754759

755-
fn handle_time_ctrl_callbacks(
756-
callbacks: Option<&crate::callback::Callbacks>,
760+
fn handle_time_ctrl_event(
761+
recording: &EntityDb,
762+
events: Option<&ViewerEventDispatcher>,
757763
response: &re_viewer_context::TimeControlResponse,
758764
) {
759-
let Some(callbacks) = callbacks else {
765+
let Some(events) = events else {
760766
return;
761767
};
762768

763769
if let Some(playing) = response.playing_change {
764-
if playing {
765-
callbacks.on_play();
766-
} else {
767-
callbacks.on_pause();
768-
}
770+
events.on_play_state_change(recording, playing);
769771
}
770772

771773
if let Some((timeline, time)) = response.timeline_change {
772-
callbacks.on_timeline_change(timeline, time);
774+
events.on_timeline_change(recording, timeline, time);
773775
}
774776

775777
if let Some(time) = response.time_change {
776-
callbacks.on_time_update(time);
778+
events.on_time_update(recording, time);
777779
}
778780
}
779781

0 commit comments

Comments
 (0)