From ca4103b75a7090fab7f8438af3b1e75625776c93 Mon Sep 17 00:00:00 2001 From: xavierqet Date: Sat, 15 Sep 2007 23:45:27 +0000 Subject: [PATCH] Il est desormais possible de deplacer les elements d'un schema avec les fleches du clavier git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@123 bfdf4180-ca20-0410-9c96-a3a8aa849046 --- diagram.cpp | 33 ++++++++++++++++++++++++++++++++ diagram.h | 2 ++ element.cpp | 54 +++++++++++++++++++++++++++-------------------------- element.h | 1 + 4 files changed, 64 insertions(+), 26 deletions(-) diff --git a/diagram.cpp b/diagram.cpp index 60087ddf7..5483f2dc9 100644 --- a/diagram.cpp +++ b/diagram.cpp @@ -70,6 +70,39 @@ void Diagram::drawBackground(QPainter *p, const QRectF &r) { p -> restore(); } +/** + Gere le clavier + @param e QKeyEvent decrivant l'evenement clavier +*/ +void Diagram::keyPressEvent(QKeyEvent *e) { + qDebug() << "Diagram::keyPressEvent"; + QPointF movement; + switch(e -> key()) { + case Qt::Key_Left: movement = QPointF(-GRILLE_X, 0.0); break; + case Qt::Key_Right: movement = QPointF(+GRILLE_X, 0.0); break; + case Qt::Key_Up: movement = QPointF(0.0, -GRILLE_Y); break; + case Qt::Key_Down: movement = QPointF(0.0, +GRILLE_Y); break; + } + if (!movement.isNull()) { + QSet moved_elements = elementsToMove(); + if (!moved_elements.isEmpty()) { + Element *first_elmt; + foreach(Element *elmt, moved_elements) { + first_elmt = elmt; + break; + } + first_elmt -> setPos(first_elmt -> pos() + movement); + first_elmt -> moveOtherElements(movement); + } + } + QGraphicsScene::keyPressEvent(e); +} + +void Diagram::keyReleaseEvent(QKeyEvent *e) { + invalidateMovedElements(); + QGraphicsScene::keyReleaseEvent(e); +} + /** Exporte le schema vers une image @return Une QImage representant le schema diff --git a/diagram.h b/diagram.h index e8945e428..039980063 100644 --- a/diagram.h +++ b/diagram.h @@ -38,6 +38,8 @@ class Diagram : public QGraphicsScene { // methodes public: void drawBackground(QPainter *, const QRectF &); + void keyPressEvent(QKeyEvent *); + void keyReleaseEvent(QKeyEvent *); // fonctions relatives a la pose de conducteurs void setConducer(bool); diff --git a/element.cpp b/element.cpp index 7342396e6..1c52995b4 100644 --- a/element.cpp +++ b/element.cpp @@ -228,35 +228,37 @@ void Element::mouseMoveEvent(QGraphicsSceneMouseEvent *e) { if (e -> buttons() & Qt::LeftButton) { QPointF oldPos = pos(); setPos(mapToParent(e -> pos()) - matrix().map(e -> buttonDownPos(Qt::LeftButton))); - QPointF diff = pos() - oldPos; - - // 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(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); - } - - // recalcule les autres conducteurs - const QHash &conducers_modify = diagram -> conducersToUpdate(); - foreach(Conducer *conducer, conducers_modify.keys()) { - conducer -> updateWithNewPos(QRectF(), conducers_modify[conducer], conducers_modify[conducer] -> scenePos()); - } + moveOtherElements(pos() - oldPos); } else e -> ignore(); } +void Element::moveOtherElements(const QPointF &diff) { + // 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(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); + } + + // recalcule les autres conducteurs + const QHash &conducers_modify = diagram -> conducersToUpdate(); + foreach(Conducer *conducer, conducers_modify.keys()) { + conducer -> updateWithNewPos(QRectF(), conducers_modify[conducer], conducers_modify[conducer] -> amarrageConducer()); + } +} + void Element::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) { if (scene()) { Diagram *diagram = qobject_cast(scene()); diff --git a/element.h b/element.h index c544f0453..f46517d7b 100644 --- a/element.h +++ b/element.h @@ -60,6 +60,7 @@ class Element : public QGraphicsItem { // methodes relatives a la position void setPos(const QPointF &); void setPos(qreal, qreal); + void moveOtherElements(const QPointF &); // methodes relatives aux connexions internes bool connexionsInternesAcceptees();