Simplification du code permettant la mise a jour des conducteurs lors des deplacements et rotations d'elements.

git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/branches/0.3@984 bfdf4180-ca20-0410-9c96-a3a8aa849046
This commit is contained in:
xavier 2010-05-04 20:18:30 +00:00
parent b073351872
commit f610efef8d
9 changed files with 21 additions and 41 deletions

View File

@ -134,18 +134,10 @@ void Conductor::update(const QRectF &rect) {
@param b Borne @param b Borne
@param newpos position de la borne b @param newpos position de la borne b
*/ */
void Conductor::updateWithNewPos(const QRectF &rect, const Terminal *b, const QPointF &newpos) { void Conductor::updateWithNewPos(const QRectF &rect) {
QPointF p1, p2; QPointF p1, p2;
if (b == terminal1) {
p1 = newpos;
p2 = terminal2 -> dockConductor();
} else if (b == terminal2) {
p1 = terminal1 -> dockConductor();
p2 = newpos;
} else {
p1 = terminal1 -> dockConductor(); p1 = terminal1 -> dockConductor();
p2 = terminal2 -> dockConductor(); p2 = terminal2 -> dockConductor();
}
if (nbSegments() && !conductor_profiles[currentPathType()].isNull()) if (nbSegments() && !conductor_profiles[currentPathType()].isNull())
priv_modifieConductor(p1, terminal1 -> orientation(), p2, terminal2 -> orientation()); priv_modifieConductor(p1, terminal1 -> orientation(), p2, terminal2 -> orientation());
else else

View File

@ -61,7 +61,7 @@ class Conductor : public QObject, public QGraphicsPathItem {
/// @return true si ce conducteur est detruit /// @return true si ce conducteur est detruit
bool isDestroyed() const { return(destroyed); } bool isDestroyed() const { return(destroyed); }
Diagram *diagram() const; Diagram *diagram() const;
void updateWithNewPos(const QRectF &, const Terminal *, const QPointF &); void updateWithNewPos(const QRectF &);
void update(const QRectF & = QRectF()); void update(const QRectF & = QRectF());
void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *); void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *);
QRectF boundingRect() const; QRectF boundingRect() const;

View File

@ -845,7 +845,7 @@ void Diagram::fetchMovedElements() {
if (elements_to_move.contains(other_terminal -> parentElement())) { if (elements_to_move.contains(other_terminal -> parentElement())) {
conductors_to_move << conductor; conductors_to_move << conductor;
} else { } else {
conductors_to_update.insert(conductor, terminal); conductors_to_update << conductor;
} }
} }
} }
@ -879,9 +879,8 @@ void Diagram::moveElements(const QPointF &diff, QGraphicsItem *dontmove) {
} }
// recalcule les autres conducteurs // recalcule les autres conducteurs
const QHash<Conductor *, Terminal *> &conductors_modify = conductorsToUpdate(); foreach(Conductor *conductor, conductorsToUpdate()) {
foreach(Conductor *conductor, conductors_modify.keys()) { conductor -> updateWithNewPos(QRectF());
conductor -> updateWithNewPos(QRectF(), conductors_modify[conductor], conductors_modify[conductor] -> dockConductor());
} }
// deplace les champs de texte // deplace les champs de texte
@ -1090,7 +1089,7 @@ DiagramContent Diagram::selectedContent() {
dc.elements = elementsToMove().toList(); dc.elements = elementsToMove().toList();
dc.textFields = independentTextsToMove().toList(); dc.textFields = independentTextsToMove().toList();
dc.conductorsToMove = conductorsToMove().toList(); dc.conductorsToMove = conductorsToMove().toList();
dc.conductorsToUpdate = conductorsToUpdate(); dc.conductorsToUpdate = conductorsToUpdate().toList();
// recupere les conducteurs selectionnes isoles (= non deplacables mais supprimables) // recupere les conducteurs selectionnes isoles (= non deplacables mais supprimables)
foreach(QGraphicsItem *qgi, items()) { foreach(QGraphicsItem *qgi, items()) {

View File

@ -79,7 +79,7 @@ class Diagram : public QGraphicsScene {
bool moved_elements_fetched; bool moved_elements_fetched;
QSet<Element *> elements_to_move; QSet<Element *> elements_to_move;
QSet<Conductor *> conductors_to_move; QSet<Conductor *> conductors_to_move;
QHash<Conductor *, Terminal *> conductors_to_update; QSet<Conductor *> conductors_to_update;
QSet<IndependentTextItem *> texts_to_move; QSet<IndependentTextItem *> texts_to_move;
QSet<ElementTextItem *> elements_texts_to_move; QSet<ElementTextItem *> elements_texts_to_move;
QGIManager *qgi_manager; QGIManager *qgi_manager;
@ -158,7 +158,7 @@ class Diagram : public QGraphicsScene {
void fetchMovedElements(); void fetchMovedElements();
const QSet<Element *> &elementsToMove(); const QSet<Element *> &elementsToMove();
const QSet<Conductor *> &conductorsToMove(); const QSet<Conductor *> &conductorsToMove();
const QHash<Conductor *, Terminal *> &conductorsToUpdate(); const QSet<Conductor *> &conductorsToUpdate();
const QSet<IndependentTextItem *> &independentTextsToMove(); const QSet<IndependentTextItem *> &independentTextsToMove();
const QSet<ElementTextItem *> &elementTextsToMove(); const QSet<ElementTextItem *> &elementTextsToMove();
QSet<DiagramTextItem *> selectedTexts() const; QSet<DiagramTextItem *> selectedTexts() const;
@ -285,7 +285,7 @@ inline const QSet<Conductor *> &Diagram::conductorsToMove() {
} }
/// @return la liste des conducteurs a modifier (typiquement les conducteurs dont seul un element est deplace) /// @return la liste des conducteurs a modifier (typiquement les conducteurs dont seul un element est deplace)
inline const QHash<Conductor *, Terminal *> &Diagram::conductorsToUpdate() { inline const QSet<Conductor *> &Diagram::conductorsToUpdate() {
if (!moved_elements_fetched) fetchMovedElements(); if (!moved_elements_fetched) fetchMovedElements();
return(conductors_to_update); return(conductors_to_update);
} }

View File

@ -353,12 +353,8 @@ void MoveElementsCommand::move(const QPointF &actual_movement) {
} }
// recalcule les autres conducteurs // recalcule les autres conducteurs
foreach(Conductor *conductor, content_to_move.conductorsToUpdate.keys()) { foreach(Conductor *conductor, content_to_move.conductorsToUpdate) {
conductor -> updateWithNewPos( conductor -> updateWithNewPos(QRectF());
QRectF(),
content_to_move.conductorsToUpdate[conductor],
content_to_move.conductorsToUpdate[conductor] -> dockConductor()
);
} }
// deplace les textes // deplace les textes

View File

@ -52,7 +52,7 @@ DiagramContent::~DiagramContent() {
QList<Conductor *> DiagramContent::conductors(int filter) const { QList<Conductor *> DiagramContent::conductors(int filter) const {
QList<Conductor *> result; QList<Conductor *> result;
if (filter & ConductorsToMove) result += conductorsToMove; if (filter & ConductorsToMove) result += conductorsToMove;
if (filter & ConductorsToUpdate) result += conductorsToUpdate.keys(); if (filter & ConductorsToUpdate) result += conductorsToUpdate;
if (filter & OtherConductors) result += otherConductors; if (filter & OtherConductors) result += otherConductors;
if (filter & SelectedOnly) { if (filter & SelectedOnly) {
foreach(Conductor *conductor, result) { foreach(Conductor *conductor, result) {
@ -100,7 +100,7 @@ int DiagramContent::count(int filter) const {
if (filter & Elements) foreach(Element *element, elements) { if (element -> isSelected()) ++ count; } if (filter & Elements) foreach(Element *element, elements) { if (element -> isSelected()) ++ count; }
if (filter & TextFields) foreach(DiagramTextItem *dti, textFields) { if (dti -> isSelected()) ++ count; } if (filter & TextFields) foreach(DiagramTextItem *dti, textFields) { if (dti -> isSelected()) ++ count; }
if (filter & ConductorsToMove) foreach(Conductor *conductor, conductorsToMove) { if (conductor -> isSelected()) ++ count; } if (filter & ConductorsToMove) foreach(Conductor *conductor, conductorsToMove) { if (conductor -> isSelected()) ++ count; }
if (filter & ConductorsToUpdate) foreach(Conductor *conductor, conductorsToUpdate.keys()) { if (conductor -> isSelected()) ++ count; } if (filter & ConductorsToUpdate) foreach(Conductor *conductor, conductorsToUpdate) { if (conductor -> isSelected()) ++ count; }
if (filter & OtherConductors) foreach(Conductor *conductor, otherConductors) { if (conductor -> isSelected()) ++ count; } if (filter & OtherConductors) foreach(Conductor *conductor, otherConductors) { if (conductor -> isSelected()) ++ count; }
} else { } else {
if (filter & Elements) count += elements.count(); if (filter & Elements) count += elements.count();
@ -143,7 +143,7 @@ QDebug &operator<<(QDebug d, DiagramContent &content) {
/* /*
FIXME Le double-heritage QObject / QGraphicsItem a casse cet operateur FIXME Le double-heritage QObject / QGraphicsItem a casse cet operateur
d << " elements :" << c.elements << "\n"; d << " elements :" << c.elements << "\n";
d << " conductorsToUpdate :" << c.conductorsToUpdate.keys() << "\n"; d << " conductorsToUpdate :" << c.conductorsToUpdate << "\n";
d << " conductorsToMove :" << c.conductorsToMove << "\n"; d << " conductorsToMove :" << c.conductorsToMove << "\n";
d << " otherConductors :" << c.otherConductors << "\n"; d << " otherConductors :" << c.otherConductors << "\n";
*/ */

View File

@ -20,7 +20,6 @@
#include <QtGui> #include <QtGui>
class Conductor; class Conductor;
class Element; class Element;
class Terminal;
class IndependentTextItem; class IndependentTextItem;
/** /**
Cette classe est un conteneur pour passer facilement le contenu d'un schema Cette classe est un conteneur pour passer facilement le contenu d'un schema
@ -55,7 +54,7 @@ class DiagramContent {
/// Champs de texte independants du schema /// Champs de texte independants du schema
QList<IndependentTextItem *> textFields; QList<IndependentTextItem *> textFields;
/// Conducteurs a mettre a jour du schema /// Conducteurs a mettre a jour du schema
QHash<Conductor *, Terminal *> conductorsToUpdate; QList<Conductor *> conductorsToUpdate;
/// Conducteurs a deplacer du schema /// Conducteurs a deplacer du schema
QList<Conductor *> conductorsToMove; QList<Conductor *> conductorsToMove;
/// Conducteurs isoles (ni a deplacer, ni a mettre a jour) /// Conducteurs isoles (ni a deplacer, ni a mettre a jour)

View File

@ -372,20 +372,14 @@ void Terminal::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) {
} }
/** /**
Met a jour l'eventuel conducteur relie a la Terminal. Met a jour l'eventuel conducteur relie a la borne.
@param newpos Position de l'element parent a prendre en compte @param newpos Position de l'element parent a prendre en compte
*/ */
void Terminal::updateConductor(QPointF newpos) { void Terminal::updateConductor() {
if (!scene() || !parentItem()) return; if (!scene() || !parentItem()) return;
foreach (Conductor *conductor, conductors_) { foreach (Conductor *conductor, conductors_) {
if (conductor -> isDestroyed()) continue; if (conductor -> isDestroyed()) continue;
if (newpos == QPointF()) conductor -> update(QRectF()); conductor -> update(QRectF());
else {
// determine la translation subie par l'element parent
QPointF translation = newpos - parentItem() -> pos();
// rafraichit le conducteur en tenant compte de la translation
conductor -> updateWithNewPos(QRectF(), this, dockConductor() + translation);
}
} }
} }

View File

@ -61,7 +61,7 @@ class Terminal : public QGraphicsItem {
QList<Conductor *> conductors() const; QList<Conductor *> conductors() const;
QET::Orientation orientation() const; QET::Orientation orientation() const;
QPointF dockConductor() const; QPointF dockConductor() const;
void updateConductor(QPointF = QPointF()); void updateConductor();
bool isLinkedTo(Terminal *); bool isLinkedTo(Terminal *);
bool canBeLinkedTo(Terminal *); bool canBeLinkedTo(Terminal *);