void wxSFLayoutMesh::DoLayout(ShapeList& shapes) { int i = 0, cols = floor( sqrt( (float)shapes.GetCount() ) ); double roffset, coffset, maxh = -m_HSpace; roffset = coffset = 0; wxRealPoint nStart = GetTopLeft( shapes ); for( ShapeList::iterator it = shapes.begin(); it != shapes.end(); ++ it ) { wxSFShapeBase *pShape = *it; if( i++ % cols == 0 ) { coffset = 0; roffset += maxh + m_HSpace; maxh = 0; } pShape->MoveTo( nStart.x + coffset, nStart.y + roffset ); wxRect rctBB = pShape->GetBoundingBox(); coffset += rctBB.GetWidth() + m_VSpace; if( rctBB.GetHeight() > maxh ) maxh = rctBB.GetHeight(); } }
wxRealPoint wxSFLayoutAlgorithm::GetShapesCenter(const ShapeList& shapes) { wxRealPoint nCenter; for( ShapeList::const_iterator it = shapes.begin(); it != shapes.end(); ++ it ) { nCenter = nCenter + (*it)->GetAbsolutePosition(); } nCenter.x /= shapes.GetCount(); nCenter.y /= shapes.GetCount(); return nCenter; }
void wxSFLayoutCircle::DoLayout(ShapeList& shapes) { wxSize sizeShapes = GetShapesExtent( shapes ); wxRealPoint nCenter = GetShapesCenter( shapes ); double x, y; double step = 360.0 / shapes.GetCount(); double degree = 0; double rx = ( sizeShapes.x / 2 ) * m_DistanceRatio; double ry = ( sizeShapes.y / 2 ) * m_DistanceRatio; for( ShapeList::iterator it = shapes.begin(); it != shapes.end(); ++ it ) { wxSFShapeBase *pShape = *it; x = nCenter.x + cos( degree * wxSF::PI / 180 ) * rx; y = nCenter.y + sin( degree * wxSF::PI / 180 ) * ry; degree += step; pShape->MoveTo( x, y ); } }
void wxSFShapeBase::_OnKey(int key) { if(!m_pParentManager)return; wxSFShapeCanvas *pCanvas = GetShapeManager()->GetShapeCanvas(); if(!pCanvas)return; if( m_fVisible && m_fActive ) { double dx = 1, dy = 1; bool fRefreshAll = false; wxRect prevBB; if( pCanvas->ContainsStyle(wxSFShapeCanvas::sfsGRID_USE) ) { dx = pCanvas->GetGrid().x; dy = pCanvas->GetGrid().y; } ShapeList lstSelection; pCanvas->GetSelectedShapes(lstSelection); if((lstSelection.GetCount() > 1) && (lstSelection.IndexOf(this) != wxNOT_FOUND)) { fRefreshAll = true; } if(!fRefreshAll) { GetCompleteBoundingBox(prevBB, bbSELF | bbCONNECTIONS | bbCHILDREN | bbSHADOW); } if(this->OnKey(key)) { switch(key) { case WXK_LEFT: if(ContainsStyle(sfsPOSITION_CHANGE))this->MoveBy(-dx, 0); break; case WXK_RIGHT: if(ContainsStyle(sfsPOSITION_CHANGE))this->MoveBy(dx, 0); break; case WXK_UP: if(ContainsStyle(sfsPOSITION_CHANGE))this->MoveBy(0, -dy); break; case WXK_DOWN: if(ContainsStyle(sfsPOSITION_CHANGE))this->MoveBy(0, dy); break; } } if(!fRefreshAll) { wxRect currBB; GetCompleteBoundingBox(currBB, bbSELF | bbCONNECTIONS | bbCHILDREN | bbSHADOW); prevBB.Union(currBB); Refresh(prevBB, sfDELAYED); } else pCanvas->Refresh(false); } }