// 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/GraphicsViewCircularArcInput.h $ // $Id: GraphicsViewCircularArcInput.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_GRAPHICS_VIEW_CIRCULAR_ARC_INPUT_H #define CGAL_QT_GRAPHICS_VIEW_CIRCULAR_ARC_INPUT_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace CGAL { namespace Qt { template class GraphicsViewCircularArcInput : public GraphicsViewInput { public: GraphicsViewCircularArcInput(QObject *parent, QGraphicsScene* s); ~GraphicsViewCircularArcInput(); protected: virtual void mousePressEvent(QGraphicsSceneMouseEvent *event); virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event); virtual void keyPressEvent(QKeyEvent *event); bool eventFilter(QObject *obj, QEvent *event); private: typedef typename K::Circular_arc_2 Circular_arc_2; typedef typename K::Line_arc_2 Line_arc_2; typedef typename K::Point_2 Point_2; typedef typename K::Segment_2 Segment_2; int count; QGraphicsLineItem *qline; CircularArcGraphicsItem *qcarc; QPointF qp, qq, qr; Point_2 p, q, r, ap, aq, ar; QGraphicsScene *scene_; Converter convert; }; template GraphicsViewCircularArcInput::GraphicsViewCircularArcInput(QObject *parent, QGraphicsScene* s) : GraphicsViewInput(parent), count(0), scene_(s) { qline = new QGraphicsLineItem(); qcarc = new CircularArcGraphicsItem(); qline->hide(); qcarc->hide(); s->addItem(qline); s->addItem(qcarc); } template GraphicsViewCircularArcInput::~GraphicsViewCircularArcInput() { // do not delete qline and qcarc, because 's' owns them and will delete them. } template void GraphicsViewCircularArcInput::mousePressEvent(QGraphicsSceneMouseEvent *event) { if(event->modifiers() & ::Qt::ShiftModifier){ return; } if(count == 0){ qp = event->scenePos(); p = convert(qp); qline->setLine(QLineF(qp, qp)); qline->show(); count = 1; } else if(count == 1){ qq = event->scenePos(); qline->setLine(QLineF(qp, qq)); q = convert(qq); if( (event->button() == ::Qt::RightButton) && (p != q) ){ qline->hide(); Q_EMIT generate(CGAL::make_object(Line_arc_2(Segment_2(p,q)))); count = 0; } else { count = 2; } } else if(count == 2){ qr = event->scenePos(); r = convert(qr); typename K::Collinear_2 collinear; if(! collinear(p,q,r)){ qcarc->hide(); Q_EMIT generate(make_object(qcarc->arc())); count = 0; } } } template void GraphicsViewCircularArcInput::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { if(count == 0){ qcarc->hide(); qline->hide(); return; } else if(count == 1) { qcarc->hide(); qq = event->scenePos(); q = convert(qq); qline->setLine(QLineF(qp, qq)); qline->show(); } else if(count == 2){ qline->hide(); qr = event->scenePos(); r = convert(qr); typename K::Collinear_2 collinear; if(collinear(p,q,r)){ qcarc->hide(); return; } else { if(CGAL::orientation(p, q, r) == CGAL::RIGHT_TURN) { ap = p; ar = r; aq = q; qcarc->setArc(Circular_arc_2(p,r,q)); } else { ap = q; ar = r; aq = p; qcarc->setArc(Circular_arc_2(q,r,p)); } qcarc->show(); } } } template void GraphicsViewCircularArcInput::keyPressEvent ( QKeyEvent * event ) { if(event->key() == ::Qt::Key_Delete){ if(count>0){ --count; } } if(event->key() == ::Qt::Key_Escape){ count = 0; } } template bool GraphicsViewCircularArcInput::eventFilter(QObject *obj, QEvent *event) { if (event->type() == QEvent::GraphicsSceneMousePress) { QGraphicsSceneMouseEvent *mouseEvent = static_cast(event); mousePressEvent(mouseEvent); return true; } else if (event->type() == QEvent::GraphicsSceneMouseMove) { QGraphicsSceneMouseEvent *mouseEvent = static_cast(event); mouseMoveEvent(mouseEvent); return true; } else if (event->type() == QEvent::KeyPress) { QKeyEvent *keyEvent = static_cast(event); keyPressEvent(keyEvent); return true; } else{ // standard event processing return QObject::eventFilter(obj, event); } } } // namespace Qt } // namespace CGAL #endif // CGAL_QT_GRAPHICS_VIEW_CIRCULAR_ARC_INPUT_H