WIP: save unverified diagram Delete candidate at user pause
This commit is contained in:
@@ -38,7 +38,6 @@ pub struct State {
|
||||
context: Option<Context>,
|
||||
tool: Option<Tool>,
|
||||
pointer: Option<Point>,
|
||||
focused: bool,
|
||||
press: Option<Press>,
|
||||
source: Option<Id>,
|
||||
preview: Option<(Id, Position)>,
|
||||
@@ -771,7 +770,6 @@ impl canvas::Program<Event> for StateCanvas<'_> {
|
||||
}
|
||||
canvas::Event::Window(iced::window::Event::Unfocused) => {
|
||||
state.reset();
|
||||
state.focused = false;
|
||||
return None;
|
||||
}
|
||||
_ => cursor,
|
||||
@@ -779,14 +777,40 @@ impl canvas::Program<Event> for StateCanvas<'_> {
|
||||
let window = cursor.position();
|
||||
let local = window.map(|p| Point::new(p.x - bounds.x, p.y - bounds.y));
|
||||
let inside = local.is_some_and(|p| Self::content(bounds).contains(p));
|
||||
if let canvas::Event::Keyboard(keyboard::Event::KeyPressed { key, modifiers, .. }) = event
|
||||
&& state.focused
|
||||
{
|
||||
if let canvas::Event::Keyboard(keyboard::Event::KeyPressed { key, modifiers, .. }) = event {
|
||||
use keyboard::{Key, key::Named};
|
||||
if *key == Key::Named(Named::Escape) {
|
||||
state.reset();
|
||||
return Some(Action::publish(Event::Choose(Tool::Select)).and_capture());
|
||||
}
|
||||
if *key == Key::Named(Named::Delete)
|
||||
&& self.editable
|
||||
&& self.tool == Tool::Select
|
||||
&& state.press.is_none()
|
||||
&& state.pan_from.is_none()
|
||||
&& state.source.is_none()
|
||||
&& (modifiers.is_empty() || *modifiers == keyboard::Modifiers::SHIFT)
|
||||
{
|
||||
let scene = self.scene(state)?;
|
||||
let placement = scene
|
||||
.view
|
||||
.nodes
|
||||
.iter()
|
||||
.find(|node| node.element == self.selected || node.id == self.selected);
|
||||
let object = placement.map_or(self.selected, |node| node.element);
|
||||
if placement.is_none() && !scene.view.edges.iter().any(|edge| edge.id == object) {
|
||||
return None;
|
||||
}
|
||||
return Some(
|
||||
Action::publish(Event::Remove(crate::app::diagram_removal::Intent {
|
||||
context: self.context,
|
||||
object,
|
||||
placement: placement.map(|node| node.id),
|
||||
model: modifiers.shift(),
|
||||
}))
|
||||
.and_capture(),
|
||||
);
|
||||
}
|
||||
if modifiers.is_empty() {
|
||||
let pan = match key.as_ref() {
|
||||
Key::Named(Named::ArrowLeft) => Some(Vector::new(60., 0.)),
|
||||
@@ -804,7 +828,6 @@ impl canvas::Program<Event> for StateCanvas<'_> {
|
||||
let scene = self.scene(state)?;
|
||||
match event {
|
||||
canvas::Event::Mouse(mouse::Event::ButtonPressed(button)) => {
|
||||
state.focused = inside;
|
||||
if !inside {
|
||||
return None;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user