diff --git a/GraphicsView/include/CGAL/Qt/PointsGraphicsItem.h b/GraphicsView/include/CGAL/Qt/PointsGraphicsItem.h new file mode 100644 index 00000000000..a947222f50f --- /dev/null +++ b/GraphicsView/include/CGAL/Qt/PointsGraphicsItem.h @@ -0,0 +1,167 @@ +// Copyright (c) 2008 GeometryFactory Sarl (France). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you may redistribute it under +// the terms of the Q Public License version 1.0. +// See the file LICENSE.QPL distributed with CGAL. +// +// Licensees holding a valid commercial license may use this file in +// accordance with the commercial license agreement provided with the software. +// +// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +// +// $URL$ +// $Id$ +// +// +// Author(s) : Andreas Fabri +// Laurent Rineau + +#ifndef CGAL_QT_POINTS_GRAPHICS_ITEM_H +#define CGAL_QT_POINTS_GRAPHICS_ITEM_H + +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace CGAL { +namespace Qt { + +template +class PointsGraphicsItem : public GraphicsItem +{ + typedef typename P::value_type Point_2; + typedef typename CGAL::Kernel_traits::Kernel Traits; + +public: + PointsGraphicsItem(P* p_); + + void modelChanged(); + +public: + QRectF boundingRect() const; + + void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); + + + const QPen& verticesPen() const + { + return vertices_pen; + } + + void setVerticesPen(const QPen& pen) + { + vertices_pen = pen; + } + + bool drawVertices() const + { + return draw_vertices; + } + + void setDrawVertices(const bool b) + { + draw_vertices = b; + update(); + } + +protected: + void updateBoundingBox(); + + P * points; + QPainter* m_painter; + PainterOstream painterostream; + + + QRectF bounding_rect; + + QPen vertices_pen; + bool draw_edges; + bool draw_vertices; +}; + + +template +PointsGraphicsItem

::PointsGraphicsItem(P * p_) + : points(p_), painterostream(0), + draw_edges(true), draw_vertices(true) +{ + setVerticesPen(QPen(::Qt::red, 3.)); + if(points->size() == 0){ + this->hide(); + } + updateBoundingBox(); + setZValue(3); +} + +template +QRectF +PointsGraphicsItem

::boundingRect() const +{ + return bounding_rect; +} + + + + +template +void +PointsGraphicsItem

::paint(QPainter *painter, + const QStyleOptionGraphicsItem *option, + QWidget * widget) +{ + if(drawVertices()) { + Converter convert; + + painter->setPen(verticesPen()); + QMatrix matrix = painter->matrix(); + painter->resetMatrix(); + for(typename P::iterator it = points->begin(); + it != points->end(); + it++){ + QPointF point = matrix.map(convert(*it)); + painter->drawPoint(point); + } + } +} + +// We let the bounding box only grow, so that when vertices get removed +// the maximal bbox gets refreshed in the GraphicsView +template +void +PointsGraphicsItem

::updateBoundingBox() +{ + Converter convert; + prepareGeometryChange(); + if(points->size() == 0){ + return; + } + bounding_rect = convert(CGAL::bounding_box(points->begin(), points->end())); +} + + +template +void +PointsGraphicsItem

::modelChanged() +{ + if((points->size() == 0) ){ + this->hide(); + } else if((points->size() > 0) && (! this->isVisible())){ + this->show(); + } + updateBoundingBox(); + update(); +} + + +} // namespace Qt +} // namespace CGAL + +#endif // CGAL_QT_POINTS_GRAPHICS_ITEM_H