/* Copyright 2006-2020 The QElectroTech Team This file is part of QElectroTech. QElectroTech 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 2 of the License, or (at your option) any later version. QElectroTech 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 QElectroTech. If not, see . */ #include "diagrameventaddimage.h" #include "diagram.h" #include "diagramimageitem.h" #include "diagramcommands.h" /** * @brief DiagramEventAddImage::DiagramEventAddImage * Default constructor * @param diagram : diagram where operate this event */ DiagramEventAddImage::DiagramEventAddImage(Diagram *diagram) : DiagramEventInterface(diagram), m_image (nullptr), m_is_added (false) { openDialog(); } /** * @brief DiagramEventAddImage::~DiagramEventAddImage */ DiagramEventAddImage::~DiagramEventAddImage() { if (m_running || m_abort) { if (m_is_added) m_diagram->removeItem(m_image); delete m_image; } foreach (QGraphicsView *view, m_diagram->views()) view->setContextMenuPolicy((Qt::DefaultContextMenu)); } /** * @brief DiagramEventAddImage::mousePressEvent * Action when mouse is pressed * @param event : event of mouse pressed */ void DiagramEventAddImage::mousePressEvent(QGraphicsSceneMouseEvent *event) { if (m_image && event -> button() == Qt::LeftButton) { QPointF pos = event->scenePos(); pos.rx() -= m_image->boundingRect().width()/2; pos.ry() -= m_image->boundingRect().height()/2; m_diagram -> undoStack().push (new AddItemCommand(m_image, m_diagram, pos)); for (QGraphicsView *view : m_diagram->views()) { view->setContextMenuPolicy((Qt::DefaultContextMenu)); } m_running = false; emit finish(); event->setAccepted(true); } else if (m_image && event -> button() == Qt::RightButton) { m_image->setRotation(m_image->rotation() + 90); event->setAccepted(true); } } /** * @brief DiagramEventAddImage::mouseMoveEvent * Action when mouse move * @param event : event of mouse move */ void DiagramEventAddImage::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { if (!m_image || event->buttons() != Qt::NoButton) { return; }; QPointF pos = event->scenePos(); if (!m_is_added) { for (QGraphicsView *view : m_diagram->views()) { view->setContextMenuPolicy((Qt::NoContextMenu)); } m_diagram->addItem(m_image); m_is_added = true; } m_image->setPos(pos - m_image->boundingRect().center()); event->setAccepted(true); } /** * @brief DiagramEventAddImage::mouseDoubleClickEvent * This method is only use to overwrite double click. * When double click, image propertie dialog isn't open. * @param event : event of mouse double click. */ void DiagramEventAddImage::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) { event->setAccepted(true); } /** * @brief DiagramEventAddImage::wheelEvent * Action when mouse wheel is rotate * @param event: evet of mouse wheel */ void DiagramEventAddImage::wheelEvent(QGraphicsSceneWheelEvent *event) { if (!m_is_added || !m_image || event -> modifiers() != Qt::CTRL) { return; } qreal scaling = m_image->scale(); event->delta() > 1? scaling += 0.01 : scaling -= 0.01; if (scaling>0.01 && scaling <= 2) { m_image->setScale(scaling); } event->setAccepted(true); } /** * @brief DiagramEventAddImage::isNull * @return : true if image can't be loaded, otherwise return false. */ bool DiagramEventAddImage::isNull() const { if (!m_image) return true; return false; } /** * @brief DiagramEventAddImage::openDialog * Open dialog for select the image to add. */ void DiagramEventAddImage::openDialog() { if (m_diagram -> isReadOnly()) return; //Open dialog for select image QString pathPictures = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation); QString fileName = QFileDialog::getOpenFileName(m_diagram->views().isEmpty()? nullptr : m_diagram->views().first(), QObject::tr("Selectionner une image..."), pathPictures, QObject::tr("Image Files (*.png *.jpg *.jpeg *.bmp *.svg)")); if (fileName.isEmpty()) return; QImage image(fileName); if(image.isNull()) { QMessageBox::critical(m_diagram->views().isEmpty()? nullptr : m_diagram->views().first(), QObject::tr("Erreur"), QObject::tr("Impossible de charger l'image.")); return; } m_image = new DiagramImageItem (QPixmap::fromImage(image)); m_running = true; }