diff --git a/sources/qetgraphicsitem/qetshapeitem.cpp b/sources/qetgraphicsitem/qetshapeitem.cpp index 9cc81a901..a6abaf04e 100644 --- a/sources/qetgraphicsitem/qetshapeitem.cpp +++ b/sources/qetgraphicsitem/qetshapeitem.cpp @@ -21,7 +21,7 @@ #include "qet.h" #include "shapegraphicsitempropertieswidget.h" #include "PropertiesEditor/propertieseditordialog.h" -#include "qetshapegeometrycommand.h" +#include "QPropertyUndoCommand/qpropertyundocommand.h" /** * @brief QetShapeItem::QetShapeItem @@ -39,7 +39,6 @@ QetShapeItem::QetShapeItem(QPointF p1, QPointF p2, ShapeType type, QGraphicsItem m_P2 (p2), m_hovered(false), m_mouse_grab_handler(false), - m_undo_command(nullptr), m_handler(10) { if (type == Polyline) m_polygon << m_P1 << m_P2; @@ -47,10 +46,7 @@ QetShapeItem::QetShapeItem(QPointF p1, QPointF p2, ShapeType type, QGraphicsItem setAcceptHoverEvents(true); } -QetShapeItem::~QetShapeItem() -{ - if (m_undo_command) delete m_undo_command; -} +QetShapeItem::~QetShapeItem() {} /** * @brief QetShapeItem::setStyle @@ -83,22 +79,21 @@ void QetShapeItem::setP2(const QPointF &P2) prepareGeometryChange(); m_P2 = P2; } - setTransformOriginPoint(boundingRect().center()); } /** * @brief QetShapeItem::setLine * Set item geometry to line (only available for line shape) * @param line + * @return : true when shape is a Line, else false */ -void QetShapeItem::setLine(const QLineF &line) +bool QetShapeItem::setLine(const QLineF &line) { - if (Q_LIKELY(m_shapeType == Line)) - { - prepareGeometryChange(); - m_P1 = line.p1(); - m_P2 = line.p2(); - } + if (Q_UNLIKELY(m_shapeType != Line)) return false; + prepareGeometryChange(); + m_P1 = line.p1(); + m_P2 = line.p2(); + return true; } /** @@ -138,8 +133,7 @@ bool QetShapeItem::setPolygon(const QPolygonF &polygon) * @brief QetShapeItem::pointCount * @return the number of point in the polygon */ -int QetShapeItem::pointsCount() const -{ +int QetShapeItem::pointsCount() const { return m_polygon.size(); } @@ -148,10 +142,10 @@ int QetShapeItem::pointsCount() const * Add a new point to the curent polygon * @param P the new point. */ -void QetShapeItem::setNextPoint(QPointF P) { +void QetShapeItem::setNextPoint(QPointF P) +{ prepareGeometryChange(); m_polygon.append(Diagram::snapToGrid(P)); - setTransformOriginPoint(boundingRect().center()); } /** @@ -295,10 +289,8 @@ void QetShapeItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *opti * @param event */ void QetShapeItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event) { - Q_UNUSED(event); - m_hovered = true; - update(); + QetGraphicsItem::hoverEnterEvent(event); } /** @@ -307,10 +299,8 @@ void QetShapeItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event) { * @param event */ void QetShapeItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) { - Q_UNUSED(event); - m_hovered = false; - update(); + QetGraphicsItem::hoverLeaveEvent(event); } /** @@ -337,14 +327,9 @@ void QetShapeItem::mousePressEvent(QGraphicsSceneMouseEvent *event) { //User click on an handler m_mouse_grab_handler = true; - - switch (m_shapeType) - { - case Line: m_undo_command = new QetShapeGeometryCommand(this, QLineF(m_P1, m_P2)); break; - case Rectangle: m_undo_command = new QetShapeGeometryCommand(this, QRectF(m_P1, m_P2)); break; - case Ellipse: m_undo_command = new QetShapeGeometryCommand(this, QRectF(m_P1, m_P2)); break; - case Polyline: m_undo_command = new QetShapeGeometryCommand(this, m_polygon); break; - } + m_old_P1 = m_P1; + m_old_P2 = m_P2; + m_old_polygon = m_polygon; return; } } @@ -367,26 +352,19 @@ void QetShapeItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) switch (m_shapeType) { - case Line: { + case Line: prepareGeometryChange(); m_vector_index == 0 ? m_P1 = new_pos : m_P2 = new_pos; - } break; - case Rectangle: - setRect(m_handler.rectForPosAtIndex(QRectF(m_P1, m_P2), new_pos, m_vector_index)); + case Rectangle: setRect(m_handler.rectForPosAtIndex(QRectF(m_P1, m_P2), new_pos, m_vector_index)); break; + case Ellipse: setRect(m_handler.rectForPosAtIndex(QRectF(m_P1, m_P2), new_pos, m_vector_index)); break; - case Ellipse: - setRect(m_handler.rectForPosAtIndex(QRectF(m_P1, m_P2), new_pos, m_vector_index)); - break; - - case Polyline: { + case Polyline: prepareGeometryChange(); m_polygon.replace(m_vector_index, new_pos); - } break; } //End switch - return; } @@ -403,21 +381,29 @@ void QetShapeItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) if (m_mouse_grab_handler) { m_mouse_grab_handler = false; - switch(m_shapeType) - { - case Line: m_undo_command->setNewLine(QLineF(m_P1, m_P2)); break; - case Rectangle: m_undo_command->setNewRect(QRectF(m_P1, m_P2)); break; - case Ellipse: m_undo_command->setNewRect(QRectF(m_P1, m_P2)); break; - case Polyline : m_undo_command->setNewPolygon(m_polygon); break; - } - if (diagram()) { - diagram()->undoStack().push(m_undo_command); - m_undo_command = nullptr; + QPropertyUndoCommand *undo = nullptr; + if ((m_shapeType & (Line | Rectangle | Ellipse)) && (m_P1 != m_old_P1 || m_P2 != m_old_P2)) + { + switch(m_shapeType) + { + case Line: undo = new QPropertyUndoCommand(this, "line",QLineF(m_old_P1, m_old_P2), QLineF(m_P1, m_P2)); break; + case Rectangle: undo = new QPropertyUndoCommand(this, "rect",QRectF(m_old_P1, m_old_P2), QRectF(m_P1, m_P2)); break; + case Ellipse: undo = new QPropertyUndoCommand(this, "rect",QRectF(m_old_P1, m_old_P2), QRectF(m_P1, m_P2)); break; + case Polyline: break; + } + if (undo) undo->enableAnimation(); + } + else if (m_shapeType == Polyline && (m_polygon != m_old_polygon)) + undo = new QPropertyUndoCommand(this, "polygon", m_old_polygon, m_polygon); + + if(undo) + { + undo->setText(tr("Modifier %1").arg(name())); + diagram()->undoStack().push(undo); + } } - else - delete m_undo_command; } QetGraphicsItem::mouseReleaseEvent(event); @@ -496,23 +482,14 @@ QDomElement QetShapeItem::toXml(QDomDocument &document) const * @param filepath file path of the the dxf document * @return true if draw success */ -bool QetShapeItem::toDXF(const QString &filepath) { - switch (m_shapeType) { - case Line: - Createdxf::drawLine(filepath, QLineF(mapToScene(m_P1), mapToScene(m_P2)), 0); - return true; - break; - case Rectangle: - Createdxf::drawRectangle(filepath, QRectF(mapToScene(m_P1), mapToScene(m_P2)).normalized(), 0); - return true; - break; - case Ellipse: - Createdxf::drawEllipse(filepath, QRectF(mapToScene(m_P1), mapToScene(m_P2)).normalized(), 0); - return true; - break; - default: - return false; - break; +bool QetShapeItem::toDXF(const QString &filepath) +{ + switch (m_shapeType) + { + case Line: Createdxf::drawLine (filepath, QLineF(mapToScene(m_P1), mapToScene(m_P2)), 0); return true; + case Rectangle: Createdxf::drawRectangle(filepath, QRectF(mapToScene(m_P1), mapToScene(m_P2)).normalized(), 0); return true; + case Ellipse: Createdxf::drawEllipse (filepath, QRectF(mapToScene(m_P1), mapToScene(m_P2)).normalized(), 0); return true; + default: return false; } } @@ -532,14 +509,12 @@ void QetShapeItem::editProperty() * @brief QetShapeItem::name * @return the name of the curent shape. */ -QString QetShapeItem::name() const -{ - switch (m_shapeType) - { - case Line: return tr("une ligne"); break; - case Rectangle: return tr("un rectangle"); break; - case Ellipse: return tr("une éllipse"); break; - case Polyline: return tr("une polyligne"); break; - default: return tr("une shape"); break; +QString QetShapeItem::name() const { + switch (m_shapeType) { + case Line: return tr("une ligne"); + case Rectangle: return tr("un rectangle"); + case Ellipse: return tr("une éllipse"); + case Polyline: return tr("une polyligne"); + default: return tr("une shape"); } } diff --git a/sources/qetgraphicsitem/qetshapeitem.h b/sources/qetgraphicsitem/qetshapeitem.h index 1fd32cd2c..57416e4c3 100644 --- a/sources/qetgraphicsitem/qetshapeitem.h +++ b/sources/qetgraphicsitem/qetshapeitem.h @@ -23,7 +23,6 @@ class QDomElement; class QDomDocument; -class QetShapeGeometryCommand; /** * @brief The QetShapeItem class @@ -34,15 +33,19 @@ class QetShapeItem : public QetGraphicsItem { Q_OBJECT + Q_PROPERTY(QRectF rect READ rect WRITE setRect) + Q_PROPERTY(QLineF line READ line WRITE setLine) + Q_PROPERTY(QPolygonF polygon READ polygon WRITE setPolygon) + signals: void styleChanged(); public: Q_ENUMS(ShapeType) - enum ShapeType {Line =0, - Rectangle =1, - Ellipse =2, - Polyline =3 }; + enum ShapeType {Line =1, + Rectangle =2, + Ellipse =4, + Polyline =8 }; enum { Type = UserType + 1008 }; @@ -65,8 +68,11 @@ class QetShapeItem : public QetGraphicsItem virtual QString name() const; void setP2 (const QPointF &P2); - void setLine (const QLineF &line); + QLineF line() const{return QLineF(m_P1, m_P2);} + bool setLine (const QLineF &line); + QRectF rect() const{return QRectF(m_P1, m_P2);} bool setRect (const QRectF &rect); + QPolygonF polygon() const {return m_polygon;} bool setPolygon (const QPolygonF &polygon); //Methods available for polygon shape @@ -89,12 +95,11 @@ class QetShapeItem : public QetGraphicsItem private: ShapeType m_shapeType; Qt::PenStyle m_shapeStyle; - QPointF m_P1, m_P2; - QPolygonF m_polygon; + QPointF m_P1, m_P2, m_old_P1, m_old_P2; + QPolygonF m_polygon, m_old_polygon; bool m_hovered, m_mouse_grab_handler; int m_vector_index; - QetShapeGeometryCommand *m_undo_command; QetGraphicsHandlerUtility m_handler; }; #endif // QETSHAPEITEM_H diff --git a/sources/undocommand/qetshapegeometrycommand.cpp b/sources/undocommand/qetshapegeometrycommand.cpp deleted file mode 100644 index 076fdc8e4..000000000 --- a/sources/undocommand/qetshapegeometrycommand.cpp +++ /dev/null @@ -1,122 +0,0 @@ -/* - Copyright 2006-2015 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 "qetshapegeometrycommand.h" -#include "qetshapeitem.h" -#include - -/** - * @brief QetShapeGeometryCommand::QetShapeGeometryCommand - * Constructor for a line shape - * @param item : item to change the geometry - * @param old_line : old line - * @param parent : parent undo command - */ -QetShapeGeometryCommand::QetShapeGeometryCommand(QetShapeItem *item, const QLineF &old_line, QUndoCommand *parent) : - QUndoCommand(parent), - m_shape_item(item), - m_old_line(old_line) -{ - setText(QObject::tr("Modifier la géometrie de : %1").arg(m_shape_item->name())); -} - -/** - * @brief QetShapeGeometryCommand::QetShapeGeometryCommand - * Constructor for a rectangle or ellipse shape - * @param item : item to change the geometry - * @param old_rect : old rectangle - * @param parent : parent undo command - */ -QetShapeGeometryCommand::QetShapeGeometryCommand(QetShapeItem *item, const QRectF &old_rect, QUndoCommand *parent): - QUndoCommand(parent), - m_shape_item(item), - m_old_rect(old_rect) -{ - setText(QObject::tr("Modifier la géometrie de : %1").arg(m_shape_item->name())); -} - -/** - * @brief QetShapeGeometryCommand::QetShapeGeometryCommand - * Constructor for polygon shape - * @param item : item to change the geometry - * @param old_polygon : old polygon - * @param parent : parent undo command - */ -QetShapeGeometryCommand::QetShapeGeometryCommand(QetShapeItem *item, const QPolygonF &old_polygon, QUndoCommand *parent): - QUndoCommand(parent), - m_shape_item(item), - m_old_polygon(old_polygon) -{ - setText(QObject::tr("Modifier la géometrie de : %1").arg(m_shape_item->name())); -} - -/** - * @brief QetShapeGeometryCommand::mergeWith - * Try to merge this undo command with @other - * @param other - * @return true if the two command was merged - */ -bool QetShapeGeometryCommand::mergeWith(const QUndoCommand *other) -{ - if (other->id() != id() || other->childCount()) return false; - const QetShapeGeometryCommand *other_undo = static_cast(other); - if (other_undo->m_shape_item != m_shape_item) return false; - - switch (m_shape_item->shapeType()) - { - case QetShapeItem::Line: m_new_line = other_undo->m_new_line; break; - case QetShapeItem::Rectangle: m_new_rect = other_undo->m_new_rect; break; - case QetShapeItem::Ellipse: m_new_rect = other_undo->m_new_rect; break; - case QetShapeItem::Polyline: m_new_polygon = other_undo->m_new_polygon; break; - } - - return true; -} - -/** - * @brief QetShapeGeometryCommand::redo - * Redo this command - */ -void QetShapeGeometryCommand::redo() -{ - switch (m_shape_item->shapeType()) - { - case QetShapeItem::Line: m_shape_item->setLine(m_new_line); break; - case QetShapeItem::Rectangle: m_shape_item->setRect(m_new_rect); break; - case QetShapeItem::Ellipse: m_shape_item->setRect(m_new_rect); break; - case QetShapeItem::Polyline: m_shape_item->setPolygon(m_new_polygon); break; - } - - QUndoCommand::redo(); -} - -/** - * @brief QetShapeGeometryCommand::undo - * Undo this command - */ -void QetShapeGeometryCommand::undo() -{ - switch (m_shape_item->shapeType()) - { - case QetShapeItem::Line: m_shape_item->setLine(m_old_line); break; - case QetShapeItem::Rectangle: m_shape_item->setRect(m_old_rect); break; - case QetShapeItem::Ellipse: m_shape_item->setRect(m_old_rect); break; - case QetShapeItem::Polyline: m_shape_item->setPolygon(m_old_polygon); break; - } - - QUndoCommand::undo(); -} diff --git a/sources/undocommand/qetshapegeometrycommand.h b/sources/undocommand/qetshapegeometrycommand.h deleted file mode 100644 index 8ffb07542..000000000 --- a/sources/undocommand/qetshapegeometrycommand.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - Copyright 2006-2015 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 . -*/ -#ifndef QETSHAPEGEOMETRYCOMMAND_H -#define QETSHAPEGEOMETRYCOMMAND_H - -#include -#include -#include -#include -class QetShapeItem; - -/** - * @brief The QetShapeGeometryCommand class - * This undo command class manage the geometry change of a QetShapeItem. - */ -class QetShapeGeometryCommand : public QUndoCommand -{ - public: - QetShapeGeometryCommand(QetShapeItem *item, const QLineF &old_line, QUndoCommand *parent = nullptr); - QetShapeGeometryCommand(QetShapeItem *item, const QRectF &old_rect, QUndoCommand *parent = nullptr); - QetShapeGeometryCommand(QetShapeItem *item, const QPolygonF &old_polygon, QUndoCommand *parent = nullptr); - - void setNewLine (const QLineF &new_line) {m_new_line = new_line;} - void setNewRect (const QRectF &new_rect) {m_new_rect = new_rect;} - void setNewPolygon (const QPolygonF &new_polygon) {m_new_polygon = new_polygon;} - - int id() const {return 5;} - bool mergeWith(const QUndoCommand *other); - void redo(); - void undo(); - - private: - QetShapeItem *m_shape_item; - QLineF m_old_line, m_new_line; - QPolygonF m_old_polygon, m_new_polygon; - QRectF m_old_rect, m_new_rect; -}; - -#endif // QETSHAPEGEOMETRYCOMMAND_H