mirror of
https://github.com/bevyengine/bevy
synced 2024-12-25 20:43:07 +00:00
bd008589f3
> In draft until #4761 is merged. See the relevant commits [here](a85fe94a18
).
---
# Objective
Update enums across Bevy to use the new enum reflection and get rid of `#[reflect_value(...)]` usages.
## Solution
Find and replace all[^1] instances of `#[reflect_value(...)]` on enum types.
---
## Changelog
- Updated all[^1] reflected enums to implement `Enum` (i.e. they are no longer `ReflectRef::Value`)
## Migration Guide
Bevy-defined enums have been updated to implement `Enum` and are not considered value types (`ReflectRef::Value`) anymore. This means that their serialized representations will need to be updated. For example, given the Bevy enum:
```rust
pub enum ScalingMode {
None,
WindowSize,
Auto { min_width: f32, min_height: f32 },
FixedVertical(f32),
FixedHorizontal(f32),
}
```
You will need to update the serialized versions accordingly.
```js
// OLD FORMAT
{
"type": "bevy_render:📷:projection::ScalingMode",
"value": FixedHorizontal(720),
},
// NEW FORMAT
{
"type": "bevy_render:📷:projection::ScalingMode",
"enum": {
"variant": "FixedHorizontal",
"tuple": [
{
"type": "f32",
"value": 720,
},
],
},
},
```
This may also have other smaller implications (such as `Debug` representation), but serialization is probably the most prominent.
[^1]: All enums except `HandleId` as neither `Uuid` nor `AssetPathId` implement the reflection traits
39 lines
1.3 KiB
Rust
39 lines
1.3 KiB
Rust
use crate::{CalculatedSize, Size, UiImage, Val};
|
|
use bevy_asset::Assets;
|
|
use bevy_ecs::{
|
|
component::Component,
|
|
query::With,
|
|
reflect::ReflectComponent,
|
|
system::{Query, Res},
|
|
};
|
|
use bevy_reflect::{Reflect, ReflectDeserialize, ReflectSerialize};
|
|
use bevy_render::texture::Image;
|
|
use serde::{Deserialize, Serialize};
|
|
|
|
/// Describes how to resize the Image node
|
|
#[derive(Component, Debug, Default, Clone, Reflect, Serialize, Deserialize)]
|
|
#[reflect(Component, Serialize, Deserialize)]
|
|
pub enum ImageMode {
|
|
/// Keep the aspect ratio of the image
|
|
#[default]
|
|
KeepAspect,
|
|
}
|
|
|
|
/// Updates calculated size of the node based on the image provided
|
|
pub fn image_node_system(
|
|
textures: Res<Assets<Image>>,
|
|
mut query: Query<(&mut CalculatedSize, &UiImage), With<ImageMode>>,
|
|
) {
|
|
for (mut calculated_size, image) in &mut query {
|
|
if let Some(texture) = textures.get(image) {
|
|
let size = Size {
|
|
width: Val::Px(texture.texture_descriptor.size.width as f32),
|
|
height: Val::Px(texture.texture_descriptor.size.height as f32),
|
|
};
|
|
// Update only if size has changed to avoid needless layout calculations
|
|
if size != calculated_size.size {
|
|
calculated_size.size = size;
|
|
}
|
|
}
|
|
}
|
|
}
|