mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2025-12-20 08:10:52 +01:00
Optimisation du deplacement des elements
git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@122 bfdf4180-ca20-0410-9c96-a3a8aa849046
This commit is contained in:
39
diagram.cpp
39
diagram.cpp
@@ -379,3 +379,42 @@ QRectF Diagram::border() const {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// oublie la liste des elements et conducteurs en mouvement
|
||||||
|
void Diagram::invalidateMovedElements() {
|
||||||
|
if (!moved_elements_fetched) return;
|
||||||
|
moved_elements_fetched = false;
|
||||||
|
elements_to_move.clear();
|
||||||
|
conducers_to_move.clear();
|
||||||
|
conducers_to_update.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// reconstruit la liste des elements et conducteurs en mouvement
|
||||||
|
void Diagram::fetchMovedElements() {
|
||||||
|
// recupere les elements deplaces
|
||||||
|
foreach (QGraphicsItem *item, selectedItems()) {
|
||||||
|
if (Element *elmt = qgraphicsitem_cast<Element *>(item)) {
|
||||||
|
elements_to_move << elmt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// pour chaque element deplace, determine les conducteurs qui seront modifies
|
||||||
|
foreach(Element *elmt, elements_to_move) {
|
||||||
|
foreach(Terminal *terminal, elmt -> terminals()) {
|
||||||
|
foreach(Conducer *conducer, terminal -> conducers()) {
|
||||||
|
Terminal *other_terminal;
|
||||||
|
if (conducer -> terminal1 == terminal) {
|
||||||
|
other_terminal = conducer -> terminal2;
|
||||||
|
} else {
|
||||||
|
other_terminal = conducer -> terminal1;
|
||||||
|
}
|
||||||
|
// si les deux elements du conducteur sont deplaces
|
||||||
|
if (elements_to_move.contains(static_cast<Element *>(other_terminal -> parentItem()))) {
|
||||||
|
conducers_to_move << conducer;
|
||||||
|
} else {
|
||||||
|
conducers_to_update.insert(conducer, terminal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
moved_elements_fetched = true;
|
||||||
|
}
|
||||||
|
|||||||
29
diagram.h
29
diagram.h
@@ -9,6 +9,7 @@
|
|||||||
#include "borderinset.h"
|
#include "borderinset.h"
|
||||||
class Element;
|
class Element;
|
||||||
class Terminal;
|
class Terminal;
|
||||||
|
class Conducer;
|
||||||
class Diagram : public QGraphicsScene {
|
class Diagram : public QGraphicsScene {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
@@ -29,6 +30,10 @@ class Diagram : public QGraphicsScene {
|
|||||||
QGraphicsLineItem *conducer_setter;
|
QGraphicsLineItem *conducer_setter;
|
||||||
bool draw_grid;
|
bool draw_grid;
|
||||||
bool use_border;
|
bool use_border;
|
||||||
|
bool moved_elements_fetched;
|
||||||
|
QSet<Element *> elements_to_move;
|
||||||
|
QSet<Conducer *> conducers_to_move;
|
||||||
|
QHash<Conducer *, Terminal *> conducers_to_update;
|
||||||
|
|
||||||
// methodes
|
// methodes
|
||||||
public:
|
public:
|
||||||
@@ -55,6 +60,12 @@ class Diagram : public QGraphicsScene {
|
|||||||
QImage toImage(int = -1, int = -1, Qt::AspectRatioMode = Qt::KeepAspectRatio);
|
QImage toImage(int = -1, int = -1, Qt::AspectRatioMode = Qt::KeepAspectRatio);
|
||||||
QSize imageSize() const;
|
QSize imageSize() const;
|
||||||
|
|
||||||
|
void invalidateMovedElements();
|
||||||
|
void fetchMovedElements();
|
||||||
|
const QSet<Element *> &elementsToMove();
|
||||||
|
const QSet<Conducer *> &conducersToMove();
|
||||||
|
const QHash<Conducer *, Terminal *> &conducersToUpdate();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void slot_checkSelectionEmptinessChange();
|
void slot_checkSelectionEmptinessChange();
|
||||||
|
|
||||||
@@ -149,4 +160,22 @@ inline Diagram::BorderOptions Diagram::borderOptions() {
|
|||||||
return(retour);
|
return(retour);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// @return la liste des elements a deplacer
|
||||||
|
inline const QSet<Element *> &Diagram::elementsToMove() {
|
||||||
|
if (!moved_elements_fetched) fetchMovedElements();
|
||||||
|
return(elements_to_move);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @return la liste des conducteurs a deplacer
|
||||||
|
inline const QSet<Conducer *> &Diagram::conducersToMove() {
|
||||||
|
if (!moved_elements_fetched) fetchMovedElements();
|
||||||
|
return(conducers_to_move);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @return la liste des conducteurs a modifier (typiquement les conducteurs dont seul un element est deplace)
|
||||||
|
inline const QHash<Conducer *, Terminal *> &Diagram::conducersToUpdate() {
|
||||||
|
if (!moved_elements_fetched) fetchMovedElements();
|
||||||
|
return(conducers_to_update);
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
59
element.cpp
59
element.cpp
@@ -1,5 +1,6 @@
|
|||||||
#include "element.h"
|
#include "element.h"
|
||||||
#include "diagram.h"
|
#include "diagram.h"
|
||||||
|
#include "conducer.h"
|
||||||
#include "elementtextitem.h"
|
#include "elementtextitem.h"
|
||||||
#include <QtDebug>
|
#include <QtDebug>
|
||||||
|
|
||||||
@@ -103,21 +104,6 @@ QPixmap Element::pixmap() {
|
|||||||
return(apercu);
|
return(apercu);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
Gere les changements d'etat de l'element
|
|
||||||
@param change type du changement d'etat
|
|
||||||
@param value valeur du changement d'etat
|
|
||||||
@return la valeur du changement d'etat
|
|
||||||
*/
|
|
||||||
QVariant Element::itemChange(GraphicsItemChange change, const QVariant &value) {
|
|
||||||
if (change == QGraphicsItem::ItemPositionHasChanged) {
|
|
||||||
foreach(QGraphicsItem *qgi, children()) {
|
|
||||||
if (Terminal *p = qgraphicsitem_cast<Terminal *>(qgi)) p -> updateConducer(value.toPointF());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return(QGraphicsItem::itemChange(change, value));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Permet de specifier l'orientation de l'element
|
Permet de specifier l'orientation de l'element
|
||||||
@param o la nouvelle orientation de l'objet
|
@param o la nouvelle orientation de l'objet
|
||||||
@@ -187,7 +173,7 @@ void Element::drawSelection(QPainter *painter, const QStyleOptionGraphicsItem *)
|
|||||||
t.setStyle(Qt::DashDotLine);
|
t.setStyle(Qt::DashDotLine);
|
||||||
painter -> setPen(t);
|
painter -> setPen(t);
|
||||||
// Le dessin se fait a partir du rectangle delimitant
|
// Le dessin se fait a partir du rectangle delimitant
|
||||||
painter -> drawRoundRect(boundingRect(), 10, 10);
|
painter -> drawRoundRect(boundingRect().adjusted(1, 1, -1, -1), 10, 10);
|
||||||
painter -> restore();
|
painter -> restore();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -236,7 +222,7 @@ void Element::setPos(qreal x, qreal y) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Gere les mouvements de souris lies a l'element, notamment
|
Gere les mouvements de souris lies a l'element
|
||||||
*/
|
*/
|
||||||
void Element::mouseMoveEvent(QGraphicsSceneMouseEvent *e) {
|
void Element::mouseMoveEvent(QGraphicsSceneMouseEvent *e) {
|
||||||
if (e -> buttons() & Qt::LeftButton) {
|
if (e -> buttons() & Qt::LeftButton) {
|
||||||
@@ -244,22 +230,41 @@ void Element::mouseMoveEvent(QGraphicsSceneMouseEvent *e) {
|
|||||||
setPos(mapToParent(e -> pos()) - matrix().map(e -> buttonDownPos(Qt::LeftButton)));
|
setPos(mapToParent(e -> pos()) - matrix().map(e -> buttonDownPos(Qt::LeftButton)));
|
||||||
QPointF diff = pos() - oldPos;
|
QPointF diff = pos() - oldPos;
|
||||||
|
|
||||||
// Recupere la liste des elements selectionnes
|
// inutile de deplacer les autres elements s'il n'y a pas eu de mouvement concret
|
||||||
QList<QGraphicsItem *> selectedItems;
|
if (diff.isNull()) return;
|
||||||
if (scene()) {
|
|
||||||
selectedItems = scene() -> selectedItems();
|
// recupere le schema parent
|
||||||
} else if (QGraphicsItem *parent = parentItem()) {
|
if (!scene()) return;
|
||||||
while (parent && parent -> isSelected()) selectedItems << parent;
|
Diagram *diagram = qobject_cast<Diagram *>(scene());
|
||||||
|
if (!diagram) return;
|
||||||
|
|
||||||
|
// deplace les elements selectionnes
|
||||||
|
foreach(Element *element, diagram -> elementsToMove()) {
|
||||||
|
if (element == this) continue;
|
||||||
|
element -> setPos(element -> pos() + diff);
|
||||||
|
};
|
||||||
|
|
||||||
|
// deplace certains conducteurs
|
||||||
|
foreach(Conducer *conducer, diagram -> conducersToMove()) {
|
||||||
|
conducer -> setPos(conducer -> pos() + diff);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Deplace tous les elements selectionnes
|
// recalcule les autres conducteurs
|
||||||
foreach (QGraphicsItem *item, selectedItems) {
|
const QHash<Conducer *, Terminal *> &conducers_modify = diagram -> conducersToUpdate();
|
||||||
if (!item -> parentItem() || !item -> parentItem() -> isSelected())
|
foreach(Conducer *conducer, conducers_modify.keys()) {
|
||||||
if (item != this && qgraphicsitem_cast<Element *>(item)) item -> setPos(item -> pos() + diff);
|
conducer -> updateWithNewPos(QRectF(), conducers_modify[conducer], conducers_modify[conducer] -> scenePos());
|
||||||
}
|
}
|
||||||
} else e -> ignore();
|
} else e -> ignore();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Element::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) {
|
||||||
|
if (scene()) {
|
||||||
|
Diagram *diagram = qobject_cast<Diagram *>(scene());
|
||||||
|
if (diagram) diagram -> invalidateMovedElements();
|
||||||
|
}
|
||||||
|
QGraphicsItem::mouseReleaseEvent(e);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Permet de savoir si un element XML (QDomElement) represente bien un element
|
Permet de savoir si un element XML (QDomElement) represente bien un element
|
||||||
@param e Le QDomElement a valide
|
@param e Le QDomElement a valide
|
||||||
|
|||||||
@@ -45,7 +45,6 @@ class Element : public QGraphicsItem {
|
|||||||
virtual QString nom() const = 0;
|
virtual QString nom() const = 0;
|
||||||
|
|
||||||
void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *);
|
void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *);
|
||||||
QVariant itemChange(GraphicsItemChange, const QVariant &);
|
|
||||||
QRectF boundingRect() const;
|
QRectF boundingRect() const;
|
||||||
QSize setSize(int, int);
|
QSize setSize(int, int);
|
||||||
QPixmap pixmap();
|
QPixmap pixmap();
|
||||||
@@ -78,6 +77,7 @@ class Element : public QGraphicsItem {
|
|||||||
protected:
|
protected:
|
||||||
void drawAxes(QPainter *, const QStyleOptionGraphicsItem *);
|
void drawAxes(QPainter *, const QStyleOptionGraphicsItem *);
|
||||||
void mouseMoveEvent(QGraphicsSceneMouseEvent *);
|
void mouseMoveEvent(QGraphicsSceneMouseEvent *);
|
||||||
|
void mouseReleaseEvent(QGraphicsSceneMouseEvent *);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool peut_relier_ses_propres_terminals;
|
bool peut_relier_ses_propres_terminals;
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ void Terminal::initialise(QPointF pf, QET::Orientation o) {
|
|||||||
setAcceptsHoverEvents(true);
|
setAcceptsHoverEvents(true);
|
||||||
setAcceptedMouseButtons(Qt::LeftButton);
|
setAcceptedMouseButtons(Qt::LeftButton);
|
||||||
hovered = false;
|
hovered = false;
|
||||||
setToolTip("Terminal");
|
setToolTip(QObject::tr("Borne"));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user