[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 *);


Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/