Skip to content

Commit 4f1bf04

Browse files
authored
Add re_data_ui tooltip to graph view nodes (#8311)
### Related <!-- Include links to any related issues/PRs in a bulleted list, for example: * Closes #1234 * Part of #1337 --> * Closes #8279. ### What Title. <img width="330" alt="image" src="https://github.com/user-attachments/assets/c2f0e65e-d532-41ca-a1b9-6d0f758c78a6"> <!-- Make sure the PR title and labels are set to maximize their usefulness for the CHANGELOG, and our `git log`. If you have noticed any breaking changes, include them in the migration guide. We track various metrics at <https://build.rerun.io>. For maintainers: * To run all checks from `main`, comment on the PR with `@rerun-bot full-check`. * To deploy documentation changes immediately after merging this PR, add the `deploy docs` label. -->
1 parent c0fad11 commit 4f1bf04

File tree

5 files changed

+51
-53
lines changed

5 files changed

+51
-53
lines changed

Cargo.lock

+12-11
Original file line numberDiff line numberDiff line change
@@ -1923,7 +1923,7 @@ checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125"
19231923
[[package]]
19241924
name = "ecolor"
19251925
version = "0.29.1"
1926-
source = "git+https://github.com/emilk/egui.git?rev=eac7ba01fa37bad35f71bc303561761952361b7c#eac7ba01fa37bad35f71bc303561761952361b7c"
1926+
source = "git+https://github.com/emilk/egui.git?rev=c5ac7d301a90afbaec843ee04fb43d8a0956cc90#c5ac7d301a90afbaec843ee04fb43d8a0956cc90"
19271927
dependencies = [
19281928
"bytemuck",
19291929
"color-hex",
@@ -1940,7 +1940,7 @@ checksum = "18aade80d5e09429040243ce1143ddc08a92d7a22820ac512610410a4dd5214f"
19401940
[[package]]
19411941
name = "eframe"
19421942
version = "0.29.1"
1943-
source = "git+https://github.com/emilk/egui.git?rev=eac7ba01fa37bad35f71bc303561761952361b7c#eac7ba01fa37bad35f71bc303561761952361b7c"
1943+
source = "git+https://github.com/emilk/egui.git?rev=c5ac7d301a90afbaec843ee04fb43d8a0956cc90#c5ac7d301a90afbaec843ee04fb43d8a0956cc90"
19441944
dependencies = [
19451945
"ahash",
19461946
"bytemuck",
@@ -1979,7 +1979,7 @@ dependencies = [
19791979
[[package]]
19801980
name = "egui"
19811981
version = "0.29.1"
1982-
source = "git+https://github.com/emilk/egui.git?rev=eac7ba01fa37bad35f71bc303561761952361b7c#eac7ba01fa37bad35f71bc303561761952361b7c"
1982+
source = "git+https://github.com/emilk/egui.git?rev=c5ac7d301a90afbaec843ee04fb43d8a0956cc90#c5ac7d301a90afbaec843ee04fb43d8a0956cc90"
19831983
dependencies = [
19841984
"accesskit",
19851985
"ahash",
@@ -1996,7 +1996,7 @@ dependencies = [
19961996
[[package]]
19971997
name = "egui-wgpu"
19981998
version = "0.29.1"
1999-
source = "git+https://github.com/emilk/egui.git?rev=eac7ba01fa37bad35f71bc303561761952361b7c#eac7ba01fa37bad35f71bc303561761952361b7c"
1999+
source = "git+https://github.com/emilk/egui.git?rev=c5ac7d301a90afbaec843ee04fb43d8a0956cc90#c5ac7d301a90afbaec843ee04fb43d8a0956cc90"
20002000
dependencies = [
20012001
"ahash",
20022002
"bytemuck",
@@ -2015,7 +2015,7 @@ dependencies = [
20152015
[[package]]
20162016
name = "egui-winit"
20172017
version = "0.29.1"
2018-
source = "git+https://github.com/emilk/egui.git?rev=eac7ba01fa37bad35f71bc303561761952361b7c#eac7ba01fa37bad35f71bc303561761952361b7c"
2018+
source = "git+https://github.com/emilk/egui.git?rev=c5ac7d301a90afbaec843ee04fb43d8a0956cc90#c5ac7d301a90afbaec843ee04fb43d8a0956cc90"
20192019
dependencies = [
20202020
"accesskit_winit",
20212021
"ahash",
@@ -2057,7 +2057,7 @@ dependencies = [
20572057
[[package]]
20582058
name = "egui_extras"
20592059
version = "0.29.1"
2060-
source = "git+https://github.com/emilk/egui.git?rev=eac7ba01fa37bad35f71bc303561761952361b7c#eac7ba01fa37bad35f71bc303561761952361b7c"
2060+
source = "git+https://github.com/emilk/egui.git?rev=c5ac7d301a90afbaec843ee04fb43d8a0956cc90#c5ac7d301a90afbaec843ee04fb43d8a0956cc90"
20612061
dependencies = [
20622062
"ahash",
20632063
"egui",
@@ -2074,7 +2074,7 @@ dependencies = [
20742074
[[package]]
20752075
name = "egui_glow"
20762076
version = "0.29.1"
2077-
source = "git+https://github.com/emilk/egui.git?rev=eac7ba01fa37bad35f71bc303561761952361b7c#eac7ba01fa37bad35f71bc303561761952361b7c"
2077+
source = "git+https://github.com/emilk/egui.git?rev=c5ac7d301a90afbaec843ee04fb43d8a0956cc90#c5ac7d301a90afbaec843ee04fb43d8a0956cc90"
20782078
dependencies = [
20792079
"ahash",
20802080
"bytemuck",
@@ -2092,7 +2092,7 @@ dependencies = [
20922092
[[package]]
20932093
name = "egui_kittest"
20942094
version = "0.29.1"
2095-
source = "git+https://github.com/emilk/egui.git?rev=eac7ba01fa37bad35f71bc303561761952361b7c#eac7ba01fa37bad35f71bc303561761952361b7c"
2095+
source = "git+https://github.com/emilk/egui.git?rev=c5ac7d301a90afbaec843ee04fb43d8a0956cc90#c5ac7d301a90afbaec843ee04fb43d8a0956cc90"
20962096
dependencies = [
20972097
"dify",
20982098
"egui",
@@ -2161,7 +2161,7 @@ checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
21612161
[[package]]
21622162
name = "emath"
21632163
version = "0.29.1"
2164-
source = "git+https://github.com/emilk/egui.git?rev=eac7ba01fa37bad35f71bc303561761952361b7c#eac7ba01fa37bad35f71bc303561761952361b7c"
2164+
source = "git+https://github.com/emilk/egui.git?rev=c5ac7d301a90afbaec843ee04fb43d8a0956cc90#c5ac7d301a90afbaec843ee04fb43d8a0956cc90"
21652165
dependencies = [
21662166
"bytemuck",
21672167
"serde",
@@ -2277,7 +2277,7 @@ dependencies = [
22772277
[[package]]
22782278
name = "epaint"
22792279
version = "0.29.1"
2280-
source = "git+https://github.com/emilk/egui.git?rev=eac7ba01fa37bad35f71bc303561761952361b7c#eac7ba01fa37bad35f71bc303561761952361b7c"
2280+
source = "git+https://github.com/emilk/egui.git?rev=c5ac7d301a90afbaec843ee04fb43d8a0956cc90#c5ac7d301a90afbaec843ee04fb43d8a0956cc90"
22812281
dependencies = [
22822282
"ab_glyph",
22832283
"ahash",
@@ -2296,7 +2296,7 @@ dependencies = [
22962296
[[package]]
22972297
name = "epaint_default_fonts"
22982298
version = "0.29.1"
2299-
source = "git+https://github.com/emilk/egui.git?rev=eac7ba01fa37bad35f71bc303561761952361b7c#eac7ba01fa37bad35f71bc303561761952361b7c"
2299+
source = "git+https://github.com/emilk/egui.git?rev=c5ac7d301a90afbaec843ee04fb43d8a0956cc90#c5ac7d301a90afbaec843ee04fb43d8a0956cc90"
23002300

23012301
[[package]]
23022302
name = "equivalent"
@@ -6242,6 +6242,7 @@ dependencies = [
62426242
"fjadra",
62436243
"nohash-hasher",
62446244
"re_chunk",
6245+
"re_data_ui",
62456246
"re_entity_db",
62466247
"re_format",
62476248
"re_log_types",

Cargo.toml

+7-7
Original file line numberDiff line numberDiff line change
@@ -559,13 +559,13 @@ significant_drop_tightening = "allow" # An update of parking_lot made this trigg
559559
# As a last resport, patch with a commit to our own repository.
560560
# ALWAYS document what PR the commit hash is part of, or when it was merged into the upstream trunk.
561561

562-
ecolor = { git = "https://github.com/emilk/egui.git", rev = "eac7ba01fa37bad35f71bc303561761952361b7c" } # egui master 2024-12-03
563-
eframe = { git = "https://github.com/emilk/egui.git", rev = "eac7ba01fa37bad35f71bc303561761952361b7c" } # egui master 2024-12-03
564-
egui = { git = "https://github.com/emilk/egui.git", rev = "eac7ba01fa37bad35f71bc303561761952361b7c" } # egui master 2024-12-03
565-
egui_extras = { git = "https://github.com/emilk/egui.git", rev = "eac7ba01fa37bad35f71bc303561761952361b7c" } # egui master 2024-12-03
566-
egui_kittest = { git = "https://github.com/emilk/egui.git", rev = "eac7ba01fa37bad35f71bc303561761952361b7c" } # egui master 2024-12-03
567-
egui-wgpu = { git = "https://github.com/emilk/egui.git", rev = "eac7ba01fa37bad35f71bc303561761952361b7c" } # egui master 2024-12-03
568-
emath = { git = "https://github.com/emilk/egui.git", rev = "eac7ba01fa37bad35f71bc303561761952361b7c" } # egui master 2024-12-03
562+
ecolor = { git = "https://github.com/emilk/egui.git", rev = "c5ac7d301a90afbaec843ee04fb43d8a0956cc90" } # egui master 2024-12-03
563+
eframe = { git = "https://github.com/emilk/egui.git", rev = "c5ac7d301a90afbaec843ee04fb43d8a0956cc90" } # egui master 2024-12-03
564+
egui = { git = "https://github.com/emilk/egui.git", rev = "c5ac7d301a90afbaec843ee04fb43d8a0956cc90" } # egui master 2024-12-03
565+
egui_extras = { git = "https://github.com/emilk/egui.git", rev = "c5ac7d301a90afbaec843ee04fb43d8a0956cc90" } # egui master 2024-12-03
566+
egui_kittest = { git = "https://github.com/emilk/egui.git", rev = "c5ac7d301a90afbaec843ee04fb43d8a0956cc90" } # egui master 2024-12-03
567+
egui-wgpu = { git = "https://github.com/emilk/egui.git", rev = "c5ac7d301a90afbaec843ee04fb43d8a0956cc90" } # egui master 2024-12-03
568+
emath = { git = "https://github.com/emilk/egui.git", rev = "c5ac7d301a90afbaec843ee04fb43d8a0956cc90" } # egui master 2024-12-03
569569

570570
# Useful while developing:
571571
# ecolor = { path = "../../egui/crates/ecolor" }

crates/viewer/re_space_view_graph/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ workspace = true
1919
all-features = true
2020

2121
[dependencies]
22+
re_data_ui.workspace = true
2223
re_chunk.workspace = true
2324
re_entity_db.workspace = true
2425
re_format.workspace = true

crates/viewer/re_space_view_graph/src/ui/draw.rs

+25-15
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@ use egui::{
55
Rect, Response, RichText, Sense, Shape, Stroke, TextWrapMode, Ui, UiBuilder, Vec2, WidgetText,
66
};
77
use re_chunk::EntityPath;
8+
use re_data_ui::{item_ui, DataUi as _};
89
use re_entity_db::InstancePath;
910
use re_types::ArrowString;
11+
use re_ui::list_item;
1012
use re_viewer_context::{
11-
HoverHighlight, InteractionHighlight, Item, SelectionHighlight, SpaceViewHighlights, ViewQuery,
12-
ViewerContext,
13+
HoverHighlight, InteractionHighlight, Item, SelectionHighlight, SpaceViewHighlights, UiLayout,
14+
ViewQuery, ViewerContext,
1315
};
1416

1517
use crate::{
@@ -281,29 +283,37 @@ pub fn draw_graph(
281283
let response = match node {
282284
Node::Explicit { instance, .. } => {
283285
let highlight = entity_highlights.index_highlight(instance.instance_index);
284-
let response = draw_node(ui, center, node.label(), highlight);
285-
286-
let response = if let Label::Text { text, .. } = &instance.label {
287-
response.on_hover_text(format!(
288-
"Graph Node: {}\nLabel: {text}",
289-
instance.graph_node.as_str(),
290-
))
291-
} else {
292-
response.on_hover_text(format!("Graph Node: {}", instance.graph_node.as_str(),))
293-
};
286+
let mut response = draw_node(ui, center, node.label(), highlight);
294287

295288
let instance_path =
296289
InstancePath::instance(entity_path.clone(), instance.instance_index);
297290
ctx.select_hovered_on_click(
298291
&response,
299-
vec![(Item::DataResult(query.space_view_id, instance_path), None)].into_iter(),
292+
Item::DataResult(query.space_view_id, instance_path.clone()),
300293
);
301294

295+
response = response.on_hover_ui_at_pointer(|ui| {
296+
list_item::list_item_scope(ui, "graph_node_hover", |ui| {
297+
item_ui::instance_path_button(
298+
ctx,
299+
&query.latest_at_query(),
300+
ctx.recording(),
301+
ui,
302+
Some(query.space_view_id),
303+
&instance_path,
304+
);
305+
306+
instance_path.data_ui_recording(ctx, ui, UiLayout::Tooltip);
307+
});
308+
});
309+
302310
response
303311
}
304312
Node::Implicit { graph_node, .. } => {
305-
draw_node(ui, center, node.label(), Default::default())
306-
.on_hover_text(format!("Implicit Graph Node: {}", graph_node.as_str(),))
313+
draw_node(ui, center, node.label(), Default::default()).on_hover_text(format!(
314+
"Implicit node {} created via a reference in a GraphEdge component",
315+
graph_node.as_str(),
316+
))
307317
}
308318
};
309319

crates/viewer/re_space_view_graph/src/visualizers/edges.rs

+6-20
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use re_chunk::LatestAtQuery;
2-
use re_log_types::EntityPath;
2+
use re_log_types::{EntityPath, Instance};
33
use re_space_view::{DataResultQuery, RangeResultsExt};
44
use re_types::{
55
self, archetypes,
@@ -19,30 +19,14 @@ pub struct EdgesVisualizer {
1919
}
2020

2121
pub struct EdgeInstance {
22+
// We will need this in the future, when we want to select individual edges.
23+
pub _instance: Instance,
2224
pub source: GraphNode,
2325
pub target: GraphNode,
2426
pub source_index: NodeId,
2527
pub target_index: NodeId,
2628
}
2729

28-
impl std::hash::Hash for EdgeInstance {
29-
fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
30-
// We use the more verbose destructring here, to make sure that we
31-
// exhaustively consider all fields when hashing (we get a compiler
32-
// warning when we forget a field).
33-
let Self {
34-
// The index fields already uniquely identify `source` and `target`.
35-
source: _,
36-
target: _,
37-
source_index,
38-
target_index,
39-
} = self;
40-
source_index.hash(state);
41-
target_index.hash(state);
42-
}
43-
}
44-
45-
#[derive(Hash)]
4630
pub struct EdgeData {
4731
pub graph_type: components::GraphType,
4832
pub edges: Vec<EdgeInstance>,
@@ -81,7 +65,8 @@ impl VisualizerSystem for EdgesVisualizer {
8165
for (_index, edges) in all_indexed_edges.component::<GraphEdge>() {
8266
let edges = edges
8367
.iter()
84-
.map(|edge| {
68+
.enumerate()
69+
.map(|(i, edge)| {
8570
let source = GraphNode::from(edge.first.clone());
8671
let target = GraphNode::from(edge.second.clone());
8772

@@ -90,6 +75,7 @@ impl VisualizerSystem for EdgesVisualizer {
9075
let target_index = NodeId::from_entity_node(entity_path, &target);
9176

9277
EdgeInstance {
78+
_instance: Instance::from(i as u64),
9379
source,
9480
target,
9581
source_index,

0 commit comments

Comments
 (0)