use bevy::prelude::*;
use bevy::ui::widget::NodeImageMode;
#[allow(unused_imports)]
use crate::prelude::*;
#[derive(Reflect, Default, Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SliceRect
{
#[reflect(default)]
pub top: f32,
#[reflect(default)]
pub bottom: f32,
#[reflect(default)]
pub left: f32,
#[reflect(default)]
pub right: f32,
}
impl Into<BorderRect> for SliceRect
{
fn into(self) -> BorderRect
{
BorderRect {
top: self.top,
bottom: self.bottom,
left: self.left,
right: self.left,
}
}
}
#[derive(Reflect, Default, Debug, Copy, Clone, PartialEq)]
#[cfg_attr(
feature = "serde",
derive(serde::Serialize, serde::Deserialize),
reflect(Serialize, Deserialize)
)]
pub enum LoadedSliceScaleMode
{
#[default]
Stretch,
Tile
{
stretch_value: f32,
},
}
impl Into<SliceScaleMode> for LoadedSliceScaleMode
{
fn into(self) -> SliceScaleMode
{
match self {
Self::Stretch => SliceScaleMode::Stretch,
Self::Tile { stretch_value } => SliceScaleMode::Tile { stretch_value },
}
}
}
#[derive(Reflect, Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct LoadedTextureSlicer
{
pub border: SliceRect,
#[reflect(default)]
pub center_scale_mode: LoadedSliceScaleMode,
#[reflect(default)]
pub sides_scale_mode: LoadedSliceScaleMode,
#[reflect(default = "LoadedTextureSlicer::default_corner_scale")]
pub max_corner_scale: f32,
}
impl LoadedTextureSlicer
{
fn default_corner_scale() -> f32
{
1.0
}
}
impl Default for LoadedTextureSlicer
{
fn default() -> Self
{
Self {
border: Default::default(),
center_scale_mode: Default::default(),
sides_scale_mode: Default::default(),
max_corner_scale: Self::default_corner_scale(),
}
}
}
impl Into<TextureSlicer> for LoadedTextureSlicer
{
fn into(self) -> TextureSlicer
{
TextureSlicer {
border: self.border.into(),
center_scale_mode: self.center_scale_mode.into(),
sides_scale_mode: self.sides_scale_mode.into(),
max_corner_scale: self.max_corner_scale,
}
}
}
#[derive(Reflect, Default, Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum LoadedImageMode
{
#[default]
Auto,
Stretch,
Sliced(LoadedTextureSlicer),
Tiled
{
tile_x: bool,
tile_y: bool,
stretch_value: f32,
},
}
impl Into<NodeImageMode> for LoadedImageMode
{
fn into(self) -> NodeImageMode
{
match self {
Self::Auto => NodeImageMode::Auto,
Self::Stretch => NodeImageMode::Stretch,
Self::Sliced(slicer) => NodeImageMode::Sliced(slicer.into()),
Self::Tiled { tile_x, tile_y, stretch_value } => {
NodeImageMode::Tiled { tile_x, tile_y, stretch_value }
}
}
}
}
impl Into<SpriteImageMode> for LoadedImageMode
{
fn into(self) -> SpriteImageMode
{
match self {
Self::Auto => SpriteImageMode::Auto,
Self::Stretch => SpriteImageMode::Auto,
Self::Sliced(slicer) => SpriteImageMode::Sliced(slicer.into()),
Self::Tiled { tile_x, tile_y, stretch_value } => {
SpriteImageMode::Tiled { tile_x, tile_y, stretch_value }
}
}
}
}
#[derive(Reflect, Default, Debug, Clone, PartialEq)]
#[cfg_attr(
feature = "serde",
derive(serde::Serialize, serde::Deserialize),
reflect(Serialize, Deserialize)
)]
pub struct TextureAtlasReference
{
pub index: usize,
pub alias: String,
}
pub(crate) struct TextureAtlasExtPlugin;
impl Plugin for TextureAtlasExtPlugin
{
fn build(&self, app: &mut App)
{
app.register_type::<SliceRect>()
.register_type::<LoadedSliceScaleMode>()
.register_type::<LoadedTextureSlicer>()
.register_type::<LoadedImageMode>()
.register_type::<TextureAtlasReference>();
}
}