@@ -22,7 +22,9 @@ TEnv::StringVar SelectionType("SelectionType", "Rectangular");
22
22
23
23
// -----------------------------------------------------------------------------
24
24
25
- template <typename Tv, typename Tr, typename ... Args> DragSelectionTool::DragTool* createNewDragTool (SelectionTool* st, Args... args) {
25
+ template <typename Tv, typename Tr, typename ... Args>
26
+ DragSelectionTool::DragTool *createNewDragTool (SelectionTool *st,
27
+ Args... args) {
26
28
VectorSelectionTool *vst = dynamic_cast <VectorSelectionTool *>(st);
27
29
RasterSelectionTool *rst = dynamic_cast <RasterSelectionTool *>(st);
28
30
if (vst)
@@ -33,7 +35,8 @@ template <typename Tv, typename Tr, typename... Args> DragSelectionTool::DragToo
33
35
}
34
36
35
37
DragSelectionTool::DragTool *createNewMoveSelectionTool (SelectionTool *st) {
36
- return createNewDragTool<VectorMoveSelectionTool, RasterMoveSelectionTool>(st);
38
+ return createNewDragTool<VectorMoveSelectionTool, RasterMoveSelectionTool>(
39
+ st);
37
40
}
38
41
39
42
DragSelectionTool::DragTool *createNewRotationTool (SelectionTool *st) {
@@ -44,7 +47,8 @@ DragSelectionTool::DragTool *createNewFreeDeformTool(SelectionTool *st) {
44
47
return createNewDragTool<VectorFreeDeformTool, RasterFreeDeformTool>(st);
45
48
}
46
49
47
- DragSelectionTool::DragTool *createNewScaleTool (SelectionTool *st, ScaleType type) {
50
+ DragSelectionTool::DragTool *createNewScaleTool (SelectionTool *st,
51
+ ScaleType type) {
48
52
return createNewDragTool<VectorScaleTool, RasterScaleTool>(st, type);
49
53
}
50
54
@@ -476,10 +480,13 @@ void DragSelectionTool::FreeDeform::leftButtonDrag(const TPointD &pos,
476
480
const TMouseEvent &e) {
477
481
SelectionTool *tool = m_deformTool->getTool ();
478
482
TPointD delta = pos - m_deformTool->getCurPos ();
479
- TPointD center = tool->getCenter ();
480
- int index = tool->getSelectedPoint ();
481
- FourPoints bbox = tool->getBBox ();
482
- FourPoints newBbox = bbox;
483
+ double pixelSize = tool->getPixelSize ();
484
+ bool isFastDragging = norm2 (delta) > 9.0 * pixelSize * pixelSize;
485
+
486
+ TPointD center = tool->getCenter ();
487
+ int index = tool->getSelectedPoint ();
488
+ FourPoints bbox = tool->getBBox ();
489
+ FourPoints newBbox = bbox;
483
490
if (index < 4 )
484
491
bbox.setPoint (index, bbox.getPoint (index) + delta);
485
492
else {
@@ -491,7 +498,13 @@ void DragSelectionTool::FreeDeform::leftButtonDrag(const TPointD &pos,
491
498
}
492
499
tool->setBBox (bbox);
493
500
m_deformTool->setCurPos (pos);
494
- m_deformTool->applyTransform (bbox);
501
+ m_deformTool->applyTransform (bbox, isFastDragging);
502
+ }
503
+
504
+ // -----------------------------------------------------------------------------
505
+
506
+ void DragSelectionTool::FreeDeform::leftButtonUp () {
507
+ m_deformTool->applyTransform (m_deformTool->getTool ()->getBBox ());
495
508
}
496
509
497
510
// =============================================================================
@@ -528,7 +541,7 @@ void DragSelectionTool::MoveSelection::leftButtonDrag(const TPointD &pos,
528
541
m_lastDelta = TPointD (0 , (curPos - m_firstPos).y );
529
542
aff *= TTranslation (m_lastDelta);
530
543
} else
531
- aff = TTranslation (delta);
544
+ aff = TTranslation (delta);
532
545
double factor = 1.0 / Stage::inch;
533
546
m_deformTool->getTool ()->m_deformValues .m_moveValue =
534
547
m_deformTool->getTool ()->m_deformValues .m_moveValue + factor * delta;
@@ -738,7 +751,7 @@ FourPoints DragSelectionTool::Scale::bboxScaleInCenter(
738
751
if (areAlmostEqual (oldp.x , newPos.x , 1e-2 ) &&
739
752
areAlmostEqual (oldp.y , newPos.y , 1e-2 ))
740
753
return oldBbox;
741
- FourPoints bbox = bboxScale (index, oldBbox, newPos);
754
+ FourPoints bbox = bboxScale (index, oldBbox, newPos);
742
755
if (recomputeScaleValue) scaleValue = computeScaleValue (index, bbox);
743
756
if (!m_scaleInCenter) return bbox;
744
757
int symmetricIndex = m_deformTool->getSymmetricPointIndex (index);
@@ -788,20 +801,39 @@ void DragSelectionTool::Scale::leftButtonDrag(const TPointD &pos,
788
801
if (!isBboxReset)
789
802
delta = pos - m_deformTool->getCurPos ();
790
803
else
791
- delta = pos - m_deformTool->getStartPos ();
804
+ delta = pos - m_deformTool->getStartPos ();
792
805
int symmetricIndex = m_deformTool->getSymmetricPointIndex (selectedIndex);
793
806
TPointD symmetricPoint = tool->getBBox ().getPoint (symmetricIndex);
794
807
TPointD v = normalize (point - symmetricPoint);
795
808
delta = v * (v * delta);
796
809
newPos = point + delta;
797
810
}
798
811
m_scaleInCenter = m_isAltPressed;
812
+
813
+ double pixelSize = tool->getPixelSize ();
814
+ bool isFastDragging =
815
+ tdistance2 (pos, m_deformTool->getCurPos ()) > 9.0 * pixelSize * pixelSize;
816
+
799
817
m_deformTool->setCurPos (pos);
800
- TPointD scaleValue = m_deformTool->transform (selectedIndex, newPos);
818
+ TPointD scaleValue =
819
+ m_deformTool->transform (selectedIndex, newPos, isFastDragging);
801
820
tool->m_deformValues .m_scaleValue = scaleValue;
802
821
TTool::getApplication ()->getCurrentTool ()->notifyToolChanged ();
803
822
}
804
823
824
+ // -----------------------------------------------------------------------------
825
+
826
+ void DragSelectionTool::Scale::leftButtonUp () {
827
+ SelectionTool *tool = m_deformTool->getTool ();
828
+ TPointD newPos = m_deformTool->getCurPos ();
829
+ int selectedIndex = tool->getSelectedPoint ();
830
+ if (m_isShiftPressed && m_type == ScaleType::GLOBAL) {
831
+ newPos = tool->getBBox ().getPoint (selectedIndex);
832
+ }
833
+ m_deformTool->transform (selectedIndex, newPos);
834
+ TTool::getApplication ()->getCurrentTool ()->notifyToolChanged ();
835
+ }
836
+
805
837
// =============================================================================
806
838
// SelectionTool
807
839
// -----------------------------------------------------------------------------
@@ -1023,7 +1055,7 @@ void SelectionTool::updateAction(TPointD pos, const TMouseEvent &e) {
1023
1055
}
1024
1056
m_selectedPoint = NONE;
1025
1057
if ((isLevelType () || isSelectedFramesType ()) && !isSameStyleType ()) {
1026
- m_what = Inside;
1058
+ m_what = Inside;
1027
1059
m_cursorId = ToolCursor::LevelSelectCursor;
1028
1060
}
1029
1061
@@ -1133,7 +1165,7 @@ bool SelectionTool::keyDown(QKeyEvent *event) {
1133
1165
if (!ti && !vi && !ri) return false ;
1134
1166
1135
1167
std::unique_ptr<DragTool> dragTool (createNewMoveSelectionTool (this ));
1136
- TAffine aff = TTranslation (delta);
1168
+ TAffine aff = TTranslation (delta);
1137
1169
dragTool->transform (aff);
1138
1170
double factor = 1.0 / Stage::inch;
1139
1171
m_deformValues.m_moveValue += factor * delta;
0 commit comments