/*********************************************************************/ /* */ /* Copyright 2022-2023 Rémi Synave - remi.synave@univ-littoral.fr */ /* */ /* This file is part of DSL. */ /* This software uses Qt to build the Graphical User Interface */ /* https://www.qt.io/ */ /* */ /* DSL is free software: you can redistribute it and/or modify */ /* it under the terms of the GNU General Public License as published */ /* by the Free Software Foundation, either version 3 of the License, */ /* or (at your option) any later version. */ /* */ /* DSL is distributed in the hope that it will be useful, */ /* but WITHOUT ANY WARRANTY; without even the implied warranty of */ /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ /* GNU General Public License for more details. */ /* */ /* You should have received a copy of the GNU General Public License */ /* along with DSL. If not, see . */ /* */ /*********************************************************************/ #include #include #include #include #include #include #include #include #include #include #include "WorkArea.hpp" WorkArea::WorkArea (int screenSizeX, int screenSizeY, QWidget * parent):QWidget(parent) { this->screenSizeX = screenSizeX; this->screenSizeY = screenSizeY; this->setGeometry(0,0,screenSizeX,screenSizeY); QPalette pal = QPalette(); pal.setColor(QPalette::Window, Qt::gray); this->setAutoFillBackground(true); this->setPalette(pal); setFixedSize (screenSizeX, screenSizeY); indexPointClicked = -1; } WorkArea::~WorkArea () { } void WorkArea::addSL (const StrengthLine *sl) { liste_points << new QPoint((int)(sl->getP1()->x()), (int)(sl->getP1()->y())); liste_points << new QPoint((int)(sl->getP2()->x()), (int)(sl->getP2()->y())); } void WorkArea::paintEvent (QPaintEvent * event) { QPainter painter (this); paint (painter); } void WorkArea::paint (QPainter & painter) { for (int i = 0; i < liste_points.length (); i++) { painter.setBrush (QBrush (Qt::green)); painter.setPen (QPen (Qt::black)); painter.drawEllipse (liste_points[i]->x () - taillePoint / 2, liste_points[i]->y () - taillePoint / 2, taillePoint, taillePoint); if ((i % 2) == 1) { painter.setPen (QPen (Qt::red, epaisseurLigne)); std::pair < QPoint *, QPoint * >endPoints = StrengthLine (liste_points[i - 1], liste_points[i]).interpolateToEdge (this->screenSizeX, this->screenSizeY); QPoint *first = std::get < 0 > (endPoints); QPoint *last = std::get < 1 > (endPoints); painter.drawLine (*first, *last); painter.setBrush (QBrush (Qt::blue)); painter.setPen (QPen (Qt::blue)); painter.drawEllipse (*first, taillePoint, taillePoint); painter.drawEllipse (*last, taillePoint, taillePoint); } } } void WorkArea::mousePressEvent (QMouseEvent * event) { // Est ce qu'on a cliqué sur un point existant ? indexPointClicked = -1; for (int i = 0; i < liste_points.length (); i++) { QPoint point = event->pos () - *(liste_points[i]); if (point.manhattanLength () < taillePoint) { indexPointClicked = i; } } repaint (); } void WorkArea::mouseMoveEvent (QMouseEvent * event) { if (indexPointClicked != -1) { liste_points[indexPointClicked]->setX (event->x ()); liste_points[indexPointClicked]->setY (event->y ()); } repaint (); } void WorkArea::mouseReleaseEvent (QMouseEvent * event) { indexPointClicked = -1; emit click(); } double WorkArea::getDistance() const { StrengthLine *sl1 = new StrengthLine(liste_points[0], liste_points[1]); StrengthLine *sl2 = new StrengthLine(liste_points[2], liste_points[3]); return sl1->ea_score(sl2, screenSizeX, screenSizeY); }