[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
]
- To: qet@xxxxxxxxxxxxxxxxxxx
- Subject: [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"
- From: subversion@xxxxxxxxxxxxx
- Date: Sun, 18 Jul 2010 03:46:30 +0200
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 &);
};
/**