@@ -16,7 +16,7 @@ use re_types::{
16
16
use re_ui:: { list_item, Help , UiExt as _} ;
17
17
use re_view:: { suggest_view_for_each_entity, view_property_ui} ;
18
18
use re_viewer_context:: {
19
- gpu_bridge, ColormapWithRange , IdentifiedViewSystem as _, IndicatedEntities ,
19
+ gpu_bridge, ColormapWithRange , IdentifiedViewSystem as _, IndicatedEntities , Item ,
20
20
MaybeVisualizableEntities , PerVisualizer , TensorStatsCache , TypedComponentFallbackProvider ,
21
21
ViewClass , ViewClassRegistryError , ViewId , ViewQuery , ViewState , ViewStateExt as _,
22
22
ViewSystemExecutionError , ViewerContext , VisualizableEntities ,
@@ -216,23 +216,38 @@ Set the displayed dimensions in a selection panel.",
216
216
217
217
let tensors = & system_output. view_systems . get :: < TensorSystem > ( ) ?. tensors ;
218
218
219
- if tensors. len ( ) > 1 {
220
- egui:: Frame {
221
- inner_margin : re_ui:: DesignTokens :: view_padding ( ) . into ( ) ,
222
- ..egui:: Frame :: default ( )
223
- }
224
- . show ( ui, |ui| {
225
- ui. error_label ( format ! (
226
- "Can only show one tensor at a time; was given {}. Update the query so that it \
219
+ let response = {
220
+ let mut ui = ui. new_child ( egui:: UiBuilder :: new ( ) . sense ( egui:: Sense :: click ( ) ) ) ;
221
+
222
+ if tensors. len ( ) > 1 {
223
+ egui:: Frame {
224
+ inner_margin : re_ui:: DesignTokens :: view_padding ( ) . into ( ) ,
225
+ ..egui:: Frame :: default ( )
226
+ }
227
+ . show ( & mut ui, |ui| {
228
+ ui. error_label ( format ! (
229
+ "Can only show one tensor at a time; was given {}. Update the query so that it \
227
230
returns a single tensor entity and create additional views for the others.",
228
- tensors. len( )
229
- ) ) ;
230
- } ) ;
231
- } else if let Some ( tensor_view) = tensors. first ( ) {
232
- state. tensor = Some ( tensor_view. clone ( ) ) ;
233
- self . view_tensor ( ctx, ui, state, query. view_id , & tensor_view. tensor ) ?;
234
- } else {
235
- ui. centered_and_justified ( |ui| ui. label ( "(empty)" ) ) ;
231
+ tensors. len( )
232
+ ) ) ;
233
+ } ) ;
234
+ } else if let Some ( tensor_view) = tensors. first ( ) {
235
+ state. tensor = Some ( tensor_view. clone ( ) ) ;
236
+ self . view_tensor ( ctx, & mut ui, state, query. view_id , & tensor_view. tensor ) ?;
237
+ } else {
238
+ ui. centered_and_justified ( |ui| ui. label ( "(empty)" ) ) ;
239
+ }
240
+
241
+ ui. response ( )
242
+ } ;
243
+
244
+ if response. hovered ( ) {
245
+ ctx. selection_state ( ) . set_hovered ( Item :: View ( query. view_id ) ) ;
246
+ }
247
+
248
+ if response. clicked ( ) {
249
+ ctx. selection_state ( )
250
+ . set_selection ( Item :: View ( query. view_id ) ) ;
236
251
}
237
252
238
253
Ok ( ( ) )
@@ -297,7 +312,7 @@ impl TensorView {
297
312
} ) ,
298
313
] ;
299
314
300
- egui:: ScrollArea :: both ( ) . show ( ui, |ui| {
315
+ egui:: ScrollArea :: both ( ) . auto_shrink ( false ) . show ( ui, |ui| {
301
316
if let Err ( err) =
302
317
self . tensor_slice_ui ( ctx, ui, state, view_id, dimension_labels, & slice_selection)
303
318
{
@@ -317,12 +332,12 @@ impl TensorView {
317
332
dimension_labels : [ Option < ( String , bool ) > ; 2 ] ,
318
333
slice_selection : & TensorSliceSelection ,
319
334
) -> anyhow:: Result < ( ) > {
320
- let ( response, painter , image_rect) =
335
+ let ( response, image_rect) =
321
336
self . paint_tensor_slice ( ctx, ui, state, view_id, slice_selection) ?;
322
337
323
338
if !response. hovered ( ) {
324
339
let font_id = egui:: TextStyle :: Body . resolve ( ui. style ( ) ) ;
325
- paint_axis_names ( ui, & painter , image_rect, font_id, dimension_labels) ;
340
+ paint_axis_names ( ui, image_rect, font_id, dimension_labels) ;
326
341
}
327
342
328
343
Ok ( ( ) )
@@ -335,7 +350,7 @@ impl TensorView {
335
350
state : & ViewTensorState ,
336
351
view_id : ViewId ,
337
352
slice_selection : & TensorSliceSelection ,
338
- ) -> anyhow:: Result < ( egui:: Response , egui:: Painter , egui :: Rect ) > {
353
+ ) -> anyhow:: Result < ( egui:: Response , egui:: Rect ) > {
339
354
re_tracing:: profile_function!( ) ;
340
355
341
356
let Some ( tensor_view) = state. tensor . as_ref ( ) else {
@@ -411,7 +426,7 @@ impl TensorView {
411
426
re_renderer:: DebugLabel :: from ( "tensor_slice" ) ,
412
427
) ?;
413
428
414
- Ok ( ( response, painter , image_rect) )
429
+ Ok ( ( response, image_rect) )
415
430
}
416
431
}
417
432
@@ -484,11 +499,12 @@ fn dimension_name(shape: &[TensorDimension], dim_idx: u32) -> String {
484
499
485
500
fn paint_axis_names (
486
501
ui : & egui:: Ui ,
487
- painter : & egui:: Painter ,
488
502
rect : egui:: Rect ,
489
503
font_id : egui:: FontId ,
490
504
dimension_labels : [ Option < ( String , bool ) > ; 2 ] ,
491
505
) {
506
+ let painter = ui. painter ( ) ;
507
+
492
508
let [ width, height] = dimension_labels;
493
509
let ( width_name, invert_width) =
494
510
width. map_or ( ( None , false ) , |( label, invert) | ( Some ( label) , invert) ) ;
0 commit comments