bool MgCmdDrawLines::touchEnded(const MgMotion* sender) { Point2d pnt(snapPoint(sender)); float distmin = mgDisplayMmToModel(2.f, sender); bool closed = false; dynshape()->shape()->setPoint(m_step, pnt); if (needCheckClosed()) { closed = m_step > 2 && pnt.distanceTo(dynshape()->shape()->getPoint(0)) < distmin; ((MgBaseLines*)dynshape()->shape())->setClosed(closed); } dynshape()->shape()->update(); if (pnt.distanceTo(dynshape()->shape()->getPoint(m_step - 1)) > distmin) { if (closed || needEnded()) { if (closed) { ((MgBaseLines*)dynshape()->shape())->removePoint(m_step); } _addshape(sender); _delayClear(); m_step = 0; } else if (++m_step >= dynshape()->shape()->getPointCount()) { ((MgBaseLines*)dynshape()->shape())->addPoint(pnt); } } return _touchEnded(sender); }
bool MgCmdDrawLines::touchEnded(const MgMotion* sender) { Point2d pnt(snapPoint(sender)); dynshape()->shape()->setPoint(m_index, pnt); bool closed = checkClosed(sender, pnt); MgBaseLines* lines = (MgBaseLines*)dynshape()->shape(); dynshape()->shape()->update(); if (canAddPoint(sender, pnt)) { if (closed || needEnded()) { if (closed) { lines->removePoint(m_step); } addShape(sender); m_step = 0; _lastClicked = false; } else if (m_step <= dynshape()->shape()->getPointCount()) { m_step++; } } else if (m_step > 1) { if (m_step >= dynshape()->shape()->getPointCount()) { m_step--; } lines->removePoint(m_index); } return MgCommandDraw::touchEnded(sender); }
bool MgCmdDrawLines::draw(const MgMotion* sender, GiGraphics* gs) { if (m_step > (needEnded() ? 3 : 2) && !sender->dragging()) { gs->drawHandle(dynshape()->shapec()->getExtent().center(), kGiHandleAccept); } return MgCommandDraw::draw(sender, gs); }
bool MgCmdDrawLines::click(const MgMotion* sender) { if (m_step > (needEnded() ? 3 : 2) && sender->pointM.distanceTo(dynshape()->shapec()->getExtent().center()) < sender->displayMmToModel(5.f)) { return cancel(sender); } return MgCommandDraw::click(sender); }