diff --git a/sources/editor/editorcommands.cpp b/sources/editor/editorcommands.cpp index 6e6d8722e..e9f65638e 100644 --- a/sources/editor/editorcommands.cpp +++ b/sources/editor/editorcommands.cpp @@ -17,6 +17,63 @@ */ #include "editorcommands.h" +/** + Constructs an ElementEditionCommand, thus embedding the provided \a scene and \a view. + @param parent Parent command +*/ +ElementEditionCommand::ElementEditionCommand(ElementScene *scene, ElementView *view, QUndoCommand *parent): + QUndoCommand(parent), + editor_scene_(scene), + editor_view_(view) +{ +} + +/** + Constructs an ElementEditionCommand, thus embedding the provided \a scene and \a view. + @param text Text describing the effect of the command + @param parent Parent command +*/ +ElementEditionCommand::ElementEditionCommand(const QString &text, ElementScene *scene, ElementView *view, QUndoCommand *parent): + QUndoCommand(text, parent), + editor_scene_(scene), + editor_view_(view) +{ +} + +/** + Destructor +*/ +ElementEditionCommand::~ElementEditionCommand() { +} + +/** + @return the element editor/scene the command should take place on +*/ +ElementScene *ElementEditionCommand::elementScene() const { + return(editor_scene_); +} + +/** + Define \a scene as the element editor/scene the command should take place +*/ +void ElementEditionCommand::setElementScene(ElementScene *scene) { + editor_scene_ = scene; +} + +/** + @return the view the effect of the command should be rendered on +*/ +ElementView *ElementEditionCommand::elementView() const { + return(editor_view_); +} + +/** + Define \a view as the view the effect of the command should be rendered on +*/ +void ElementEditionCommand::setElementView(ElementView *view) { + editor_view_ = view; +} + /*** DeletePartsCommand ***/ /** Constructeur @@ -29,38 +86,37 @@ DeletePartsCommand::DeletePartsCommand( const QList parts, QUndoCommand *parent ) : - QUndoCommand(QObject::tr("suppression", "undo caption"), parent), - deleted_parts(parts), - editor_scene(scene) + ElementEditionCommand(QObject::tr("suppression", "undo caption"), scene, 0, parent), + deleted_parts(parts) { foreach(QGraphicsItem *qgi, deleted_parts) { - editor_scene -> qgiManager().manage(qgi); + editor_scene_ -> qgiManager().manage(qgi); } } /// Destructeur : detruit egalement les parties supprimees DeletePartsCommand::~DeletePartsCommand() { foreach(QGraphicsItem *qgi, deleted_parts) { - editor_scene -> qgiManager().release(qgi); + editor_scene_ -> qgiManager().release(qgi); } } /// Restaure les parties supprimees void DeletePartsCommand::undo() { - editor_scene -> blockSignals(true); + editor_scene_ -> blockSignals(true); foreach(QGraphicsItem *qgi, deleted_parts) { - editor_scene -> addItem(qgi); + editor_scene_ -> addItem(qgi); } - editor_scene -> blockSignals(false); + editor_scene_ -> blockSignals(false); } /// Supprime les parties void DeletePartsCommand::redo() { - editor_scene -> blockSignals(true); + editor_scene_ -> blockSignals(true); foreach(QGraphicsItem *qgi, deleted_parts) { - editor_scene -> removeItem(qgi); + editor_scene_ -> removeItem(qgi); } - editor_scene -> blockSignals(false); + editor_scene_ -> blockSignals(false); } /*** CutPartsCommand ***/ @@ -75,10 +131,8 @@ PastePartsCommand::PastePartsCommand( const ElementContent &c, QUndoCommand *parent ) : - QUndoCommand(parent), + ElementEditionCommand(view ? view -> scene() : 0, view, parent), content_(c), - editor_view_(view), - editor_scene_(view -> scene()), uses_offset(false), first_redo(true) { @@ -173,12 +227,11 @@ MovePartsCommand::MovePartsCommand( const QList parts, QUndoCommand *parent ) : - QUndoCommand(QObject::tr("d\351placement", "undo caption"), parent), + ElementEditionCommand(QObject::tr("d\351placement", "undo caption"), scene, 0, parent), movement(m), first_redo(true) { moved_parts = parts; - editor_scene = scene; } /// Destructeur @@ -214,22 +267,21 @@ AddPartCommand::AddPartCommand( QGraphicsItem *p, QUndoCommand *parent ) : - QUndoCommand(QString(QObject::tr("ajout %1", "undo caption")).arg(name), parent), + ElementEditionCommand(QString(QObject::tr("ajout %1", "undo caption")).arg(name), scene, 0, parent), part(p), - editor_scene(scene), first_redo(true) { - editor_scene -> qgiManager().manage(part); + editor_scene_ -> qgiManager().manage(part); } /// Destructeur AddPartCommand::~AddPartCommand() { - editor_scene -> qgiManager().release(part); + editor_scene_ -> qgiManager().release(part); } /// Annule l'ajout void AddPartCommand::undo() { - editor_scene -> removeItem(part); + editor_scene_ -> removeItem(part); } /// Refait l'ajout @@ -239,16 +291,16 @@ void AddPartCommand::redo() { if (!part -> zValue()) { // the added part has no specific zValue already defined, we put it // above existing items (but still under terminals) - QList existing_items = editor_scene -> zItems(); + QList existing_items = editor_scene_ -> zItems(); qreal z = existing_items.count() ? existing_items.last() -> zValue() + 1 : 1; part -> setZValue(z); } - editor_scene -> clearSelection(); + editor_scene_ -> clearSelection(); part -> setSelected(true); first_redo = false; return; } - editor_scene -> addItem(part); + editor_scene_ -> addItem(part); } /** @@ -268,7 +320,7 @@ ChangePartCommand::ChangePartCommand( const QVariant &new_v, QUndoCommand *parent ) : - QUndoCommand(QString(QObject::tr("modification %1", "undo caption")).arg(name), parent), + ElementEditionCommand(QString(QObject::tr("modification %1", "undo caption")).arg(name), 0, 0, parent), cep(part), property(prop), old_value(old_v), @@ -303,7 +355,7 @@ ChangePolygonPointsCommand::ChangePolygonPointsCommand( const QVector &n_points, QUndoCommand *parent ) : - QUndoCommand(QObject::tr("modification points polygone", "undo caption"), parent), + ElementEditionCommand(QObject::tr("modification points polygone", "undo caption"), 0, 0, parent), polygon(p), old_points(o_points), new_points(n_points) @@ -343,8 +395,7 @@ ChangeHotspotCommand::ChangeHotspotCommand( const QPoint &o, QUndoCommand *parent ) : - QUndoCommand(QObject::tr("modification dimensions/hotspot", "undo caption"), parent), - element(element_scene), + ElementEditionCommand(QObject::tr("modification dimensions/hotspot", "undo caption"), element_scene, 0, parent), size_before(size_1), size_after(size_2), hotspot_before(hotspot_1), @@ -359,26 +410,26 @@ ChangeHotspotCommand::~ChangeHotspotCommand() { /// Annule le changement void ChangeHotspotCommand::undo() { - QRectF sc(element -> sceneContent()); + QRectF sc(editor_scene_ -> sceneContent()); - element -> setWidth(size_before.width()); - element -> setHeight(size_before.height()); - element -> setHotspot(hotspot_before); + editor_scene_ -> setWidth(size_before.width()); + editor_scene_ -> setHeight(size_before.height()); + editor_scene_ -> setHotspot(hotspot_before); if (!offset.isNull()) applyOffset(-offset); - element -> update(element -> sceneContent().unite(sc)); + editor_scene_ -> update(editor_scene_ -> sceneContent().unite(sc)); } /// Refait le changement void ChangeHotspotCommand::redo() { - QRectF sc(element -> sceneContent()); + QRectF sc(editor_scene_ -> sceneContent()); - element -> setWidth(size_after.width()); - element -> setHeight(size_after.height()); - element -> setHotspot(hotspot_after); + editor_scene_ -> setWidth(size_after.width()); + editor_scene_ -> setHeight(size_after.height()); + editor_scene_ -> setHotspot(hotspot_after); if (!offset.isNull()) applyOffset(offset); - element -> update(element -> sceneContent().unite(sc)); + editor_scene_ -> update(editor_scene_ -> sceneContent().unite(sc)); } /** @@ -386,7 +437,7 @@ void ChangeHotspotCommand::redo() { @param o Translation a appliquer */ void ChangeHotspotCommand::applyOffset(const QPointF &o) { - foreach(QGraphicsItem *qgi, element -> items()) { + foreach(QGraphicsItem *qgi, editor_scene_ -> items()) { qgi -> translate(o.x(), o.y()); } } @@ -404,10 +455,9 @@ ChangeNamesCommand::ChangeNamesCommand( const NamesList &after, QUndoCommand *parent ) : - QUndoCommand(QObject::tr("modification noms", "undo caption"), parent), + ElementEditionCommand(QObject::tr("modification noms", "undo caption"), element_scene, 0, parent), names_before(before), - names_after(after), - element(element_scene) + names_after(after) { } @@ -417,12 +467,12 @@ ChangeNamesCommand::~ChangeNamesCommand() { /// Annule le changement void ChangeNamesCommand::undo() { - element -> setNames(names_before); + editor_scene_ -> setNames(names_before); } /// Refait le changement void ChangeNamesCommand::redo() { - element -> setNames(names_after); + editor_scene_ -> setNames(names_after); } /** @@ -438,10 +488,9 @@ ChangeOrientationsCommand::ChangeOrientationsCommand( const OrientationSet &after, QUndoCommand *parent ) : - QUndoCommand(QObject::tr("modification orientations", "undo caption"), parent), + ElementEditionCommand(QObject::tr("modification orientations", "undo caption"), element_scene, 0, parent), ori_before(before), - ori_after(after), - element(element_scene) + ori_after(after) { } @@ -451,12 +500,12 @@ ChangeOrientationsCommand::~ChangeOrientationsCommand() { /// Annule le changement void ChangeOrientationsCommand::undo() { - element -> setOrientations(ori_before); + editor_scene_ -> setOrientations(ori_before); } /// Refait le changement void ChangeOrientationsCommand::redo() { - element -> setOrientations(ori_after); + editor_scene_ -> setOrientations(ori_after); } /** @@ -470,12 +519,11 @@ ChangeZValueCommand::ChangeZValueCommand( ChangeZValueCommand::Option o, QUndoCommand *parent ) : - QUndoCommand(parent), - element(elmt), + ElementEditionCommand(elmt, 0, parent), option(o) { // recupere les parties de l'elements, sauf les bornes - QList items_list = element -> zItems(); + QList items_list = editor_scene_ -> zItems(); // prend un snapshot des zValues foreach(QGraphicsItem *qgi, items_list) undo_hash.insert(qgi, qgi -> zValue()); @@ -590,8 +638,7 @@ void ChangeZValueCommand::applySendBackward(const QList &items_ @param parent QUndoCommand parent */ AllowInternalConnectionsCommand::AllowInternalConnectionsCommand(ElementScene *elmt, bool allow, QUndoCommand *parent) : - QUndoCommand(QObject::tr("modification connexions internes", "undo caption"), parent), - element(elmt), + ElementEditionCommand(QObject::tr("modification connexions internes", "undo caption"), elmt, 0, parent), ic(allow) { } @@ -602,12 +649,12 @@ AllowInternalConnectionsCommand::~AllowInternalConnectionsCommand() { /// Annule le changement d'autorisation pour les connexions internes void AllowInternalConnectionsCommand::undo() { - element -> setInternalConnections(!ic); + editor_scene_ -> setInternalConnections(!ic); } /// Refait le changement d'autorisation pour les connexions internes void AllowInternalConnectionsCommand::redo() { - element -> setInternalConnections(ic); + editor_scene_ -> setInternalConnections(ic); } /** @@ -618,8 +665,7 @@ void AllowInternalConnectionsCommand::redo() { @param parent QUndoCommand parent */ ChangeInformationsCommand::ChangeInformationsCommand(ElementScene *elmt, const QString &old_infos, const QString &new_infos, QUndoCommand *parent) : - QUndoCommand(QObject::tr("modification informations complementaires", "undo caption"), parent), - element(elmt), + ElementEditionCommand(QObject::tr("modification informations complementaires", "undo caption"), elmt, 0, parent), old_informations_(old_infos), new_informations_(new_infos) { @@ -631,10 +677,10 @@ ChangeInformationsCommand::~ChangeInformationsCommand() { /// Annule le changement d'autorisation pour les connexions internes void ChangeInformationsCommand::undo() { - element -> setInformations(old_informations_); + editor_scene_ -> setInformations(old_informations_); } /// Refait le changement d'autorisation pour les connexions internes void ChangeInformationsCommand::redo() { - element -> setInformations(new_informations_); + editor_scene_ -> setInformations(new_informations_); } diff --git a/sources/editor/editorcommands.h b/sources/editor/editorcommands.h index c54b7497f..35582b21b 100644 --- a/sources/editor/editorcommands.h +++ b/sources/editor/editorcommands.h @@ -24,11 +24,40 @@ #include "elementcontent.h" #include "qgimanager.h" #include + +/** + ElementEditionCommand is the base class for all commands classes involved in + the edition of an electrical element. It provides commonly required methods + and attributes, such as accessors to the modified scene and view. +*/ +class ElementEditionCommand : public QUndoCommand { + // constructors, destructor + public: + ElementEditionCommand(ElementScene * = 0, ElementView * = 0, QUndoCommand * = 0); + ElementEditionCommand(const QString &, ElementScene * = 0, ElementView * = 0, QUndoCommand * = 0); + virtual ~ElementEditionCommand(); + private: + ElementEditionCommand(const ElementEditionCommand &); + + // methods + public: + ElementScene *elementScene() const; + void setElementScene(ElementScene *); + ElementView *elementView() const; + void setElementView(ElementView *); + + // attributes + protected: + /// Element editor/view/scene the command should take place on + ElementScene *editor_scene_; + ElementView *editor_view_; +}; + /** This command deletes one or several primitives/parts when editing an electrical element. */ -class DeletePartsCommand : public QUndoCommand { +class DeletePartsCommand : public ElementEditionCommand { // constructors, destructor public: DeletePartsCommand(ElementScene *, const QList, QUndoCommand * = 0); @@ -45,14 +74,12 @@ class DeletePartsCommand : public QUndoCommand { private: /// Deleted primitives QList deleted_parts; - /// Element editor/view/scene the command should take place on - ElementScene *editor_scene; }; /** This command pastes primitives when editing an electrical element. */ -class PastePartsCommand : public QUndoCommand { +class PastePartsCommand : public ElementEditionCommand { // constructors, destructor public: PastePartsCommand(ElementView *, const ElementContent &, QUndoCommand * = 0); @@ -70,9 +97,6 @@ class PastePartsCommand : public QUndoCommand { private: /// Pasted content ElementContent content_; - /// Element editor/view/scene the command should take place on - ElementView *editor_view_; - ElementScene *editor_scene_; /// Data required to undo a copy/paste with offset int old_offset_paste_count_; QPointF old_start_top_left_corner_; @@ -98,7 +122,7 @@ class CutPartsCommand : public DeletePartsCommand { /** This command moves primitives when editing an electrical element. */ -class MovePartsCommand : public QUndoCommand { +class MovePartsCommand : public ElementEditionCommand { // constructors, destructor public: MovePartsCommand(const QPointF &, ElementScene *, const QList, QUndoCommand * = 0); @@ -115,8 +139,6 @@ class MovePartsCommand : public QUndoCommand { private: /// List of moved primitives QList moved_parts; - /// Element editor/view/scene the command should take place on - ElementScene *editor_scene; /// applied movement QPointF movement; /// Prevent the first call to redo() @@ -126,7 +148,7 @@ class MovePartsCommand : public QUndoCommand { /** This command adds a primitive when editing an electrical element. */ -class AddPartCommand : public QUndoCommand { +class AddPartCommand : public ElementEditionCommand { // constructors, destructor public: AddPartCommand(const QString &, ElementScene *, QGraphicsItem *, QUndoCommand * = 0); @@ -143,8 +165,6 @@ class AddPartCommand : public QUndoCommand { private: /// Added primitive QGraphicsItem *part; - /// Element editor/view/scene the command should take place on - ElementScene *editor_scene; /// Prevent the first call to redo() bool first_redo; }; @@ -153,7 +173,7 @@ class AddPartCommand : public QUndoCommand { This command changes a property of a primitive when editing an electrical element. */ -class ChangePartCommand : public QUndoCommand { +class ChangePartCommand : public ElementEditionCommand { // constructors, destructor public: ChangePartCommand(const QString &, CustomElementPart *, const QString &, const QVariant &, const QVariant &, QUndoCommand * = 0); @@ -182,7 +202,7 @@ class ChangePartCommand : public QUndoCommand { This command changes the points of a polygon when editing an electrical element. */ -class ChangePolygonPointsCommand : public QUndoCommand { +class ChangePolygonPointsCommand : public ElementEditionCommand { // constructors, destructor public: ChangePolygonPointsCommand(PartPolygon *, const QVector &, const QVector &, QUndoCommand * = 0); @@ -208,7 +228,7 @@ class ChangePolygonPointsCommand : public QUndoCommand { This command changes the dimensions and/or the hotspot of an electrical element. */ -class ChangeHotspotCommand : public QUndoCommand { +class ChangeHotspotCommand : public ElementEditionCommand { // constructors, destructor public: ChangeHotspotCommand(ElementScene *, const QSize &, const QSize &, const QPoint &, const QPoint &, const QPoint & = QPoint(), QUndoCommand * = 0); @@ -225,8 +245,6 @@ class ChangeHotspotCommand : public QUndoCommand { void applyOffset(const QPointF &); // attributes - /// Element editor/view/scene the command should take place on - ElementScene *element; /// Former dimensions QSize size_before; /// new dimensions @@ -242,7 +260,7 @@ class ChangeHotspotCommand : public QUndoCommand { /** This command changes the translated names of an electrical element. */ -class ChangeNamesCommand : public QUndoCommand { +class ChangeNamesCommand : public ElementEditionCommand { // constructors, destructor public: ChangeNamesCommand(ElementScene *, const NamesList &, const NamesList &, QUndoCommand * = 0); @@ -261,14 +279,12 @@ class ChangeNamesCommand : public QUndoCommand { NamesList names_before; /// List of new names NamesList names_after; - /// Element editor/view/scene the command should take place on - ElementScene *element; }; /** This command changes the allowed orientations of an electrical element. */ -class ChangeOrientationsCommand : public QUndoCommand { +class ChangeOrientationsCommand : public ElementEditionCommand { // constructors, destructor public: ChangeOrientationsCommand(ElementScene *, const OrientationSet &, const OrientationSet &, QUndoCommand * = 0); @@ -287,15 +303,13 @@ class ChangeOrientationsCommand : public QUndoCommand { OrientationSet ori_before; /// New orientations OrientationSet ori_after; - /// Element editor/view/scene the command should take place on - ElementScene *element; }; /** This command changes the zValue of a set of primitives when editing an electrical element. */ -class ChangeZValueCommand : public QUndoCommand { +class ChangeZValueCommand : public ElementEditionCommand { // constructors, destructor public: /// List the various kind of changes for the zValue @@ -327,8 +341,6 @@ class ChangeZValueCommand : public QUndoCommand { QHash undo_hash; /// associates impacted primitives with their new zValues QHash redo_hash; - /// Element editor/view/scene the command should take place on - ElementScene *element; /// kind of treatment to apply Option option; }; @@ -337,7 +349,7 @@ class ChangeZValueCommand : public QUndoCommand { This command enables or disables internal connections for an electrical element. */ -class AllowInternalConnectionsCommand : public QUndoCommand { +class AllowInternalConnectionsCommand : public ElementEditionCommand { // constructors, destructor public: AllowInternalConnectionsCommand(ElementScene *, bool, QUndoCommand * = 0); @@ -352,8 +364,6 @@ class AllowInternalConnectionsCommand : public QUndoCommand { // attributes private: - /// Element editor/view/scene the command should take place on - ElementScene *element; /// whether internal connections are allowed afterward bool ic; }; @@ -361,7 +371,7 @@ class AllowInternalConnectionsCommand : public QUndoCommand { /** This command changes extra information carried by an electrical element. */ -class ChangeInformationsCommand : public QUndoCommand { +class ChangeInformationsCommand : public ElementEditionCommand { // constructors, destructor public: ChangeInformationsCommand(ElementScene *, const QString &, const QString &, QUndoCommand * = 0); @@ -376,8 +386,6 @@ class ChangeInformationsCommand : public QUndoCommand { // attributes private: - /// Element editor/view/scene the command should take place on - ElementScene *element; /// Former information QString old_informations_; /// New information