Refactor navigation metadata (#1956)
* Fix path tool select * Refactor rounded edge distance * comment * Fix demo artwork * Fix comments --------- Co-authored-by: Keavon Chambers <keavon@keavon.com>
This commit is contained in:
parent
06e11b6f46
commit
70dacac474
|
|
@ -1435,7 +1435,8 @@ impl DocumentMessageHandler {
|
||||||
responses.add(PortfolioMessage::UpdateOpenDocumentsList);
|
responses.add(PortfolioMessage::UpdateOpenDocumentsList);
|
||||||
responses.add(NodeGraphMessage::SelectedNodesUpdated);
|
responses.add(NodeGraphMessage::SelectedNodesUpdated);
|
||||||
responses.add(NodeGraphMessage::ForceRunDocumentGraph);
|
responses.add(NodeGraphMessage::ForceRunDocumentGraph);
|
||||||
|
// TODO: Remove once the footprint is used to load the imports/export distances from the edge
|
||||||
|
responses.add(NodeGraphMessage::SetGridAlignedEdges);
|
||||||
Some(previous_network)
|
Some(previous_network)
|
||||||
}
|
}
|
||||||
pub fn redo_with_history(&mut self, ipp: &InputPreprocessorMessageHandler, responses: &mut VecDeque<Message>) {
|
pub fn redo_with_history(&mut self, ipp: &InputPreprocessorMessageHandler, responses: &mut VecDeque<Message>) {
|
||||||
|
|
|
||||||
|
|
@ -1772,6 +1772,10 @@ impl NodeNetworkInterface {
|
||||||
log::error!("Could not get all nodes bounding box in load_export_ports");
|
log::error!("Could not get all nodes bounding box in load_export_ports");
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
let Some(rounded_network_edge_distance) = self.rounded_network_edge_distance(network_path).cloned() else {
|
||||||
|
log::error!("Could not get rounded_network_edge_distance in load_export_ports");
|
||||||
|
return;
|
||||||
|
};
|
||||||
let Some(network_metadata) = self.network_metadata(network_path) else {
|
let Some(network_metadata) = self.network_metadata(network_path) else {
|
||||||
log::error!("Could not get nested network_metadata in load_export_ports");
|
log::error!("Could not get nested network_metadata in load_export_ports");
|
||||||
return;
|
return;
|
||||||
|
|
@ -1780,6 +1784,7 @@ impl NodeNetworkInterface {
|
||||||
log::error!("Could not get current network in load_export_ports");
|
log::error!("Could not get current network in load_export_ports");
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut import_export_ports = Ports::new();
|
let mut import_export_ports = Ports::new();
|
||||||
|
|
||||||
let viewport_top_right = network_metadata
|
let viewport_top_right = network_metadata
|
||||||
|
|
@ -1787,7 +1792,7 @@ impl NodeNetworkInterface {
|
||||||
.navigation_metadata
|
.navigation_metadata
|
||||||
.node_graph_to_viewport
|
.node_graph_to_viewport
|
||||||
.inverse()
|
.inverse()
|
||||||
.transform_point2(network_metadata.persistent_metadata.navigation_metadata.exports_to_edge_distance);
|
.transform_point2(rounded_network_edge_distance.exports_to_edge_distance);
|
||||||
let offset_from_top_right = if network
|
let offset_from_top_right = if network
|
||||||
.exports
|
.exports
|
||||||
.first()
|
.first()
|
||||||
|
|
@ -1809,7 +1814,7 @@ impl NodeNetworkInterface {
|
||||||
.navigation_metadata
|
.navigation_metadata
|
||||||
.node_graph_to_viewport
|
.node_graph_to_viewport
|
||||||
.inverse()
|
.inverse()
|
||||||
.transform_point2(network_metadata.persistent_metadata.navigation_metadata.imports_to_edge_distance);
|
.transform_point2(rounded_network_edge_distance.imports_to_edge_distance);
|
||||||
|
|
||||||
let offset_from_top_left = if network
|
let offset_from_top_left = if network
|
||||||
.exports
|
.exports
|
||||||
|
|
@ -1842,6 +1847,69 @@ impl NodeNetworkInterface {
|
||||||
network_metadata.transient_metadata.import_export_ports.unload();
|
network_metadata.transient_metadata.import_export_ports.unload();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn rounded_network_edge_distance(&mut self, network_path: &[NodeId]) -> Option<&NetworkEdgeDistance> {
|
||||||
|
let Some(network_metadata) = self.network_metadata(network_path) else {
|
||||||
|
log::error!("Could not get nested network_metadata in rounded_network_edge_distance");
|
||||||
|
return None;
|
||||||
|
};
|
||||||
|
if !network_metadata.transient_metadata.rounded_network_edge_distance.is_loaded() {
|
||||||
|
self.load_rounded_network_edge_distance(network_path);
|
||||||
|
}
|
||||||
|
let Some(network_metadata) = self.network_metadata(network_path) else {
|
||||||
|
log::error!("Could not get nested network_metadata in rounded_network_edge_distance");
|
||||||
|
return None;
|
||||||
|
};
|
||||||
|
let TransientMetadata::Loaded(rounded_network_edge_distance) = &network_metadata.transient_metadata.rounded_network_edge_distance else {
|
||||||
|
log::error!("could not load import rounded_network_edge_distance");
|
||||||
|
return None;
|
||||||
|
};
|
||||||
|
Some(rounded_network_edge_distance)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn load_rounded_network_edge_distance(&mut self, network_path: &[NodeId]) {
|
||||||
|
let Some(network_metadata) = self.network_metadata_mut(network_path) else {
|
||||||
|
log::error!("Could not get nested network in set_grid_aligned_edges");
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
// When setting the edges to be grid aligned, update the pixel offset to ensure the next pan starts from the snapped import/export position
|
||||||
|
let node_graph_to_viewport = network_metadata.persistent_metadata.navigation_metadata.node_graph_to_viewport;
|
||||||
|
// TODO: Eventually replace node graph top right with the footprint when trying to get the network edge distance
|
||||||
|
let node_graph_top_right = network_metadata.persistent_metadata.navigation_metadata.node_graph_top_right;
|
||||||
|
|
||||||
|
let target_exports_distance = node_graph_to_viewport.inverse().transform_point2(DVec2::new(
|
||||||
|
node_graph_top_right.x - EXPORTS_TO_RIGHT_EDGE_PIXEL_GAP as f64,
|
||||||
|
node_graph_top_right.y + EXPORTS_TO_TOP_EDGE_PIXEL_GAP as f64,
|
||||||
|
));
|
||||||
|
|
||||||
|
let target_imports_distance = node_graph_to_viewport
|
||||||
|
.inverse()
|
||||||
|
.transform_point2(DVec2::new(IMPORTS_TO_LEFT_EDGE_PIXEL_GAP as f64, IMPORTS_TO_TOP_EDGE_PIXEL_GAP as f64));
|
||||||
|
|
||||||
|
let rounded_exports_distance = DVec2::new((target_exports_distance.x / 24. + 0.5).floor() * 24., (target_exports_distance.y / 24. + 0.5).floor() * 24.);
|
||||||
|
let rounded_imports_distance = DVec2::new((target_imports_distance.x / 24. + 0.5).floor() * 24., (target_imports_distance.y / 24. + 0.5).floor() * 24.);
|
||||||
|
|
||||||
|
let rounded_viewport_exports_distance = node_graph_to_viewport.transform_point2(rounded_exports_distance);
|
||||||
|
let rounded_viewport_imports_distance = node_graph_to_viewport.transform_point2(rounded_imports_distance);
|
||||||
|
|
||||||
|
let network_edge_distance = NetworkEdgeDistance {
|
||||||
|
exports_to_edge_distance: rounded_viewport_exports_distance,
|
||||||
|
imports_to_edge_distance: rounded_viewport_imports_distance,
|
||||||
|
};
|
||||||
|
let Some(network_metadata) = self.network_metadata_mut(network_path) else {
|
||||||
|
log::error!("Could not get current network in load_export_ports");
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
network_metadata.transient_metadata.rounded_network_edge_distance = TransientMetadata::Loaded(network_edge_distance);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn unload_rounded_network_edge_distance(&mut self, network_path: &[NodeId]) {
|
||||||
|
let Some(network_metadata) = self.network_metadata_mut(network_path) else {
|
||||||
|
log::error!("Could not get nested network_metadata in unload_export_ports");
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
network_metadata.transient_metadata.rounded_network_edge_distance.unload();
|
||||||
|
}
|
||||||
|
|
||||||
fn owned_nodes(&self, node_id: &NodeId, network_path: &[NodeId]) -> Option<&HashSet<NodeId>> {
|
fn owned_nodes(&self, node_id: &NodeId, network_path: &[NodeId]) -> Option<&HashSet<NodeId>> {
|
||||||
let layer_node = self.node_metadata(node_id, network_path)?;
|
let layer_node = self.node_metadata(node_id, network_path)?;
|
||||||
let NodeTypePersistentMetadata::Layer(LayerPersistentMetadata { owned_nodes, .. }) = &layer_node.persistent_metadata.node_type_metadata else {
|
let NodeTypePersistentMetadata::Layer(LayerPersistentMetadata { owned_nodes, .. }) = &layer_node.persistent_metadata.node_type_metadata else {
|
||||||
|
|
@ -2407,12 +2475,16 @@ impl NodeNetworkInterface {
|
||||||
let mut all_nodes_bounding_box = String::new();
|
let mut all_nodes_bounding_box = String::new();
|
||||||
let _ = rect.subpath_to_svg(&mut all_nodes_bounding_box, DAffine2::IDENTITY);
|
let _ = rect.subpath_to_svg(&mut all_nodes_bounding_box, DAffine2::IDENTITY);
|
||||||
|
|
||||||
let Some(network_metadata) = self.network_metadata(network_path) else {
|
let Some(rounded_network_edge_distance) = self.rounded_network_edge_distance(network_path).cloned() else {
|
||||||
log::error!("Could not get nested network_metadata in collect_front_end_click_targets");
|
log::error!("Could not get rounded_network_edge_distance in collect_frontend_click_targets");
|
||||||
return FrontendClickTargets::default();
|
return FrontendClickTargets::default();
|
||||||
};
|
};
|
||||||
let import_exports_viewport_top_left = network_metadata.persistent_metadata.navigation_metadata.imports_to_edge_distance;
|
let Some(network_metadata) = self.network_metadata(network_path) else {
|
||||||
let import_exports_viewport_bottom_right = network_metadata.persistent_metadata.navigation_metadata.exports_to_edge_distance;
|
log::error!("Could not get nested network_metadata in collect_frontend_click_targets");
|
||||||
|
return FrontendClickTargets::default();
|
||||||
|
};
|
||||||
|
let import_exports_viewport_top_left = rounded_network_edge_distance.imports_to_edge_distance;
|
||||||
|
let import_exports_viewport_bottom_right = rounded_network_edge_distance.exports_to_edge_distance;
|
||||||
|
|
||||||
let node_graph_top_left = network_metadata
|
let node_graph_top_left = network_metadata
|
||||||
.persistent_metadata
|
.persistent_metadata
|
||||||
|
|
@ -2843,30 +2915,11 @@ impl NodeNetworkInterface {
|
||||||
// This should be run whenever the pan ends, a zoom occurs, or the network is opened
|
// This should be run whenever the pan ends, a zoom occurs, or the network is opened
|
||||||
pub fn set_grid_aligned_edges(&mut self, node_graph_top_right: DVec2, network_path: &[NodeId]) {
|
pub fn set_grid_aligned_edges(&mut self, node_graph_top_right: DVec2, network_path: &[NodeId]) {
|
||||||
let Some(network_metadata) = self.network_metadata_mut(network_path) else {
|
let Some(network_metadata) = self.network_metadata_mut(network_path) else {
|
||||||
log::error!("Could not get nested network in set_grid_aligned_edges");
|
log::error!("Could not get nested network_metadata in set_grid_aligned_edges");
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
// When setting the edges to be grid aligned, update the pixel offset to ensure the next pan starts from the snapped import/export position
|
network_metadata.persistent_metadata.navigation_metadata.node_graph_top_right = node_graph_top_right;
|
||||||
let node_graph_to_viewport = network_metadata.persistent_metadata.navigation_metadata.node_graph_to_viewport;
|
self.unload_rounded_network_edge_distance(network_path);
|
||||||
|
|
||||||
let target_exports_distance = node_graph_to_viewport.inverse().transform_point2(DVec2::new(
|
|
||||||
node_graph_top_right.x - EXPORTS_TO_RIGHT_EDGE_PIXEL_GAP as f64,
|
|
||||||
node_graph_top_right.y + EXPORTS_TO_TOP_EDGE_PIXEL_GAP as f64,
|
|
||||||
));
|
|
||||||
|
|
||||||
let target_imports_distance = node_graph_to_viewport
|
|
||||||
.inverse()
|
|
||||||
.transform_point2(DVec2::new(IMPORTS_TO_LEFT_EDGE_PIXEL_GAP as f64, IMPORTS_TO_TOP_EDGE_PIXEL_GAP as f64));
|
|
||||||
|
|
||||||
let rounded_exports_distance = DVec2::new((target_exports_distance.x / 24. + 0.5).floor() * 24., (target_exports_distance.y / 24. + 0.5).floor() * 24.);
|
|
||||||
let rounded_imports_distance = DVec2::new((target_imports_distance.x / 24. + 0.5).floor() * 24., (target_imports_distance.y / 24. + 0.5).floor() * 24.);
|
|
||||||
|
|
||||||
let rounded_viewport_exports_distance = node_graph_to_viewport.transform_point2(rounded_exports_distance);
|
|
||||||
let rounded_viewport_imports_distance = node_graph_to_viewport.transform_point2(rounded_imports_distance);
|
|
||||||
|
|
||||||
network_metadata.persistent_metadata.navigation_metadata.exports_to_edge_distance = rounded_viewport_exports_distance;
|
|
||||||
network_metadata.persistent_metadata.navigation_metadata.imports_to_edge_distance = rounded_viewport_imports_distance;
|
|
||||||
|
|
||||||
self.unload_import_export_ports(network_path);
|
self.unload_import_export_ports(network_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -5076,6 +5129,16 @@ pub struct NodeNetworkTransientMetadata {
|
||||||
// pub wire_paths: Vec<WirePath>
|
// pub wire_paths: Vec<WirePath>
|
||||||
/// All export connector click targets
|
/// All export connector click targets
|
||||||
pub import_export_ports: TransientMetadata<Ports>,
|
pub import_export_ports: TransientMetadata<Ports>,
|
||||||
|
// Distance to the edges of the network, where the import/export ports are displayed. Rounded to nearest grid space when the panning ends.
|
||||||
|
pub rounded_network_edge_distance: TransientMetadata<NetworkEdgeDistance>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct NetworkEdgeDistance {
|
||||||
|
/// The viewport pixel distance between the left edge of the node graph and the exports.
|
||||||
|
pub exports_to_edge_distance: DVec2,
|
||||||
|
/// The viewport pixel distance between the left edge of the node graph and the imports.
|
||||||
|
pub imports_to_edge_distance: DVec2,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
|
|
@ -5297,22 +5360,19 @@ pub struct NavigationMetadata {
|
||||||
// TODO: Remove and replace with calculate_offset_transform from the node_graph_ptz. This will be difficult since it requires both the navigation message handler and the IPP
|
// TODO: Remove and replace with calculate_offset_transform from the node_graph_ptz. This will be difficult since it requires both the navigation message handler and the IPP
|
||||||
/// Transform from node graph space to viewport space.
|
/// Transform from node graph space to viewport space.
|
||||||
pub node_graph_to_viewport: DAffine2,
|
pub node_graph_to_viewport: DAffine2,
|
||||||
/// The viewport pixel distance distance between the left edge of the node graph and the exports. Rounded to nearest grid space when the panning ends.
|
/// Top right of the node graph in viewport space
|
||||||
#[serde(skip)]
|
#[serde(default)]
|
||||||
pub exports_to_edge_distance: DVec2,
|
pub node_graph_top_right: DVec2,
|
||||||
/// The viewport pixel distance between the left edge of the node graph and the imports. Rounded to nearest grid space when the panning ends.
|
|
||||||
#[serde(skip)]
|
|
||||||
pub imports_to_edge_distance: DVec2,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for NavigationMetadata {
|
impl Default for NavigationMetadata {
|
||||||
fn default() -> NavigationMetadata {
|
fn default() -> NavigationMetadata {
|
||||||
//Default PTZ and transform
|
// Default PTZ and transform
|
||||||
NavigationMetadata {
|
NavigationMetadata {
|
||||||
node_graph_ptz: PTZ::default(),
|
node_graph_ptz: PTZ::default(),
|
||||||
node_graph_to_viewport: DAffine2::IDENTITY,
|
node_graph_to_viewport: DAffine2::IDENTITY,
|
||||||
exports_to_edge_distance: DVec2::ZERO,
|
// TODO: Eventually replace with footprint
|
||||||
imports_to_edge_distance: DVec2::ZERO,
|
node_graph_top_right: DVec2::ZERO,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -349,7 +349,6 @@ impl PathToolData {
|
||||||
}
|
}
|
||||||
// We didn't find a segment path, so consider selecting the nearest shape instead
|
// We didn't find a segment path, so consider selecting the nearest shape instead
|
||||||
else if let Some(layer) = document.click(input) {
|
else if let Some(layer) = document.click(input) {
|
||||||
responses.add(DocumentMessage::StartTransaction);
|
|
||||||
if add_to_selection {
|
if add_to_selection {
|
||||||
responses.add(NodeGraphMessage::SelectedNodesAdd { nodes: vec![layer.to_node()] });
|
responses.add(NodeGraphMessage::SelectedNodesAdd { nodes: vec![layer.to_node()] });
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -359,6 +358,7 @@ impl PathToolData {
|
||||||
self.previous_mouse_position = document.metadata().document_to_viewport.inverse().transform_point2(input.mouse.position);
|
self.previous_mouse_position = document.metadata().document_to_viewport.inverse().transform_point2(input.mouse.position);
|
||||||
shape_editor.select_connected_anchors(document, layer, input.mouse.position);
|
shape_editor.select_connected_anchors(document, layer, input.mouse.position);
|
||||||
|
|
||||||
|
responses.add(DocumentMessage::StartTransaction);
|
||||||
PathToolFsmState::Dragging
|
PathToolFsmState::Dragging
|
||||||
}
|
}
|
||||||
// Start drawing a box
|
// Start drawing a box
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue