From 8a8bb92d33f028a4e2b92c4412e8c7a335de2c8a Mon Sep 17 00:00:00 2001 From: alehel Date: Thu, 22 Oct 2026 17:00:41 +0200 Subject: [PATCH] M3: choosing a tool or another tab puts the expanded All tools away The expanded view kept covering the workspace after a control client chose a tool (`tool=organize`) or went Home (`home`), so the chosen panel or the Home view never showed. The same held for a document tab click, Open Recent on an open file, and the Combine files tab. select_tool now clears the view, so every way of choosing a tool does. The view also remembers which tab was in front when it opened, and another tab coming forward puts it away, whichever path brought it there. Each new test was seen to fail with the fix reverted. Co-Authored-By: Claude Opus 5.5 --- crates/ui-egui/src/all_tools_ui.rs | 1 - crates/ui-egui/src/lib.rs | 16 +++++++++++++++ crates/ui-egui/tests/ui.rs | 33 ++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/crates/ui-egui/src/all_tools_ui.rs b/crates/ui-egui/src/all_tools_ui.rs index e9e0f6128..71b4c1684 100644 --- a/crates/ui-egui/src/all_tools_ui.rs +++ b/crates/ui-egui/src/all_tools_ui.rs @@ -98,7 +98,6 @@ pub fn show(app: &mut PdfCraftApp, ui: &mut egui::Ui) { }); }); if let Some(id) = chosen { - app.all_tools_full = false; app.left_open = true; app.select_tool(id); } diff --git a/crates/ui-egui/src/lib.rs b/crates/ui-egui/src/lib.rs index 0cd9a2934..827297854 100644 --- a/crates/ui-egui/src/lib.rs +++ b/crates/ui-egui/src/lib.rs @@ -583,6 +583,9 @@ pub struct PdfCraftApp { /// The All tools view fills the workspace (its sidebar's expand button). pub all_tools_full: bool, pub all_tools_query: String, + /// The tab that showed when the expanded All tools view opened ([`Self::shown_tab`]). Another + /// tab coming to the front (Home, a document, Combine files) puts the view away. + all_tools_tab: (Option, bool), pub recent: Vec, /// Preferences: reopen the files that were open when PdfCraft last closed (#442). pub reopen_last_session: bool, @@ -987,6 +990,7 @@ impl PdfCraftApp { all_tools_expanded: false, all_tools_full: false, all_tools_query: String::new(), + all_tools_tab: (None, false), recent: Vec::new(), reopen_last_session: false, last_session: Default::default(), @@ -2256,6 +2260,8 @@ impl PdfCraftApp { /// Enter a tool from the catalogue, Home, palette or control channel. Organize is a /// workspace, so opening its panel also opens the page grid (without toggling it off). pub(crate) fn select_tool(&mut self, id: &'static str) { + // The tool's panel shows, not the expanded All tools view over it. + self.all_tools_full = false; self.left = LeftPanel::Tool(id); self.reveal_tools(); if let Some(view) = self.active.and_then(|i| self.views.get_mut(i)) { @@ -2313,6 +2319,12 @@ impl PdfCraftApp { self.switch_mode(Mode::AllTools, true); } self.all_tools_full = true; + self.all_tools_tab = self.shown_tab(); + } + + /// The tab at the front: the active document, or else whether Combine files shows over Home. + fn shown_tab(&self) -> (Option, bool) { + (self.active.and_then(|i| self.views.get(i)).map(|v| v.id), self.combine_showing()) } /// Back to the Select tool from an editing tool. A paragraph still open in the editor is @@ -3400,6 +3412,10 @@ impl eframe::App for PdfCraftApp { .show(ui, |ui| panels::right_panel(self, ui)); } } + // Whichever way another tab came to the front, it shows instead of the expanded view. + if self.all_tools_full && self.all_tools_tab != self.shown_tab() { + self.all_tools_full = false; + } let t = theme::Tokens::get(&ctx); egui::CentralPanel::default().frame(egui::Frame::NONE.fill(t.pasteboard)).show(ui, |ui| { if self.mode == Mode::Read { diff --git a/crates/ui-egui/tests/ui.rs b/crates/ui-egui/tests/ui.rs index f65da9ac6..ae32820fc 100644 --- a/crates/ui-egui/tests/ui.rs +++ b/crates/ui-egui/tests/ui.rs @@ -207,6 +207,39 @@ fn opening_a_document_puts_the_expanded_all_tools_away() { assert!(!app.all_tools_full); } +#[test] +fn choosing_a_tool_puts_the_expanded_all_tools_away() { + use pdfcraft_ui_egui::LeftPanel; + let mut h = harness(|app| app.set_option("tools", "full").unwrap()); + h.state_mut().set_option("tool", "organize").unwrap(); + h.run_steps(3); + assert!(!h.state().all_tools_full, "the tool's panel shows, not the catalogue"); + assert_eq!(h.state().left, LeftPanel::Tool("organize")); +} + +#[test] +fn another_tab_coming_forward_puts_the_expanded_all_tools_away() { + // Home, through the control option. + let mut h = harness(|app| app.open_bytes("fixture.pdf", None, FIXTURE.to_vec()).expect("fixture opens")); + h.state_mut().set_option("tools", "full").unwrap(); + h.run_steps(3); + assert!(h.state().all_tools_full, "the document's own tab keeps it"); + h.state_mut().set_option("home", "").unwrap(); + h.run_steps(3); + assert!(!h.state().all_tools_full); + h.get_by_label_contains("Welcome to PdfCraft"); + // Another document's tab. + let mut h = harness(|app| { + app.open_bytes("one.pdf", None, FIXTURE.to_vec()).expect("fixture opens"); + app.open_bytes("two.pdf", None, FIXTURE.to_vec()).expect("fixture opens"); + }); + h.state_mut().set_option("tools", "full").unwrap(); + h.run_steps(3); + h.state_mut().active = Some(0); + h.run_steps(3); + assert!(!h.state().all_tools_full, "one.pdf shows, not the catalogue over it"); +} + #[test] fn expanding_all_tools_from_read_mode_restores_the_right_panel() { use pdfcraft_ui_egui::{Mode, RightPanel};