[qet] [815] Il est desormais possible de pivoter les textes des elements dans l' editeur de schema.

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


Revision: 815
Author:   xavier
Date:     2009-12-13 23:12:52 +0100 (Sun, 13 Dec 2009)
Log Message:
-----------
Il est desormais possible de pivoter les textes des elements dans l'editeur de schema.

Modified Paths:
--------------
    branches/0.3/sources/customelement.cpp
    branches/0.3/sources/diagram.cpp
    branches/0.3/sources/diagramtextitem.cpp
    branches/0.3/sources/diagramtextitem.h
    branches/0.3/sources/diagramview.cpp
    branches/0.3/sources/elementtextitem.cpp
    branches/0.3/sources/elementtextitem.h

Modified: branches/0.3/sources/customelement.cpp
===================================================================
--- branches/0.3/sources/customelement.cpp	2009-12-13 21:48:38 UTC (rev 814)
+++ branches/0.3/sources/customelement.cpp	2009-12-13 22:12:52 UTC (rev 815)
@@ -611,10 +611,20 @@
 	
 	ElementTextItem *eti = new ElementTextItem(e.attribute("text"), this);
 	eti -> setFont(QETApp::diagramTextsFont(size));
+	
+	// position du champ de texte
+	eti -> setOriginalPos(QPointF(pos_x, pos_y));
 	eti -> setPos(pos_x, pos_y);
-	eti -> setOriginalPos(QPointF(pos_x, pos_y));
-	if (e.attribute("rotate") == "true") eti -> setFollowParentRotations(true);
 	
+	// rotation du champ de texte
+	qreal original_rotation_angle = 0.0;
+	QET::attributeIsAReal(e, "rotation", &original_rotation_angle);
+	eti -> setOriginalRotationAngle(original_rotation_angle);
+	eti -> setRotationAngle(original_rotation_angle);
+	
+	// comportement du champ lorsque son element parent est pivote
+	eti -> setFollowParentRotations(e.attribute("rotate") == "true");
+	
 	list_texts_ << eti;
 	
 	return(eti);

Modified: branches/0.3/sources/diagram.cpp
===================================================================
--- branches/0.3/sources/diagram.cpp	2009-12-13 21:48:38 UTC (rev 814)
+++ branches/0.3/sources/diagram.cpp	2009-12-13 22:12:52 UTC (rev 815)
@@ -1072,6 +1072,8 @@
 	foreach(QGraphicsItem * qgi, selectedItems()) {
 		if (/*DiagramTextItem *dti = */qgraphicsitem_cast<DiagramTextItem *>(qgi)) {
 			return(true);
+		} else if (qgraphicsitem_cast<ElementTextItem *>(qgi)) {
+			return(true);
 		} else if (Element *e = qgraphicsitem_cast<Element *>(qgi)) {
 			// l'element est-il pivotable ?
 			if (e -> orientation().current() != e -> orientation().next()) {

Modified: branches/0.3/sources/diagramtextitem.cpp
===================================================================
--- branches/0.3/sources/diagramtextitem.cpp	2009-12-13 21:48:38 UTC (rev 814)
+++ branches/0.3/sources/diagramtextitem.cpp	2009-12-13 22:12:52 UTC (rev 815)
@@ -17,6 +17,7 @@
 */
 #include "diagramtextitem.h"
 #include "diagramcommands.h"
+#include "qet.h"
 #include "qetapp.h"
 
 /**
@@ -68,32 +69,27 @@
 }
 
 /**
-	Permet de tourner le texte a un angle donne. La rotation s'effectue par
-	rapport au point (0, 0) du texte.
+	Permet de tourner le texte a un angle donne de maniere absolue.
+	Un angle de 0 degres correspond a un texte horizontal non retourne.
 	@param rotation Nouvel angle de rotation de ce texte
+	@see applyRotation
 */
 void DiagramTextItem::setRotationAngle(const qreal &rotation) {
-	// ramene l'angle demande entre -360.0 et +360.0 degres
-	qreal applied_rotation = rotation;
-	while (applied_rotation < -360.0) applied_rotation += 360.0;
-	while (applied_rotation >  360.0) applied_rotation -= 360.0;
-	
-	rotate(applied_rotation - rotation_angle_);
+	qreal applied_rotation = QET::correctAngle(rotation);
+	applyRotation(applied_rotation - rotation_angle_);
 	rotation_angle_ = applied_rotation;
 }
 
 /**
-	Ajoute 
+	Permet de tourner le texte de maniere relative.
+	L'angle added_rotation est ajoute a l'orientation actuelle du texte.
 	@param added_rotation Angle a ajouter a la rotation actuelle
+	@see applyRotation
 */
 void DiagramTextItem::rotateBy(const qreal &added_rotation) {
-	// ramene l'angle demande entre -360.0 et +360.0 degres
-	qreal applied_added_rotation = added_rotation;
-	while (applied_added_rotation < 360.0) applied_added_rotation += 360.0;
-	while (applied_added_rotation > 360.0) applied_added_rotation -= 360.0;
-	
-	rotation_angle_ += applied_added_rotation;
-	rotate(applied_added_rotation);
+	qreal applied_added_rotation = QET::correctAngle(added_rotation);
+	rotation_angle_ = QET::correctAngle(rotation_angle_ + applied_added_rotation);
+	applyRotation(applied_added_rotation);
 }
 
 /**
@@ -211,6 +207,17 @@
 }
 
 /**
+	Effetue 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 
+	@param angle Angle de la rotation a effectuer
+*/
+void DiagramTextItem::applyRotation(const qreal &angle) {
+	// un simple appel a QGraphicsTextItem::rotate suffit
+	QGraphicsTextItem::rotate(angle);
+}
+
+/**
 	Change la position du champ de texte en veillant a ce qu'il
 	reste sur la grille du schema auquel il appartient.
 	@param p Nouvelles coordonnees de l'element

Modified: branches/0.3/sources/diagramtextitem.h
===================================================================
--- branches/0.3/sources/diagramtextitem.h	2009-12-13 21:48:38 UTC (rev 814)
+++ branches/0.3/sources/diagramtextitem.h	2009-12-13 22:12:52 UTC (rev 815)
@@ -60,6 +60,7 @@
 	virtual void mousePressEvent(QGraphicsSceneMouseEvent *);
 	virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *);
 	virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *);
+	virtual void applyRotation(const qreal &);
 	
 	// signaux
 	signals:

Modified: branches/0.3/sources/diagramview.cpp
===================================================================
--- branches/0.3/sources/diagramview.cpp	2009-12-13 21:48:38 UTC (rev 814)
+++ branches/0.3/sources/diagramview.cpp	2009-12-13 22:12:52 UTC (rev 815)
@@ -124,8 +124,12 @@
 			elements_to_rotate.insert(e, e -> orientation().current());
 		} else if (DiagramTextItem *dti = qgraphicsitem_cast<DiagramTextItem *>(item)) {
 			texts_to_rotate << dti;
-		} /*else if (ElementTextItem *eti = qgraphicsitem_cast<ElementTextItem *>(item)) {
-		}*/
+		} else if (ElementTextItem *eti = qgraphicsitem_cast<ElementTextItem *>(item)) {
+			// on ne pivote un texte d'element que si son parent n'est pas selectionne
+			if (eti -> parentItem() && !eti -> parentItem() -> isSelected()) {
+				texts_to_rotate << eti;
+			}
+		}
 	}
 	
 	// effectue les rotations s'il y a quelque chose a pivoter

Modified: branches/0.3/sources/elementtextitem.cpp
===================================================================
--- branches/0.3/sources/elementtextitem.cpp	2009-12-13 21:48:38 UTC (rev 814)
+++ branches/0.3/sources/elementtextitem.cpp	2009-12-13 22:12:52 UTC (rev 815)
@@ -26,11 +26,15 @@
 */
 ElementTextItem::ElementTextItem(QGraphicsItem *parent, QGraphicsScene *scene) :
 	DiagramTextItem(parent, scene),
-	follow_parent_rotations(false)
+	follow_parent_rotations(false),
+	original_rotation_angle_(0.0)
 {
 	// par defaut, les DiagramTextItem sont Selectable et Movable
 	// on desactive Movable pour les textes des elements
 	setFlag(QGraphicsItem::ItemIsMovable, false);
+	
+	// ajuste la position du QGraphicsItem lorsque le QTextDocument change
+	connect(document(), SIGNAL(blockCountChanged(int)), this, SLOT(adjustItemPosition(int)));
 }
 
 /**
@@ -41,11 +45,15 @@
 */
 ElementTextItem::ElementTextItem(const QString &text, QGraphicsItem *parent, QGraphicsScene *scene) :
 	DiagramTextItem(text, parent, scene),
-	follow_parent_rotations(false)
+	follow_parent_rotations(false),
+	original_rotation_angle_(0.0)
 {
 	// par defaut, les DiagramTextItem sont Selectable et Movable
 	// on desactive Movable pour les textes des elements
 	setFlag(QGraphicsItem::ItemIsMovable, false);
+	
+	// ajuste la position du QGraphicsItem lorsque le QTextDocument change
+	connect(document(), SIGNAL(blockCountChanged(int)), this, SLOT(adjustItemPosition(int)));
 }
 
 /// Destructeur
@@ -59,7 +67,7 @@
 void ElementTextItem::setPos(const QPointF &pos) {
 	QPointF actual_pos = pos;
 	actual_pos -= QPointF(0.0, boundingRect().height() / 2.0);
-	DiagramTextItem::setPos(actual_pos);
+	QGraphicsTextItem::setPos(actual_pos);
 }
 
 /**
@@ -88,9 +96,16 @@
 */
 void ElementTextItem::fromXml(const QDomElement &e) {
 	QPointF _pos = pos();
-	if (qFuzzyCompare(qreal(e.attribute("x").toDouble()), _pos.x()) && qFuzzyCompare(qreal(e.attribute("y").toDouble()), _pos.y())) {
+	if (
+		qFuzzyCompare(qreal(e.attribute("x").toDouble()), _pos.x()) &&
+		qFuzzyCompare(qreal(e.attribute("y").toDouble()), _pos.y())
+	) {
 		setPlainText(e.attribute("text"));
 		previous_text = e.attribute("text");
+		qreal xml_rotation_angle;
+		if (QET::attributeIsAReal(e, "userrotation", &xml_rotation_angle)) {
+			setRotationAngle(xml_rotation_angle);
+		}
 	}
 }
 
@@ -103,6 +118,9 @@
 	result.setAttribute("x", QString("%1").arg(originalPos().x()));
 	result.setAttribute("y", QString("%1").arg(originalPos().y()));
 	result.setAttribute("text", toPlainText());
+	if (rotationAngle() != originalRotationAngle()) {
+		result.setAttribute("userrotation", QString("%1").arg(rotationAngle()));
+	}
 	return(result);
 }
 
@@ -120,3 +138,48 @@
 QPointF ElementTextItem::originalPos() const {
 	return(original_position);
 }
+
+/**
+	Definit l'angle de rotation original de ce champ de texte
+	@param rotation_angle un angle de rotation
+*/
+void ElementTextItem::setOriginalRotationAngle(const qreal &rotation_angle) {
+	original_rotation_angle_ = QET::correctAngle(rotation_angle);
+}
+
+/**
+	@return l'angle de rotation original de ce champ de texte
+*/
+qreal ElementTextItem::originalRotationAngle() const {
+	return(original_rotation_angle_);
+}
+
+/**
+	Cette methode s'assure que la position de l'ElementTextItem est coherente
+	en repositionnant son origine (c-a-d le milieu du bord gauche du champ de
+	texte) a la position originale. Cela est notamment utile lorsque le champ
+	de texte est agrandi ou retreci verticalement (ajout ou retrait de lignes).
+	@param new_bloc_count Nombre de blocs dans l'ElementTextItem
+	@see originalPos()
+*/
+void ElementTextItem::adjustItemPosition(int new_block_count) {
+	Q_UNUSED(new_block_count);
+	setPos(originalPos());
+}
+
+/**
+	Effetue la rotation du texte en elle-meme
+	Pour les ElementTextItem, la rotation s'effectue autour du milieu du bord
+	gauche du champ de texte.
+	@param angle Angle de la rotation a effectuer
+*/
+void ElementTextItem::applyRotation(const qreal &angle) {
+	qreal origin_offset = boundingRect().height() / 2.0;
+	
+	QTransform rotation;
+	rotation.translate(0.0,  origin_offset);
+	rotation.rotate(angle);
+	rotation.translate(0.0, -origin_offset);
+	
+	QGraphicsTextItem::setTransform(rotation, true);
+}

Modified: branches/0.3/sources/elementtextitem.h
===================================================================
--- branches/0.3/sources/elementtextitem.h	2009-12-13 21:48:38 UTC (rev 814)
+++ branches/0.3/sources/elementtextitem.h	2009-12-13 22:12:52 UTC (rev 815)
@@ -40,6 +40,7 @@
 	private:
 	bool follow_parent_rotations;
 	QPointF original_position;
+	qreal original_rotation_angle_;
 	
 	// methodes
 	public:
@@ -55,6 +56,14 @@
 	QPointF pos() const;
 	void setOriginalPos(const QPointF &);
 	QPointF originalPos() const;
+	void setOriginalRotationAngle(const qreal &);
+	qreal originalRotationAngle() const;
+	
+	public slots:
+	void adjustItemPosition(int);
+	
+	protected:
+	virtual void applyRotation(const qreal &);
 };
 
 /**


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