diff --git a/crates/menu/src/bar/nav.rs b/crates/menu/src/bar/nav.rs index acdb5811..643784ee 100644 --- a/crates/menu/src/bar/nav.rs +++ b/crates/menu/src/bar/nav.rs @@ -120,6 +120,9 @@ impl Nav { if top != nav.top { nav = Nav { top, tops: std::mem::take(&mut nav.tops), ..Default::default() }; } + // Rows hold the command and enabled state of the frame that drew them. A popup that is + // not drawn this frame (closed by a title click) must leave nothing for the keys to run. + nav.rows.clear(); nav } diff --git a/crates/menu/src/tests/bar.rs b/crates/menu/src/tests/bar.rs index 5227839b..f7142b39 100644 --- a/crates/menu/src/tests/bar.rs +++ b/crates/menu/src/tests/bar.rs @@ -10,6 +10,23 @@ use crate::bar::nav::{ARROW, Nav, heading, is_open}; #[path = "bar_keys.rs"] mod keys; +#[test] +fn rows_from_an_earlier_frame_are_never_activated() { + let ctx = egui::Context::default(); + let id = Id::unique("nav"); + let row = crate::bar::nav::Row { + widget: Id::unique("row"), + enabled: true, + command: Some(Builtin::Quit.command()), + rect: Rect::NOTHING, + mnemonic: None, + }; + let mut stale = Nav::default(); + stale.rows = vec![vec![row]]; + ctx.data_mut(|d| d.insert_temp(id, stale)); + assert!(Nav::load(&ctx, id).rows.is_empty(), "rows are this frame's only"); +} + fn item(id: &str, label: &str) -> Item { Item::new(id, label) }