// Copyright (c) 2008 GeometryFactory Sarl (France). // All rights reserved. // // This file is part of CGAL (www.cgal.org). // // $URL: https://github.com/CGAL/cgal/blob/v5.1/GraphicsView/include/CGAL/Qt/SegmentsGraphicsItem.h $ // $Id: SegmentsGraphicsItem.h 0779373 2020-03-26T13:31:46+01:00 Sébastien Loriot // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial // // // Author(s) : Andreas Fabri // Laurent Rineau #ifndef CGAL_QT_SEGMENTS_GRAPHICS_ITEM_H #define CGAL_QT_SEGMENTS_GRAPHICS_ITEM_H #include #include #include #include #include #include #include #include #include namespace CGAL { namespace Qt { template class SegmentsGraphicsItem : public GraphicsItem { typedef typename P::value_type Segment_2; typedef typename CGAL::Kernel_traits::Kernel Traits; public: SegmentsGraphicsItem(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 * segments; QPainter* m_painter; PainterOstream painterostream; QRectF bounding_rect; QPen vertices_pen; bool draw_edges; bool draw_vertices; }; template SegmentsGraphicsItem

::SegmentsGraphicsItem(P * p_) : segments(p_), painterostream(0), draw_edges(true), draw_vertices(true) { setVerticesPen(QPen(::Qt::red, 3.)); updateBoundingBox(); setZValue(3); } template QRectF SegmentsGraphicsItem

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

::paint(QPainter *painter, const QStyleOptionGraphicsItem * /*option*/, QWidget * /*widget*/) { painterostream = PainterOstream(painter); painter->setPen(QPen(::Qt::black, 0, ::Qt::SolidLine, ::Qt::RoundCap, ::Qt::RoundJoin)); for(typename P::iterator it = segments->begin(); it != segments->end(); it++){ painterostream << *it; } } // We let the bounding box only grow, so that when vertices get removed // the maximal bbox gets refreshed in the GraphicsView template void SegmentsGraphicsItem

::updateBoundingBox() { Converter convert; prepareGeometryChange(); if(segments->size() == 0){ return; } Bbox_2 bb = segments->begin()->bbox(); for(typename P::iterator it = segments->begin(); it != segments->end(); ++it){ bb = bb + it->bbox(); } bounding_rect = convert(bb); } template void SegmentsGraphicsItem

::modelChanged() { updateBoundingBox(); update(); } } // namespace Qt } // namespace CGAL #endif // CGAL_QT_SEGMENTS_GRAPHICS_ITEM_H