
Open inspector with `dev: toggle inspector` from command palette or `cmd-alt-i` on mac or `ctrl-alt-i` on linux. https://github.com/user-attachments/assets/54c43034-d40b-414e-ba9b-190bed2e6d2f * Picking of elements via the mouse, with scroll wheel to inspect occluded elements. * Temporary manipulation of the selected element. * Layout info and JSON-based style manipulation for `Div`. * Navigation to code that constructed the element. Big thanks to @as-cii and @maxdeviant for sorting out how to implement the core of an inspector. Release Notes: - N/A --------- Co-authored-by: Antonio Scandurra <me@as-cii.com> Co-authored-by: Marshall Bowers <git@maxdeviant.com> Co-authored-by: Federico Dionisi <code@fdionisi.me>
96 lines
2.6 KiB
Rust
96 lines
2.6 KiB
Rust
use crate::{
|
|
AnyElement, App, Bounds, Element, GlobalElementId, InspectorElementId, IntoElement, LayoutId,
|
|
Pixels, Window,
|
|
};
|
|
|
|
/// Builds a `Deferred` element, which delays the layout and paint of its child.
|
|
pub fn deferred(child: impl IntoElement) -> Deferred {
|
|
Deferred {
|
|
child: Some(child.into_any_element()),
|
|
priority: 0,
|
|
}
|
|
}
|
|
|
|
/// An element which delays the painting of its child until after all of
|
|
/// its ancestors, while keeping its layout as part of the current element tree.
|
|
pub struct Deferred {
|
|
child: Option<AnyElement>,
|
|
priority: usize,
|
|
}
|
|
|
|
impl Deferred {
|
|
/// Sets the `priority` value of the `deferred` element, which
|
|
/// determines the drawing order relative to other deferred elements,
|
|
/// with higher values being drawn on top.
|
|
pub fn with_priority(mut self, priority: usize) -> Self {
|
|
self.priority = priority;
|
|
self
|
|
}
|
|
}
|
|
|
|
impl Element for Deferred {
|
|
type RequestLayoutState = ();
|
|
type PrepaintState = ();
|
|
|
|
fn id(&self) -> Option<crate::ElementId> {
|
|
None
|
|
}
|
|
|
|
fn source_location(&self) -> Option<&'static core::panic::Location<'static>> {
|
|
None
|
|
}
|
|
|
|
fn request_layout(
|
|
&mut self,
|
|
_id: Option<&GlobalElementId>,
|
|
_inspector_id: Option<&InspectorElementId>,
|
|
window: &mut Window,
|
|
cx: &mut App,
|
|
) -> (LayoutId, ()) {
|
|
let layout_id = self.child.as_mut().unwrap().request_layout(window, cx);
|
|
(layout_id, ())
|
|
}
|
|
|
|
fn prepaint(
|
|
&mut self,
|
|
_id: Option<&GlobalElementId>,
|
|
_inspector_id: Option<&InspectorElementId>,
|
|
_bounds: Bounds<Pixels>,
|
|
_request_layout: &mut Self::RequestLayoutState,
|
|
window: &mut Window,
|
|
_cx: &mut App,
|
|
) {
|
|
let child = self.child.take().unwrap();
|
|
let element_offset = window.element_offset();
|
|
window.defer_draw(child, element_offset, self.priority)
|
|
}
|
|
|
|
fn paint(
|
|
&mut self,
|
|
_id: Option<&GlobalElementId>,
|
|
_inspector_id: Option<&InspectorElementId>,
|
|
_bounds: Bounds<Pixels>,
|
|
_request_layout: &mut Self::RequestLayoutState,
|
|
_prepaint: &mut Self::PrepaintState,
|
|
_window: &mut Window,
|
|
_cx: &mut App,
|
|
) {
|
|
}
|
|
}
|
|
|
|
impl IntoElement for Deferred {
|
|
type Element = Self;
|
|
|
|
fn into_element(self) -> Self::Element {
|
|
self
|
|
}
|
|
}
|
|
|
|
impl Deferred {
|
|
/// Sets a priority for the element. A higher priority conceptually means painting the element
|
|
/// on top of deferred draws with a lower priority (i.e. closer to the viewer).
|
|
pub fn priority(mut self, priority: usize) -> Self {
|
|
self.priority = priority;
|
|
self
|
|
}
|
|
}
|