You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

156 lines
4.6 KiB
Rust

use bevy::{color::palettes::css::BLACK, prelude::*, window::WindowResized};
use crate::deck::Card;
/// Debugging systems
pub struct DebugPlugin;
impl Plugin for DebugPlugin {
fn build(&self, app: &mut App) {
app.add_observer(track_card_info)
.add_systems(Update, update_window_info)
.add_systems(Startup, init_ui);
}
}
#[derive(Component)]
pub(crate) struct DebugText;
#[derive(Component)]
pub(crate) struct WindowInfoText;
fn init_ui(mut commands: Commands) {
commands
.spawn((
Sprite::from_color(Color::BLACK.with_alpha(0.9), [250.0, 150.0].into()),
DebugText,
Visibility::Hidden,
Transform::default().with_translation(Vec3::new(0.0, 0.0, 1.0)),
PickingBehavior::IGNORE,
))
.with_children(|parent| {
parent.spawn((
Text2d("...".to_string()),
DebugText,
Transform::default().with_translation(Vec3::new(0.0, 0.0, 2.0)),
PickingBehavior::IGNORE,
));
});
commands
.spawn((
Node {
position_type: PositionType::Absolute,
top: Val::Px(0.0),
right: Val::Px(0.0),
..default()
},
BackgroundColor(BLACK.into()),
GlobalZIndex(1),
))
.with_children(|parent| {
parent
.spawn(Button)
.with_children(|parent| {
parent.spawn((
Text("-".into()),
TextFont {
font_size: 60.0,
..default()
},
));
})
.observe(decrease_scale_ratio);
parent
.spawn(Button)
.with_children(|parent| {
parent.spawn((
Text("+".into()),
TextFont {
font_size: 60.0,
..default()
},
));
})
.observe(increase_scale_ratio);
parent.spawn((Text("????x????".to_string()), WindowInfoText));
});
}
fn track_card_info(
trigger: Trigger<Pointer<Move>>,
mut transforms: Query<&mut Transform, (With<DebugText>, With<Sprite>)>,
window: Query<&Window>,
) {
let p = trigger.pointer_location.position;
transforms.iter_mut().for_each(|mut t| {
let offset = window.single().resolution.size() / 2.0;
let pos = p - offset + Vec2::new(-125.0, 75.0);
t.translation.x = pos.x;
t.translation.y = -pos.y;
});
}
pub(crate) fn set_debug_card(
trigger: Trigger<Pointer<Over>>,
cards: Query<&Card>,
mut vis: Query<&mut Visibility, With<DebugText>>,
mut debug_text: Query<&mut Text2d, With<DebugText>>,
) {
let card = cards.get(trigger.entity()).unwrap();
debug_text.iter_mut().for_each(|mut text| {
text.0 = format!("{:#?}", card);
});
vis.iter_mut().for_each(|mut v| {
*v = Visibility::Inherited;
});
}
pub(crate) fn hide_debug_card(
_trigger: Trigger<Pointer<Out>>,
mut vis: Query<&mut Visibility, With<DebugText>>,
) {
vis.iter_mut().for_each(|mut v| {
*v = Visibility::Hidden;
});
}
fn update_window_info(
mut events: EventReader<WindowResized>,
windows: Query<&mut Window>,
mut infos: Query<&mut Text, With<WindowInfoText>>,
) {
events.read().for_each(|_| {
info!("Window resized");
let window = windows.single();
let width = window.resolution.width();
let height = window.resolution.height();
let scale_factor = window.resolution.scale_factor();
let mut info = infos.single_mut();
info.0 = format!("{:.0}x{:.0} ({:.03})", width, height, scale_factor,);
});
}
fn increase_scale_ratio(
_trigger: Trigger<Pointer<Click>>,
// TODO: Move window scale factor out to non-debug system
mut windows: Query<&mut Window>,
) {
info!("increase scale ratio");
let mut window = windows.single_mut();
let current = window.scale_factor();
window.resolution.set_scale_factor(current + 0.05);
}
fn decrease_scale_ratio(
_trigger: Trigger<Pointer<Click>>,
// TODO: Move window scale factor out to non-debug system
mut windows: Query<&mut Window>,
) {
info!("decrease scale ratio");
let mut window = windows.single_mut();
let current = window.scale_factor();
window.resolution.set_scale_factor(current - 0.05);
}