| 590 | } |
| 591 | |
| 592 | void DrawRectangleTool::updateRectangle() |
| 593 | { |
| 594 | double angle = angle_helper->getConstrainedCursorPosMap(constrained_pos_map, constrained_pos_map); |
| 595 | |
| 596 | if (angles.size() == 1) |
| 597 | { |
| 598 | // Update vectors and angles |
| 599 | // preview_path is going to be modified. Non-const getCoordinate is fine. |
| 600 | forward_vector = constrained_pos_map - MapCoordF(preview_path->getCoordinate(0)); |
| 601 | forward_vector.normalize(); |
| 602 | |
| 603 | angles.back() = -forward_vector.angle(); |
| 604 | |
| 605 | // Update rectangle |
| 606 | MapCoord coord = MapCoord(constrained_pos_map); |
| 607 | coord.setDashPoint(draw_dash_points); |
| 608 | preview_path->setCoordinate(1, coord); |
| 609 | } |
| 610 | else |
| 611 | { |
| 612 | // Update vectors and angles |
| 613 | forward_vector = MapCoordF::fromPolar(1.0, -angle); |
| 614 | |
| 615 | angles.back() = angle; |
| 616 | |
| 617 | // Update rectangle |
| 618 | auto cur_point_index = angles.size(); |
| 619 | deleteClosePoint(); |
| 620 | |
| 621 | // preview_path was be modified. Non-const getCoordinate is fine. |
| 622 | auto forward_dist = MapCoordF::dotProduct(forward_vector, constrained_pos_map - MapCoordF(preview_path->getCoordinate(cur_point_index - 1))); |
| 623 | MapCoord coord = preview_path->getCoordinate(cur_point_index - 1) + MapCoord(forward_dist * forward_vector); |
| 624 | |
| 625 | snapped_to_line = false; |
| 626 | auto best_snap_distance_sq = std::numeric_limits<qreal>::max(); |
| 627 | if (ctrl_pressed && angles.size() > 2) |
| 628 | { |
| 629 | // Try to snap to existing lines |
| 630 | MapCoord original_coord = coord; |
| 631 | for (int i = 0; i < int(angles.size()) - 1; ++i) |
| 632 | { |
| 633 | MapCoordF direction(100, 0); |
| 634 | direction.rotate(-angles[i]); |
| 635 | |
| 636 | int num_steps; |
| 637 | double angle_step, angle_offset = 0; |
| 638 | if (i == 0 || qAbs(qAbs(fmod_pos(angles[i], M_PI) - fmod_pos(angles[i-1], M_PI)) - (M_PI / 2)) < 0.1) |
| 639 | { |
| 640 | num_steps = 2; |
| 641 | angle_step = M_PI/2; |
| 642 | } |
| 643 | else |
| 644 | { |
| 645 | num_steps = 4; |
| 646 | angle_step = M_PI/4; |
| 647 | } |
| 648 | |
| 649 | for (int k = 0; k < num_steps; ++k) |
nothing calls this directly
no test coverage detected