mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2026-09-25 20:28:12 +08:00
Initial method for refit
This commit is contained in:
@@ -216,8 +216,10 @@ pub fn input_mappings() -> Mapping {
|
|||||||
// PathToolMessage
|
// PathToolMessage
|
||||||
entry!(KeyDown(Delete); modifiers=[Accel], action_dispatch=PathToolMessage::DeleteAndBreakPath),
|
entry!(KeyDown(Delete); modifiers=[Accel], action_dispatch=PathToolMessage::DeleteAndBreakPath),
|
||||||
entry!(KeyDown(Backspace); modifiers=[Accel], action_dispatch=PathToolMessage::DeleteAndBreakPath),
|
entry!(KeyDown(Backspace); modifiers=[Accel], action_dispatch=PathToolMessage::DeleteAndBreakPath),
|
||||||
entry!(KeyDown(Delete); modifiers=[Shift], action_dispatch=PathToolMessage::BreakPath),
|
entry!(KeyDown(Delete); modifiers=[Alt], action_dispatch=PathToolMessage::BreakPath),
|
||||||
entry!(KeyDown(Backspace); modifiers=[Shift], action_dispatch=PathToolMessage::BreakPath),
|
entry!(KeyDown(Backspace); modifiers=[Alt], action_dispatch=PathToolMessage::BreakPath),
|
||||||
|
entry!(KeyDown(Delete); modifiers=[Shift], action_dispatch=PathToolMessage::DeleteAndRefit),
|
||||||
|
entry!(KeyDown(Backspace); modifiers=[Shift], action_dispatch=PathToolMessage::DeleteAndRefit),
|
||||||
entry!(KeyDownNoRepeat(Tab); action_dispatch=PathToolMessage::SwapSelectedHandles),
|
entry!(KeyDownNoRepeat(Tab); action_dispatch=PathToolMessage::SwapSelectedHandles),
|
||||||
entry!(KeyDown(MouseLeft); action_dispatch=PathToolMessage::MouseDown { extend_selection: Shift, lasso_select: Control, handle_drag_from_anchor: Alt, drag_restore_handle: Control }),
|
entry!(KeyDown(MouseLeft); action_dispatch=PathToolMessage::MouseDown { extend_selection: Shift, lasso_select: Control, handle_drag_from_anchor: Alt, drag_restore_handle: Control }),
|
||||||
entry!(KeyDown(MouseRight); action_dispatch=PathToolMessage::RightClick),
|
entry!(KeyDown(MouseRight); action_dispatch=PathToolMessage::RightClick),
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ use crate::messages::tool::common_functionality::utility_functions::is_visible_p
|
|||||||
use crate::messages::tool::tool_messages::path_tool::{PathOverlayMode, PointSelectState};
|
use crate::messages::tool::tool_messages::path_tool::{PathOverlayMode, PointSelectState};
|
||||||
use bezier_rs::{Bezier, BezierHandles, Subpath, TValue};
|
use bezier_rs::{Bezier, BezierHandles, Subpath, TValue};
|
||||||
use glam::{DAffine2, DVec2};
|
use glam::{DAffine2, DVec2};
|
||||||
|
use graph_craft::document;
|
||||||
use graphene_std::vector::{HandleId, SegmentId};
|
use graphene_std::vector::{HandleId, SegmentId};
|
||||||
use graphene_std::vector::{ManipulatorPointId, PointId, VectorData, VectorModificationType};
|
use graphene_std::vector::{ManipulatorPointId, PointId, VectorData, VectorModificationType};
|
||||||
|
|
||||||
@@ -1173,6 +1174,10 @@ impl ShapeState {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_bezier_from_segment_id(segment: SegmentId, vector_data: &VectorData) -> Option<SegmentId> {
|
||||||
|
vector_data.segment_bezier_iter().find(|(id, _, _, _)| *id == segment).map(|(_, bezier, _, _)| bezier)
|
||||||
|
}
|
||||||
|
|
||||||
fn dissolve_anchor(anchor: PointId, responses: &mut VecDeque<Message>, layer: LayerNodeIdentifier, vector_data: &VectorData) -> Option<[(HandleId, PointId); 2]> {
|
fn dissolve_anchor(anchor: PointId, responses: &mut VecDeque<Message>, layer: LayerNodeIdentifier, vector_data: &VectorData) -> Option<[(HandleId, PointId); 2]> {
|
||||||
// Delete point
|
// Delete point
|
||||||
let modification_type = VectorModificationType::RemovePoint { id: anchor };
|
let modification_type = VectorModificationType::RemovePoint { id: anchor };
|
||||||
@@ -1196,6 +1201,14 @@ impl ShapeState {
|
|||||||
let [Some(start), Some(end)] = opposites.map(|opposite| opposite.to_manipulator_point().get_anchor(vector_data)) else {
|
let [Some(start), Some(end)] = opposites.map(|opposite| opposite.to_manipulator_point().get_anchor(vector_data)) else {
|
||||||
return None;
|
return None;
|
||||||
};
|
};
|
||||||
|
let Some(bezier1) = vector_data.segment_bezier_iter().find(|(id, _, _, _)| *id == segment).map(|(_, bezier, _, _)| bezier) else {
|
||||||
|
return None;
|
||||||
|
};
|
||||||
|
let Some(bezier2) = vector_data.segment_bezier_iter().find(|(id, _, _, _)| *id == segment).map(|(_, bezier, _, _)| bezier) else {
|
||||||
|
return None;
|
||||||
|
};
|
||||||
|
// Here we should also return the beziers of the connected handles
|
||||||
|
|
||||||
Some([(handles[0], start), (handles[1], end)])
|
Some([(handles[0], start), (handles[1], end)])
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1304,6 +1317,15 @@ impl ShapeState {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn delete_point_and_refit(&mut self, document: &DocumentMessageHandler, responses: &mut VecDeque<Message>) {
|
||||||
|
// Here define the logic of what happens exactly when sone selected points are deleted
|
||||||
|
for (&layer, state) in &mut self.selected_shape_state {
|
||||||
|
let Some(vector_data) = document.network_interface.compute_modified_vector(layer) else {
|
||||||
|
continue;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn break_path_at_selected_point(&self, document: &DocumentMessageHandler, responses: &mut VecDeque<Message>) {
|
pub fn break_path_at_selected_point(&self, document: &DocumentMessageHandler, responses: &mut VecDeque<Message>) {
|
||||||
for (&layer, state) in &self.selected_shape_state {
|
for (&layer, state) in &self.selected_shape_state {
|
||||||
let Some(vector_data) = document.network_interface.compute_modified_vector(layer) else { continue };
|
let Some(vector_data) = document.network_interface.compute_modified_vector(layer) else { continue };
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ pub enum PathToolMessage {
|
|||||||
DeselectAllPoints,
|
DeselectAllPoints,
|
||||||
Delete,
|
Delete,
|
||||||
DeleteAndBreakPath,
|
DeleteAndBreakPath,
|
||||||
|
DeleteAndRefit,
|
||||||
DragStop {
|
DragStop {
|
||||||
extend_selection: Key,
|
extend_selection: Key,
|
||||||
shrink_selection: Key,
|
shrink_selection: Key,
|
||||||
@@ -284,6 +285,7 @@ impl<'a> MessageHandler<ToolMessage, &mut ToolActionHandlerData<'a>> for PathToo
|
|||||||
DeselectAllPoints,
|
DeselectAllPoints,
|
||||||
BreakPath,
|
BreakPath,
|
||||||
DeleteAndBreakPath,
|
DeleteAndBreakPath,
|
||||||
|
DeleteAndRefit,
|
||||||
ClosePath,
|
ClosePath,
|
||||||
PointerMove,
|
PointerMove,
|
||||||
),
|
),
|
||||||
@@ -296,6 +298,7 @@ impl<'a> MessageHandler<ToolMessage, &mut ToolActionHandlerData<'a>> for PathToo
|
|||||||
Delete,
|
Delete,
|
||||||
BreakPath,
|
BreakPath,
|
||||||
DeleteAndBreakPath,
|
DeleteAndBreakPath,
|
||||||
|
DeleteAndRefit,
|
||||||
SwapSelectedHandles,
|
SwapSelectedHandles,
|
||||||
),
|
),
|
||||||
PathToolFsmState::Drawing { .. } => actions!(PathToolMessageDiscriminant;
|
PathToolFsmState::Drawing { .. } => actions!(PathToolMessageDiscriminant;
|
||||||
@@ -306,6 +309,7 @@ impl<'a> MessageHandler<ToolMessage, &mut ToolActionHandlerData<'a>> for PathToo
|
|||||||
Enter,
|
Enter,
|
||||||
BreakPath,
|
BreakPath,
|
||||||
DeleteAndBreakPath,
|
DeleteAndBreakPath,
|
||||||
|
DeleteAndRefit,
|
||||||
Escape,
|
Escape,
|
||||||
RightClick,
|
RightClick,
|
||||||
),
|
),
|
||||||
@@ -1921,11 +1925,24 @@ impl Fsm for PathToolFsmState {
|
|||||||
PathToolFsmState::Ready
|
PathToolFsmState::Ready
|
||||||
}
|
}
|
||||||
(_, PathToolMessage::BreakPath) => {
|
(_, PathToolMessage::BreakPath) => {
|
||||||
|
responses.add(DocumentMessage::AddTransaction);
|
||||||
shape_editor.break_path_at_selected_point(document, responses);
|
shape_editor.break_path_at_selected_point(document, responses);
|
||||||
|
responses.add(PathToolMessage::SelectionChanged);
|
||||||
|
|
||||||
PathToolFsmState::Ready
|
PathToolFsmState::Ready
|
||||||
}
|
}
|
||||||
(_, PathToolMessage::DeleteAndBreakPath) => {
|
(_, PathToolMessage::DeleteAndBreakPath) => {
|
||||||
|
responses.add(DocumentMessage::AddTransaction);
|
||||||
shape_editor.delete_point_and_break_path(document, responses);
|
shape_editor.delete_point_and_break_path(document, responses);
|
||||||
|
responses.add(PathToolMessage::SelectionChanged);
|
||||||
|
|
||||||
|
PathToolFsmState::Ready
|
||||||
|
}
|
||||||
|
(_, PathToolMessage::DeleteAndRefit) => {
|
||||||
|
responses.add(DocumentMessage::AddTransaction);
|
||||||
|
shape_editor.delete_point_and_refit(document, responses);
|
||||||
|
responses.add(PathToolMessage::SelectionChanged);
|
||||||
|
|
||||||
PathToolFsmState::Ready
|
PathToolFsmState::Ready
|
||||||
}
|
}
|
||||||
(_, PathToolMessage::FlipSmoothSharp) => {
|
(_, PathToolMessage::FlipSmoothSharp) => {
|
||||||
@@ -2278,7 +2295,8 @@ fn update_dynamic_hints(state: PathToolFsmState, responses: &mut VecDeque<Messag
|
|||||||
|
|
||||||
if at_least_one_anchor_selected {
|
if at_least_one_anchor_selected {
|
||||||
delete_selected_hints.push(HintInfo::keys([Key::Accel], "No Dissolve").prepend_plus());
|
delete_selected_hints.push(HintInfo::keys([Key::Accel], "No Dissolve").prepend_plus());
|
||||||
delete_selected_hints.push(HintInfo::keys([Key::Shift], "Cut Anchor").prepend_plus());
|
delete_selected_hints.push(HintInfo::keys([Key::Alt], "Cut Anchor").prepend_plus());
|
||||||
|
delete_selected_hints.push(HintInfo::keys([Key::Shift], "Re-Fit").prepend_plus());
|
||||||
}
|
}
|
||||||
|
|
||||||
if single_colinear_anchor_selected {
|
if single_colinear_anchor_selected {
|
||||||
|
|||||||
Reference in New Issue
Block a user