Fix wrong behavior when move a text item group, with rotation different than 0

git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@5223 bfdf4180-ca20-0410-9c96-a3a8aa849046
This commit is contained in:
blacksun 2018-01-28 11:16:09 +00:00
parent b626a1344e
commit 8e74d88e65
9 changed files with 56 additions and 101 deletions

View File

@ -1480,13 +1480,9 @@ int Diagram::beginMoveElementTexts(QGraphicsItem *driver_item) {
return(m_element_texts_mover -> beginMovement(this, driver_item)); return(m_element_texts_mover -> beginMovement(this, driver_item));
} }
/** void Diagram::continueMoveElementTexts(QGraphicsSceneMouseEvent *event)
Prend en compte un mouvement composant un deplacement d'ElementTextItems {
@param movement mouvement a ajouter au deplacement en cours m_element_texts_mover->continueMovement(event);
@see ElementTextsMover
*/
void Diagram::continueMoveElementTexts(const QPointF &movement) {
m_element_texts_mover -> continueMovement(movement);
} }
/** /**

View File

@ -194,7 +194,7 @@ class Diagram : public QGraphicsScene
void continueMoveElements(const QPointF &); void continueMoveElements(const QPointF &);
void endMoveElements(); void endMoveElements();
int beginMoveElementTexts(QGraphicsItem * = nullptr); int beginMoveElementTexts(QGraphicsItem * = nullptr);
void continueMoveElementTexts(const QPointF &); void continueMoveElementTexts(QGraphicsSceneMouseEvent *event);
void endMoveElementTexts(); void endMoveElementTexts();
bool usesElement(const ElementsLocation &); bool usesElement(const ElementsLocation &);
bool usesTitleBlockTemplate(const QString &); bool usesTitleBlockTemplate(const QString &);

View File

@ -51,20 +51,8 @@ int ElementTextsMover::beginMovement(Diagram *diagram, QGraphicsItem *driver_ite
m_diagram = diagram; m_diagram = diagram;
m_movement_driver = driver_item; m_movement_driver = driver_item;
m_last_pos = driver_item->pos();
m_items_hash.clear(); m_items_hash.clear();
m_text_count = m_group_count =0; m_text_count = m_group_count =0;
// m_texts_hash.clear();
// m_grps_hash.clear();
// for(QGraphicsItem *item : diagram->selectedItems())
// {
// if (item->type() == ElementTextItem::Type || item->type() == DynamicElementTextItem::Type)
// {
// DiagramTextItem *dti = static_cast<DiagramTextItem *> (item);
// m_texts_hash.insert(dti, dti->pos());
// }
// }
for(QGraphicsItem *item : diagram->selectedItems()) for(QGraphicsItem *item : diagram->selectedItems())
{ {
@ -83,8 +71,6 @@ int ElementTextsMover::beginMovement(Diagram *diagram, QGraphicsItem *driver_ite
} }
} }
// if (!m_texts_hash.size())
// return(-1);
if(m_items_hash.isEmpty()) if(m_items_hash.isEmpty())
return -1; return -1;
@ -92,40 +78,27 @@ int ElementTextsMover::beginMovement(Diagram *diagram, QGraphicsItem *driver_ite
m_movement_running = true; m_movement_running = true;
return m_items_hash.size(); return m_items_hash.size();
// return(m_texts_hash.size());
} }
/** void ElementTextsMover::continueMovement(QGraphicsSceneMouseEvent *event)
* @brief ElementTextsMover::continueMovement
* Add @movement to the current movement
* The movement must be in scene coordinate.
* @param movement
*/
void ElementTextsMover::continueMovement(const QPointF &movement)
{ {
if (!m_movement_running || movement.isNull()) if(!m_movement_running)
return; return;
QPointF move = m_movement_driver->pos() - m_last_pos;
m_last_pos = m_movement_driver->pos();
for(QGraphicsItem *qgi : m_items_hash.keys()) for(QGraphicsItem *qgi : m_items_hash.keys())
{ {
if(qgi == m_movement_driver) if(qgi == m_movement_driver)
continue; continue;
qgi->setPos(qgi->pos() + move); QPointF current_parent_pos;
} QPointF button_down_parent_pos;
// for(DiagramTextItem *text_item : m_texts_hash.keys()) current_parent_pos = qgi->mapToParent(qgi->mapFromScene(event->scenePos()));
// { button_down_parent_pos = qgi->mapToParent(qgi->mapFromScene(event->buttonDownScenePos(Qt::LeftButton)));
// if (text_item == m_movement_driver)
// continue;
// QPointF applied_movement = text_item->mapMovementToParent(text_item->mapMovementFromScene(movement)); QPointF new_pos = m_items_hash.value(qgi) + current_parent_pos - button_down_parent_pos;
// text_item->setPos(text_item->pos() + applied_movement); event->modifiers() == Qt::ControlModifier ? qgi->setPos(new_pos) : qgi->setPos(Diagram::snapToGrid(new_pos));
// } }
} }
/** /**
@ -133,25 +106,7 @@ void ElementTextsMover::continueMovement(const QPointF &movement)
* Finish the movement by pushing an undo command to the parent diagram of text item * Finish the movement by pushing an undo command to the parent diagram of text item
*/ */
void ElementTextsMover::endMovement() void ElementTextsMover::endMovement()
{ {
// //No movement running, or no text to move
// if (!m_movement_running || m_texts_hash.isEmpty())
// return;
// //Movement is null
// DiagramTextItem *dti = m_texts_hash.keys().first();
// if (dti->pos() == m_texts_hash.value(dti))
// return;
// QUndoCommand *undo = new QUndoCommand(m_texts_hash.size() == 1 ? QString(QObject::tr("Déplacer un texte d'élément")) :
// QString(QObject::tr("Déplacer %1 textes d'élément").arg(m_texts_hash.size())));
// for (DiagramTextItem *dti : m_texts_hash.keys())
// {
// QPropertyUndoCommand *child_undo = new QPropertyUndoCommand(dti, "pos", m_texts_hash.value(dti), dti->pos(), undo);
// child_undo->enableAnimation();
// }
//No movement or no items to move //No movement or no items to move
if(!m_movement_running || m_items_hash.isEmpty()) if(!m_movement_running || m_items_hash.isEmpty())
return; return;

View File

@ -25,6 +25,7 @@ class QGraphicsItem;
class DiagramTextItem; class DiagramTextItem;
class Diagram; class Diagram;
class QGraphicsItemGroup; class QGraphicsItemGroup;
class QGraphicsSceneMouseEvent;
/** /**
This class manages the interactive movement of element text items on a This class manages the interactive movement of element text items on a
@ -40,7 +41,7 @@ class ElementTextsMover
public: public:
bool isReady() const; bool isReady() const;
int beginMovement(Diagram *diagram, QGraphicsItem *driver_item = nullptr); int beginMovement(Diagram *diagram, QGraphicsItem *driver_item = nullptr);
void continueMovement(const QPointF &); void continueMovement(QGraphicsSceneMouseEvent *event);
void endMovement(); void endMovement();
private: private:
@ -53,7 +54,6 @@ class ElementTextsMover
QHash <DiagramTextItem *, QPointF> m_texts_hash; QHash <DiagramTextItem *, QPointF> m_texts_hash;
QHash <QGraphicsItemGroup *, QPointF> m_grps_hash; QHash <QGraphicsItemGroup *, QPointF> m_grps_hash;
QHash <QGraphicsItem *, QPointF> m_items_hash; QHash <QGraphicsItem *, QPointF> m_items_hash;
QPointF m_last_pos;
int m_text_count = 0, int m_text_count = 0,
m_group_count = 0; m_group_count = 0;
}; };

View File

@ -501,33 +501,33 @@ void DynamicElementTextItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
* @param event * @param event
*/ */
void DynamicElementTextItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) void DynamicElementTextItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{ {
if(event->buttons() & Qt::LeftButton) if((event->buttons() & Qt::LeftButton) && (flags() & ItemIsMovable))
{ {
QPointF old_pos = pos(); //The old pos if(diagram() && m_first_move)
QPointF movement = event->pos() - event->buttonDownPos(Qt::LeftButton); //The movement since the button down pos diagram()->beginMoveElementTexts(this);
QPointF new_pos = pos() + mapMovementToParent(movement); //The new pos with this event
if(m_first_move)
{
m_initial_position = pos();
if(parentElement())
parentElement()->setHighlighted(true);
}
QPointF current_parent_pos;
QPointF button_down_parent_pos;
current_parent_pos = mapToParent(mapFromScene(event->scenePos()));
button_down_parent_pos = mapToParent(mapFromScene(event->buttonDownScenePos(Qt::LeftButton)));
QPointF new_pos = m_initial_position + current_parent_pos - button_down_parent_pos;
event->modifiers() == Qt::ControlModifier ? setPos(new_pos) : setPos(Diagram::snapToGrid(new_pos)); event->modifiers() == Qt::ControlModifier ? setPos(new_pos) : setPos(Diagram::snapToGrid(new_pos));
if(m_parent_element && m_parent_element->diagram()) if(diagram())
{ diagram()->continueMoveElementTexts(event);
Diagram *diagram = m_parent_element->diagram(); } else {
if(m_first_move)
{
if(diagram->beginMoveElementTexts(this) == 1)
m_parent_element->setHighlighted(true);
}
//Because setPos() can be snaped to grid or not, we calcule the real movement
QPointF effective_movement = pos() - old_pos;
QPointF scene_effective_movement = mapMovementToScene(mapMovementFromParent(effective_movement));
diagram->continueMoveElementTexts(scene_effective_movement);
}
}
else
event->ignore(); event->ignore();
}
if(m_first_move) if(m_first_move)
m_first_move = false; m_first_move = false;
} }

View File

@ -152,6 +152,7 @@ class DynamicElementTextItem : public DiagramTextItem
CrossRefItem *m_Xref_item = nullptr; CrossRefItem *m_Xref_item = nullptr;
QGraphicsTextItem *m_slave_Xref_item = nullptr; QGraphicsTextItem *m_slave_Xref_item = nullptr;
qreal m_text_width = -1; qreal m_text_width = -1;
QPointF m_initial_position;
}; };
#endif // DYNAMICELEMENTTEXTITEM_H #endif // DYNAMICELEMENTTEXTITEM_H

View File

@ -272,7 +272,7 @@ void ElementTextItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) {
QPointF scene_effective_movement = mapMovementToScene(mapMovementFromParent(effective_movement)); QPointF scene_effective_movement = mapMovementToScene(mapMovementFromParent(effective_movement));
// on applique le mouvement subi aux autres textes a deplacer // on applique le mouvement subi aux autres textes a deplacer
diagram_ptr -> continueMoveElementTexts(scene_effective_movement); diagram_ptr -> continueMoveElementTexts(event);
} }
} else event -> ignore(); } else event -> ignore();

View File

@ -394,28 +394,31 @@ void ElementTextItemGroup::mousePressEvent(QGraphicsSceneMouseEvent *event)
*/ */
void ElementTextItemGroup::mouseMoveEvent(QGraphicsSceneMouseEvent *event) void ElementTextItemGroup::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{ {
if(isSelected() && event->buttons() & Qt::LeftButton) if((event->buttons() & Qt::LeftButton) && (flags() & ItemIsMovable))
{ {
if(diagram() && m_first_move) if(diagram() && m_first_move)
diagram()->beginMoveElementTexts(this); diagram()->beginMoveElementTexts(this);
QPointF old_pos = pos();
if(m_first_move) if(m_first_move)
{ {
m_mouse_to_origin_movement = old_pos - event->buttonDownScenePos(Qt::LeftButton); m_initial_position = pos();
if(parentElement()) if(parentElement())
parentElement()->setHighlighted(true); parentElement()->setHighlighted(true);
} }
QPointF expected_pos = event->scenePos() + m_mouse_to_origin_movement; QPointF current_parent_pos;
event->modifiers() == Qt::ControlModifier ? setPos(expected_pos) : setPos(Diagram::snapToGrid(expected_pos)); QPointF button_down_parent_pos;
current_parent_pos = mapToParent(mapFromScene(event->scenePos()));
button_down_parent_pos = mapToParent(mapFromScene(event->buttonDownScenePos(Qt::LeftButton)));
QPointF new_pos = m_initial_position + current_parent_pos - button_down_parent_pos;
event->modifiers() == Qt::ControlModifier ? setPos(new_pos) : setPos(Diagram::snapToGrid(new_pos));
QPointF effective_movement = pos() - old_pos;
if(diagram()) if(diagram())
diagram()->continueMoveElementTexts(effective_movement); diagram()->continueMoveElementTexts(event);
} } else {
else
event->ignore(); event->ignore();
}
if(m_first_move) if(m_first_move)
m_first_move = false; m_first_move = false;

View File

@ -91,7 +91,7 @@ class ElementTextItemGroup : public QObject, public QGraphicsItemGroup
Qt::Alignment m_alignment = Qt::AlignJustify; Qt::Alignment m_alignment = Qt::AlignJustify;
QString m_name; QString m_name;
bool m_first_move = true; bool m_first_move = true;
QPointF m_mouse_to_origin_movement; QPointF m_initial_position;
int m_vertical_adjustment = 0; int m_vertical_adjustment = 0;
CrossRefItem *m_Xref_item = nullptr; CrossRefItem *m_Xref_item = nullptr;
Element *m_parent_element = nullptr; Element *m_parent_element = nullptr;