use crate::ecs::Visual;
use crate::ecs::graphics::GraphicsCommandList;
use bevy_ecs::change_detection::DetectChangesMut;
use bevy_ecs::component::Component;
use bevy_ecs::lifecycle::HookContext;
use bevy_ecs::world::DeferredWorld;
use tracing::trace;
use windows::Win32::Graphics::DirectWrite::IDWriteTextLayout;
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub enum TextDirection {
#[default]
HorizontalLeftToRight, HorizontalRightToLeft, VerticalRightToLeft, VerticalLeftToRight, }
#[derive(Component)]
#[component(storage = "SparseSet", on_add = on_label_add, on_remove = on_label_remove)]
pub struct Label {
pub text: String,
pub font_family: String,
pub font_size: f32,
pub direction: TextDirection,
}
fn on_label_add(mut world: DeferredWorld, hook: HookContext) {
if world.get::<Visual>(hook.entity).is_some() {
return;
}
world
.commands()
.entity(hook.entity)
.insert(Visual::default());
}
impl Default for Label {
fn default() -> Self {
Self {
text: String::new(),
font_family: "メイリオ".to_string(),
font_size: 16.0,
direction: Default::default(),
}
}
}
fn on_label_remove(mut world: DeferredWorld, hook: HookContext) {
let entity = hook.entity;
if let Some(mut cmd_list) = world.get_mut::<GraphicsCommandList>(entity) {
cmd_list.set_if_neq(GraphicsCommandList::empty());
}
}
#[derive(Component)]
#[component(storage = "SparseSet", on_remove = on_text_layout_remove)]
pub struct TextLayoutResource {
layout: Option<IDWriteTextLayout>,
}
impl TextLayoutResource {
pub fn new(layout: IDWriteTextLayout) -> Self {
Self {
layout: Some(layout),
}
}
pub fn get(&self) -> Option<&IDWriteTextLayout> {
self.layout.as_ref()
}
pub fn empty() -> Self {
Self { layout: None }
}
}
fn on_text_layout_remove(_world: DeferredWorld, hook: HookContext) {
#[cfg(debug_assertions)]
trace!(entity = ?hook.entity, "[TextLayoutResource] Removed");
}