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));
}
/**
Prend en compte un mouvement composant un deplacement d'ElementTextItems
@param movement mouvement a ajouter au deplacement en cours
@see ElementTextsMover
*/
void Diagram::continueMoveElementTexts(const QPointF &movement) {
m_element_texts_mover -> continueMovement(movement);
void Diagram::continueMoveElementTexts(QGraphicsSceneMouseEvent *event)
{
m_element_texts_mover->continueMovement(event);
}
/**

View File

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

View File

@ -51,20 +51,8 @@ int ElementTextsMover::beginMovement(Diagram *diagram, QGraphicsItem *driver_ite
m_diagram = diagram;
m_movement_driver = driver_item;
m_last_pos = driver_item->pos();
m_items_hash.clear();
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())
{
@ -83,8 +71,6 @@ int ElementTextsMover::beginMovement(Diagram *diagram, QGraphicsItem *driver_ite
}
}
// if (!m_texts_hash.size())
// return(-1);
if(m_items_hash.isEmpty())
return -1;
@ -92,40 +78,27 @@ int ElementTextsMover::beginMovement(Diagram *diagram, QGraphicsItem *driver_ite
m_movement_running = true;
return m_items_hash.size();
// return(m_texts_hash.size());
}
/**
* @brief ElementTextsMover::continueMovement
* Add @movement to the current movement
* The movement must be in scene coordinate.
* @param movement
*/
void ElementTextsMover::continueMovement(const QPointF &movement)
void ElementTextsMover::continueMovement(QGraphicsSceneMouseEvent *event)
{
if (!m_movement_running || movement.isNull())
if(!m_movement_running)
return;
QPointF move = m_movement_driver->pos() - m_last_pos;
m_last_pos = m_movement_driver->pos();
for(QGraphicsItem *qgi : m_items_hash.keys())
{
if(qgi == m_movement_driver)
continue;
qgi->setPos(qgi->pos() + move);
QPointF current_parent_pos;
QPointF button_down_parent_pos;
current_parent_pos = qgi->mapToParent(qgi->mapFromScene(event->scenePos()));
button_down_parent_pos = qgi->mapToParent(qgi->mapFromScene(event->buttonDownScenePos(Qt::LeftButton)));
QPointF new_pos = m_items_hash.value(qgi) + current_parent_pos - button_down_parent_pos;
event->modifiers() == Qt::ControlModifier ? qgi->setPos(new_pos) : qgi->setPos(Diagram::snapToGrid(new_pos));
}
// for(DiagramTextItem *text_item : m_texts_hash.keys())
// {
// if (text_item == m_movement_driver)
// continue;
// QPointF applied_movement = text_item->mapMovementToParent(text_item->mapMovementFromScene(movement));
// text_item->setPos(text_item->pos() + applied_movement);
// }
}
/**
@ -134,24 +107,6 @@ void ElementTextsMover::continueMovement(const QPointF &movement)
*/
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
if(!m_movement_running || m_items_hash.isEmpty())
return;

View File

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

View File

@ -502,31 +502,31 @@ void DynamicElementTextItem::mousePressEvent(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
QPointF movement = event->pos() - event->buttonDownPos(Qt::LeftButton); //The movement since the button down pos
QPointF new_pos = pos() + mapMovementToParent(movement); //The new pos with this event
event->modifiers() == Qt::ControlModifier ? setPos(new_pos) : setPos(Diagram::snapToGrid(new_pos));
if(m_parent_element && m_parent_element->diagram())
{
Diagram *diagram = m_parent_element->diagram();
if(diagram() && m_first_move)
diagram()->beginMoveElementTexts(this);
if(m_first_move)
{
if(diagram->beginMoveElementTexts(this) == 1)
m_parent_element->setHighlighted(true);
m_initial_position = pos();
if(parentElement())
parentElement()->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
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));
if(diagram())
diagram()->continueMoveElementTexts(event);
} else {
event->ignore();
}
if(m_first_move)
m_first_move = false;

View File

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

View File

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

View File

@ -394,28 +394,31 @@ void ElementTextItemGroup::mousePressEvent(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)
diagram()->beginMoveElementTexts(this);
QPointF old_pos = pos();
if(m_first_move)
{
m_mouse_to_origin_movement = old_pos - event->buttonDownScenePos(Qt::LeftButton);
m_initial_position = pos();
if(parentElement())
parentElement()->setHighlighted(true);
}
QPointF expected_pos = event->scenePos() + m_mouse_to_origin_movement;
event->modifiers() == Qt::ControlModifier ? setPos(expected_pos) : setPos(Diagram::snapToGrid(expected_pos));
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));
QPointF effective_movement = pos() - old_pos;
if(diagram())
diagram()->continueMoveElementTexts(effective_movement);
}
else
diagram()->continueMoveElementTexts(event);
} else {
event->ignore();
}
if(m_first_move)
m_first_move = false;

View File

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