[qet] [1082] Remise en place de la contre-rotation pour les champs de texte rattaches a un element et ne presentant pas l 'option "FollowParentRotation"

[ Thread Index | Date Index | More lists.tuxfamily.org/qet Archives ]


Revision: 1082
Author:   xavier
Date:     2010-07-18 03:46:30 +0200 (Sun, 18 Jul 2010)
Log Message:
-----------
Remise en place de la contre-rotation pour les champs de texte rattaches a un element et ne presentant pas l'option "FollowParentRotation"

Modified Paths:
--------------
    branches/0.3/sources/diagramcommands.cpp
    branches/0.3/sources/diagramcommands.h
    branches/0.3/sources/diagramtextitem.cpp
    branches/0.3/sources/element.cpp
    branches/0.3/sources/elementtextitem.cpp
    branches/0.3/sources/elementtextitem.h

Modified: branches/0.3/sources/diagramcommands.cpp
===================================================================
--- branches/0.3/sources/diagramcommands.cpp	2010-07-14 21:26:31 UTC (rev 1081)
+++ branches/0.3/sources/diagramcommands.cpp	2010-07-18 01:46:30 UTC (rev 1082)
@@ -598,7 +598,7 @@
 /// defait le pivotement
 void RotateElementsCommand::undo() {
 	foreach(Element *e, elements_to_rotate.keys()) {
-		e -> setOrientation(elements_to_rotate[e]);
+		rotateElement(e, elements_to_rotate[e]);
 	}
 	foreach(DiagramTextItem *dti, texts_to_rotate) {
 		dti -> rotateBy(-applied_rotation_angle_);
@@ -608,8 +608,7 @@
 /// refait le pivotement
 void RotateElementsCommand::redo() {
 	foreach(Element *e, elements_to_rotate.keys()) {
-		e -> setOrientation(e -> orientation().next());
-		e -> update();
+		rotateElement(e, e -> orientation().next());
 	}
 	foreach(DiagramTextItem *dti, texts_to_rotate) {
 		dti -> rotateBy(applied_rotation_angle_);
@@ -631,6 +630,36 @@
 }
 
 /**
+	Passe un element a une orientation donnee, en prenant soin de gerer ses textes enfants
+	@param element Element a orienter soigneusement
+	@param orientation Nouvelle orientation de l'element
+*/
+void RotateElementsCommand::rotateElement(Element *element, QET::Orientation orientation) {
+	qreal rotation_value = 90.0 * (orientation - element -> orientation().current());
+	element -> setOrientation(orientation);
+	element -> update();
+	if (rotation_value) {
+		// repositionne les textes de l'element qui ne comportent pas l'option "FollowParentRotations"
+		foreach(ElementTextItem *eti, element -> texts()) {
+			if (!eti -> followParentRotations())  {
+				// on souhaite pivoter le champ de texte par rapport a son centre
+				QPointF eti_center = eti -> boundingRect().center();
+				// pour ce faire, on repere la position de son centre par rapport a son parent
+				QPointF parent_eti_center_before = eti -> mapToParent(eti_center);
+				// on applique ensuite une simple rotation contraire, qui sera donc appliquee sur le milieu du cote gauche du champ de texte
+				eti -> rotateBy(-rotation_value);
+				// on regarde ensuite la nouvelle position du centre du champ de texte par rapport a son parent
+				QPointF parent_eti_center_after = eti -> mapToParent(eti_center);
+				// on determine la translation a appliquer
+				QPointF eti_translation = parent_eti_center_before - parent_eti_center_after;
+				// on applique cette translation
+				eti -> setPos(eti -> pos() + eti_translation);
+			}
+		}
+	}
+}
+
+/**
 	Constructeur
 	@param previous_state Hash associant les textes impactes par l'action et leur angle de rotation avant l'action
 	@param applied_rotation Nouvel angle de rotation, a appliquer au textes concernes

Modified: branches/0.3/sources/diagramcommands.h
===================================================================
--- branches/0.3/sources/diagramcommands.h	2010-07-14 21:26:31 UTC (rev 1081)
+++ branches/0.3/sources/diagramcommands.h	2010-07-18 01:46:30 UTC (rev 1082)
@@ -319,6 +319,8 @@
 	virtual void redo();
 	qreal appliedRotationAngle() const;
 	void setAppliedRotationAngle(const qreal &);
+	private:
+	void rotateElement(Element *, QET::Orientation);
 	
 	// attributs
 	private:

Modified: branches/0.3/sources/diagramtextitem.cpp
===================================================================
--- branches/0.3/sources/diagramtextitem.cpp	2010-07-14 21:26:31 UTC (rev 1081)
+++ branches/0.3/sources/diagramtextitem.cpp	2010-07-18 01:46:30 UTC (rev 1082)
@@ -249,14 +249,14 @@
 }
 
 /**
-	Effetue la rotation du texte en elle-meme
+	Effectue la rotation du texte en elle-meme
 	Pour les DiagramTextItem, la rotation s'effectue autour du point (0, 0).
-	Cette methode peut toutefois etre redefinie dans des classes 
+	Cette methode peut toutefois etre redefinie dans des classes filles
 	@param angle Angle de la rotation a effectuer
 */
 void DiagramTextItem::applyRotation(const qreal &angle) {
-	// un simple appel a QGraphicsTextItem::rotate suffit
-	QGraphicsTextItem::rotate(angle);
+	// un simple appel a QGraphicsTextItem::setRotation suffit
+	QGraphicsTextItem::setRotation(QGraphicsTextItem::rotation() + angle);
 }
 
 /**

Modified: branches/0.3/sources/element.cpp
===================================================================
--- branches/0.3/sources/element.cpp	2010-07-14 21:26:31 UTC (rev 1081)
+++ branches/0.3/sources/element.cpp	2010-07-18 01:46:30 UTC (rev 1082)
@@ -185,19 +185,7 @@
 	foreach(QGraphicsItem *qgi, childItems()) {
 		if (Terminal *p = qgraphicsitem_cast<Terminal *>(qgi)) {
 			p -> updateConductor();
-		} /* else if (ElementTextItem *eti = qgraphicsitem_cast<ElementTextItem *>(qgi)) {
-			// applique une rotation contraire si besoin
-			if (!eti -> followParentRotations())  {
-				QMatrix new_matrix = eti -> matrix();
-				qreal dx = eti -> boundingRect().width()  / 2.0;
-				qreal dy = eti -> boundingRect().height() / 2.0;
-				new_matrix.translate(dx, dy);
-				new_matrix.rotate(-rotation_value);
-				new_matrix.translate(-dx, -dy);
-				eti -> setMatrix(new_matrix);
-			}
 		}
-		*/
 	}
 	return(true);
 }

Modified: branches/0.3/sources/elementtextitem.cpp
===================================================================
--- branches/0.3/sources/elementtextitem.cpp	2010-07-14 21:26:31 UTC (rev 1081)
+++ branches/0.3/sources/elementtextitem.cpp	2010-07-18 01:46:30 UTC (rev 1082)
@@ -35,6 +35,7 @@
 	// par defaut, les DiagramTextItem sont Selectable et Movable
 	// cela nous convient, on ne touche pas a ces flags
 	
+	adjustItemPosition(1);
 	// ajuste la position du QGraphicsItem lorsque le QTextDocument change
 	connect(document(), SIGNAL(blockCountChanged(int)), this, SLOT(adjustItemPosition(int)));
 }
@@ -55,6 +56,7 @@
 	// par defaut, les DiagramTextItem sont Selectable et Movable
 	// cela nous convient, on ne touche pas a ces flags
 	
+	adjustItemPosition(1);
 	// ajuste la position du QGraphicsItem lorsque le QTextDocument change
 	connect(document(), SIGNAL(blockCountChanged(int)), this, SLOT(adjustItemPosition(int)));
 }
@@ -75,16 +77,7 @@
 	@param pos La nouvelle position du champ de texte
 */
 void ElementTextItem::setPos(const QPointF &pos) {
-	// annule toute transformation (rotation notamment)
-	resetTransform();
-	
-	// effectue le positionnement en lui-meme
-	QPointF actual_pos = pos;
-	actual_pos -= QPointF(0.0, boundingRect().bottom() / 2.0);
-	QGraphicsTextItem::setPos(actual_pos);
-	
-	// applique a nouveau la rotation du champ de texte
-	applyRotation(rotationAngle());
+	QGraphicsTextItem::setPos(pos);
 }
 
 /**
@@ -100,9 +93,7 @@
 	@return La position (bidouillee) du champ de texte
 */
 QPointF ElementTextItem::pos() const {
-	QPointF actual_pos = DiagramTextItem::pos();
-	actual_pos += QPointF(0.0, boundingRect().bottom() / 2.0);
-	return(actual_pos);
+	return(QGraphicsTextItem::pos());
 }
 
 /**
@@ -198,7 +189,12 @@
 */
 void ElementTextItem::adjustItemPosition(int new_block_count) {
 	Q_UNUSED(new_block_count);
-	setPos(known_position_);
+	qreal origin_offset = boundingRect().bottom() / 2.0;
+	
+	QTransform base_translation;
+	base_translation.translate(0.0, -origin_offset);
+	setTransform(base_translation, false);
+	setTransformOriginPoint(0.0, origin_offset);
 }
 
 /**
@@ -208,14 +204,7 @@
 	@param angle Angle de la rotation a effectuer
 */
 void ElementTextItem::applyRotation(const qreal &angle) {
-	qreal origin_offset = boundingRect().bottom() / 2.0;
-	
-	QTransform rotation;
-	rotation.translate(0.0,  origin_offset);
-	rotation.rotate(angle);
-	rotation.translate(0.0, -origin_offset);
-	
-	QGraphicsTextItem::setTransform(rotation, true);
+	QGraphicsTextItem::setRotation(QGraphicsTextItem::rotation() + angle);
 }
 
 /**
@@ -309,17 +298,3 @@
 		QGraphicsTextItem::mouseReleaseEvent(e);
 	}
 }
-
-/**
-	Gere les changements intervenant sur ce champ de texte
-	@param change Type de changement
-	@param value Valeur numerique relative au changement
-*/
-QVariant ElementTextItem::itemChange(GraphicsItemChange change, const QVariant &value) {
-	if (change == QGraphicsItem::ItemPositionHasChanged || change == QGraphicsItem::ItemSceneHasChanged) {
-		// memorise la nouvelle position "officielle" du champ de texte
-		// cette information servira a le recentrer en cas d'ajout / retrait de lignes
-		known_position_ = pos();
-	}
-	return(DiagramTextItem::itemChange(change, value));
-}

Modified: branches/0.3/sources/elementtextitem.h
===================================================================
--- branches/0.3/sources/elementtextitem.h	2010-07-14 21:26:31 UTC (rev 1081)
+++ branches/0.3/sources/elementtextitem.h	2010-07-18 01:46:30 UTC (rev 1082)
@@ -45,7 +45,6 @@
 	Element *parent_element_;
 	bool follow_parent_rotations;
 	QPointF original_position;
-	QPointF known_position_;
 	qreal original_rotation_angle_;
 	bool first_move_;
 	
@@ -75,7 +74,6 @@
 	virtual void mousePressEvent(QGraphicsSceneMouseEvent *);
 	virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *);
 	virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *);
-	virtual QVariant itemChange(GraphicsItemChange, const QVariant &);
 };
 
 /**


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