undo is really almost done :D
This commit is contained in:
parent
32c438ce16
commit
c8c3b79ac2
2 changed files with 51 additions and 11 deletions
41
src/undo.rs
41
src/undo.rs
|
@ -1,7 +1,7 @@
|
|||
use bevy::math::Vec3Swizzles;
|
||||
use bevy::prelude::*;
|
||||
|
||||
use crate::ui::SelectedItem;
|
||||
use crate::{CreateShape, ShapeData, ImageData};
|
||||
use crate::{ShapeData, ImageData};
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum UndoItem {
|
||||
|
@ -73,23 +73,24 @@ impl UndoStack {
|
|||
pub fn undo_redo_sys(
|
||||
mut coms: Commands,
|
||||
mut stack: ResMut<UndoStack>,
|
||||
mut inspector: ResMut<SelectedItem>,
|
||||
keyboard: Res<Input<KeyCode>>,
|
||||
mut shapes: Query<&mut ShapeData>,
|
||||
mut transforms: Query<&mut Transform>,
|
||||
global_transforms: Query<&GlobalTransform>,
|
||||
mut images: Query<(&mut ImageData, &Handle<Image>)>,
|
||||
mut paths: Query<&mut bevy_prototype_lyon::prelude::Path>,
|
||||
) {
|
||||
if keyboard.just_pressed(KeyCode::Z) && keyboard.pressed(KeyCode::LControl) {
|
||||
let item = if keyboard.pressed(KeyCode::LShift) { stack.unpop() } else { stack.pop() };
|
||||
if let Some(item) = item {
|
||||
match item {
|
||||
UndoItem::Base => bevy::log::error!("POP/UNPOP: Got UndoItem::Base as a result!"),
|
||||
UndoItem::CreateShape { entity } => {
|
||||
UndoItem::CreateShape { entity: _ } => {
|
||||
bevy::log::error!("NOT IMPLEMENTED : CreateShape");
|
||||
},
|
||||
UndoItem::DeleteShape {
|
||||
sd,
|
||||
transform,
|
||||
sd: _,
|
||||
transform: _,
|
||||
} => {
|
||||
bevy::log::error!("NOT IMPLEMENTED : DeleteShape");
|
||||
},
|
||||
|
@ -102,7 +103,33 @@ pub fn undo_redo_sys(
|
|||
*to = t;
|
||||
},
|
||||
UndoItem::MoveDot { shape_data, dot, from, to } => {
|
||||
bevy::log::error!("NOT IMPLEMENTED : MoveDot");
|
||||
let gt = global_transforms.get(*dot).unwrap();
|
||||
|
||||
let sd = shapes.get(*shape_data).unwrap();
|
||||
let rot = gt.to_scale_rotation_translation().1;
|
||||
let ang = rot.to_euler(EulerRot::XYZ).2;
|
||||
let delta = Mat2::from_angle(-ang) * (*from - gt.translation().xy());
|
||||
if let Ok(mut t) = transforms.get_mut(*dot) {
|
||||
t.translation += delta.extend(0.0);
|
||||
}
|
||||
// We need to recalculate the center, and update the points to be the new relevant point from the center
|
||||
let center_offset = crate::modify::calc_shape_center_offset(&transforms, &*sd);
|
||||
// Update each edge's offset, and then move the main shape's translation
|
||||
for edge in sd.edges.iter() {
|
||||
if let Ok(mut t) = transforms.get_mut(*edge) {
|
||||
t.translation -= center_offset.extend(0.0);
|
||||
}
|
||||
}
|
||||
if let Ok(mut t) = transforms.get_mut(sd.main_shape) {
|
||||
t.translation += (Mat2::from_angle(ang) * center_offset).extend(0.0);
|
||||
}
|
||||
|
||||
// Now we need to update the shape itself
|
||||
crate::modify::update_main_shape(&mut paths, &transforms, &*sd);
|
||||
|
||||
let t = *from;
|
||||
*from = *to;
|
||||
*to = t;
|
||||
},
|
||||
UndoItem::Rotate { entity, from, to } => {
|
||||
if let Ok(mut t) = transforms.get_mut(*entity) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue