[demo] Improve introspection UI of areas

This commit is contained in:
Emil Ernerfeldt 2020-10-24 10:31:38 +02:00
parent 3416f3b91f
commit f86cb4a923
2 changed files with 53 additions and 26 deletions

View file

@ -599,12 +599,14 @@ impl Context {
ui.advance_cursor(16.0);
CollapsingHeader::new("Input")
.default_open(true)
.default_open(false)
.show(ui, |ui| ui.input().clone().ui(ui));
ui.collapsing("Paint stats", |ui| {
self.paint_stats.lock().ui(ui);
});
CollapsingHeader::new("Paint stats")
.default_open(true)
.show(ui, |ui| {
self.paint_stats.lock().ui(ui);
});
}
pub fn memory_ui(&self, ui: &mut crate::Ui) {
@ -625,6 +627,29 @@ impl Context {
self.memory().areas = Default::default();
}
});
ui.indent("areas", |ui| {
let layers_ids: Vec<LayerId> = self.memory().areas.order().to_vec();
for layer_id in layers_ids {
let area = self.memory().areas.get(layer_id.id).cloned();
if let Some(area) = area {
let is_visible = self.memory().areas.is_visible(&layer_id);
if ui
.label(format!(
"{:?} {:?} {}",
layer_id.order,
area.rect(),
if is_visible { "" } else { "(INVISIBLE)" }
))
.hovered
&& is_visible
{
ui.ctx()
.debug_painter()
.debug_rect(area.rect(), color::RED, "");
}
}
}
});
ui.horizontal(|ui| {
ui.label(format!(

View file

@ -113,26 +113,6 @@ impl Interaction {
}
}
/// Keeps track of `Area`s, which are free-floating `Ui`s.
/// These `Area`s can be in any `Order`.
#[derive(Clone, Debug, Default)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
#[cfg_attr(feature = "serde", serde(default))]
pub struct Areas {
areas: HashMap<Id, area::State>,
/// Top is last
order: Vec<LayerId>,
visible_last_frame: HashSet<LayerId>,
visible_current_frame: HashSet<LayerId>,
/// When an area want to be on top, it is put in here.
/// At the end of the frame, this is used to reorder the layers.
/// This means if several layers want to be on top, they will keep their relative order.
/// So if you close three windows and then reopen them all in one frame,
/// they will all be sent to the top, but keep their previous internal order.
wants_to_be_on_top: HashSet<LayerId>,
}
impl Memory {
pub(crate) fn begin_frame(&mut self, prev_input: &crate::input::InputState) {
self.interaction.begin_frame(prev_input);
@ -196,6 +176,28 @@ impl Memory {
}
}
// ----------------------------------------------------------------------------
/// Keeps track of `Area`s, which are free-floating `Ui`s.
/// These `Area`s can be in any `Order`.
#[derive(Clone, Debug, Default)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
#[cfg_attr(feature = "serde", serde(default))]
pub struct Areas {
areas: HashMap<Id, area::State>,
/// Top is last
order: Vec<LayerId>,
visible_last_frame: HashSet<LayerId>,
visible_current_frame: HashSet<LayerId>,
/// When an area want to be on top, it is put in here.
/// At the end of the frame, this is used to reorder the layers.
/// This means if several layers want to be on top, they will keep their relative order.
/// So if you close three windows and then reopen them all in one frame,
/// they will all be sent to the top, but keep their previous internal order.
wants_to_be_on_top: HashSet<LayerId>,
}
impl Areas {
pub(crate) fn count(&self) -> usize {
self.areas.len()
@ -211,8 +213,8 @@ impl Areas {
pub(crate) fn set_state(&mut self, layer_id: LayerId, state: area::State) {
self.visible_current_frame.insert(layer_id);
let did_insert = self.areas.insert(layer_id.id, state).is_none();
if did_insert {
self.areas.insert(layer_id.id, state);
if self.order.iter().find(|x| **x == layer_id).is_none() {
self.order.push(layer_id);
}
}