Revised vector selection pivot logic

This commit is contained in:
manongjohn 2019-10-31 14:29:23 -04:00
parent 8b393cd03c
commit 7c36741cc5
2 changed files with 25 additions and 12 deletions

View file

@ -737,6 +737,10 @@ void DragSelectionTool::VectorDeformTool::leftButtonUp(const TPointD &pos,
m_isDragging = false; m_isDragging = false;
tool->notifyImageChanged(); tool->notifyImageChanged();
VectorSelectionTool *selectionTool =
dynamic_cast<VectorSelectionTool *>(m_tool);
selectionTool->setResetCenter(true);
} }
//============================================================================= //=============================================================================
@ -766,6 +770,8 @@ void DragSelectionTool::VectorRotationTool::transform(TAffine aff,
void DragSelectionTool::VectorRotationTool::leftButtonDrag( void DragSelectionTool::VectorRotationTool::leftButtonDrag(
const TPointD &pos, const TMouseEvent &e) { const TPointD &pos, const TMouseEvent &e) {
VectorSelectionTool *tool = dynamic_cast<VectorSelectionTool *>(m_tool);
tool->setResetCenter(false);
m_rotation->leftButtonDrag(pos, e); m_rotation->leftButtonDrag(pos, e);
} }
@ -785,6 +791,8 @@ DragSelectionTool::VectorFreeDeformTool::VectorFreeDeformTool(
void DragSelectionTool::VectorFreeDeformTool::leftButtonDrag( void DragSelectionTool::VectorFreeDeformTool::leftButtonDrag(
const TPointD &pos, const TMouseEvent &e) { const TPointD &pos, const TMouseEvent &e) {
VectorSelectionTool *tool = dynamic_cast<VectorSelectionTool *>(m_tool);
tool->setResetCenter(false);
m_freeDeform->leftButtonDrag(pos, e); m_freeDeform->leftButtonDrag(pos, e);
} }
@ -819,6 +827,8 @@ void DragSelectionTool::VectorMoveSelectionTool::leftButtonDown(
void DragSelectionTool::VectorMoveSelectionTool::leftButtonDrag( void DragSelectionTool::VectorMoveSelectionTool::leftButtonDrag(
const TPointD &pos, const TMouseEvent &e) { const TPointD &pos, const TMouseEvent &e) {
VectorSelectionTool *tool = dynamic_cast<VectorSelectionTool *>(m_tool);
tool->setResetCenter(false);
if (e.isCtrlPressed() || if (e.isCtrlPressed() ||
norm2(pos - getStartPos()) > l_dragThreshold * getTool()->getPixelSize()) norm2(pos - getStartPos()) > l_dragThreshold * getTool()->getPixelSize())
m_moveSelection->leftButtonDrag(pos, e); m_moveSelection->leftButtonDrag(pos, e);
@ -885,6 +895,8 @@ void DragSelectionTool::VectorScaleTool::leftButtonDown(const TPointD &pos,
void DragSelectionTool::VectorScaleTool::leftButtonDrag(const TPointD &pos, void DragSelectionTool::VectorScaleTool::leftButtonDrag(const TPointD &pos,
const TMouseEvent &e) { const TMouseEvent &e) {
VectorSelectionTool *tool = dynamic_cast<VectorSelectionTool *>(m_tool);
tool->setResetCenter(false);
m_scale->leftButtonDrag(pos, e); m_scale->leftButtonDrag(pos, e);
} }
@ -1099,6 +1111,8 @@ void DragSelectionTool::VectorChangeThicknessTool::leftButtonDrag(
TPointD delta = pos - m_curPos; TPointD delta = pos - m_curPos;
TVectorImageP vi = getTool()->getImage(true); TVectorImageP vi = getTool()->getImage(true);
if (!vi) return; if (!vi) return;
VectorSelectionTool *tool = dynamic_cast<VectorSelectionTool *>(m_tool);
tool->setResetCenter(false);
m_thicknessChange = (pos.y - m_firstPos.y) * 0.2; m_thicknessChange = (pos.y - m_firstPos.y) * 0.2;
changeImageThickness(*vi, m_thicknessChange); changeImageThickness(*vi, m_thicknessChange);
getTool()->m_deformValues.m_maxSelectionThickness = m_thicknessChange; getTool()->m_deformValues.m_maxSelectionThickness = m_thicknessChange;
@ -1196,7 +1210,8 @@ VectorSelectionTool::VectorSelectionTool(int targetType)
, m_joinStyle("Join") , m_joinStyle("Join")
, m_miterJoinLimit("Miter:", 0, 100, 4) , m_miterJoinLimit("Miter:", 0, 100, 4)
, m_selectionCount(0) , m_selectionCount(0)
, m_canEnterGroup(true) { , m_canEnterGroup(true)
, m_resetCenter(true) {
assert(targetType == TTool::Vectors); assert(targetType == TTool::Vectors);
m_prop.bind(m_selectionTarget); m_prop.bind(m_selectionTarget);
m_prop.bind(m_constantThickness); m_prop.bind(m_constantThickness);
@ -1437,7 +1452,6 @@ void VectorSelectionTool::clearSelectedStrokes() {
m_strokeSelection.selectNone(); m_strokeSelection.selectNone();
m_levelSelection.styles().clear(); m_levelSelection.styles().clear();
m_deformValues.reset(); m_deformValues.reset();
m_centers.clear();
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -1496,7 +1510,6 @@ void VectorSelectionTool::modifySelectionOnClick(TImageP image,
if (selectionChanged) { if (selectionChanged) {
m_deformValues.reset(); // Resets selection values shown in the toolbar m_deformValues.reset(); // Resets selection values shown in the toolbar
m_centers.clear();
finalizeSelection(); finalizeSelection();
notifySelectionChanged(); notifySelectionChanged();
@ -1594,10 +1607,7 @@ void VectorSelectionTool::leftButtonDrag(const TPointD &pos,
selectionChanged = (selectStroke(s, false) || selectionChanged); selectionChanged = (selectStroke(s, false) || selectionChanged);
} }
if (selectionChanged) { if (selectionChanged) finalizeSelection();
m_centers.clear();
finalizeSelection();
}
invalidate(); invalidate();
} }
@ -1782,6 +1792,7 @@ bool VectorSelectionTool::isSelectionEmpty() {
void VectorSelectionTool::computeBBox() { void VectorSelectionTool::computeBBox() {
m_bboxs.clear(); m_bboxs.clear();
if (canResetCenter()) m_centers.clear();
TVectorImageP vi = getImage(false); TVectorImageP vi = getImage(false);
if (!vi) return; if (!vi) return;
@ -1841,7 +1852,7 @@ void VectorSelectionTool::computeBBox() {
FourPoints bbox; FourPoints bbox;
bbox = newBbox; bbox = newBbox;
m_bboxs.push_back(bbox); m_bboxs.push_back(bbox);
if (getCenter() == TPointD()) if (canResetCenter())
m_centers.push_back(0.5 * (bbox.getP11() + bbox.getP00())); m_centers.push_back(0.5 * (bbox.getP11() + bbox.getP00()));
} }
@ -1939,7 +1950,6 @@ void VectorSelectionTool::onImageChanged() {
vi->getPalette() != vi->getPalette() !=
selectedImg->getPalette()) // if palettes still match selectedImg->getPalette()) // if palettes still match
selectedStyles().clear(); selectedStyles().clear();
m_centers.clear();
} else { } else {
// Remove any eventual stroke index outside the valid range // Remove any eventual stroke index outside the valid range
if (!m_strokeSelection.isEmpty()) { if (!m_strokeSelection.isEmpty()) {
@ -1966,7 +1976,6 @@ void VectorSelectionTool::doOnDeactivate() {
m_deformValues.reset(); m_deformValues.reset();
m_polyline.clear(); m_polyline.clear();
m_centers.clear();
TTool::getApplication()->getCurrentSelection()->setSelection(0); TTool::getApplication()->getCurrentSelection()->setSelection(0);
@ -2155,7 +2164,6 @@ void VectorSelectionTool::selectRegionVectorImage() {
} }
if (selectionChanged) { if (selectionChanged) {
m_centers.clear();
finalizeSelection(); finalizeSelection();
notifySelectionChanged(); notifySelectionChanged();
invalidate(); invalidate();

View file

@ -306,6 +306,11 @@ public:
TPropertyGroup *getProperties(int targetType) override; TPropertyGroup *getProperties(int targetType) override;
bool m_resetCenter;
void setResetCenter(bool update) { m_resetCenter = update; }
bool canResetCenter() { return m_resetCenter; }
protected: protected:
void onActivate() override; void onActivate() override;
void onDeactivate() override; void onDeactivate() override;