[qet] [794] Editeur d'elements : il est desormais possible de deplacer les parties selectionnees avec les fleches du clavier . |
[ Thread Index |
Date Index
| More lists.tuxfamily.org/qet Archives
]
Revision: 794
Author: xavier
Date: 2009-11-22 19:50:30 +0100 (Sun, 22 Nov 2009)
Log Message:
-----------
Editeur d'elements : il est desormais possible de deplacer les parties selectionnees avec les fleches du clavier.
Modified Paths:
--------------
trunk/sources/editor/elementscene.cpp
trunk/sources/editor/elementscene.h
Modified: trunk/sources/editor/elementscene.cpp
===================================================================
--- trunk/sources/editor/elementscene.cpp 2009-11-22 16:12:22 UTC (rev 793)
+++ trunk/sources/editor/elementscene.cpp 2009-11-22 18:50:30 UTC (rev 794)
@@ -376,6 +376,59 @@
}
/**
+ 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
@param r Le rectangle de la zone a dessiner
Modified: trunk/sources/editor/elementscene.h
===================================================================
--- trunk/sources/editor/elementscene.h 2009-11-22 16:12:22 UTC (rev 793)
+++ trunk/sources/editor/elementscene.h 2009-11-22 18:50:30 UTC (rev 794)
@@ -68,7 +68,12 @@
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 @@
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 *);