Improve layer panel positioning for upstream nodes (#1928)

* Improve layer panel positioning for upstream nodes

* highlight parents

* Final improvements

* Fill for selection box, bug fixes

* Code review

---------

Co-authored-by: Keavon Chambers <keavon@keavon.com>
This commit is contained in:
adamgerhant
2024-08-14 03:27:42 -07:00
committed by GitHub
co-authored by Keavon Chambers
parent da13f21486
commit 2bd213f1aa
21 changed files with 321 additions and 255 deletions
@@ -20,7 +20,7 @@ pub fn overlay(selected_bounds: Rect, hovered_bounds: Rect, transform: DAffine2,
if turn_x != selected_x {
let min_viewport = transform.transform_point2(DVec2::new(turn_x.min(selected_x), turn_y));
let max_viewport = transform.transform_point2(DVec2::new(turn_x.max(selected_x), turn_y));
overlay_context.line(min_viewport, max_viewport);
overlay_context.line(min_viewport, max_viewport, None);
let length = format!("{:.2}", transform_to_document.transform_vector2(DVec2::X * (turn_x - selected_x)).length());
let direction = -(min_viewport - max_viewport).normalize_or_zero();
overlay_context.angle_text(&length, (min_viewport + max_viewport) / 2., direction, 5., utility_types::Pivot::TopCentreX);
@@ -28,7 +28,7 @@ pub fn overlay(selected_bounds: Rect, hovered_bounds: Rect, transform: DAffine2,
if turn_y != hovered_y {
let min_viewport = transform.transform_point2(DVec2::new(turn_x, turn_y.min(hovered_y)));
let max_viewport = transform.transform_point2(DVec2::new(turn_x, turn_y.max(hovered_y)));
overlay_context.line(min_viewport, max_viewport);
overlay_context.line(min_viewport, max_viewport, None);
let length = format!("{:.2}", transform_to_document.transform_vector2(DVec2::Y * (turn_y - hovered_y)).length());
let direction = (min_viewport - max_viewport).normalize_or_zero().perp();
overlay_context.angle_text(&length, (min_viewport + max_viewport) / 2., direction, 5., utility_types::Pivot::LeftCentreY);
@@ -410,11 +410,12 @@ impl SnapManager {
let start = DVec2::new(first.max().x, y);
let end = DVec2::new(second.min().x, y);
let signed_size = if bottom { y_size } else { -y_size };
overlay_context.line(transform.transform_point2(start), transform.transform_point2(start + DVec2::Y * signed_size));
overlay_context.line(transform.transform_point2(end), transform.transform_point2(end + DVec2::Y * signed_size));
overlay_context.line(transform.transform_point2(start), transform.transform_point2(start + DVec2::Y * signed_size), None);
overlay_context.line(transform.transform_point2(end), transform.transform_point2(end + DVec2::Y * signed_size), None);
overlay_context.line(
transform.transform_point2(start + DVec2::Y * signed_size / 2.),
transform.transform_point2(end + DVec2::Y * signed_size / 2.),
None,
);
}
}
@@ -427,11 +428,12 @@ impl SnapManager {
let start = DVec2::new(x, first.max().y);
let end = DVec2::new(x, second.min().y);
let signed_size = if right { x_size } else { -x_size };
overlay_context.line(transform.transform_point2(start), transform.transform_point2(start + DVec2::X * signed_size));
overlay_context.line(transform.transform_point2(end), transform.transform_point2(end + DVec2::X * signed_size));
overlay_context.line(transform.transform_point2(start), transform.transform_point2(start + DVec2::X * signed_size), None);
overlay_context.line(transform.transform_point2(end), transform.transform_point2(end + DVec2::X * signed_size), None);
overlay_context.line(
transform.transform_point2(start + DVec2::X * signed_size / 2.),
transform.transform_point2(end + DVec2::X * signed_size / 2.),
None,
);
}
}
@@ -444,7 +446,7 @@ impl SnapManager {
overlay_context.outline([Subpath::from_bezier(curve)].iter(), to_viewport);
}
if let Some(quad) = ind.target_bounds {
overlay_context.quad(to_viewport * quad);
overlay_context.quad(to_viewport * quad, None);
}
let viewport = to_viewport.transform_point2(ind.snapped_point_document);
@@ -454,7 +456,7 @@ impl SnapManager {
let align = [ind.alignment_target_x, ind.alignment_target_y].map(|target| target.map(|target| to_viewport.transform_point2(target)));
let any_align = align.iter().flatten().next().is_some();
for &target in align.iter().flatten() {
overlay_context.line(viewport, target);
overlay_context.line(viewport, target, None);
}
for &target in align.iter().flatten() {
overlay_context.manipulator_handle(target, false);
@@ -288,7 +288,7 @@ impl BoundingBoxManager {
/// Update the position of the bounding box and transform handles
pub fn render_overlays(&mut self, overlay_context: &mut OverlayContext) {
overlay_context.quad(self.transform * Quad::from_box(self.bounds));
overlay_context.quad(self.transform * Quad::from_box(self.bounds), None);
for position in self.evaluate_transform_handle_positions() {
overlay_context.square(position, Some(6.), None, None);
@@ -259,7 +259,7 @@ impl Fsm for GradientToolFsmState {
let Gradient { start, end, stops, .. } = gradient;
let (start, end) = (transform.transform_point2(start), transform.transform_point2(end));
overlay_context.line(start, end);
overlay_context.line(start, end, None);
overlay_context.manipulator_handle(start, dragging == Some(GradientDragTarget::Start));
overlay_context.manipulator_handle(end, dragging == Some(GradientDragTarget::End));
@@ -461,7 +461,12 @@ impl Fsm for PathToolFsmState {
match self {
Self::DrawingBox => {
overlay_context.quad(Quad::from_box([tool_data.drag_start_pos, tool_data.previous_mouse_position]));
let fill_color = graphene_std::Color::from_rgb_str(crate::consts::COLOR_OVERLAY_BLUE.strip_prefix('#').unwrap())
.unwrap()
.with_alpha(0.05)
.rgba_hex();
overlay_context.quad(Quad::from_box([tool_data.drag_start_pos, tool_data.previous_mouse_position]), Some(&("#".to_string() + &fill_color)));
}
Self::Dragging => {
tool_data.snap_manager.draw_overlays(SnapData::new(document, input), &mut overlay_context);
@@ -469,15 +469,15 @@ impl Fsm for PenToolFsmState {
let valid = |point: DVec2, handle: DVec2| point.distance_squared(handle) >= HIDE_HANDLE_DISTANCE * HIDE_HANDLE_DISTANCE;
let next_point = transform.transform_point2(tool_data.next_point);
let next_handle_start = transform.transform_point2(tool_data.next_handle_start);
overlay_context.line(next_point, next_handle_start);
overlay_context.line(next_point, next_handle_start, None);
let start = tool_data.latest_point().map(|point| transform.transform_point2(point.pos));
let handle_start = tool_data.latest_point().map(|point| transform.transform_point2(point.handle_start));
let handle_end = tool_data.handle_end.map(|point| transform.transform_point2(point));
if let (Some(start), Some(handle_start), Some(handle_end)) = (start, handle_start, handle_end) {
overlay_context.line(start, handle_start);
overlay_context.line(next_point, handle_end);
overlay_context.line(start, handle_start, None);
overlay_context.line(next_point, handle_end, None);
path_overlays(document, shape_editor, &mut overlay_context);
@@ -471,7 +471,11 @@ impl Fsm for SelectToolFsmState {
}
// Update the selection box
overlay_context.quad(quad);
let fill_color = graphene_std::Color::from_rgb_str(crate::consts::COLOR_OVERLAY_BLUE.strip_prefix('#').unwrap())
.unwrap()
.with_alpha(0.05)
.rgba_hex();
overlay_context.quad(quad, Some(&("#".to_string() + &fill_color)));
}
// Only highlight layers if the viewport is not being panned (middle mouse button is pressed)
// TODO: Don't use `Key::Mmb` directly, instead take it as a variable from the input mappings list like in all other places
@@ -361,7 +361,7 @@ impl Fsm for TextToolFsmState {
if far.x != 0. && far.y != 0. {
let quad = Quad::from_box([DVec2::ZERO, far]);
let transformed_quad = document.metadata().transform_to_viewport(tool_data.layer) * quad;
overlay_context.quad(transformed_quad);
overlay_context.quad(transformed_quad, None);
}
}
@@ -376,7 +376,7 @@ impl Fsm for TextToolFsmState {
let far = graphene_core::text::bounding_box(text, buzz_face, font_size, None);
let quad = Quad::from_box([DVec2::ZERO, far]);
let multiplied = document.metadata().transform_to_viewport(layer) * quad;
overlay_context.quad(multiplied);
overlay_context.quad(multiplied, None);
}
self