mirror of
https://github.com/emilk/egui.git
synced 2026-08-29 04:40:03 -04:00
Rerun sizing_pass when reopening popup (#8315)
* Closes <https://github.com/emilk/egui/issues/8115> * [x] I have followed the instructions in the PR template ## Summary - Recalculate a menu popup's cached `Area` size when it reopens. - Preserve cached sizing for continuously open menus and leave tooltips and general popups unchanged. - Add a headless regression test covering a wider item added while the menu is closed. ## Root cause `Area` keeps its cached size after a menu closes. When that menu reopened with wider content, the cached width constrained the new item and caused it to wrap instead of allowing the popup to grow. The fix requests the same invisible sizing pass used for a first-open `Area` whenever a menu was not open during the previous frame. ## User impact Menus now expand to fit newly added wider items after reopening. Existing wrapping, explicit-width, alignment, screen-constraining, and continuously open menu behavior remain unchanged. ## Validation - `cargo test -p egui_kittest --test menu` - `cargo check -p egui` - `cargo fmt --all -- --check`
This commit is contained in:
committed by
GitHub
parent
3fcadda5ba
commit
d28929ec72
@@ -1,5 +1,72 @@
|
||||
use egui::{Align, Layout, Popup};
|
||||
use egui_kittest::Harness;
|
||||
use kittest::Queryable as _;
|
||||
|
||||
#[test]
|
||||
fn reopened_popup_resizes_for_wider_items() {
|
||||
const POPUP_BUTTON: &str = "Dynamic popup";
|
||||
const SHORT_ITEM: &str = "Short item";
|
||||
const WIDE_ITEM: &str = "Newly added item with a much wider label";
|
||||
|
||||
#[derive(Default)]
|
||||
struct State {
|
||||
open: bool,
|
||||
show_wide_item: bool,
|
||||
}
|
||||
|
||||
let mut harness = Harness::builder()
|
||||
.with_size(egui::Vec2::new(500.0, 300.0))
|
||||
.build_ui_state(
|
||||
|ui, state| {
|
||||
let response = ui.button(POPUP_BUTTON);
|
||||
if response.clicked() {
|
||||
state.open = !state.open;
|
||||
}
|
||||
|
||||
Popup::from_response(&response)
|
||||
.open(state.open)
|
||||
.layout(Layout::top_down_justified(Align::Min))
|
||||
.show(|ui| {
|
||||
_ = ui.selectable_label(false, SHORT_ITEM);
|
||||
_ = ui.selectable_label(false, "Another short item");
|
||||
if state.show_wide_item {
|
||||
_ = ui.selectable_label(false, WIDE_ITEM);
|
||||
}
|
||||
});
|
||||
},
|
||||
State::default(),
|
||||
);
|
||||
|
||||
harness.get_by_label(POPUP_BUTTON).click();
|
||||
harness.run();
|
||||
let initial_row_size = harness.get_by_label(SHORT_ITEM).rect().size();
|
||||
|
||||
harness.get_by_label(POPUP_BUTTON).click();
|
||||
harness.run();
|
||||
assert!(harness.query_by_label(SHORT_ITEM).is_none());
|
||||
|
||||
harness.state_mut().show_wide_item = true;
|
||||
harness.run();
|
||||
harness.get_by_label(POPUP_BUTTON).click();
|
||||
harness.run();
|
||||
|
||||
let reopened_row_size = harness.get_by_label(SHORT_ITEM).rect().size();
|
||||
let wide_row_size = harness.get_by_label(WIDE_ITEM).rect().size();
|
||||
|
||||
assert!(
|
||||
reopened_row_size.x > initial_row_size.x,
|
||||
"reopened row width ({}) did not grow beyond its initial width ({})",
|
||||
reopened_row_size.x,
|
||||
initial_row_size.x
|
||||
);
|
||||
assert!(
|
||||
wide_row_size.y <= initial_row_size.y + 0.5,
|
||||
"new row height ({}) exceeds the single-line row height ({})",
|
||||
wide_row_size.y,
|
||||
initial_row_size.y
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_interactive_tooltip() {
|
||||
struct State {
|
||||
|
||||
Reference in New Issue
Block a user