mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2025-12-19 23:20: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:
59
element.cpp
59
element.cpp
@@ -1,5 +1,6 @@
|
||||
#include "element.h"
|
||||
#include "diagram.h"
|
||||
#include "conducer.h"
|
||||
#include "elementtextitem.h"
|
||||
#include <QtDebug>
|
||||
|
||||
@@ -103,21 +104,6 @@ QPixmap Element::pixmap() {
|
||||
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
|
||||
@param o la nouvelle orientation de l'objet
|
||||
@@ -187,7 +173,7 @@ void Element::drawSelection(QPainter *painter, const QStyleOptionGraphicsItem *)
|
||||
t.setStyle(Qt::DashDotLine);
|
||||
painter -> setPen(t);
|
||||
// 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();
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
if (e -> buttons() & Qt::LeftButton) {
|
||||
@@ -244,22 +230,41 @@ void Element::mouseMoveEvent(QGraphicsSceneMouseEvent *e) {
|
||||
setPos(mapToParent(e -> pos()) - matrix().map(e -> buttonDownPos(Qt::LeftButton)));
|
||||
QPointF diff = pos() - oldPos;
|
||||
|
||||
// Recupere la liste des elements selectionnes
|
||||
QList<QGraphicsItem *> selectedItems;
|
||||
if (scene()) {
|
||||
selectedItems = scene() -> selectedItems();
|
||||
} else if (QGraphicsItem *parent = parentItem()) {
|
||||
while (parent && parent -> isSelected()) selectedItems << parent;
|
||||
// inutile de deplacer les autres elements s'il n'y a pas eu de mouvement concret
|
||||
if (diff.isNull()) return;
|
||||
|
||||
// recupere le schema parent
|
||||
if (!scene()) return;
|
||||
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
|
||||
foreach (QGraphicsItem *item, selectedItems) {
|
||||
if (!item -> parentItem() || !item -> parentItem() -> isSelected())
|
||||
if (item != this && qgraphicsitem_cast<Element *>(item)) item -> setPos(item -> pos() + diff);
|
||||
// recalcule les autres conducteurs
|
||||
const QHash<Conducer *, Terminal *> &conducers_modify = diagram -> conducersToUpdate();
|
||||
foreach(Conducer *conducer, conducers_modify.keys()) {
|
||||
conducer -> updateWithNewPos(QRectF(), conducers_modify[conducer], conducers_modify[conducer] -> scenePos());
|
||||
}
|
||||
} 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
|
||||
@param e Le QDomElement a valide
|
||||
|
||||
Reference in New Issue
Block a user