diff --git a/sources/qetgraphicsitem/conductortextitem.cpp b/sources/qetgraphicsitem/conductortextitem.cpp index 6aad9c763..167dc7e5b 100644 --- a/sources/qetgraphicsitem/conductortextitem.cpp +++ b/sources/qetgraphicsitem/conductortextitem.cpp @@ -29,12 +29,8 @@ ConductorTextItem::ConductorTextItem(Conductor *parent_conductor, Diagram *paren DiagramTextItem(parent_conductor, parent_diagram), parent_conductor_(parent_conductor), moved_by_user_(false), - rotate_by_user_(false), - first_move_(true) -{ - // par defaut, les DiagramTextItem sont Selectable et Movable - // cela nous convient, on ne touche pas a ces flags -} + rotate_by_user_(false) +{} /** Constructeur @@ -46,12 +42,8 @@ ConductorTextItem::ConductorTextItem(const QString &text, Conductor *parent_cond DiagramTextItem(text, parent_conductor, parent_diagram), parent_conductor_(parent_conductor), moved_by_user_(false), - rotate_by_user_(false), - first_move_(true) -{ - // par defaut, les DiagramTextItem sont Selectable et Movable - // cela nous convient, on ne touche pas a ces flags -} + rotate_by_user_(false) +{} /** Destructeur @@ -149,65 +141,54 @@ void ConductorTextItem::forceRotateByUser(bool rotate_by_user) { } /** - Gere les clics de souris lies au champ de texte - @param e Objet decrivant l'evenement souris -*/ -void ConductorTextItem::mousePressEvent(QGraphicsSceneMouseEvent *e) { - if ((flags() & QGraphicsItem::ItemIsMovable) && (e -> buttons() & Qt::LeftButton)) { - before_mov_pos_ = pos(); - } - first_move_ = true; - DiagramTextItem::mousePressEvent(e); + * @brief ConductorTextItem::mousePressEvent + * @param event + */ +void ConductorTextItem::mousePressEvent(QGraphicsSceneMouseEvent *event) { + before_mov_pos_ = pos(); + DiagramTextItem::mousePressEvent(event); } /** - Gere les mouvements de souris lies au champ de texte - @param e Objet decrivant l'evenement souris -*/ -void ConductorTextItem::mouseMoveEvent(QGraphicsSceneMouseEvent *e) { - if (textInteractionFlags() & Qt::TextEditable) { - QGraphicsTextItem::mouseMoveEvent(e); - } else if ((flags() & QGraphicsItem::ItemIsMovable) && (e -> buttons() & Qt::LeftButton)) { - if (first_move_) { - mouse_to_origin_movement_ = before_mov_pos_ - mapToParent(e -> buttonDownPos(Qt::LeftButton)); - } - - QPointF intended_pos = mapToParent(e -> pos()) + mouse_to_origin_movement_; - // si ce texte est attache a un conducteur, alors ses mouvements seront - // limites a une certaine distance du trace de ce conducteur + * @brief ConductorTextItem::mouseMoveEvent + * @param event + */ +void ConductorTextItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { + if (textInteractionFlags() & Qt::TextEditable) QGraphicsTextItem::mouseMoveEvent(event); + + else if ((flags() & QGraphicsItem::ItemIsMovable) && (event -> buttons() & Qt::LeftButton)) { + + QPointF intended_pos = event ->scenePos() + m_mouse_to_origin_movement; + if (parent_conductor_) { if (parent_conductor_ -> isNearConductor(intended_pos)) { - setPos(intended_pos); + event->modifiers() == Qt::ControlModifier ? setPos(intended_pos) : setPos(Diagram::snapToGrid(intended_pos)); parent_conductor_ -> setHighlighted(Conductor::Normal); } else { parent_conductor_ -> setHighlighted(Conductor::Alert); } } - } else e -> ignore(); - - if (first_move_) { - first_move_ = false; } + + else event -> ignore(); } /** - Gere le relachement de souris - Cette methode cree un objet d'annulation pour le deplacement - @param e Objet decrivant l'evenement souris -*/ + * @brief ConductorTextItem::mouseReleaseEvent + * @param e + */ void ConductorTextItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) { if (flags() & QGraphicsItem::ItemIsMovable) { + if (Diagram *diagram_ptr = diagram()) { - // on cree un objet d'annulation correspondant au deplacement qui s'acheve QPointF applied_movement = pos() - before_mov_pos_; if (!applied_movement.isNull()) { - // on cree un objet d'annulation seulement pour ce champ de texte + //Create an undo object MoveConductorsTextsCommand *undo_object = new MoveConductorsTextsCommand(diagram_ptr); undo_object -> addTextMovement(this, before_mov_pos_, pos(), moved_by_user_); - - // on active le flag indiquant que ce champ de texte a ete explicitement repositionne par l'utilisateur + moved_by_user_ = true; diagram_ptr -> undoStack().push(undo_object); diff --git a/sources/qetgraphicsitem/conductortextitem.h b/sources/qetgraphicsitem/conductortextitem.h index 3e1c707bd..c3e6ea2f9 100644 --- a/sources/qetgraphicsitem/conductortextitem.h +++ b/sources/qetgraphicsitem/conductortextitem.h @@ -53,9 +53,9 @@ class ConductorTextItem : public DiagramTextItem { virtual void forceRotateByUser(bool); protected: - virtual void mousePressEvent(QGraphicsSceneMouseEvent *); - virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *); - virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *); + virtual void mousePressEvent (QGraphicsSceneMouseEvent *event); + virtual void mouseMoveEvent (QGraphicsSceneMouseEvent *event); + virtual void mouseReleaseEvent (QGraphicsSceneMouseEvent *event); // attributes private: @@ -63,7 +63,5 @@ class ConductorTextItem : public DiagramTextItem { bool moved_by_user_; bool rotate_by_user_; QPointF before_mov_pos_; - bool first_move_; - QPointF mouse_to_origin_movement_; }; #endif diff --git a/sources/qetgraphicsitem/diagramtextitem.cpp b/sources/qetgraphicsitem/diagramtextitem.cpp index ba09af7f9..c3b761d19 100644 --- a/sources/qetgraphicsitem/diagramtextitem.cpp +++ b/sources/qetgraphicsitem/diagramtextitem.cpp @@ -32,16 +32,7 @@ DiagramTextItem::DiagramTextItem(QGraphicsItem *parent, Diagram *parent_diagram) rotation_angle_(0.0), m_first_move (true) { - //set Zvalue at 10 to be upper than the DiagramImageItem - setZValue(10); - setDefaultTextColor(Qt::black); - setFont(QETApp::diagramTextsFont()); - setFlags(QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsMovable); - setNoEditable(false); -#if QT_VERSION >= 0x040600 - setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); -#endif - connect(this, SIGNAL(lostFocus()), this, SLOT(setNonFocusable())); + build(); } /** @@ -55,22 +46,31 @@ DiagramTextItem::DiagramTextItem(const QString &text, QGraphicsItem *parent, Dia previous_text_(text), rotation_angle_(0.0) { + build(); +} + +/// Destructeur +DiagramTextItem::~DiagramTextItem() { +} + +/** + * @brief DiagramTextItem::build + * Build this item with default value + */ +void DiagramTextItem::build() { //set Zvalue at 10 to be upper than the DiagramImageItem setZValue(10); setDefaultTextColor(Qt::black); setFont(QETApp::diagramTextsFont()); setFlags(QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsMovable); setNoEditable(false); + setToolTip(tr("Maintenir ctrl pour un d\351placer librement")); #if QT_VERSION >= 0x040600 setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); #endif connect(this, SIGNAL(lostFocus()), this, SLOT(setNonFocusable())); } -/// Destructeur -DiagramTextItem::~DiagramTextItem() { -} - /** @return le Diagram auquel ce texte appartient, ou 0 si ce texte n'est rattache a aucun schema @@ -110,25 +110,6 @@ void DiagramTextItem::rotateBy(const qreal &added_rotation) { applyRotation(applied_added_rotation); } -/** - Traduit en coordonnees de la scene un mouvement / vecteur initialement - exprime en coordonnees locales. - @param movement Vecteur exprime en coordonnees locales - @return le meme vecteur, exprime en coordonnees de la scene -*/ -QPointF DiagramTextItem::mapMovementToScene(const QPointF &movement) const { - // on definit deux points en coordonnees locales - QPointF local_origin(0.0, 0.0); - QPointF local_movement_point(movement); - - // on les mappe sur la scene - QPointF scene_origin(mapToScene(local_origin)); - QPointF scene_movement_point(mapToScene(local_movement_point)); - - // on calcule le vecteur represente par ces deux points - return(scene_movement_point - scene_origin); -} - /** Traduit en coordonnees locales un mouvement / vecteur initialement exprime en coordonnees de la scene. @@ -167,25 +148,6 @@ QPointF DiagramTextItem::mapMovementToParent(const QPointF &movement) const { return(parent_movement_point - parent_origin); } -/** - Traduit en coordonnees locales un mouvement / vecteur initialement - exprime en coordonnees du parent. - @param movement Vecteur exprime en coordonnees du parent - @return le meme vecteur, exprime en coordonnees locales -*/ -QPointF DiagramTextItem::mapMovementFromParent(const QPointF &movement) const { - // on definit deux points sur le parent - QPointF parent_origin(0.0, 0.0); - QPointF parent_movement_point(movement); - - // on les mappe sur ce QGraphicsItem - QPointF local_origin(mapFromParent(parent_origin)); - QPointF local_movement_point(mapFromParent(parent_movement_point)); - - // on calcule le vecteur represente par ces deux points - return(local_movement_point - local_origin); -} - void DiagramTextItem::setFontSize(int &s) { setFont(QETApp::diagramTextsFont(s)); } @@ -269,6 +231,8 @@ void DiagramTextItem::mousePressEvent (QGraphicsSceneMouseEvent *event) { if (event -> modifiers() & Qt::ControlModifier) { setSelected(!isSelected()); } + //Save the pos of item at the beggining of the movement + m_mouse_to_origin_movement = pos() - event->scenePos(); QGraphicsTextItem::mousePressEvent(event); } @@ -288,12 +252,10 @@ void DiagramTextItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { QPointF old_pos = pos(); - //Save the pos of item at the beggining of the movement - if (m_first_move) - m_mouse_to_origin_movement = old_pos - event->buttonDownScenePos(Qt::LeftButton); - //Set the actual pos - setPos(event->scenePos() + m_mouse_to_origin_movement); + QPointF new_pos = event->scenePos() + m_mouse_to_origin_movement; + event->modifiers() == Qt::ControlModifier ? setPos(new_pos) : setPos(Diagram::snapToGrid(new_pos)); + //Update the actual movement for other selected item if (diagram_) @@ -328,33 +290,6 @@ void DiagramTextItem::applyRotation(const qreal &angle) { setRotation(QET::correctAngle(rotation()+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 -*/ -void DiagramTextItem::setPos(const QPointF &p) { - if (p == pos()) return; - // pas la peine de positionner sur la grille si l'element n'est pas sur un Diagram - if (scene()) { - // arrondit l'abscisse a 10 px pres - int p_x = qRound(p.x() / (Diagram::xGrid * 1.0)) * Diagram::xGrid; - // arrondit l'ordonnee a 10 px pres - int p_y = qRound(p.y() / (Diagram::yGrid * 1.0)) * Diagram::yGrid; - QGraphicsTextItem::setPos(p_x, p_y); - } else QGraphicsTextItem::setPos(p); -} - -/** - Change la position du champ de texte en veillant a ce que l'il - reste sur la grille du schema auquel il appartient. - @param x Nouvelle abscisse de l'element - @param y Nouvelle ordonnee de l'element -*/ -void DiagramTextItem::setPos(qreal x, qreal y) { - setPos(QPointF(x, y)); -} - /// Rend le champ de texte non focusable void DiagramTextItem::setNonFocusable() { setFlag(QGraphicsTextItem::ItemIsFocusable, false); diff --git a/sources/qetgraphicsitem/diagramtextitem.h b/sources/qetgraphicsitem/diagramtextitem.h index 15b408900..ce128d3fc 100644 --- a/sources/qetgraphicsitem/diagramtextitem.h +++ b/sources/qetgraphicsitem/diagramtextitem.h @@ -36,6 +36,9 @@ class DiagramTextItem : public QGraphicsTextItem { DiagramTextItem(QGraphicsItem * = 0, Diagram * = 0); DiagramTextItem(const QString &, QGraphicsItem * = 0, Diagram * = 0); virtual ~DiagramTextItem(); + + private: + void build(); // attributes public: @@ -52,16 +55,12 @@ class DiagramTextItem : public QGraphicsTextItem { Diagram *diagram() const; virtual void fromXml(const QDomElement &) = 0; virtual QDomElement toXml(QDomDocument &) const = 0; - virtual void setPos(const QPointF &); - virtual void setPos(qreal, qreal); qreal rotationAngle() const; void setRotationAngle(const qreal &); void rotateBy(const qreal &); void edit(); - QPointF mapMovementToScene(const QPointF &) const; QPointF mapMovementFromScene(const QPointF &) const; QPointF mapMovementToParent(const QPointF &) const; - QPointF mapMovementFromParent(const QPointF &) const; void setFontSize(int &s); void setNoEditable(bool e = true) {no_editable = e;} diff --git a/sources/qetgraphicsitem/elementtextitem.cpp b/sources/qetgraphicsitem/elementtextitem.cpp index 53aeab2fc..93afcd026 100644 --- a/sources/qetgraphicsitem/elementtextitem.cpp +++ b/sources/qetgraphicsitem/elementtextitem.cpp @@ -62,23 +62,6 @@ Element *ElementTextItem::parentElement() const { return(parent_element_); } -/** - Modifie la position du champ de texte - @param pos La nouvelle position du champ de texte -*/ -void ElementTextItem::setPos(const QPointF &pos) { - QGraphicsTextItem::setPos(pos); -} - -/** - Modifie la position du champ de texte - @param x La nouvelle abscisse du champ de texte - @param y La nouvelle ordonnee du champ de texte -*/ -void ElementTextItem::setPos(qreal x, qreal y) { - setPos(QPointF(x, y)); -} - /** Permet de lire le texte a mettre dans le champ a partir d'un element XML. Cette methode se base sur la position du champ pour assigner ou non la diff --git a/sources/qetgraphicsitem/elementtextitem.h b/sources/qetgraphicsitem/elementtextitem.h index a672063a9..a05956c6b 100644 --- a/sources/qetgraphicsitem/elementtextitem.h +++ b/sources/qetgraphicsitem/elementtextitem.h @@ -57,8 +57,6 @@ class ElementTextItem : public DiagramTextItem { void setFollowParentRotations(bool); void fromXml(const QDomElement &); QDomElement toXml(QDomDocument &) const; - void setPos(const QPointF &); - void setPos(qreal, qreal); void setOriginalPos(const QPointF &); QPointF originalPos() const; void setOriginalRotationAngle(const qreal &);