Skip to content

Commit e025103

Browse files
Kavin006Keavon
andauthored
Add X and Y offset distance overlay while dragging with the Select tool (#2814)
* Add offset overlay to select tool * Add overlay to Dragging * Add axis align behavior * Style changes * Add trim to string * reduce code duplication * Code review --------- Co-authored-by: Keavon Chambers <keavon@keavon.com>
1 parent a40de58 commit e025103

File tree

4 files changed

+43
-28
lines changed

4 files changed

+43
-28
lines changed

editor/src/messages/portfolio/document/node_graph/node_properties.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1274,6 +1274,7 @@ pub(crate) fn rectangle_properties(node_id: NodeId, context: &mut NodeProperties
12741274

12751275
let mut corner_radius_row_2 = vec![Separator::new(SeparatorType::Unrelated).widget_holder()];
12761276
corner_radius_row_2.push(TextLabel::new("").widget_holder());
1277+
add_blank_assist(&mut corner_radius_row_2);
12771278

12781279
let document_node = match get_document_node(node_id, context) {
12791280
Ok(document_node) => document_node,
@@ -1381,8 +1382,6 @@ pub(crate) fn rectangle_properties(node_id: NodeId, context: &mut NodeProperties
13811382
// Size Y
13821383
let size_y = number_widget(ParameterWidgetsInfo::new(node_id, HeightInput::INDEX, true, context), NumberInput::default());
13831384

1384-
add_blank_assist(&mut corner_radius_row_2);
1385-
13861385
// Clamped
13871386
let clamped = bool_widget(ParameterWidgetsInfo::new(node_id, ClampedInput::INDEX, true, context), CheckboxInput::default());
13881387

@@ -1436,7 +1435,7 @@ pub(crate) fn generate_node_properties(node_id: NodeId, context: &mut NodeProper
14361435
if let Some(field) = graphene_std::registry::NODE_METADATA
14371436
.lock()
14381437
.unwrap()
1439-
.get(&proto_node_identifier)
1438+
.get(proto_node_identifier)
14401439
.and_then(|metadata| metadata.fields.get(input_index))
14411440
{
14421441
number_options = (field.number_min, field.number_max, field.number_mode_range);

editor/src/messages/portfolio/document/overlays/utility_types.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -814,6 +814,36 @@ impl OverlayContext {
814814
self.render_context.fill_text(text, 0., 0.).expect("Failed to draw the text at the calculated position");
815815
self.render_context.reset_transform().expect("Failed to reset the render context transform");
816816
}
817+
818+
pub fn translation_box(&mut self, translation: DVec2, quad: Quad, typed_string: Option<String>) {
819+
if translation.x.abs() > 1e-3 {
820+
self.dashed_line(quad.top_left(), quad.top_right(), None, None, Some(2.), Some(2.), Some(0.5));
821+
822+
let width = match typed_string {
823+
Some(ref typed_string) => typed_string,
824+
None => &format!("{:.2}", translation.x).trim_end_matches('0').trim_end_matches('.').to_string(),
825+
};
826+
let x_transform = DAffine2::from_translation((quad.top_left() + quad.top_right()) / 2.);
827+
self.text(width, COLOR_OVERLAY_BLUE, None, x_transform, 4., [Pivot::Middle, Pivot::End]);
828+
}
829+
830+
if translation.y.abs() > 1e-3 {
831+
self.dashed_line(quad.top_left(), quad.bottom_left(), None, None, Some(2.), Some(2.), Some(0.5));
832+
833+
let height = match typed_string {
834+
Some(ref typed_string) => typed_string,
835+
None => &format!("{:.2}", translation.y).trim_end_matches('0').trim_end_matches('.').to_string(),
836+
};
837+
let y_transform = DAffine2::from_translation((quad.top_left() + quad.bottom_left()) / 2.);
838+
let height_pivot = if translation.x > -1e-3 { Pivot::Start } else { Pivot::End };
839+
self.text(height, COLOR_OVERLAY_BLUE, None, y_transform, 3., [height_pivot, Pivot::Middle]);
840+
}
841+
842+
if translation.x.abs() > 1e-3 && translation.y.abs() > 1e-3 {
843+
self.line(quad.top_right(), quad.bottom_right(), None, None);
844+
self.line(quad.bottom_left(), quad.bottom_right(), None, None);
845+
}
846+
}
817847
}
818848

819849
pub enum Pivot {

editor/src/messages/tool/tool_messages/select_tool.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -974,6 +974,14 @@ impl Fsm for SelectToolFsmState {
974974
}
975975
}
976976

977+
if let Self::Dragging { .. } = self {
978+
let quad = Quad::from_box([tool_data.drag_start, tool_data.drag_current]);
979+
let document_start = document.metadata().document_to_viewport.inverse().transform_point2(quad.top_left());
980+
let document_current = document.metadata().document_to_viewport.inverse().transform_point2(quad.bottom_right());
981+
982+
overlay_context.translation_box(document_current - document_start, quad, None);
983+
}
984+
977985
self
978986
}
979987
(_, SelectToolMessage::EditLayer) => {

editor/src/messages/tool/transform_layer/transform_layer_message_handler.rs

Lines changed: 3 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -319,37 +319,15 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
319319
let translation = translation.to_dvec(self.initial_transform, self.increments);
320320
let viewport_translate = document_to_viewport.transform_vector2(translation);
321321
let pivot = document_to_viewport.transform_point2(self.grab_target);
322-
let quad = Quad::from_box([pivot, pivot + viewport_translate]).0;
323-
let e1 = (self.layer_bounding_box.0[1] - self.layer_bounding_box.0[0]).normalize_or(DVec2::X);
322+
let quad = Quad::from_box([pivot, pivot + viewport_translate]);
324323

325324
responses.add(SelectToolMessage::PivotShift {
326325
offset: Some(viewport_translate),
327326
flush: false,
328327
});
329328

330-
if matches!(axis_constraint, Axis::Both | Axis::X) && translation.x != 0. {
331-
let end = if self.local { (quad[1] - quad[0]).rotate(e1) + quad[0] } else { quad[1] };
332-
overlay_context.dashed_line(quad[0], end, None, None, Some(2.), Some(2.), Some(0.5));
333-
334-
let x_transform = DAffine2::from_translation((quad[0] + end) / 2.);
335-
overlay_context.text(&format_rounded(translation.x, 3), COLOR_OVERLAY_BLUE, None, x_transform, 4., [Pivot::Middle, Pivot::End]);
336-
}
337-
338-
if matches!(axis_constraint, Axis::Both | Axis::Y) && translation.y != 0. {
339-
let end = if self.local { (quad[3] - quad[0]).rotate(e1) + quad[0] } else { quad[3] };
340-
overlay_context.dashed_line(quad[0], end, None, None, Some(2.), Some(2.), Some(0.5));
341-
let x_parameter = viewport_translate.x.clamp(-1., 1.);
342-
let y_transform = DAffine2::from_translation((quad[0] + end) / 2. + x_parameter * DVec2::X * 0.);
343-
let pivot_selection = if x_parameter >= -1e-3 { Pivot::Start } else { Pivot::End };
344-
if axis_constraint != Axis::Both || self.typing.digits.is_empty() || !self.transform_operation.can_begin_typing() {
345-
overlay_context.text(&format_rounded(translation.y, 2), COLOR_OVERLAY_BLUE, None, y_transform, 3., [pivot_selection, Pivot::Middle]);
346-
}
347-
}
348-
349-
if matches!(axis_constraint, Axis::Both) && translation.x != 0. && translation.y != 0. {
350-
overlay_context.line(quad[1], quad[2], None, None);
351-
overlay_context.line(quad[3], quad[2], None, None);
352-
}
329+
let typed_string = (!self.typing.digits.is_empty() && self.transform_operation.can_begin_typing()).then(|| self.typing.string.clone());
330+
overlay_context.translation_box(translation, quad, typed_string);
353331
}
354332
TransformOperation::Scaling(scale) => {
355333
let scale = scale.to_f64(self.increments);

0 commit comments

Comments
 (0)