diff --git a/diagram.cpp b/diagram.cpp index 1a543268d..d2b305bcb 100644 --- a/diagram.cpp +++ b/diagram.cpp @@ -5,6 +5,7 @@ #include "diagram.h" #include "exportdialog.h" #include "diagramcommands.h" +#include "diagramcontent.h" const int Diagram::xGrid = 10; const int Diagram::yGrid = 10; @@ -113,16 +114,7 @@ void Diagram::keyReleaseEvent(QKeyEvent *e) { !current_movement.isNull() && !e -> isAutoRepeat() ) { // cree un objet d'annulation pour le mouvement qui vient de se finir - undoStack().push( - new MoveElementsCommand( - this, - elementsToMove(), - conductorsToMove(), - conductorsToUpdate(), - textsToMove(), - current_movement - ) - ); + undoStack().push(new MoveElementsCommand(this, selectedContent(), current_movement)); invalidateMovedElements(); current_movement = QPointF(); } @@ -300,14 +292,11 @@ QDomDocument Diagram::toXml(bool diagram) { @param position La position du diagram importe @param consider_informations Si vrai, les informations complementaires (auteur, titre, ...) seront prises en compte - @param added_elements si ce pointeur vers une liste d'elements n'est pas - NULL, il sera rempli avec les elements ajoutes au schema par le fromXml - @param added_conductors si ce pointeur vers une liste de conducteurs n'est - pas NULL, il sera rempli avec les conducteurs ajoutes au schema par le - fromXml + @param content_ptr si ce pointeur vers un DiagramContentn'est pas NULL, il + sera rempli avec le contenu ajoute au schema par le fromXml @return true si l'import a reussi, false sinon */ -bool Diagram::fromXml(QDomDocument &document, QPointF position, bool consider_informations, QList *added_elements_ptr, QList *added_conductors_ptr, QList *added_texts_ptr) { +bool Diagram::fromXml(QDomDocument &document, QPointF position, bool consider_informations, DiagramContent *content_ptr) { QDomElement root = document.documentElement(); // le premier element doit etre un schema if (root.tagName() != "diagram") return(false); @@ -457,9 +446,11 @@ bool Diagram::fromXml(QDomDocument &document, QPointF position, bool consider_in } // remplissage des listes facultatives - if (added_elements_ptr != NULL) *added_elements_ptr = added_elements; - if (added_conductors_ptr != NULL) *added_conductors_ptr = added_conductors; - if (added_texts_ptr != NULL) *added_texts_ptr = added_texts; + if (content_ptr != NULL) { + content_ptr -> elements = added_elements; + content_ptr -> conductorsToMove = added_conductors; + content_ptr -> textFields = added_texts; + } return(true); } @@ -604,3 +595,33 @@ bool Diagram::clipboardMayContainDiagram() { bool may_be_diagram = clipboard_text.startsWith(""); return(may_be_diagram); } + +/** + @return Le contenu du schema. Les conducteurs sont tous places dans + conductorsToMove. +*/ +DiagramContent Diagram::content() const { + DiagramContent dc; + foreach(QGraphicsItem *qgi, items()) { + if (Element *e = qgraphicsitem_cast(qgi)) { + dc.elements << e; + } else if (DiagramTextItem *dti = qgraphicsitem_cast(qgi)) { + dc.textFields << dti; + } else if (Conductor *c = qgraphicsitem_cast(qgi)) { + dc.conductorsToMove << c; + } + } + return(dc); +} + +/** + @return le contenu selectionne du schema. +*/ +DiagramContent Diagram::selectedContent() { + DiagramContent dc; + dc.elements = elementsToMove().toList(); + dc.textFields = textsToMove().toList(); + dc.conductorsToMove = conductorsToMove().toList(); + dc.conductorsToUpdate = conductorsToUpdate(); + return(dc); +} diff --git a/diagram.h b/diagram.h index e041ccdfd..64f75d3db 100644 --- a/diagram.h +++ b/diagram.h @@ -10,6 +10,7 @@ class Element; class Terminal; class Conductor; class DiagramTextItem; +class DiagramContent; /** Cette classe represente un schema electrique. Elle gere les differents elements et conducteurs qui le composent @@ -77,7 +78,7 @@ class Diagram : public QGraphicsScene { // fonctions relatives a l'import / export XML QDomDocument toXml(bool = true); - bool fromXml(QDomDocument &, QPointF = QPointF(), bool = true, QList * = NULL, QList * = NULL, QList * = NULL); + bool fromXml(QDomDocument &, QPointF = QPointF(), bool = true, DiagramContent * = NULL); // fonctions relatives aux options graphiques void setDisplayGrid(bool); @@ -101,6 +102,8 @@ class Diagram : public QGraphicsScene { const QHash &conductorsToUpdate(); const QSet &textsToMove(); QSet selectedConductors() const; + DiagramContent content() const; + DiagramContent selectedContent(); void moveElements(const QPointF &, QGraphicsItem * = NULL); QUndoStack &undoStack(); diff --git a/diagramcommands.cpp b/diagramcommands.cpp index dad838cce..e3c798069 100644 --- a/diagramcommands.cpp +++ b/diagramcommands.cpp @@ -112,53 +112,43 @@ void AddConductorCommand::redo() { /** Constructeur @param dia Schema dont on supprime des elements et conducteurs - @param elements Elements supprimes - @param conductors Conducteurs supprimes - @param texts Textes supprimes + @param content Contenu supprime @param parent QUndoCommand parent */ DeleteElementsCommand::DeleteElementsCommand( Diagram *dia, - QSet elements, - QSet conductors, - QSet texts, + const DiagramContent &content, QUndoCommand *parent ) : QUndoCommand(parent), - removed_elements(elements), - removed_conductors(conductors), - removed_texts(texts), + removed_content(content), diagram(dia) { - setText(QObject::tr("supprimer ") + QET::ElementsAndConductorsSentence(removed_elements.count(), removed_conductors.count(), removed_texts.count())); - foreach(QGraphicsItem *qgi, removed_elements) diagram -> qgiManager().manage(qgi); - foreach(QGraphicsItem *qgi, removed_conductors) diagram -> qgiManager().manage(qgi); - foreach(QGraphicsItem *qgi, removed_texts) diagram -> qgiManager().manage(qgi); + setText(QObject::tr("supprimer ") + removed_content.sentence(true)); + diagram -> qgiManager().manage(removed_content.items()); } /// Destructeur DeleteElementsCommand::~DeleteElementsCommand() { - foreach(QGraphicsItem *qgi, removed_texts) diagram -> qgiManager().release(qgi); - foreach(QGraphicsItem *qgi, removed_conductors) diagram -> qgiManager().release(qgi); - foreach(QGraphicsItem *qgi, removed_elements) diagram -> qgiManager().release(qgi); + diagram -> qgiManager().release(removed_content.items()); } /// annule les suppressions void DeleteElementsCommand::undo() { // remet les elements - foreach(Element *e, removed_elements) { + foreach(Element *e, removed_content.elements) { diagram -> addItem(e); } // remet les conducteurs - foreach(Conductor *c, removed_conductors) { + foreach(Conductor *c, removed_content.conductors()) { diagram -> addItem(c); c -> terminal1 -> addConductor(c); c -> terminal2 -> addConductor(c); } // remet les textes - foreach(DiagramTextItem *t, removed_texts) { + foreach(DiagramTextItem *t, removed_content.textFields) { diagram -> addItem(t); } } @@ -166,19 +156,19 @@ void DeleteElementsCommand::undo() { /// refait les suppressions void DeleteElementsCommand::redo() { // enleve les conducteurs - foreach(Conductor *c, removed_conductors) { + foreach(Conductor *c, removed_content.conductors()) { c -> terminal1 -> removeConductor(c); c -> terminal2 -> removeConductor(c); diagram -> removeItem(c); } // enleve les elements - foreach(Element *e, removed_elements) { + foreach(Element *e, removed_content.elements) { diagram -> removeItem(e); } // enleve les textes - foreach(DiagramTextItem *t, removed_texts) { + foreach(DiagramTextItem *t, removed_content.textFields) { diagram -> removeItem(t); } } @@ -193,45 +183,37 @@ void DeleteElementsCommand::redo() { */ PasteDiagramCommand::PasteDiagramCommand( Diagram *dia, - const QList &e, - const QList &c, - const QList &t, + const DiagramContent &c, QUndoCommand *parent ) : QUndoCommand(parent), - elements(e), - conductors(c), - texts(t), + content(c), diagram(dia), first_redo(true) { - setText(QObject::tr("coller ") + QET::ElementsAndConductorsSentence(elements.count(), conductors.count())); - foreach(QGraphicsItem *qgi, elements) diagram -> qgiManager().manage(qgi); - foreach(QGraphicsItem *qgi, conductors) diagram -> qgiManager().manage(qgi); - foreach(QGraphicsItem *qgi, texts) diagram -> qgiManager().manage(qgi); + setText(QObject::tr("coller ") + content.sentence()); + diagram -> qgiManager().manage(content.items()); } /// Destructeur PasteDiagramCommand::~PasteDiagramCommand() { - foreach(QGraphicsItem *qgi, texts) diagram -> qgiManager().release(qgi); - foreach(QGraphicsItem *qgi, conductors) diagram -> qgiManager().release(qgi); - foreach(QGraphicsItem *qgi, elements) diagram -> qgiManager().release(qgi); + diagram -> qgiManager().release(content.items()); } /// annule le coller void PasteDiagramCommand::undo() { // enleve les conducteurs - foreach(Conductor *c, conductors) { + foreach(Conductor *c, content.conductorsToMove) { c -> terminal1 -> removeConductor(c); c -> terminal2 -> removeConductor(c); diagram -> removeItem(c); } // enleve les elements - foreach(Element *e, elements) diagram -> removeItem(e); + foreach(Element *e, content.elements) diagram -> removeItem(e); // enleve les textes - foreach(DiagramTextItem *t, texts) diagram -> removeItem(t); + foreach(DiagramTextItem *t, content.textFields) diagram -> removeItem(t); } /// refait le coller @@ -239,40 +221,37 @@ void PasteDiagramCommand::redo() { if (first_redo) first_redo = false; else { // pose les elements - foreach(Element *e, elements) diagram -> addItem(e); + foreach(Element *e, content.elements) diagram -> addItem(e); // pose les conducteurs - foreach(Conductor *c, conductors) { + foreach(Conductor *c, content.conductorsToMove) { diagram -> addItem(c); c -> terminal1 -> addConductor(c); c -> terminal2 -> addConductor(c); } // pose les textes - foreach(DiagramTextItem *t, texts) diagram -> addItem(t); + foreach(DiagramTextItem *t, content.textFields) diagram -> addItem(t); } - foreach(Element *e, elements) e -> setSelected(true); - foreach(Conductor *c, conductors) c -> setSelected(true); - foreach(DiagramTextItem *t, texts) t -> setSelected(true); + foreach(Element *e, content.elements) e -> setSelected(true); + foreach(Conductor *c, content.conductorsToMove) c -> setSelected(true); + foreach(DiagramTextItem *t, content.textFields) t -> setSelected(true); } /** Constructeur @param dia Schema dont on coupe des elements et conducteurs - @param elements Elements coupes - @param conductors Conducteurs coupes + @param content Contenu coupe @param parent QUndoCommand parent */ CutDiagramCommand::CutDiagramCommand( Diagram *dia, - QSet elements, - QSet conductors, - QSet texts, + const DiagramContent &content, QUndoCommand *parent ) : - DeleteElementsCommand(dia, elements, conductors, texts, parent) + DeleteElementsCommand(dia, content, parent) { - setText(QObject::tr("couper ") + QET::ElementsAndConductorsSentence(elements.count(), conductors.count(), texts.count())); + setText(QObject::tr("couper ") + content.sentence(true)); } /// Destructeur @@ -282,32 +261,23 @@ CutDiagramCommand::~CutDiagramCommand() { /** Constructeur @param dia Schema sur lequel on deplace des elements - @param move_elements Elements a deplacer - @param move_conductors Conducteurs a deplacer - @param modify_conductors Conducteurs a mettre a jour - @param move_texts Textes a deplacer + @param diagram_content Contenu a deplacer @param m translation subie par les elements @param parent QUndoCommand parent */ MoveElementsCommand::MoveElementsCommand( Diagram *dia, - const QSet &move_elements, - const QSet &move_conductors, - const QHash &modify_conductors, - const QSet &move_texts, + const DiagramContent &diagram_content, const QPointF &m, QUndoCommand *parent ) : QUndoCommand(parent), diagram(dia), - elements_to_move(move_elements), - conductors_to_move(move_conductors), - conductors_to_update(modify_conductors), - texts_to_move(move_texts), + content_to_move(diagram_content), movement(m), first_redo(true) { - setText(QObject::tr("d\351placer ") + QET::ElementsAndConductorsSentence(elements_to_move.count(), conductors_to_move.count(), texts_to_move.count())); + setText(QObject::tr("d\351placer ") + content_to_move.sentence()); } /// Destructeur @@ -331,22 +301,26 @@ void MoveElementsCommand::redo() { */ void MoveElementsCommand::move(const QPointF &actual_movement) { // deplace les elements - foreach(Element *element, elements_to_move) { + foreach(Element *element, content_to_move.elements) { element -> setPos(element -> pos() + actual_movement); } // deplace certains conducteurs - foreach(Conductor *conductor, conductors_to_move) { + foreach(Conductor *conductor, content_to_move.conductorsToMove) { conductor -> setPos(conductor -> pos() + actual_movement); } // recalcule les autres conducteurs - foreach(Conductor *conductor, conductors_to_update.keys()) { - conductor -> updateWithNewPos(QRectF(), conductors_to_update[conductor], conductors_to_update[conductor] -> amarrageConductor()); + foreach(Conductor *conductor, content_to_move.conductorsToUpdate.keys()) { + conductor -> updateWithNewPos( + QRectF(), + content_to_move.conductorsToUpdate[conductor], + content_to_move.conductorsToUpdate[conductor] -> amarrageConductor() + ); } // deplace les textes - foreach(DiagramTextItem *text, texts_to_move) { + foreach(DiagramTextItem *text, content_to_move.textFields) { text -> setPos(text -> pos() + actual_movement); } } diff --git a/diagramcommands.h b/diagramcommands.h index af72484fc..5c327f957 100644 --- a/diagramcommands.h +++ b/diagramcommands.h @@ -2,6 +2,7 @@ #define DIAGRAM_COMMANDS_H #include "qet.h" #include "diagram.h" +#include "diagramcontent.h" #include "diagramtextitem.h" #include "conductor.h" #include "conductorproperties.h" @@ -89,7 +90,7 @@ class AddConductorCommand : public QUndoCommand { class DeleteElementsCommand : public QUndoCommand { // constructeurs, destructeur public: - DeleteElementsCommand(Diagram *, QSet, QSet, QSet, QUndoCommand * = 0); + DeleteElementsCommand(Diagram *, const DiagramContent &, QUndoCommand * = 0); virtual ~DeleteElementsCommand(); private: DeleteElementsCommand(const DeleteElementsCommand &); @@ -101,12 +102,8 @@ class DeleteElementsCommand : public QUndoCommand { // attributs private: - /// liste des elements enleves - QSet removed_elements; - /// liste des conducteurs enleves - QSet removed_conductors; - /// liste des textes enleves - QSet removed_texts; + /// contenu enleve + DiagramContent removed_content; /// schema dont on supprime des elements et conducteurs Diagram *diagram; }; @@ -117,7 +114,7 @@ class DeleteElementsCommand : public QUndoCommand { class PasteDiagramCommand : public QUndoCommand { // constructeurs, destructeur public: - PasteDiagramCommand(Diagram *, const QList &, const QList &, const QList &, QUndoCommand * = 0); + PasteDiagramCommand(Diagram *, const DiagramContent &, QUndoCommand * = 0); virtual ~PasteDiagramCommand(); private: PasteDiagramCommand(const PasteDiagramCommand &); @@ -129,12 +126,8 @@ class PasteDiagramCommand : public QUndoCommand { // attributs private: - /// elements ajoutes - QList elements; - /// conducteurs ajoutes - QList conductors; - /// textes ajoutes - QList texts; + /// contenu ajoute + DiagramContent content; /// schema sur lequel on colle les elements et conducteurs Diagram *diagram; /// booleen pour empecher le premier appel a redo @@ -148,7 +141,7 @@ class PasteDiagramCommand : public QUndoCommand { class CutDiagramCommand : public DeleteElementsCommand { // constructeurs, destructeur public: - CutDiagramCommand(Diagram *, QSet, QSet, QSet, QUndoCommand * = 0); + CutDiagramCommand(Diagram *, const DiagramContent &, QUndoCommand * = 0); virtual ~CutDiagramCommand(); private: CutDiagramCommand(const CutDiagramCommand &); @@ -161,7 +154,7 @@ class CutDiagramCommand : public DeleteElementsCommand { class MoveElementsCommand : public QUndoCommand { // constructeurs, destructeur public: - MoveElementsCommand(Diagram *, const QSet &, const QSet &, const QHash &, const QSet &, const QPointF &m, QUndoCommand * = 0); + MoveElementsCommand(Diagram *, const DiagramContent &, const QPointF &m, QUndoCommand * = 0); virtual ~MoveElementsCommand(); private: MoveElementsCommand(const MoveElementsCommand &); @@ -176,14 +169,8 @@ class MoveElementsCommand : public QUndoCommand { private: /// schema sur lequel on deplace les elements Diagram *diagram; - /// elements a deplacer - QSet elements_to_move; - /// conducteurs a deplacer - QSet conductors_to_move; - /// conducteurs a actualiser - QHash conductors_to_update; - /// textes a deplacer - QSet texts_to_move; + /// contenu a deplacer + DiagramContent content_to_move; /// mouvement effectue QPointF movement; /// booleen pour ne pas executer le premier redo() diff --git a/diagramcontent.cpp b/diagramcontent.cpp new file mode 100644 index 000000000..d04b8b88f --- /dev/null +++ b/diagramcontent.cpp @@ -0,0 +1,91 @@ +#include "diagramcontent.h" +#include +#include "element.h" +#include "diagramtextitem.h" +#include "conductor.h" + +/** + Constructeur par defaut. Ne contient rien. +*/ +DiagramContent::DiagramContent() { +} + +/** + Constructeur de copie. +*/ +DiagramContent::DiagramContent(const DiagramContent &other) : + elements(other.elements), + textFields(other.textFields), + conductorsToUpdate(other.conductorsToUpdate), + conductorsToMove(other.conductorsToMove) +{ +} + +/** + Constructeur +*/ +DiagramContent::~DiagramContent() { +} + +/** + @return tous les conducteurs +*/ +QList DiagramContent::conductors() const { + return(conductorsToMove + conductorsToUpdate.keys()); +} + +/** + Vide le conteneur +*/ +void DiagramContent::clear() { + elements.clear(); + textFields.clear(); + conductorsToUpdate.clear(); + conductorsToMove.clear(); +} + +/** + @return la liste des items formant le contenu du schema +*/ +QList DiagramContent::items() const { + QList items_list; + foreach(QGraphicsItem *qgi, conductors()) items_list << qgi; + foreach(QGraphicsItem *qgi, elements) items_list << qgi; + foreach(QGraphicsItem *qgi, textFields) items_list << qgi; + return(items_list); +} + +/** + @param include_updated_conductors true pour compter les conducteurs mis a jour, false sinon + @return le nombre d'items formant le contenu du schema +*/ +int DiagramContent::count(bool include_updated_conductors) const { + int conductors_count = conductorsToMove.count(); + if (include_updated_conductors) conductors_count += conductorsToUpdate.count(); + + return( + elements.count() + + textFields.count() + + conductors_count + + conductorsToUpdate.count() + ); +} + +/** + Permet de composer rapidement la proposition "x elements, y conducteurs et + z champs de texte". + @param include_updated_conductors true pour compter les conducteurs mis a jour, false sinon + @return la proposition decrivant le contenu. +*/ +QString DiagramContent::sentence(bool include_updated_conductors) const { + int conductors_count = conductorsToMove.count(); + if (include_updated_conductors) conductors_count += conductorsToUpdate.count(); + + return( + QET::ElementsAndConductorsSentence( + elements.count(), + conductors_count, + textFields.count() + ) + ); +} diff --git a/diagramcontent.h b/diagramcontent.h new file mode 100644 index 000000000..df4e6b953 --- /dev/null +++ b/diagramcontent.h @@ -0,0 +1,39 @@ +#ifndef DIAGRAM_CONTENT_H +#define DIAGRAM_CONTENT_H +#include +class Conductor; +class Element; +class Terminal; +class DiagramTextItem; +/** + Cette classe est un conteneur pour passer facilement le contenu d'un schema + a une fonction. Il permet d'acceder rapidement aux differents types de + composants que l'on peut trouver sur un schema, comme les elements, les + champs de texte, les conducteurs (a deplacer ou a mettre a jour, en cas de + deplacements), etc. + A noter que ce container ne contient pas systematiquement l'integralite + d'un schema. Il peut n'en contenir qu'une partie, typiquement les + composants selectionnes. +*/ +class DiagramContent { + public: + DiagramContent(); + DiagramContent(const DiagramContent &); + ~DiagramContent(); + + /// Elements de texte du schema + QList elements; + /// Champs de texte du schema + QList textFields; + /// Conducteurs a mettre a jour du schema + QHash conductorsToUpdate; + /// Conducteurs a deplacer du schema + QList conductorsToMove; + + QList conductors() const; + QList items() const; + QString sentence(bool = false) const; + int count(bool = false) const; + void clear(); +}; +#endif diff --git a/diagramtextitem.cpp b/diagramtextitem.cpp index 838d740cc..9f6c82e75 100644 --- a/diagramtextitem.cpp +++ b/diagramtextitem.cpp @@ -135,10 +135,7 @@ void DiagramTextItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) { diagram_ptr -> undoStack().push( new MoveElementsCommand( diagram_ptr, - diagram_ptr -> elementsToMove(), - diagram_ptr -> conductorsToMove(), - diagram_ptr -> conductorsToUpdate(), - diagram_ptr -> textsToMove(), + diagram_ptr -> selectedContent(), diagram_ptr -> current_movement ) ); diff --git a/diagramview.cpp b/diagramview.cpp index 43de3f93d..84a44b45c 100644 --- a/diagramview.cpp +++ b/diagramview.cpp @@ -80,27 +80,10 @@ void DiagramView::deleteSelection() { // que la touche suppr a ete enfoncee pour effacer une lettre et non la // selection if (scene -> focusItem()) return; - - QSet garbage_elmt; - QSet garbage_conductors; - QSet garbage_texts; - - // creation de deux listes : une pour les conducteurs, une pour les elements - foreach (QGraphicsItem *qgi, scene -> selectedItems()) { - // pour chaque qgi selectionne, il s'agit soit d'un element soit d'un conducteur - if (Conductor * c = qgraphicsitem_cast(qgi)) { - // s'il s'agit d'un conducteur, on le met dans la liste des conducteurs - garbage_conductors << c; - } else if (Element *e = qgraphicsitem_cast(qgi)) { - garbage_elmt << e; - // s'il s'agit d'un element, on veille a enlever ses conducteurs - garbage_conductors += e -> conductors().toSet(); - } else if (DiagramTextItem *t = qgraphicsitem_cast(qgi)) { - if (!t -> parentItem()) garbage_texts << t; - } - } + + DiagramContent removed_content = scene -> selectedContent(); scene -> clearSelection(); - scene -> undoStack().push(new DeleteElementsCommand(scene, garbage_elmt, garbage_conductors, garbage_texts)); + scene -> undoStack().push(new DeleteElementsCommand(scene, removed_content)); } /** @@ -214,27 +197,9 @@ void DiagramView::zoomReset() { */ void DiagramView::cut() { copy(); - QSet cut_elmt; - QSet cut_conductors; - QSet cut_texts; - - // creation de deux listes : une pour les conducteurs, une pour les elements - foreach (QGraphicsItem *qgi, scene -> selectedItems()) { - // pour chaque qgi selectionne, il s'agit soit d'un element soit d'un conducteur - if (Conductor *c = qgraphicsitem_cast(qgi)) { - // s'il s'agit d'un conducteur, on le met dans la liste des conducteurs - cut_conductors << c; - } else if (Element *e = qgraphicsitem_cast(qgi)) { - cut_elmt << e; - // s'il s'agit d'un element, on veille a enlever ses conducteurs - cut_conductors += e -> conductors().toSet(); - } else if (DiagramTextItem *t = qgraphicsitem_cast(qgi)) { - // les textes recherches n'ont pas de parent - if (!t -> parentItem()) cut_texts << t; - } - } + DiagramContent removed_content = scene -> selectedContent(); scene -> clearSelection(); - scene -> undoStack().push(new CutDiagramCommand(scene, cut_elmt, cut_conductors, cut_texts)); + scene -> undoStack().push(new CutDiagramCommand(scene, scene -> selectedContent())); } /** @@ -260,16 +225,14 @@ void DiagramView::paste(const QPointF &pos, QClipboard::Mode clipboard_mode) { QDomDocument document_xml; if (!document_xml.setContent(texte_presse_papier)) return; - // listes pour recupere les elements et conducteurs ajoutes au schema par le coller - QList elements_pasted; - QList conductors_pasted; - QList texts_pasted; - scene -> fromXml(document_xml, pos, false, &elements_pasted, &conductors_pasted, &texts_pasted); + // objet pour recuperer le contenu ajoute au schema par le coller + DiagramContent content_pasted; + scene -> fromXml(document_xml, pos, false, &content_pasted); // si quelque chose a effectivement ete ajoute au schema, on cree un objet d'annulation - if (elements_pasted.count() || conductors_pasted.count() || texts_pasted.count()) { + if (content_pasted.count()) { scene -> clearSelection(); - scene -> undoStack().push(new PasteDiagramCommand(scene, elements_pasted, conductors_pasted, texts_pasted)); + scene -> undoStack().push(new PasteDiagramCommand(scene, content_pasted)); } } diff --git a/element.cpp b/element.cpp index 956127dae..c94aaa341 100644 --- a/element.cpp +++ b/element.cpp @@ -264,10 +264,7 @@ void Element::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) { diagram_ptr -> undoStack().push( new MoveElementsCommand( diagram_ptr, - diagram_ptr -> elementsToMove(), - diagram_ptr -> conductorsToMove(), - diagram_ptr -> conductorsToUpdate(), - diagram_ptr -> textsToMove(), + diagram_ptr -> selectedContent(), diagram_ptr -> current_movement ) ); diff --git a/elementtextitem.h b/elementtextitem.h index 7dae53e9d..45e5a18eb 100644 --- a/elementtextitem.h +++ b/elementtextitem.h @@ -25,6 +25,7 @@ class ElementTextItem : public DiagramTextItem { // methodes public: virtual int type() const { return Type; } + virtual QRectF boundingRect() { return(QGraphicsTextItem::boundingRect().adjusted(0.0, -1.0, 0.0, 0.0)); } bool followParentRotations() const; void setFollowParentRotations(bool); void fromXml(const QDomElement &); diff --git a/qelectrotech.pro b/qelectrotech.pro index a0707c471..020420c2d 100644 --- a/qelectrotech.pro +++ b/qelectrotech.pro @@ -80,6 +80,7 @@ HEADERS += aboutqet.h \ diagramtextitem.h \ insetproperties.h \ conductorpropertieswidget.h \ + diagramcontent.h \ conductorproperties.h SOURCES += aboutqet.cpp \ borderinset.cpp \ @@ -140,6 +141,7 @@ SOURCES += aboutqet.cpp \ diagramcommands.cpp \ diagramtextitem.cpp \ conductorpropertieswidget.cpp \ + diagramcontent.cpp \ conductorproperties.cpp RESOURCES += qelectrotech.qrc TRANSLATIONS += lang/qet_en.ts lang/qt_fr.ts diff --git a/qet.cpp b/qet.cpp index cd627df5a..df0035c6f 100644 --- a/qet.cpp +++ b/qet.cpp @@ -128,6 +128,7 @@ bool QET::attributeIsAReal(const QDomElement &e, QString nom_attribut, double *r Permet de composer rapidement la proposition "x elements et y conducteurs" @param elements_count nombre d élements @param conductors_count nombre de conducteurs + @param texts_count nombre de champs de texte @return la proposition decrivant le nombre d'elements et de conducteurs */ QString QET::ElementsAndConductorsSentence(int elements_count, int conductors_count, int texts_count) { diff --git a/qgimanager.cpp b/qgimanager.cpp index bff8bd337..26422bf83 100644 --- a/qgimanager.cpp +++ b/qgimanager.cpp @@ -48,6 +48,25 @@ void QGIManager::release(QGraphicsItem *qgi) { } } +/** + Demande au QGIManager de gerer plusieurs QGI + @param qgis QGraphicsItems a gerer +*/ +void QGIManager::manage(const QList &qgis) { + foreach(QGraphicsItem *qgi, qgis) manage(qgi); +} + +/** + Indique au QGIManager que pour chaque QGI fourni, une reference vers celui-ci + a ete detruite. + S'il n'y a plus de references vers un QGI et que celui-ci n'est pas present + sur la scene de ce QGIManager, alors il sera detruit. + @param qgis QGraphicsItems a ne plus gerer +*/ +void QGIManager::release(const QList &qgis) { + foreach(QGraphicsItem *qgi, qgis) release(qgi); +} + /** Indique au QGIManager de detruire les QGraphicsItem restants lors de sa destruction si ceux-ci n'appartiennent pas a la scene diff --git a/qgimanager.h b/qgimanager.h index df4ff7734..a88d1bd76 100644 --- a/qgimanager.h +++ b/qgimanager.h @@ -26,6 +26,8 @@ class QGIManager { public: void manage(QGraphicsItem *); void release(QGraphicsItem *); + void manage(const QList &); + void release(const QList &); void setDestroyQGIOnDelete(bool); }; #endif