Skip to main content

pybevy_sprite/
texture_slicer.rs

1use bevy::sprite::TextureSlicer;
2use pyo3::prelude::*;
3
4use crate::{
5    border_rect::PyBorderRect,
6    slice_scale_mode::{PySliceScaleMode, PySliceScaleModeInner},
7};
8
9#[pyclass(name = "TextureSlicer", frozen, eq)]
10#[derive(Debug, Clone, PartialEq)]
11pub struct PyTextureSlicer {
12    border: PyBorderRect,
13    center_scale_mode: PySliceScaleModeInner,
14    sides_scale_mode: PySliceScaleModeInner,
15    max_corner_scale: f32,
16}
17
18#[pymethods]
19impl PyTextureSlicer {
20    #[new]
21    #[pyo3(signature = (
22        border = PyBorderRect::new(pybevy_math::PyVec2::ZERO, pybevy_math::PyVec2::ZERO),
23        center_tile = false,
24        center_stretch_value = 1.0,
25        sides_tile = false,
26        sides_stretch_value = 1.0,
27        max_corner_scale = 1.0,
28        center_scale_mode = None,
29        sides_scale_mode = None
30    ))]
31    pub fn new(
32        border: PyBorderRect,
33        center_tile: bool,
34        center_stretch_value: f32,
35        sides_tile: bool,
36        sides_stretch_value: f32,
37        max_corner_scale: f32,
38        center_scale_mode: Option<PySliceScaleMode>,
39        sides_scale_mode: Option<PySliceScaleMode>,
40    ) -> Self {
41        let center_scale_mode = if let Some(mode) = center_scale_mode {
42            mode.inner
43        } else if center_tile {
44            PySliceScaleModeInner::Tile {
45                stretch_value: center_stretch_value,
46            }
47        } else {
48            PySliceScaleModeInner::Stretch
49        };
50
51        let sides_scale_mode = if let Some(mode) = sides_scale_mode {
52            mode.inner
53        } else if sides_tile {
54            PySliceScaleModeInner::Tile {
55                stretch_value: sides_stretch_value,
56            }
57        } else {
58            PySliceScaleModeInner::Stretch
59        };
60
61        Self {
62            border,
63            center_scale_mode,
64            sides_scale_mode,
65            max_corner_scale,
66        }
67    }
68
69    #[getter]
70    pub fn border(&self) -> PyBorderRect {
71        self.border.clone()
72    }
73
74    #[getter]
75    pub fn max_corner_scale(&self) -> f32 {
76        self.max_corner_scale
77    }
78
79    #[getter]
80    pub fn center_scale_mode(&self) -> PySliceScaleMode {
81        PySliceScaleMode {
82            inner: self.center_scale_mode,
83        }
84    }
85
86    #[getter]
87    pub fn sides_scale_mode(&self) -> PySliceScaleMode {
88        PySliceScaleMode {
89            inner: self.sides_scale_mode,
90        }
91    }
92
93    pub fn __repr__(&self) -> String {
94        format!(
95            "TextureSlicer(border={:?}, center={:?}, sides={:?}, max_corner_scale={})",
96            self.border, self.center_scale_mode, self.sides_scale_mode, self.max_corner_scale
97        )
98    }
99}
100
101impl From<PyTextureSlicer> for TextureSlicer {
102    fn from(slicer: PyTextureSlicer) -> Self {
103        TextureSlicer {
104            border: slicer.border.into(),
105            center_scale_mode: slicer.center_scale_mode.into(),
106            sides_scale_mode: slicer.sides_scale_mode.into(),
107            max_corner_scale: slicer.max_corner_scale,
108        }
109    }
110}
111
112impl From<TextureSlicer> for PyTextureSlicer {
113    fn from(slicer: TextureSlicer) -> Self {
114        PyTextureSlicer {
115            border: slicer.border.into(),
116            center_scale_mode: slicer.center_scale_mode.into(),
117            sides_scale_mode: slicer.sides_scale_mode.into(),
118            max_corner_scale: slicer.max_corner_scale,
119        }
120    }
121}