mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2026-05-08 09:30:00 +02:00
Bug fix: element text item move strange when element is rotated. (my apologies for this weird bug)
git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@3399 bfdf4180-ca20-0410-9c96-a3a8aa849046
This commit is contained in:
@@ -110,6 +110,25 @@ 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.
|
||||
@@ -120,11 +139,11 @@ QPointF DiagramTextItem::mapMovementFromScene(const QPointF &movement) const {
|
||||
// on definit deux points sur la scene
|
||||
QPointF scene_origin(0.0, 0.0);
|
||||
QPointF scene_movement_point(movement);
|
||||
|
||||
|
||||
// on les mappe sur ce QGraphicsItem
|
||||
QPointF local_origin(mapFromScene(scene_origin));
|
||||
QPointF local_movement_point(mapFromScene(scene_movement_point));
|
||||
|
||||
|
||||
// on calcule le vecteur represente par ces deux points
|
||||
return(local_movement_point - local_origin);
|
||||
}
|
||||
@@ -139,15 +158,34 @@ QPointF DiagramTextItem::mapMovementToParent(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 parent_origin(mapToParent(local_origin));
|
||||
QPointF parent_movement_point(mapToParent(local_movement_point));
|
||||
|
||||
|
||||
// on calcule le vecteur represente par ces deux points
|
||||
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));
|
||||
}
|
||||
|
||||
@@ -59,8 +59,10 @@ class DiagramTextItem : public QGraphicsTextItem {
|
||||
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;}
|
||||
|
||||
|
||||
@@ -18,6 +18,8 @@
|
||||
#include "elementtextitem.h"
|
||||
#include "element.h"
|
||||
#include <QTextDocument>
|
||||
#include "diagram.h"
|
||||
#include "diagramcommands.h"
|
||||
|
||||
/**
|
||||
Constructeur
|
||||
@@ -183,22 +185,76 @@ void ElementTextItem::applyRotation(const qreal &angle) {
|
||||
|
||||
/**
|
||||
* @brief ElementTextItem::mouseMoveEvent
|
||||
* @param event
|
||||
* @param e
|
||||
*/
|
||||
void ElementTextItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) {
|
||||
if (parent_element_)
|
||||
parent_element_->setHighlighted(true);
|
||||
void ElementTextItem::mouseMoveEvent(QGraphicsSceneMouseEvent *e) {
|
||||
if (textInteractionFlags() & Qt::TextEditable) {
|
||||
DiagramTextItem::mouseMoveEvent(e);
|
||||
} else if ((flags() & QGraphicsItem::ItemIsMovable) && (e -> buttons() & Qt::LeftButton)) {
|
||||
QPointF old_pos = pos();
|
||||
|
||||
DiagramTextItem::mouseMoveEvent(event);
|
||||
/*
|
||||
* Use e -> pos() directly will be have for behavior to pos the origin
|
||||
* of the text field to the position pointed by the cursor, that isn't the wanted effect.
|
||||
* Instead of this, we apply to the actual pos,
|
||||
* the vector defined by the movement of cursor since the last pos clicked by left button
|
||||
*/
|
||||
QPointF movement = e -> pos() - e -> buttonDownPos(Qt::LeftButton);
|
||||
|
||||
/*
|
||||
* the method pos() and setPos() always work with coordinate of parent item
|
||||
* (or scene if there isn't parent) we don't forget to map the movemement to parent
|
||||
* before applyRotation
|
||||
*/
|
||||
QPointF new_pos = pos() + mapMovementToParent(movement);
|
||||
e -> modifiers() == Qt::ControlModifier ? setPos(new_pos) : setPos(Diagram::snapToGrid(new_pos));
|
||||
|
||||
Diagram *diagram_ptr = diagram();
|
||||
if (diagram_ptr) {
|
||||
if (m_first_move) {
|
||||
//We signal the beginning of movement to the parent diagram
|
||||
int moved_texts_count = diagram_ptr -> beginMoveElementTexts(this);
|
||||
|
||||
//If there is one texte to move, we highlight the parent element.
|
||||
if (moved_texts_count == 1 && parent_element_) {
|
||||
parent_element_ -> setHighlighted(true);
|
||||
parent_element_ -> update();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Comme setPos() n'est pas oblige d'appliquer exactement la
|
||||
valeur qu'on lui fournit, on calcule le mouvement reellement
|
||||
applique.
|
||||
*/
|
||||
QPointF effective_movement = pos() - old_pos;
|
||||
QPointF scene_effective_movement = mapMovementToScene(mapMovementFromParent(effective_movement));
|
||||
|
||||
// on applique le mouvement subi aux autres textes a deplacer
|
||||
diagram_ptr -> continueMoveElementTexts(scene_effective_movement);
|
||||
}
|
||||
} else e -> ignore();
|
||||
|
||||
if (m_first_move) {
|
||||
m_first_move = false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief ElementTextItem::mouseReleaseEvent
|
||||
* @param event
|
||||
* @param e
|
||||
*/
|
||||
void ElementTextItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) {
|
||||
if (parent_element_)
|
||||
parent_element_->setHighlighted(false);
|
||||
void ElementTextItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) {
|
||||
if (Diagram *diagram_ptr = diagram()) {
|
||||
if (parent_element_) {
|
||||
if (parent_element_ -> isHighlighted()) {
|
||||
parent_element_ -> setHighlighted(false);
|
||||
}
|
||||
}
|
||||
|
||||
DiagramTextItem::mouseReleaseEvent(event);
|
||||
diagram_ptr -> endMoveElementTexts();
|
||||
}
|
||||
if (!(e -> modifiers() & Qt::ControlModifier)) {
|
||||
QGraphicsTextItem::mouseReleaseEvent(e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -71,8 +71,8 @@ class ElementTextItem : public DiagramTextItem {
|
||||
protected:
|
||||
virtual void applyRotation(const qreal &);
|
||||
|
||||
virtual void mouseMoveEvent (QGraphicsSceneMouseEvent *event);
|
||||
virtual void mouseReleaseEvent (QGraphicsSceneMouseEvent *event);
|
||||
virtual void mouseMoveEvent (QGraphicsSceneMouseEvent *e);
|
||||
virtual void mouseReleaseEvent (QGraphicsSceneMouseEvent *e);
|
||||
|
||||
private:
|
||||
void build();
|
||||
|
||||
Reference in New Issue
Block a user