void MgCmdManagerImpl::eraseWnd(const MgMotion* sender) { Box2d snap(sender->view->xform()->getWndRectM()); std::vector<int> delIds; void *it = NULL; MgShapes* s = sender->view->shapes(); for (MgShape* shape = s->getFirstShape(it); shape; shape = s->getNextShape(it)) { if (shape->shape()->hitTestBox(snap)) { delIds.push_back(shape->getID()); } } s->freeIterator(it); if (!delIds.empty() && sender->view->shapeWillDeleted(s->findShape(delIds.front()))) { MgShapesLock locker(MgShapesLock::Remove, sender->view); for (std::vector<int>::iterator i = delIds.begin(); i != delIds.end(); ++i) { MgShape* shape = s->findShape(*i); if (shape && sender->view->removeShape(shape)) { shape->release(); } } sender->view->regenAll(); } }
float MgComposite::_hitTest(const Point2d& pt, float tol, Point2d& nearpt, int& segment, bool& inside) const { void* it; float mindist = 1e10f; Point2d tmpNear; int tmpseg; bool tmpIn; Box2d limits(pt, 2 * tol, 0); segment = 0; for (MgShape* sp = _shapes->getFirstShape(it); sp; sp = _shapes->getNextShape(it)) { if (limits.isIntersect(sp->shapec()->getExtent())) { float d = sp->shapec()->hitTest(pt, tol, tmpNear, tmpseg, tmpIn); if (mindist > d - _MGZERO) { mindist = d; nearpt = tmpNear; segment = sp->getID(); inside = tmpIn; } } } _shapes->freeIterator(it); return mindist; }
float MgComposite::_hitTest(const Point2d& pt, float tol, MgHitResult& res) const { void* it; MgHitResult tmpRes; Box2d limits(pt, 2 * tol, 0); res.segment = 0; res.dist = _FLT_MAX; for (MgShape* sp = _shapes->getFirstShape(it); sp; sp = _shapes->getNextShape(it)) { if (limits.isIntersect(sp->shapec()->getExtent())) { float d = sp->shapec()->hitTest(pt, tol, tmpRes); if (res.dist > d - _MGZERO) { res = tmpRes; res.dist = d; res.segment = sp->getID(); } } } _shapes->freeIterator(it); return res.segment != 0; }
bool MgCmdErase::touchEnded(const MgMotion* sender) { MgShapes* s = sender->view->shapes(); if (!m_delIds.empty() && sender->view->shapeWillDeleted(s->findShape(m_delIds.front()))) { MgShapesLock locker(s, MgShapesLock::Remove); int count = 0; for (std::vector<int>::iterator it = m_delIds.begin(); it != m_delIds.end(); ++it) { MgShape* shape = s->findShape(*it); if (shape && sender->view->removeShape(shape)) { shape->release(); count++; } } if (count > 0) { sender->view->regen(); } } m_delIds.clear(); m_boxsel = false; sender->view->redraw(false); return true; }
MgShape* MgCmdManagerImpl::addImageShape(const MgMotion* sender, const char* name, float width, float height) { if (!name || *name == 0 || width < 1 || height < 1) return NULL; Vector2d size(Vector2d(width, height) * sender->view->xform()->displayToWorld()); while (fabsf(size.x) > 200.f || fabsf(size.y) > 200.f) { size *= 0.95f; } Box2d rect(sender->view->xform()->getWndRectW() + Vector2d(10.f, -10.f)); rect = Box2d(rect.leftTop(), rect.leftTop() + size); rect *= sender->view->xform()->worldToModel(); MgShapeT<MgImageShape> shape; MgImageShape* imagesp = (MgImageShape*)shape.shape(); shape.context()->setLineStyle(kGiLineNull); // 默认没有边框 shape.context()->setFillColor(GiColor::White()); // 设为实填充,避免在中心无法点中 imagesp->setName(name); imagesp->setRect2P(rect.leftTop(), rect.rightBottom()); MgShapesLock locker(MgShapesLock::Add, sender->view); if (sender->view->shapeWillAdded(&shape)) { MgShape* newsp = sender->view->shapes()->addShape(shape); sender->view->shapeAdded(newsp); sender->view->setNewShapeID(newsp->getID()); sender->view->cancel(sender); return newsp; } return NULL; }
bool MgGroup::_draw(int mode, GiGraphics& gs, const GiContext& ctx, int segment) const { MgShape* sp = _shapes->findShape(segment); if (sp) { return sp->draw(mode, gs, ctx.isNullLine() ? NULL : &ctx, -1); } return __super::_draw(mode, gs, ctx, segment); }
void MgComposite::_transform(const Matrix2d& mat) { void* it; for (MgShape* sp = _shapes->getFirstShape(it); sp; sp = _shapes->getNextShape(it)) { sp->shape()->transform(mat); } _shapes->freeIterator(it); }
bool MgGroup::_offset(const Vector2d& vec, int segment) { MgShape* sp = _shapes->findShape(segment); if (sp && canOffsetShapeAlone(sp)) { return sp->shape()->offset(vec, -1); } return __super::_offset(vec, segment); }
GiContext& GiCoreView::getContext(bool forChange) { if (!forChange) { _contextEditing = false; } MgShape* shape = NULL; impl->_cmds->getSelection(impl, 1, &shape, forChange); _tmpContext = shape ? *shape->context() : *impl->context(); return _tmpContext; }
void MgComposite::_update() { void* it; _extent.empty(); for (MgShape* sp = _shapes->getFirstShape(it); sp; sp = _shapes->getNextShape(it)) { sp->shape()->update(); _extent.unionWith(sp->shapec()->getExtent()); } _shapes->freeIterator(it); }
bool MgComposite::_draw(int mode, GiGraphics& gs, const GiContext& ctx, int) const { void* it; int n = 0; for (MgShape* sp = _shapes->getFirstShape(it); sp; sp = _shapes->getNextShape(it)) { n += sp->draw(mode, gs, ctx.isNullLine() ? NULL : &ctx, -1) ? 1 : 0; } _shapes->freeIterator(it); return n > 0; }
bool MgComposite::_offset(const Vector2d& vec, int) { void* it; int n = 0; for (MgShape* sp = _shapes->getFirstShape(it); sp; sp = _shapes->getNextShape(it)) { n += sp->shape()->offset(vec, -1) ? 1 : 0; } _shapes->freeIterator(it); return n > 0; }
bool MgCommandDraw::_click(const MgMotion* sender) { Box2d limits(sender->pointM, mgDisplayMmToModel(10, sender), 0); Point2d nearpt; MgShape* shape = sender->view->shapes()->hitTest(limits, nearpt); if (shape) { g_newShapeID = shape->getID(); mgGetCommandManager()->setCommand(sender, "select"); } return shape || longPress(sender); }
bool MgCmdErase::click(const MgMotion* sender) { MgShape* shape = hitTest(sender); if (shape && sender->view->shapeWillDeleted(shape)) { MgShapesLock locker(sender->view->shapes(), MgShapesLock::Remove); if (sender->view->removeShape(shape)) { shape->release(); sender->view->regen(); } } return true; }
bool MgCommandDraw::_click(const MgMotion* sender) { Box2d limits(sender->pointM, sender->displayMmToModel(10.f), 0); MgHitResult res; MgShape* shape = sender->view->shapes()->hitTest(limits, res); if (shape) { sender->view->setNewShapeID(shape->getID()); sender->toSelectCommand(); LOGD("Command (%s) cancelled after the shape #%d clicked.", getName(), shape->getID()); } return shape || (sender->view->useFinger() && longPress(sender)); }
MgShape* MgCommandDraw::_addshape(const MgMotion* sender, MgShape* shape) { MgShapesLock locker(sender->view->shapes(), MgShapesLock::Add); shape = shape ? shape : m_shape; MgShape* newsp = NULL; if (locker.locked() && sender->view->shapeWillAdded(shape)) { newsp = sender->view->shapes()->addShape(*shape); sender->view->shapeAdded(newsp); g_newShapeID = newsp->getID(); } if (m_shape && sender->view->context()) { *m_shape->context() = *sender->view->context(); } return newsp; }
bool MgCmdErase::touchMoved(const MgMotion* sender) { Box2d snap(sender->startPointM, sender->pointM); void *it = NULL; MgShape* shape = m_boxsel ? sender->view->shapes()->getFirstShape(it) : NULL; m_delIds.clear(); for (; shape; shape = sender->view->shapes()->getNextShape(it)) { if (isIntersectMode(sender) ? shape->shape()->hitTestBox(snap) : snap.contains(shape->shape()->getExtent())) { m_delIds.push_back(shape->getID()); } } sender->view->shapes()->freeIterator(it); sender->view->redraw(false); return true; }
MgShape* MgCommandDraw::addShape(const MgMotion* sender, MgShape* shape, bool autolock) { MgShapesLock locker(MgShapesLock::Add, autolock ? sender->view : NULL); shape = shape ? shape : m_shape; MgShape* newsp = NULL; if ((locker.locked() || !autolock) && sender->view->shapeWillAdded(shape)) { newsp = sender->view->shapes()->addShape(*shape); sender->view->shapeAdded(newsp); sender->view->getCmdSubject()->onShapeAdded(sender, newsp); if (strcmp(getName(), "splines") != 0) { sender->view->setNewShapeID(newsp->getID()); } } if (m_shape && sender->view->context()) { *m_shape->context() = *sender->view->context(); } return newsp; }
bool MgCmdErase::draw(const MgMotion* sender, GiGraphics* gs) { if (m_boxsel) { GiContext ctxshap(0, GiColor(0, 0, 255, 80), isIntersectMode(sender) ? kGiLineDash : kGiLineSolid, GiColor(0, 0, 255, 24)); bool antiAlias = gs->setAntiAliasMode(false); gs->drawRect(&ctxshap, Box2d(sender->startPointM, sender->pointM)); gs->setAntiAliasMode(antiAlias); } GiContext ctx(-4, GiColor(64, 64, 64, 128)); for (std::vector<int>::const_iterator it = m_delIds.begin(); it != m_delIds.end(); ++it) { MgShape* shape = sender->view->shapes()->findShape(*it); if (shape) shape->draw(1, *gs, &ctx); } return true; }
MgShape* MgCmdManagerImpl::addImageShape(const MgMotion* sender, const char* name, float xc, float yc, float w, float h) { if (!name || *name == 0 || w < 1 || h < 1) return NULL; Vector2d size(Vector2d(w, h) * sender->view->xform()->displayToWorld()); while (fabsf(size.x) > 200.f || fabsf(size.y) > 200.f) { size *= 0.95f; } size *= sender->view->xform()->worldToDisplay(); Box2d rect(xc - size.x / 2, yc - size.y / 2, xc + size.x / 2, yc + size.y / 2); LOGD("addImageShape %s x:%.0f y:%.0f w:%.0f h:%.0f", name, rect.xmin, rect.ymin, rect.width(), rect.height()); rect *= sender->view->xform()->displayToModel(); MgShapeT<MgImageShape> shape; MgImageShape* imagesp = (MgImageShape*)shape.shape(); shape.context()->setLineStyle(kGiLineNull); // 默认没有边框 shape.context()->setFillColor(GiColor::White()); // 设为实填充,避免在中心无法点中 imagesp->setName(name); imagesp->setRect2P(rect.leftTop(), rect.rightBottom()); MgShapesLock locker(MgShapesLock::Add, sender->view); if (sender->view->shapeWillAdded(&shape)) { MgShape* newsp = sender->view->shapes()->addShape(shape); sender->view->shapeAdded(newsp); sender->view->setNewShapeID(newsp->getID()); sender->toSelectCommand(); return newsp; } return NULL; }
bool MgCmdDrawSplines::click(const MgMotion* sender) { if (m_freehand) { MgShapeT<MgLine> line(*sender->view->context()); Point2d pt (sender->pointM); if (sender->point.distanceTo(sender->startPt) < 1.f) { pt = (sender->point + Vector2d(1.f, 1.f)) * sender->view->xform()->displayToModel(); } line.shape()->setPoint(0, sender->startPtM); line.shape()->setPoint(1, pt); MgShape* newsp = addShape(sender, &line); if (newsp) { dynshape()->shape()->clear(); sender->view->regenAppend(newsp->getID()); } return true; } return MgCommandDraw::click(sender); }
int GiCoreView::addImageShape(const char* name, float width, float height) { MgShape* shape = impl->_cmds->addImageShape(&impl->motion, name, width, height); return shape ? shape->getID() : 0; }
Point2d MgComposite::_getPoint(int index) const { MgShape* sp = _shapes->getHeadShape(); return sp ? sp->shapec()->getPoint(index) : Point2d(); }
int MgComposite::_getHandleType(int index) const { MgShape* sp = _shapes->getHeadShape(); return sp ? sp->shapec()->getHandleType(index) : kMgHandleOutside; }
int MgComposite::_getPointCount() const { MgShape* sp = _shapes->getHeadShape(); return sp ? sp->shapec()->getPointCount() : 0; }
int GiCoreView::addImageShape(const char* name, float xc, float yc, float w, float h) { MgShape* shape = impl->_cmds->addImageShape(&impl->motion, name, xc, yc, w, h); return shape ? shape->getID() : 0; }