use bevy_ecs::{
entity::Entity,
hierarchy::ChildOf,
query::With,
system::{Query, SystemParam},
};
use tiny_bail::prelude::*;
use crate::{
layout::{TooltipStringText, TooltipTextNode, TooltipTitleNode, TooltipTitleText},
prelude::TooltipHighlightLink,
term::TooltipTermLinkRecursive,
};
pub struct TooltipEntities {
pub title_node: Entity,
pub title_text: Entity,
pub tooltip_text_node: Entity,
pub string_texts: Vec<Entity>,
pub term_texts: Vec<Entity>,
pub highlight_texts: Vec<Entity>,
}
#[derive(SystemParam)]
pub struct TooltipEntitiesParam<'w, 's> {
ancestor_query: Query<'w, 's, &'static ChildOf>,
title_node_query: Query<'w, 's, Entity, With<TooltipTitleNode>>,
title_text_query: Query<'w, 's, Entity, With<TooltipTitleText>>,
text_node_query: Query<'w, 's, Entity, With<TooltipTextNode>>,
string_texts_query: Query<'w, 's, Entity, With<TooltipStringText>>,
links_query: Query<'w, 's, Entity, With<TooltipTermLinkRecursive>>,
highlights_query: Query<'w, 's, Entity, With<TooltipHighlightLink>>,
}
impl<'w, 's> TooltipEntitiesParam<'w, 's> {
pub fn tooltip_child_entities(self, entity: Entity) -> Option<TooltipEntities> {
let mut title_node = None;
for title in self.title_node_query {
if entity == self.ancestor_query.root_ancestor(title) {
title_node = Some(title);
break;
}
}
let mut title_text = None;
for title in self.title_text_query {
if entity == self.ancestor_query.root_ancestor(title) {
title_text = Some(title);
break;
}
}
let mut text_node = None;
for text in self.text_node_query {
if entity == self.ancestor_query.root_ancestor(text) {
text_node = Some(text);
}
}
let mut string_texts = Vec::new();
for text in self.string_texts_query {
if entity == self.ancestor_query.root_ancestor(text) {
string_texts.push(text);
}
}
let mut link_texts = Vec::new();
for link in self.links_query {
if entity == self.ancestor_query.root_ancestor(link) {
link_texts.push(link);
}
}
let mut highlight_texts = Vec::new();
for highlight in self.highlights_query {
if entity == self.ancestor_query.root_ancestor(highlight) {
highlight_texts.push(highlight);
}
}
Some(TooltipEntities {
title_node: r!(title_node),
title_text: r!(title_text),
tooltip_text_node: r!(text_node),
string_texts,
term_texts: link_texts,
highlight_texts,
})
}
}