From e45fc6e21d1e3bfcf4ad119e66c18a11bbbe98da Mon Sep 17 00:00:00 2001 From: xavier Date: Sun, 22 Nov 2009 18:50:30 +0000 Subject: [PATCH] Editeur d'elements : il est desormais possible de deplacer les parties selectionnees avec les fleches du clavier. git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@794 bfdf4180-ca20-0410-9c96-a3a8aa849046 --- sources/editor/elementscene.cpp | 53 +++++++++++++++++++++++++++++++++ sources/editor/elementscene.h | 9 +++++- 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/sources/editor/elementscene.cpp b/sources/editor/elementscene.cpp index 8ad237c92..0bb51cf8b 100644 --- a/sources/editor/elementscene.cpp +++ b/sources/editor/elementscene.cpp @@ -375,6 +375,59 @@ void ElementScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) { } else QGraphicsScene::mouseReleaseEvent(e); } +/** + Gere les enfoncements de touches du clavier + @param e QKeyEvent decrivant l'evenement clavier +*/ +void ElementScene::keyPressEvent(QKeyEvent *e) { + bool is_read_only = element_editor && element_editor -> isReadOnly(); + if (!is_read_only) { + const qreal movement_length = 1.0; + QPointF movement; + switch(e -> key()) { + case Qt::Key_Left: movement = QPointF(-movement_length, 0.0); break; + case Qt::Key_Right: movement = QPointF(+movement_length, 0.0); break; + case Qt::Key_Up: movement = QPointF(0.0, -movement_length); break; + case Qt::Key_Down: movement = QPointF(0.0, +movement_length); break; + } + if (!movement.isNull() && !focusItem()) { + qDebug() << "keyPressEvent: let's move by " << movement; + if (!moving_parts_) { + moving_parts_ = true; + fsi_pos = movement; + } else { + fsi_pos += movement; + } + foreach(QGraphicsItem *qgi, selectedItems()) { + qgi -> setPos(qgi -> pos() + movement); + } + } + } + QGraphicsScene::keyPressEvent(e); +} + +/** + Gere les relachements de touches du clavier + @param e QKeyEvent decrivant l'evenement clavier +*/ +void ElementScene::keyReleaseEvent(QKeyEvent *e) { + bool is_read_only = element_editor && element_editor -> isReadOnly(); + if (!is_read_only) { + // detecte le relachement d'une touche de direction ( = deplacement de parties) + if ( + (e -> key() == Qt::Key_Left || e -> key() == Qt::Key_Right ||\ + e -> key() == Qt::Key_Up || e -> key() == Qt::Key_Down) &&\ + moving_parts_ && !e -> isAutoRepeat() + ) { + // cree un objet d'annulation pour le mouvement qui vient de se finir + undo_stack.push(new MovePartsCommand(fsi_pos, this, selectedItems())); + fsi_pos = QPointF(); + moving_parts_ = false; + } + } + QGraphicsScene::keyReleaseEvent(e); +} + /** Dessine l'arriere-plan de l'editeur, cad la grille. @param p Le QPainter a utiliser pour dessiner diff --git a/sources/editor/elementscene.h b/sources/editor/elementscene.h index c2a2551d6..468ac80ff 100644 --- a/sources/editor/elementscene.h +++ b/sources/editor/elementscene.h @@ -68,7 +68,12 @@ class ElementScene : public QGraphicsScene { QGIManager qgi_manager; /// Pile des actions annulables QUndoStack undo_stack; - /// Position du premier item selectionne (utilise pour annuler les deplacements) + /** + fsi_pos (first selected item pos) : Position du premier item + selectionne : utilise pour annuler les deplacements a la souris ; + egalement utilise pour gerer les deplacements avec les fleches du + clavier. + */ QPointF fsi_pos; QPointF moving_press_pos; bool moving_parts_; @@ -135,6 +140,8 @@ class ElementScene : public QGraphicsScene { virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *); virtual void mousePressEvent(QGraphicsSceneMouseEvent *); virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *); + virtual void keyPressEvent(QKeyEvent *); + virtual void keyReleaseEvent(QKeyEvent *); virtual void drawBackground(QPainter *, const QRectF &); virtual void drawForeground(QPainter *, const QRectF &); virtual void endCurrentBehavior(const QGraphicsSceneMouseEvent *);