1
0
mirror of https://github.com/emilk/egui.git synced 2026-09-03 15:20:05 -04:00

Distinguish ids that need to be unique and warn about name clashes

This commit is contained in:
Emil Ernerfeldt
2020-04-19 11:13:24 +02:00
parent 1afda00fc4
commit 6eae91e028
11 changed files with 292 additions and 88 deletions

View File

@@ -1,10 +1,41 @@
//! Emigui tracks widgets frame-to-frame using `Id`s.
//!
//! For instance, if you start dragging a slider one frame, emigui stores
//! the sldiers Id as the current interact_id so that next frame when
//! you move the mouse the same slider changes, even if the mouse has
//! moved outside the slider.
//!
//! For some widgets `Id`s are also used to GUIpersist some state about the
//! widgets, such as Window position or wether not a Foldable region is open.
//!
//! This implicated that the `Id`s must be unqiue.
//!
//! For simple things like sliders and buttons that don't have any memory and
//! doesn't move we can use the location of the widget as a source of identity.
//! For instance, a slider only needs a unique and persistent ID while you are
//! dragging the sldier. As long as it is still while moving, that is fine.
//!
//! For things that need to persist state even after moving (windows, foldables)
//! the location of the widgets is obviously not good enough. For instance,
//! a fodlable region needs to remember wether or not it is open even
//! if the layout next frame is different and the foldable is not lower down
//! on the screen.
//!
//! Then there are widgets that need no identifiers at all, like labels,
//! because they have no state nor are interacted with.
//!
//! So we have two type of Ids: PositionId and UniqueId.
//! TODO: have separate types for PositionId and UniqueId.
use std::{collections::hash_map::DefaultHasher, hash::Hash};
use crate::math::Pos2;
#[derive(Clone, Copy, Debug, Hash, Eq, PartialEq)]
pub struct Id(u64);
impl Id {
pub fn whole_screen() -> Self {
pub fn background() -> Self {
Self(0)
}
@@ -26,4 +57,10 @@ impl Id {
child.hash(&mut hasher);
Id(hasher.finish())
}
pub fn from_pos(p: Pos2) -> Id {
let x = p.x.round() as i32;
let y = p.y.round() as i32;
Id::new(&x).with(&y)
}
}