diff --git a/sources/diagram.cpp b/sources/diagram.cpp index 61d7c0724..9919c12fd 100644 --- a/sources/diagram.cpp +++ b/sources/diagram.cpp @@ -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); } /** diff --git a/sources/diagram.h b/sources/diagram.h index 44151a677..8210d6b7b 100644 --- a/sources/diagram.h +++ b/sources/diagram.h @@ -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 &); diff --git a/sources/elementtextsmover.cpp b/sources/elementtextsmover.cpp index 861ef989e..6b25eff51 100644 --- a/sources/elementtextsmover.cpp +++ b/sources/elementtextsmover.cpp @@ -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 (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); - } - -// for(DiagramTextItem *text_item : m_texts_hash.keys()) -// { -// if (text_item == m_movement_driver) -// continue; + 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 applied_movement = text_item->mapMovementToParent(text_item->mapMovementFromScene(movement)); -// text_item->setPos(text_item->pos() + applied_movement); -// } + 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)); + } } /** @@ -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 */ 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; diff --git a/sources/elementtextsmover.h b/sources/elementtextsmover.h index 3b7ac2b2c..c9ff9d88f 100644 --- a/sources/elementtextsmover.h +++ b/sources/elementtextsmover.h @@ -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 m_texts_hash; QHash m_grps_hash; QHash m_items_hash; - QPointF m_last_pos; int m_text_count = 0, m_group_count = 0; }; diff --git a/sources/qetgraphicsitem/dynamicelementtextitem.cpp b/sources/qetgraphicsitem/dynamicelementtextitem.cpp index 66de5e222..90b995440 100644 --- a/sources/qetgraphicsitem/dynamicelementtextitem.cpp +++ b/sources/qetgraphicsitem/dynamicelementtextitem.cpp @@ -501,33 +501,33 @@ void DynamicElementTextItem::mousePressEvent(QGraphicsSceneMouseEvent *event) * @param 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 + if(diagram() && m_first_move) + diagram()->beginMoveElementTexts(this); + + 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)); - if(m_parent_element && m_parent_element->diagram()) - { - Diagram *diagram = m_parent_element->diagram(); - - 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 + if(diagram()) + diagram()->continueMoveElementTexts(event); + } else { event->ignore(); - + } + if(m_first_move) m_first_move = false; } diff --git a/sources/qetgraphicsitem/dynamicelementtextitem.h b/sources/qetgraphicsitem/dynamicelementtextitem.h index d35122a62..1f9a7dbff 100644 --- a/sources/qetgraphicsitem/dynamicelementtextitem.h +++ b/sources/qetgraphicsitem/dynamicelementtextitem.h @@ -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 diff --git a/sources/qetgraphicsitem/elementtextitem.cpp b/sources/qetgraphicsitem/elementtextitem.cpp index 74ef72fe2..1df0df12f 100644 --- a/sources/qetgraphicsitem/elementtextitem.cpp +++ b/sources/qetgraphicsitem/elementtextitem.cpp @@ -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(); diff --git a/sources/qetgraphicsitem/elementtextitemgroup.cpp b/sources/qetgraphicsitem/elementtextitemgroup.cpp index 53b7cc876..db70d73b9 100644 --- a/sources/qetgraphicsitem/elementtextitemgroup.cpp +++ b/sources/qetgraphicsitem/elementtextitemgroup.cpp @@ -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; diff --git a/sources/qetgraphicsitem/elementtextitemgroup.h b/sources/qetgraphicsitem/elementtextitemgroup.h index 04f6e1c7e..90903b58b 100644 --- a/sources/qetgraphicsitem/elementtextitemgroup.h +++ b/sources/qetgraphicsitem/elementtextitemgroup.h @@ -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;