use bevy::prelude::*;
use bevy::window::PrimaryWindow;
use crate::model::window_ui_scale;
#[derive(Resource, Clone, Debug, PartialEq, Reflect)]
#[reflect(Resource, Default, Debug, PartialEq, Clone)]
#[cfg_attr(
feature = "serde",
derive(serde::Serialize, serde::Deserialize),
serde(default)
)]
pub struct UiScaleSettings {
pub reference_short_side: f32,
pub scale: f32,
}
impl Default for UiScaleSettings {
fn default() -> Self {
Self {
reference_short_side: 720.0,
scale: 1.0,
}
}
}
pub fn scale_with_window(
settings: Res<UiScaleSettings>,
window: Single<&Window, With<PrimaryWindow>>,
mut ui_scale: ResMut<UiScale>,
) {
let UiScaleSettings {
reference_short_side,
scale,
} = *settings;
match window_ui_scale(window.width(), window.height(), reference_short_side, scale) {
Some(new) if ui_scale.0 != new => ui_scale.0 = new,
Some(_) => {}
None if settings.is_changed() && !(reference_short_side > 0.0 && scale > 0.0) => {
warn!(
"UiScaleSettings: reference_short_side {reference_short_side} and scale {scale} must be above zero; UiScale stays {}",
ui_scale.0
);
}
None => {}
}
}