@@ -20,8 +20,8 @@ use re_ui::{ContextExt as _, DesignTokens, Help, UiExt as _, filter_widget, icon
20
20
use re_ui:: { IconText , filter_widget:: format_matching_text} ;
21
21
use re_viewer_context:: {
22
22
CollapseScope , HoverHighlight , Item , ItemCollection , ItemContext , RecordingConfig ,
23
- SystemCommand , SystemCommandSender as _, TimeControl , TimeView , UiLayout , ViewerContext ,
24
- VisitorControlFlow ,
23
+ SystemCommand , SystemCommandSender as _, TimeControl , TimeView , UiLayout , UrlContext ,
24
+ ViewerContext , VisitorControlFlow ,
25
25
} ;
26
26
use re_viewport_blueprint:: ViewportBlueprint ;
27
27
@@ -567,6 +567,7 @@ impl TimePanel {
567
567
& self . time_ranges_ui ,
568
568
time_ctrl,
569
569
ui,
570
+ ctx,
570
571
Some ( & time_area_response) ,
571
572
& time_area_painter,
572
573
& timeline_rect,
@@ -1380,6 +1381,7 @@ impl TimePanel {
1380
1381
& time_ranges_ui,
1381
1382
time_ctrl,
1382
1383
ui,
1384
+ ctx,
1383
1385
None ,
1384
1386
& painter,
1385
1387
& time_range_rect,
@@ -1396,7 +1398,9 @@ impl TimePanel {
1396
1398
ui : & mut egui:: Ui ,
1397
1399
time_ctrl : & mut TimeControl ,
1398
1400
) {
1399
- if let Some ( time_int) = time_ctrl. time_int ( ) {
1401
+ if let Some ( time_int) = time_ctrl. time_int ( )
1402
+ && let Some ( time) = time_ctrl. time ( )
1403
+ {
1400
1404
let time_type = time_ctrl. time_type ( ) ;
1401
1405
1402
1406
let mut time_str = self
@@ -1418,11 +1422,11 @@ impl TimePanel {
1418
1422
}
1419
1423
self . time_edit_string = None ;
1420
1424
}
1421
- response
1422
- . on_hover_text ( format ! ( "Timestamp: {}" , time_int . as_i64 ( ) ) )
1423
- . context_menu ( |ui| {
1424
- copy_time_properties_context_menu ( ui, time_ctrl , None ) ;
1425
- } ) ;
1425
+ let response = response . on_hover_text ( format ! ( "Timestamp: {}" , time_int . as_i64 ( ) ) ) ;
1426
+
1427
+ response . context_menu ( |ui| {
1428
+ copy_time_properties_context_menu ( ui, time ) ;
1429
+ } ) ;
1426
1430
}
1427
1431
}
1428
1432
}
@@ -1774,29 +1778,41 @@ fn interact_with_streams_rect(
1774
1778
}
1775
1779
1776
1780
/// Context menu that shows up when interacting with the streams rect.
1777
- fn copy_time_properties_context_menu (
1781
+ fn copy_timeline_properties_context_menu (
1778
1782
ui : & mut egui:: Ui ,
1783
+ ctx : & ViewerContext < ' _ > ,
1779
1784
time_ctrl : & TimeControl ,
1780
- hovered_time : Option < TimeReal > ,
1785
+ hovered_time : TimeReal ,
1781
1786
) {
1782
- if let Some ( time) = hovered_time {
1783
- if ui. button ( "Copy hovered timestamp" ) . clicked ( ) {
1784
- let time = format ! ( "{}" , time. floor( ) . as_i64( ) ) ;
1785
- re_log:: info!( "Copied hovered timestamp: {}" , time) ;
1786
- ui. ctx ( ) . copy_text ( time) ;
1787
- }
1788
- } else if let Some ( time) = time_ctrl. time_int ( )
1789
- && ui. button ( "Copy current timestamp" ) . clicked ( )
1787
+ // TODO: Add shortcuts for these
1788
+ if let Some ( selected_time_range) = time_ctrl. active_loop_selection ( )
1789
+ && selected_time_range. contains ( hovered_time)
1790
1790
{
1791
- let time = format ! ( "{}" , time. as_i64( ) ) ;
1792
- re_log:: info!( "Copied current timestamp: {}" , time) ;
1791
+ if ui. button ( "Copy link to trimmed range" ) . clicked ( ) {
1792
+ ctx. command_sender ( )
1793
+ . send_system ( UrlContext :: from_context ( ctx) . into_copy_cmd ( ) ) ;
1794
+ }
1795
+ } else if ui. button ( "Copy link to timestamp" ) . clicked ( ) {
1796
+ ctx. command_sender ( ) . send_system (
1797
+ UrlContext :: from_context ( ctx)
1798
+ . without_time_range ( )
1799
+ . with_timestamp ( time_ctrl. timeline ( ) , hovered_time. into ( ) )
1800
+ . into_copy_cmd ( ) ,
1801
+ ) ;
1802
+ }
1803
+
1804
+ if ui. button ( "Copy timestamp" ) . clicked ( ) {
1805
+ let time = format ! ( "{}" , hovered_time. floor( ) . as_i64( ) ) ;
1806
+ re_log:: info!( "Copied hovered timestamp: {}" , time) ;
1793
1807
ui. ctx ( ) . copy_text ( time) ;
1794
1808
}
1809
+ }
1795
1810
1796
- if ui. button ( "Copy current timeline name" ) . clicked ( ) {
1797
- let timeline = format ! ( "{}" , time_ctrl. timeline( ) . name( ) ) ;
1798
- re_log:: info!( "Copied current timeline: {}" , timeline) ;
1799
- ui. ctx ( ) . copy_text ( timeline) ;
1811
+ fn copy_time_properties_context_menu ( ui : & mut egui:: Ui , time : TimeReal ) {
1812
+ if ui. button ( "Copy timestamp" ) . clicked ( ) {
1813
+ let time = format ! ( "{}" , time. floor( ) . as_i64( ) ) ;
1814
+ re_log:: info!( "Copied hovered timestamp: {}" , time) ;
1815
+ ui. ctx ( ) . copy_text ( time) ;
1800
1816
}
1801
1817
}
1802
1818
@@ -1805,6 +1821,7 @@ fn time_marker_ui(
1805
1821
time_ranges_ui : & TimeRangesUi ,
1806
1822
time_ctrl : & mut TimeControl ,
1807
1823
ui : & egui:: Ui ,
1824
+ ctx : & ViewerContext < ' _ > ,
1808
1825
time_area_response : Option < & egui:: Response > ,
1809
1826
time_area_painter : & egui:: Painter ,
1810
1827
timeline_rect : & Rect ,
@@ -1918,8 +1935,26 @@ fn time_marker_ui(
1918
1935
}
1919
1936
}
1920
1937
1921
- time_area_response
1922
- . context_menu ( |ui| copy_time_properties_context_menu ( ui, time_ctrl, hovered_time) ) ;
1938
+ let hovered_ctx_id = egui:: Id :: new ( "hovered timestamp context" ) ;
1939
+ if let Some ( hovered_time) = ui
1940
+ . ctx ( )
1941
+ . memory ( |mem| mem. data . get_temp ( hovered_ctx_id) )
1942
+ . or ( hovered_time)
1943
+ {
1944
+ if egui:: Popup :: context_menu ( & time_area_response)
1945
+ . width ( 300.0 )
1946
+ . show ( |ui| {
1947
+ copy_timeline_properties_context_menu ( ui, ctx, time_ctrl, hovered_time) ;
1948
+ } )
1949
+ . is_some ( )
1950
+ {
1951
+ ui. ctx ( )
1952
+ . memory_mut ( |mem| mem. data . insert_temp ( hovered_ctx_id, hovered_time) ) ;
1953
+ } else {
1954
+ ui. ctx ( )
1955
+ . memory_mut ( |mem| mem. data . remove :: < TimeReal > ( hovered_ctx_id) ) ;
1956
+ }
1957
+ }
1923
1958
}
1924
1959
}
1925
1960
0 commit comments