[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) {