From e0609721a24baac43b3c6b48fed90247dfd19e69 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Wed, 4 Aug 2021 12:59:35 +0300 Subject: [PATCH] ability to delete curve keys --- rg3d-ui/src/curve/mod.rs | 54 ++++++++++++++++++++++++++-------------- 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/rg3d-ui/src/curve/mod.rs b/rg3d-ui/src/curve/mod.rs index ae0b9d9b5..9c042490c 100644 --- a/rg3d-ui/src/curve/mod.rs +++ b/rg3d-ui/src/curve/mod.rs @@ -1,4 +1,5 @@ use crate::core::algebra::Vector3; +use crate::message::KeyCode; use crate::{ brush::Brush, core::{ @@ -181,6 +182,25 @@ impl> Control for CurveEditor { if message.destination() == self.handle { match message.data() { UiMessageData::Widget(msg) => match msg { + WidgetMessage::KeyUp(key) => { + if let KeyCode::Delete = key { + if let Some(selection) = self.selection.as_ref() { + if let Selection::Keys { keys } = selection { + let mut new_keys = Vec::new(); + for (i, key) in self.keys.iter().enumerate() { + if !keys.contains(&i) { + new_keys.push(key.clone()); + } + } + self.keys = new_keys; + self.selection = None; + + // Send modified curve back to user. + self.send_curve(ui); + } + } + } + } WidgetMessage::MouseMove { pos, state } => { let local_mouse_pos = self.point_to_local_space(*pos); if let Some(operation_context) = self.operation_context.as_ref() { @@ -274,24 +294,7 @@ impl> Control for CurveEditor { if let OperationContext::DragKeys { .. } | OperationContext::DragTangent { .. } = context { - let curve = Curve::from( - self.keys - .iter() - .map(|k| { - CurveKey::new( - k.position.x, - k.position.y, - k.kind.clone(), - ) - }) - .collect::>(), - ); - - ui.send_message(CurveEditorMessage::sync( - self.handle, - MessageDirection::FromWidget, - curve, - )); + self.send_curve(ui); } } } @@ -500,6 +503,21 @@ impl> CurveEditor { + Vector2::new(angle.cos(), -angle.sin()).scale(self.handle_radius) } + fn send_curve(&self, ui: &UserInterface) { + let curve = Curve::from( + self.keys + .iter() + .map(|k| CurveKey::new(k.position.x, k.position.y, k.kind.clone())) + .collect::>(), + ); + + ui.send_message(CurveEditorMessage::sync( + self.handle, + MessageDirection::FromWidget, + curve, + )); + } + // TODO: Fix. fn draw_grid(&self, ctx: &mut DrawingContext) { let screen_bounds = self.screen_bounds();