From df674d0d53749572250809226ac607cd523e4034 Mon Sep 17 00:00:00 2001 From: justinjohn0306 Date: Sat, 17 Oct 2026 08:17:28 +0530 Subject: [PATCH] #710: Resources and Shift+I open the Assets panel from a collapsed sidebar or the version history Co-Authored-By: Claude Opus 5.5 --- crates/ui-egui/src/lib.rs | 8 +++- crates/ui-egui/src/resources_tests.rs | 67 +++++++++++++++++++++++++++ crates/ui-egui/src/toolbar.rs | 3 +- 3 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 crates/ui-egui/src/resources_tests.rs diff --git a/crates/ui-egui/src/lib.rs b/crates/ui-egui/src/lib.rs index 20a8a77c..f2f74c1a 100644 --- a/crates/ui-egui/src/lib.rs +++ b/crates/ui-egui/src/lib.rs @@ -162,6 +162,8 @@ mod proto_reorder_tests; #[cfg(test)] mod proto_responsive_tests; #[cfg(test)] +mod resources_tests; +#[cfg(test)] mod select_all_tests; #[cfg(test)] mod shortcut_keys_tests; @@ -810,7 +812,11 @@ impl FigApp { } "focus.region" => self.ui.nav.step(r.data.get("step").and_then(Value::as_i64).unwrap_or(1).clamp(-4, 4) as i32), "panel.layers" => self.ui.left_tab = LeftTab::File, - "panel.assets" => self.ui.left_tab = LeftTab::Assets, + "panel.assets" => { + self.ui.left_tab = LeftTab::Assets; + self.ui.left_collapsed = false; + self.ui.versions = Default::default(); + } "panel.versionHistory" => versions::open(self), "view.devCompare" => { self.ui.dev.compare = r.data.get("id").and_then(figcraft_engine::params::id_of).map(dev_compare::CompareView::new); diff --git a/crates/ui-egui/src/resources_tests.rs b/crates/ui-egui/src/resources_tests.rs new file mode 100644 index 00000000..42869098 --- /dev/null +++ b/crates/ui-egui/src/resources_tests.rs @@ -0,0 +1,67 @@ +//! The toolbar's Resources button and Shift+I open the Assets panel (#710), from a collapsed +//! sidebar and from the version history too. + +use egui::accesskit::Role; +use egui::{Event, Key, Modifiers, Pos2, pos2}; +use figcraft_engine::Session; + +use crate::LeftTab; +use crate::layers_drag_tests::Ui; + +fn click(u: &mut Ui, p: Pos2) { + u.button(p, true); + u.button(p, false); + u.frame(vec![]); +} + +fn shift_i(u: &mut Ui) { + let modifiers = Modifiers::SHIFT; + u.frame(vec![ + Event::Key { key: Key::I, physical_key: None, pressed: true, repeat: false, modifiers }, + Event::Key { key: Key::I, physical_key: None, pressed: false, repeat: false, modifiers }, + ]); + u.frame(vec![]); +} + +/// The middle of the toolbar's Resources button, found in the AccessKit tree. +fn resources_button(u: &mut Ui) -> Pos2 { + u.ctx.enable_accesskit(); + u.frame(vec![]); + let out = u.frame_output(vec![]); + let nodes = out.platform_output.accesskit_update.expect("an AccessKit update").nodes; + let n = nodes.iter().map(|(_, n)| n).find(|n| n.role() == Role::Button && n.label() == Some("Resources")).expect("Resources"); + let b = n.bounds().expect("bounds"); + pos2(((b.x0 + b.x1) / 2.0) as f32, ((b.y0 + b.y1) / 2.0) as f32) +} + +fn assets_shown(u: &Ui) -> bool { + u.app.ui.left_tab == LeftTab::Assets && !u.app.ui.left_collapsed && !u.app.ui.versions.open +} + +/// The three states the sidebar can be in when Resources is asked for. +fn starts() -> Vec<(&'static str, Ui)> { + let shown = Ui::new(Session::new()); + let mut collapsed = Ui::new(Session::new()); + collapsed.app.ui.left_collapsed = true; + let mut versions = Ui::new(Session::new()); + crate::versions::open(&mut versions.app); + vec![("layers", shown), ("collapsed", collapsed), ("version history", versions)] +} + +#[test] +fn the_resources_button_opens_the_assets_panel() { + for (name, mut u) in starts() { + let at = resources_button(&mut u); + click(&mut u, at); + assert!(assets_shown(&u), "{name}: the Assets panel is open"); + } +} + +#[test] +fn shift_i_opens_the_assets_panel() { + for (name, mut u) in starts() { + u.frame(vec![]); + shift_i(&mut u); + assert!(assets_shown(&u), "{name}: the Assets panel is open"); + } +} diff --git a/crates/ui-egui/src/toolbar.rs b/crates/ui-egui/src/toolbar.rs index a921cc29..c2f947f8 100644 --- a/crates/ui-egui/src/toolbar.rs +++ b/crates/ui-egui/src/toolbar.rs @@ -137,8 +137,7 @@ pub fn show(app: &mut FigApp, ui: &mut Ui) { if id == "actions" { app.ui.palette = Some(String::new()); } else { - app.ui.left_tab = crate::LeftTab::Assets; - app.ui.left_collapsed = false; + app.run("view.assets", json!({})); } } x += cell + 4.0;