[qet] [824] Correction de problemes de positionnement des champs de texte des elements .

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


Revision: 824
Author:   xavier
Date:     2010-01-01 15:41:15 +0100 (Fri, 01 Jan 2010)
Log Message:
-----------
Correction de problemes de positionnement des champs de texte des elements.

Modified Paths:
--------------
    branches/0.3/sources/editor/parttextfield.cpp
    branches/0.3/sources/editor/parttextfield.h
    branches/0.3/sources/elementtextitem.cpp

Modified: branches/0.3/sources/editor/parttextfield.cpp
===================================================================
--- branches/0.3/sources/editor/parttextfield.cpp	2009-12-28 17:16:54 UTC (rev 823)
+++ branches/0.3/sources/editor/parttextfield.cpp	2010-01-01 14:41:15 UTC (rev 824)
@@ -38,6 +38,9 @@
 	setPlainText(QObject::tr("_", "default text when adding a textfield in the element editor"));
 	infos = new TextFieldEditor(elementEditor(), this);
 	infos -> setElementTypeName(name());
+	
+	// ajuste la position du champ de texte lorsqu'on lui ajoute/retire des lignes
+	connect(document(), SIGNAL(blockCountChanged(int)), this, SLOT(adjustItemPosition(int)));
 }
 
 /// Destructeur
@@ -67,6 +70,7 @@
 		xml_element.attribute("x").toDouble(),
 		xml_element.attribute("y").toDouble()
 	);
+	known_position_ = pos();
 	
 	follow_parent_rotations = (xml_element.attribute("rotate") == "true");
 }
@@ -106,7 +110,7 @@
 	@return la position du texte
 */
 QPointF PartTextField::pos() const {
-	return(QGraphicsTextItem::pos() + margin());
+	return(mapToScene(margin()));
 }
 
 /**
@@ -114,7 +118,15 @@
 	@param new_pos Nouvelle position
 */
 void PartTextField::setPos(const QPointF &new_pos) {
-	QGraphicsTextItem::setPos(new_pos - margin());
+	// annule toute transformation (rotation notamment)
+	resetTransform();
+	
+	// effectue le positionnement en lui-meme
+	QPointF m = margin();
+	QGraphicsTextItem::setPos(new_pos - m);
+	
+	// applique a nouveau la rotation du champ de texte
+	setTransform(QTransform().translate(m.x(), m.y()).rotate(rotation_angle_).translate(-m.x(), -m.y()));
 }
 
 /**
@@ -123,7 +135,7 @@
 	@param y ordonnee de la nouvelle position
 */
 void PartTextField::setPos(qreal x, qreal y) {
-	QGraphicsTextItem::setPos(QPointF(x, y) - margin());
+	PartTextField::setPos(QPointF(x, y));
 }
 
 /**
@@ -137,18 +149,13 @@
 	@param angle Le nouvel angle de rotation de ce champ de texte
 */
 void PartTextField::setRotationAngle(const qreal &angle) {
-	rotation_angle_ = QET::correctAngle(angle);
+	qreal applied_rotation = QET::correctAngle(angle);
 	
-	// annule toute rotation precedente
-	resetTransform();
-	
-	QPointF pos_margin = margin();
-	QTransform rotation;
-	rotation.translate(pos_margin.x(), pos_margin.y());
-	rotation.rotate(rotation_angle_);
-	rotation.translate(-pos_margin.x(), -pos_margin.y());
-	
-	QGraphicsTextItem::setTransform(rotation, true);
+	QPointF t = margin();
+	translate(t.x(), t.y());
+	rotate(applied_rotation - rotation_angle_);
+	rotation_angle_ = applied_rotation;
+	translate(-t.x(), -t.y());
 }
 
 /**
@@ -279,8 +286,15 @@
 */
 QVariant PartTextField::itemChange(GraphicsItemChange change, const QVariant &value) {
 	if (scene()) {
-		if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemSelectedChange) {
+		if (change == QGraphicsItem::ItemPositionHasChanged) {
+			// 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();
 			infos -> updateForm();
+		} else if (change == QGraphicsItem::ItemSelectedHasChanged) {
+			if (value.toBool() == true) {
+				infos -> updateForm();
+			}
 		}
 	}
 	return(QGraphicsTextItem::itemChange(change, value));
@@ -326,6 +340,18 @@
 #endif
 }
 
+/**
+	Cette methode s'assure que la position du champ de texte 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
+*/
+void PartTextField::adjustItemPosition(int new_block_count) {
+	Q_UNUSED(new_block_count);
+	setPos(known_position_);
+}
+
 #ifdef QET_DEBUG_EDITOR_TEXTS
 /**
 	Dessine deux petites fleches pour mettre un point en valeur

Modified: branches/0.3/sources/editor/parttextfield.h
===================================================================
--- branches/0.3/sources/editor/parttextfield.h	2009-12-28 17:16:54 UTC (rev 823)
+++ branches/0.3/sources/editor/parttextfield.h	2010-01-01 14:41:15 UTC (rev 824)
@@ -28,6 +28,8 @@
 	lorsque l'element sera pose sur un schema.
 */
 class PartTextField : public QGraphicsTextItem, public CustomElementPart {
+	Q_OBJECT
+	
 	// constructeurs, destructeur
 	public:
 	PartTextField(QETElementEditor *, QGraphicsItem * = 0, QGraphicsScene * = 0);
@@ -65,6 +67,9 @@
 	virtual bool isUseless() const;
 	virtual void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget * = 0 );
 	
+	public slots:
+	void adjustItemPosition(int);
+	
 	protected:
 	virtual void focusOutEvent(QFocusEvent *);
 	virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *);
@@ -77,5 +82,6 @@
 	void drawPoint(QPainter *, const QPointF &);
 #endif
 	QString previous_text;
+	QPointF known_position_;
 };
 #endif

Modified: branches/0.3/sources/elementtextitem.cpp
===================================================================
--- branches/0.3/sources/elementtextitem.cpp	2009-12-28 17:16:54 UTC (rev 823)
+++ branches/0.3/sources/elementtextitem.cpp	2010-01-01 14:41:15 UTC (rev 824)
@@ -65,9 +65,16 @@
 	@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());
 }
 
 /**
@@ -159,7 +166,7 @@
 	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
+	@param new_block_count Nombre de blocs dans l'ElementTextItem
 	@see originalPos()
 */
 void ElementTextItem::adjustItemPosition(int new_block_count) {


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