pub struct ViewportBlueprint {
pub views: BTreeMap<ViewId, ViewBlueprint>,
pub containers: BTreeMap<ContainerId, ContainerBlueprint>,
pub root_container: ContainerId,
pub tree: Tree<ViewId>,
pub maximized: Option<ViewId>,
auto_layout: AtomicBool,
auto_views: AtomicBool,
past_viewer_recommendations: IntSet<ViewerRecommendationHash>,
pub deferred_commands: Arc<Mutex<Vec<ViewportCommand>>>,
}
Expand description
Describes the layout and contents of the Viewport Panel.
This datastructure is loaded from the blueprint store at the start of each frame.
It remain immutable during the frame.
Any change is queued up into Self::deferred_commands
and applied at the end of the frame,
right before saving to the blueprint store.
Fields§
§views: BTreeMap<ViewId, ViewBlueprint>
Where the views are stored.
Not a hashmap in order to preserve the order of the views.
containers: BTreeMap<ContainerId, ContainerBlueprint>
All the containers found in the viewport.
root_container: ContainerId
The root container.
tree: Tree<ViewId>
The layouts of all the views.
If Self::maximized
is set, this tree is ignored.
maximized: Option<ViewId>
Show only one view as maximized?
If set, Self::tree
is ignored.
auto_layout: AtomicBool
Whether the viewport layout is determined automatically.
If true
, we auto-layout all views whenever a new view is added.
Set to false
the first time the user messes around with the viewport blueprint.
Note: we use an atomic here because writes needs to be effective immediately during the frame.
auto_views: AtomicBool
Whether views should be created automatically for entities that are not already in a space.
Note: we use an atomic here because writes needs to be effective immediately during the frame.
past_viewer_recommendations: IntSet<ViewerRecommendationHash>
Hashes of all recommended views the viewer has already added and that should not be added again.
deferred_commands: Arc<Mutex<Vec<ViewportCommand>>>
Blueprint mutation events that will be processed at the end of the frame.
Implementations§
source§impl ViewportBlueprint
impl ViewportBlueprint
sourcepub fn try_from_db(blueprint_db: &EntityDb, query: &LatestAtQuery) -> Self
pub fn try_from_db(blueprint_db: &EntityDb, query: &LatestAtQuery) -> Self
Attempt to load a ViewBlueprint
from the blueprint store.
sourcepub fn is_invalid(&self) -> bool
pub fn is_invalid(&self) -> bool
Determine whether all views in a blueprint are invalid.
This most commonly happens due to a change in struct definition that breaks the definition of a serde-field, which means all views will become invalid.
Note: the invalid check is used to potentially reset the blueprint, so we take the conservative stance that if any view is still usable we will still treat the blueprint as valid and show it.
pub fn view_ids(&self) -> impl Iterator<Item = &ViewId> + '_
sourcepub fn parent(&self, needle: &Contents) -> Option<ContainerId>
pub fn parent(&self, needle: &Contents) -> Option<ContainerId>
Find the parent container of a given contents.
Returns None
if this is unknown contents, or if it is the root contaioner.
pub fn view(&self, view: &ViewId) -> Option<&ViewBlueprint>
pub fn container( &self, container_id: &ContainerId, ) -> Option<&ContainerBlueprint>
sourcepub fn duplicate_view(
&self,
view_id: &ViewId,
ctx: &ViewerContext<'_>,
) -> Option<ViewId>
pub fn duplicate_view( &self, view_id: &ViewId, ctx: &ViewerContext<'_>, ) -> Option<ViewId>
Duplicates a view and its entity property overrides.
sourcepub fn is_item_valid(
&self,
store_context: &StoreContext<'_>,
item: &Item,
) -> bool
pub fn is_item_valid( &self, store_context: &StoreContext<'_>, item: &Item, ) -> bool
If false
, the item is referring to data that is not present in this blueprint.
TODO(#5742): note that Item::DataResult
with entity path set to the space origin or some
of its descendent are always considered valid.
fn enqueue_command(&self, action: ViewportCommand)
pub fn mark_user_interaction(&self, ctx: &ViewerContext<'_>)
sourcepub fn spawn_heuristic_views(&self, ctx: &ViewerContext<'_>)
pub fn spawn_heuristic_views(&self, ctx: &ViewerContext<'_>)
Spawns new views if enabled.
sourcepub fn add_views(
&self,
views: impl Iterator<Item = ViewBlueprint>,
parent_container: Option<ContainerId>,
position_in_parent: Option<usize>,
)
pub fn add_views( &self, views: impl Iterator<Item = ViewBlueprint>, parent_container: Option<ContainerId>, position_in_parent: Option<usize>, )
Add a set of views to the viewport.
The view is added to the root container, or, if provided, to a given parent container. The list of created view IDs is returned.
Note that this doesn’t focus the corresponding tab. Use Self::focus_tab
with the returned ID
if needed.
sourcepub fn contents_iter(&self) -> impl Iterator<Item = Contents> + '_
pub fn contents_iter(&self) -> impl Iterator<Item = Contents> + '_
Returns an iterator over all the contents (views and containers) in the viewport.
sourcepub fn visit_contents(
&self,
visitor: &mut impl FnMut(&Contents, &SmallVec<[ContainerId; 4]>),
)
pub fn visit_contents( &self, visitor: &mut impl FnMut(&Contents, &SmallVec<[ContainerId; 4]>), )
Walk the entire Contents
tree, starting from the root container.
See Self::visit_contents_in_container
for details.
sourcepub fn visit_contents_in_container(
&self,
container_id: &ContainerId,
visitor: &mut impl FnMut(&Contents, &SmallVec<[ContainerId; 4]>),
)
pub fn visit_contents_in_container( &self, container_id: &ContainerId, visitor: &mut impl FnMut(&Contents, &SmallVec<[ContainerId; 4]>), )
Walk the subtree defined by the provided container id and call visitor
for each
Contents
.
Note:
visitor
is first called for the container passed in argumentvisitor
’s second argument contains the hierarchy leading to the visited contents, from (and including) the container passed in argument
fn visit_contents_in_container_impl( &self, container_id: &ContainerId, hierarchy: &mut SmallVec<[ContainerId; 4]>, visitor: &mut impl FnMut(&Contents, &SmallVec<[ContainerId; 4]>), )
sourcepub fn find_contents_by(
&self,
predicate: &impl Fn(&Contents) -> bool,
) -> Option<Contents>
pub fn find_contents_by( &self, predicate: &impl Fn(&Contents) -> bool, ) -> Option<Contents>
Given a predicate, finds the (first) matching contents by recursively walking from the root container.
sourcepub fn find_contents_in_container_by(
&self,
predicate: &impl Fn(&Contents) -> bool,
container_id: &ContainerId,
) -> Option<Contents>
pub fn find_contents_in_container_by( &self, predicate: &impl Fn(&Contents) -> bool, container_id: &ContainerId, ) -> Option<Contents>
Given a predicate, finds the (first) matching contents by recursively walking from the given container.
sourcepub fn is_contents_in_container(
&self,
contents: &Contents,
container_id: &ContainerId,
) -> bool
pub fn is_contents_in_container( &self, contents: &Contents, container_id: &ContainerId, ) -> bool
Checks if some content is (directly or indirectly) contained in the given container.
sourcepub fn find_parent_and_position_index(
&self,
contents: &Contents,
) -> Option<(ContainerId, usize)>
pub fn find_parent_and_position_index( &self, contents: &Contents, ) -> Option<(ContainerId, usize)>
Given a container or a view, find its enclosing container and its position within it.
fn find_parent_and_position_index_impl( &self, contents: &Contents, container_id: &ContainerId, ) -> Option<(ContainerId, usize)>
sourcepub fn add_container(
&self,
kind: ContainerKind,
parent_container: Option<ContainerId>,
)
pub fn add_container( &self, kind: ContainerKind, parent_container: Option<ContainerId>, )
Add a container of the provided kind.
The container is added to the root container or, if provided, to the given parent container.
sourcepub fn remove_contents(&self, contents: Contents)
pub fn remove_contents(&self, contents: Contents)
Recursively remove a container or a view.
sourcepub fn move_contents(
&self,
contents_to_move: Vec<Contents>,
target_container: ContainerId,
target_position_in_container: usize,
)
pub fn move_contents( &self, contents_to_move: Vec<Contents>, target_container: ContainerId, target_position_in_container: usize, )
Move the contents
container or view to the specified target container and position.
sourcepub fn move_contents_to_new_container(
&self,
contents: Vec<Contents>,
new_container_kind: ContainerKind,
target_container: ContainerId,
target_position_in_container: usize,
)
pub fn move_contents_to_new_container( &self, contents: Vec<Contents>, new_container_kind: ContainerKind, target_container: ContainerId, target_position_in_container: usize, )
Move some Contents
to a newly created container of the given kind.
sourcepub fn focus_tab(&self, view_id: ViewId)
pub fn focus_tab(&self, view_id: ViewId)
Make sure the tab corresponding to this view is focused.
sourcepub fn set_container_kind(&self, container_id: ContainerId, kind: ContainerKind)
pub fn set_container_kind(&self, container_id: ContainerId, kind: ContainerKind)
Set the kind of the provided container.
sourcepub fn simplify_container(
&self,
container_id: &ContainerId,
simplification_options: SimplificationOptions,
)
pub fn simplify_container( &self, container_id: &ContainerId, simplification_options: SimplificationOptions, )
Simplify the container tree with the provided options.
sourcepub fn make_all_children_same_size(&self, container_id: &ContainerId)
pub fn make_all_children_same_size(&self, container_id: &ContainerId)
Make all children of the given container the same size.
sourcepub fn is_contents_visible(&self, contents: &Contents) -> bool
pub fn is_contents_visible(&self, contents: &Contents) -> bool
Check the visibility of the provided content.
This function may be called from UI code.
sourcepub fn set_content_visibility(
&self,
ctx: &ViewerContext<'_>,
contents: &Contents,
visible: bool,
)
pub fn set_content_visibility( &self, ctx: &ViewerContext<'_>, contents: &Contents, visible: bool, )
Sets the visibility for the provided content.
This function may be called from UI code.
pub fn views_containing_entity_path( &self, ctx: &ViewerContext<'_>, path: &EntityPath, ) -> Vec<ViewId>
sourcepub fn auto_layout(&self) -> bool
pub fn auto_layout(&self) -> bool
Whether the viewport layout is determined automatically.
If true
, we auto-layout all views whenever a new view is added.
Set to false
the first time the user messes around with the viewport blueprint.
sourcepub fn set_auto_layout(&self, value: bool, ctx: &ViewerContext<'_>)
pub fn set_auto_layout(&self, value: bool, ctx: &ViewerContext<'_>)
Whether the viewport layout is determined automatically.
If true
, we auto-layout all views whenever a new view is added.
Set to false
the first time the user messes around with the viewport blueprint.
sourcepub fn auto_views(&self) -> bool
pub fn auto_views(&self) -> bool
Whether views should be created automatically for entities that are not already in a space.
sourcepub fn set_auto_views(&self, value: bool, ctx: &ViewerContext<'_>)
pub fn set_auto_views(&self, value: bool, ctx: &ViewerContext<'_>)
Whether views should be created automatically for entities that are not already in a space.
pub fn set_maximized(&self, view_id: Option<ViewId>, ctx: &ViewerContext<'_>)
sourcepub fn save_tree_as_containers(&self, ctx: &ViewerContext<'_>)
pub fn save_tree_as_containers(&self, ctx: &ViewerContext<'_>)
Save the current state of the viewport to the blueprint store. This should only be called if the tree was edited.
Auto Trait Implementations§
impl !Freeze for ViewportBlueprint
impl !RefUnwindSafe for ViewportBlueprint
impl Send for ViewportBlueprint
impl Sync for ViewportBlueprint
impl Unpin for ViewportBlueprint
impl !UnwindSafe for ViewportBlueprint
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> CheckedAs for T
impl<T> CheckedAs for T
source§fn checked_as<Dst>(self) -> Option<Dst>where
T: CheckedCast<Dst>,
fn checked_as<Dst>(self) -> Option<Dst>where
T: CheckedCast<Dst>,
source§impl<Src, Dst> CheckedCastFrom<Src> for Dstwhere
Src: CheckedCast<Dst>,
impl<Src, Dst> CheckedCastFrom<Src> for Dstwhere
Src: CheckedCast<Dst>,
source§fn checked_cast_from(src: Src) -> Option<Dst>
fn checked_cast_from(src: Src) -> Option<Dst>
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.§impl<T> DowncastSync for T
impl<T> DowncastSync for T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T
in a tonic::Request