From 4d623badeb9952a9e57835c4a63eb32784df65af Mon Sep 17 00:00:00 2001 From: Andreas Reich Date: Wed, 28 Jun 2023 13:55:15 +0200 Subject: [PATCH] Add Rerun.io link/text in top bar (#2540) ### What Fixes #2518 Took quite a bit of time to make it look nice. It is not centered, so it also plays nicely with demo.rerun Native: image Web: image Web with metrics: image Web with metrics zoomed in _a lot_: image Click! https://github.com/rerun-io/rerun/assets/1220815/51c42221-8fa2-46c3-8710-e0d9731289ee Test using `cargo rerun` and `cargo rerun-web` ### Checklist * [x] I have read and agree to [Contributor Guide](https://github.com/rerun-io/rerun/blob/main/CONTRIBUTING.md) and the [Code of Conduct](https://github.com/rerun-io/rerun/blob/main/CODE_OF_CONDUCT.md) * [x] I've included a screenshot or gif (if applicable) PR Build Summary: https://build.rerun.io/pr/2540 Docs preview: https://rerun.io/preview/86d9103/docs Examples preview: https://rerun.io/preview/86d9103/examples --------- Co-authored-by: Emil Ernerfeldt --- crates/re_ui/data/icons/rerun_io.png | Bin 0 -> 12335 bytes crates/re_ui/src/icons.rs | 2 ++ crates/re_viewer/src/ui/top_panel.rs | 35 +++++++++++++++++++++++++++ 3 files changed, 37 insertions(+) create mode 100644 crates/re_ui/data/icons/rerun_io.png diff --git a/crates/re_ui/data/icons/rerun_io.png b/crates/re_ui/data/icons/rerun_io.png new file mode 100644 index 0000000000000000000000000000000000000000..0e3c0e0d287a3371819fdda51daf19ab2ea69447 GIT binary patch literal 12335 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 literal 0 HcmV?d00001 diff --git a/crates/re_ui/src/icons.rs b/crates/re_ui/src/icons.rs index 118adb8d6dd6..26d95eb78c41 100644 --- a/crates/re_ui/src/icons.rs +++ b/crates/re_ui/src/icons.rs @@ -15,6 +15,8 @@ impl Icon { pub const RERUN_MENU: Icon = Icon::new("rerun_menu", include_bytes!("../data/icons/rerun_menu.png")); +pub const RERUN_IO_TEXT: Icon = Icon::new("rerun_io", include_bytes!("../data/icons/rerun_io.png")); + pub const PLAY: Icon = Icon::new("play", include_bytes!("../data/icons/play.png")); pub const FOLLOW: Icon = Icon::new("follow", include_bytes!("../data/icons/follow.png")); pub const PAUSE: Icon = Icon::new("pause", include_bytes!("../data/icons/pause.png")); diff --git a/crates/re_viewer/src/ui/top_panel.rs b/crates/re_viewer/src/ui/top_panel.rs index d69e08e59722..a67d5d11074c 100644 --- a/crates/re_viewer/src/ui/top_panel.rs +++ b/crates/re_viewer/src/ui/top_panel.rs @@ -1,3 +1,4 @@ +use egui::NumExt as _; use re_format::format_number; use re_renderer::WgpuResourcePoolStatistics; use re_ui::UICommand; @@ -72,6 +73,9 @@ fn top_bar_ui( ) { crate::ui::rerun_menu_button_ui(store_context, ui, frame, app); + ui.add_space(12.0); + website_link_ui(ui, app); + if app.app_options().show_metrics { ui.separator(); frame_time_label_ui(ui, app); @@ -153,6 +157,37 @@ fn top_bar_ui( }); } +/// Shows clickable website link as an image (text doesn't look as nice) +fn website_link_ui(ui: &mut egui::Ui, app: &mut App) { + let icon_image = app.re_ui().icon_image(&re_ui::icons::RERUN_IO_TEXT); + + let desired_height = ui.max_rect().height(); + let desired_height = desired_height.at_most(28.0); // figma size 2023-02-03 + + let image_size = icon_image.size_vec2() * (desired_height / icon_image.size_vec2().y); + let texture_id = icon_image.texture_id(ui.ctx()); + let response = ui + .add(egui::ImageButton::new(texture_id, image_size)) + .on_hover_cursor(egui::CursorIcon::PointingHand); + let url = "https://rerun.io/"; + if response.clicked() { + let modifiers = ui.ctx().input(|i| i.modifiers); + ui.ctx().output_mut(|o| { + o.open_url = Some(egui::output::OpenUrl { + url: url.to_owned(), + new_tab: modifiers.any(), + }); + }); + } else if response.middle_clicked() { + ui.ctx().output_mut(|o| { + o.open_url = Some(egui::output::OpenUrl { + url: url.to_owned(), + new_tab: true, + }); + }); + } +} + fn frame_time_label_ui(ui: &mut egui::Ui, app: &App) { if let Some(frame_time) = app.frame_time_history.average() { let ms = frame_time * 1e3;