mirror of
https://github.com/emilk/egui.git
synced 2026-08-31 05:40:03 -04:00
Warn about Id clashes for Grid, Plot, ScrollArea, Table (#1452)
Id clashes can cause subtle bugs. egui already warns when the same Id is used to interact with different parts of the screen. This adds warnings about id clashes for some widgets that store state: Grid, Plot, ScrollArea, Table. The PR also adds `Context::check_for_id_clash` so users who create their own widgets can add the same type of check.
This commit is contained in:
@@ -9,7 +9,7 @@ use crate::{
|
||||
Size, StripLayout,
|
||||
};
|
||||
|
||||
use egui::{Response, Ui};
|
||||
use egui::{Rect, Response, Ui, Vec2};
|
||||
|
||||
/// Builder for a [`Table`] with (optional) fixed header and scrolling body.
|
||||
///
|
||||
@@ -139,12 +139,8 @@ impl<'a> TableBuilder<'a> {
|
||||
} = self;
|
||||
|
||||
let resize_id = resizable.then(|| ui.id().with("__table_resize"));
|
||||
let widths = if let Some(resize_id) = resize_id {
|
||||
ui.data().get_persisted(resize_id)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
let widths = widths
|
||||
|
||||
let widths = read_table_widths(ui, resize_id)
|
||||
.unwrap_or_else(|| sizing.to_lengths(available_width, ui.spacing().item_spacing.x));
|
||||
|
||||
let table_top = ui.cursor().top();
|
||||
@@ -190,12 +186,8 @@ impl<'a> TableBuilder<'a> {
|
||||
} = self;
|
||||
|
||||
let resize_id = resizable.then(|| ui.id().with("__table_resize"));
|
||||
let widths = if let Some(resize_id) = resize_id {
|
||||
ui.data().get_persisted(resize_id)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
let widths = widths
|
||||
|
||||
let widths = read_table_widths(ui, resize_id)
|
||||
.unwrap_or_else(|| sizing.to_lengths(available_width, ui.spacing().item_spacing.x));
|
||||
|
||||
let table_top = ui.cursor().top();
|
||||
@@ -215,6 +207,16 @@ impl<'a> TableBuilder<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
fn read_table_widths(ui: &egui::Ui, resize_id: Option<egui::Id>) -> Option<Vec<f32>> {
|
||||
if let Some(resize_id) = resize_id {
|
||||
let rect = Rect::from_min_size(ui.available_rect_before_wrap().min, Vec2::ZERO);
|
||||
ui.ctx().check_for_id_clash(resize_id, rect, "Table");
|
||||
ui.data().get_persisted(resize_id)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
/// Table struct which can construct a [`TableBody`].
|
||||
///
|
||||
/// Is created by [`TableBuilder`] by either calling [`TableBuilder::body`] or after creating a header row with [`TableBuilder::header`].
|
||||
|
||||
Reference in New Issue
Block a user