Skip to content

Commit 51d949e

Browse files
oxkitsuneMichaelGrupp
authored andcommitted
notebook: Re-export viewer event types
Source-Ref: 3965e4a969b97f9d96b824b8827f606e2385a8cb
1 parent cefbdf6 commit 51d949e

File tree

3 files changed

+90
-5
lines changed

3 files changed

+90
-5
lines changed

rerun_py/docs/gen_common_index.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -508,6 +508,23 @@ def __post_init__(self) -> None:
508508
show_tables=True,
509509
mod_path=["rerun.notebook"],
510510
show_submodules=True,
511+
func_list=[
512+
"set_default_size",
513+
],
514+
class_list=[
515+
"Viewer",
516+
"ViewerEvent",
517+
"PlayEvent",
518+
"PauseEvent",
519+
"TimeUpdateEvent",
520+
"TimelineChangeEvent",
521+
"SelectionChangeEvent",
522+
"RecordingOpenEvent",
523+
"SelectionItem",
524+
"EntitySelectionItem",
525+
"ViewSelectionItem",
526+
"ContainerSelectionItem",
527+
],
511528
),
512529
Section(
513530
title="Script Helpers",

rerun_py/rerun_sdk/rerun/_event.py

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,110 +11,154 @@
1111
# and the serialization code, which is in `viewer_event_from_json`.
1212

1313

14-
# Base class for all viewer events
1514
@dataclass
1615
class ViewerEventBase:
16+
"""Base class for all viewer events."""
17+
1718
application_id: str
19+
"""The application ID of the recording that triggered the event."""
20+
1821
recording_id: str
22+
"""The recording ID of the recording that triggered the event."""
23+
1924
segment_id: str | None
25+
"""The segment ID of the recording that triggered the event, if any."""
2026

2127
@property
2228
@deprecated("Use `segment_id` instead.")
2329
def partition_id(self) -> str | None:
2430
return self.segment_id
2531

2632

27-
# Selection item types with proper type discrimination
2833
@dataclass
2934
class EntitySelectionItem:
35+
"""An entity selection item, representing a selected entity in the viewer."""
36+
3037
@property
3138
def type(self) -> Literal["entity"]:
3239
return "entity"
3340

3441
entity_path: str
42+
"""The entity path of the selected entity."""
43+
3544
instance_id: int | None = None
45+
"""The instance ID of the selected entity, if any."""
46+
3647
view_name: str | None = None
48+
"""The name of the view containing the selected entity, if any."""
49+
3750
position: list[float] | None = None
51+
"""The 3D position of the selection, if any."""
3852

3953

4054
@dataclass
4155
class ViewSelectionItem:
56+
"""A view selection item, representing a selected view in the viewer."""
57+
4258
@property
4359
def type(self) -> Literal["view"]:
4460
return "view"
4561

4662
view_id: str
63+
"""The ID of the selected view."""
64+
4765
view_name: str
66+
"""The name of the selected view."""
4867

4968

5069
@dataclass
5170
class ContainerSelectionItem:
71+
"""A container selection item, representing a selected container in the viewer."""
72+
5273
@property
5374
def type(self) -> Literal["container"]:
5475
return "container"
5576

5677
container_id: str
78+
"""The ID of the selected container."""
79+
5780
container_name: str
81+
"""The name of the selected container."""
5882

5983

6084
SelectionItem = EntitySelectionItem | ViewSelectionItem | ContainerSelectionItem
85+
"""Union type for all possible selection item types."""
6186

6287

63-
# Concrete event classes
6488
@dataclass
6589
class PlayEvent(ViewerEventBase):
90+
"""Event triggered when the viewer starts playing."""
91+
6692
@property
6793
def type(self) -> Literal["play"]:
6894
return "play"
6995

7096

7197
@dataclass
7298
class PauseEvent(ViewerEventBase):
99+
"""Event triggered when the viewer pauses playback."""
100+
73101
@property
74102
def type(self) -> Literal["pause"]:
75103
return "pause"
76104

77105

78106
@dataclass
79107
class TimeUpdateEvent(ViewerEventBase):
108+
"""Event triggered when the current time changes in the viewer."""
109+
80110
@property
81111
def type(self) -> Literal["time_update"]:
82112
return "time_update"
83113

84114
time: float
115+
"""The new time value."""
85116

86117

87118
@dataclass
88119
class TimelineChangeEvent(ViewerEventBase):
120+
"""Event triggered when the active timeline changes in the viewer."""
121+
89122
@property
90123
def type(self) -> Literal["timeline_change"]:
91124
return "timeline_change"
92125

93126
timeline: str
127+
"""The name of the new active timeline."""
128+
94129
time: float
130+
"""The current time value on the new timeline."""
95131

96132

97133
@dataclass
98134
class SelectionChangeEvent(ViewerEventBase):
135+
"""Event triggered when the selection changes in the viewer."""
136+
99137
@property
100138
def type(self) -> Literal["selection_change"]:
101139
return "selection_change"
102140

103141
items: list[SelectionItem]
142+
"""The list of currently selected items."""
104143

105144

106145
@dataclass
107146
class RecordingOpenEvent(ViewerEventBase):
147+
"""Event triggered when a recording is opened in the viewer."""
148+
108149
@property
109150
def type(self) -> Literal["recording_open"]:
110151
return "recording_open"
111152

112153
source: str
154+
"""The source of the recording (e.g. a URL or file path)."""
155+
113156
version: str | None
157+
"""The version of the recording, if available."""
114158

115159

116-
# Union type for all possible event types
117160
ViewerEvent = PlayEvent | PauseEvent | TimeUpdateEvent | TimelineChangeEvent | SelectionChangeEvent | RecordingOpenEvent
161+
"""Union type for all possible viewer event types."""
118162

119163

120164
def _viewer_event_from_json_str(json_str: str) -> ViewerEvent:

rerun_py/rerun_sdk/rerun/notebook.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,17 @@
2424
from rerun.error_utils import RerunMissingDependencyError
2525

2626
from ._event import (
27-
ViewerEvent,
27+
ContainerSelectionItem as ContainerSelectionItem,
28+
EntitySelectionItem as EntitySelectionItem,
29+
PauseEvent as PauseEvent,
30+
PlayEvent as PlayEvent,
31+
RecordingOpenEvent as RecordingOpenEvent,
32+
SelectionChangeEvent as SelectionChangeEvent,
33+
SelectionItem as SelectionItem,
34+
TimelineChangeEvent as TimelineChangeEvent,
35+
TimeUpdateEvent as TimeUpdateEvent,
36+
ViewerEvent as ViewerEvent,
37+
ViewSelectionItem as ViewSelectionItem,
2838
_viewer_event_from_json_str,
2939
)
3040
from .recording_stream import RecordingStream, get_data_recording
@@ -477,6 +487,20 @@ def set_time_ctrl(
477487
self._viewer.set_time_ctrl(timeline, time, play)
478488

479489
def on_event(self, callback: Callable[[ViewerEvent], None]) -> None:
490+
"""
491+
Register a callback to be called when a viewer event occurs.
492+
493+
The callback will receive a [`ViewerEvent`][rerun.notebook.ViewerEvent], which is one of:
494+
[`PlayEvent`][rerun.notebook.PlayEvent], [`PauseEvent`][rerun.notebook.PauseEvent],
495+
[`TimeUpdateEvent`][rerun.notebook.TimeUpdateEvent], [`TimelineChangeEvent`][rerun.notebook.TimelineChangeEvent],
496+
[`SelectionChangeEvent`][rerun.notebook.SelectionChangeEvent], or [`RecordingOpenEvent`][rerun.notebook.RecordingOpenEvent].
497+
498+
Parameters
499+
----------
500+
callback:
501+
A function that takes a [`ViewerEvent`][rerun.notebook.ViewerEvent] as its only argument.
502+
503+
"""
480504
self._event_callbacks.append(callback)
481505

482506
def set_credentials(self, access_token: str, email: str) -> None:

0 commit comments

Comments
 (0)