[qet] [4089] Element text mover : use QPropertyUndoCommand instead of MoveElementsTextsCommand.

[ Thread Index | Date Index | More lists.tuxfamily.org/qet Archives ]


Revision: 4089
Author:   blacksun
Date:     2015-08-07 21:45:00 +0200 (Fri, 07 Aug 2015)
Log Message:
-----------
Element text mover : use QPropertyUndoCommand instead of MoveElementsTextsCommand.
Remove class MoveElementsTextsCommand

Modified Paths:
--------------
    trunk/sources/diagramcommands.cpp
    trunk/sources/diagramcommands.h
    trunk/sources/elementtextsmover.cpp
    trunk/sources/elementtextsmover.h

Modified: trunk/sources/diagramcommands.cpp
===================================================================
--- trunk/sources/diagramcommands.cpp	2015-08-06 17:08:45 UTC (rev 4088)
+++ trunk/sources/diagramcommands.cpp	2015-08-07 19:45:00 UTC (rev 4089)
@@ -363,65 +363,6 @@
 }
 
 /**
-		Constructeur
-		@param diagram Schema sur lequel on deplace des champs de texte
-		@param texts Liste des textes deplaces
-		@param m translation subie par les elements
-		@param parent QUndoCommand parent
-*/
-MoveElementsTextsCommand::MoveElementsTextsCommand(
-		Diagram *diagram,
-		const QSet<ElementTextItem *> &texts,
-		const QPointF &m,
-		QUndoCommand *parent
-) :
-		QUndoCommand(parent),
-		diagram(diagram),
-		texts_to_move(texts),
-		movement(m),
-		first_redo(true)
-{
-		QString moved_content_sentence = QET::ElementsAndConductorsSentence(0, 0, texts_to_move.count());
-		setText(
-				QString(
-						QObject::tr(
-								"déplacer %1",
-								"undo caption - %1 is a sentence listing the moved content"
-						).arg(moved_content_sentence)
-				)
-		);
-}
-
-/// Destructeur
-MoveElementsTextsCommand::~MoveElementsTextsCommand() {
-}
-
-/// annule le deplacement
-void MoveElementsTextsCommand::undo() {
-		diagram -> showMe();
-		move(-movement);
-}
-
-/// refait le deplacement
-void MoveElementsTextsCommand::redo() {
-		diagram -> showMe();
-		if (first_redo) first_redo = false;
-		else move(movement);
-}
-
-/**
-		deplace les elements et conducteurs
-		@param actual_movement translation a effectuer sur les elements et conducteurs
-*/
-void MoveElementsTextsCommand::move(const QPointF &actual_movement) {
-		// deplace les textes
-		foreach(ElementTextItem *text, texts_to_move) {
-				QPointF applied_movement = text -> mapMovementToParent(text -> mapMovementFromScene(actual_movement));
-				text -> setPos(text -> pos() + applied_movement);
-		}
-}
-
-/**
 	Constructeur
 	@param diagram Schema sur lequel on deplace des champs de texte
 	@param texts Textes deplaces : chaque ConductorTextItem est associe a un

Modified: trunk/sources/diagramcommands.h
===================================================================
--- trunk/sources/diagramcommands.h	2015-08-06 17:08:45 UTC (rev 4088)
+++ trunk/sources/diagramcommands.h	2015-08-07 19:45:00 UTC (rev 4089)
@@ -181,33 +181,6 @@
 	bool first_redo;
 };
 
-class MoveElementsTextsCommand : public QUndoCommand {
-		// constructors, destructor
-	public:
-		MoveElementsTextsCommand(Diagram *, const QSet<ElementTextItem *> &, const QPointF &m, QUndoCommand * = 0);
-		virtual ~MoveElementsTextsCommand();
-
-	private:
-		MoveElementsTextsCommand(const MoveElementsTextsCommand &);
-
-	// methods
-	public:
-		virtual void undo();
-		virtual void redo();
-		virtual void move(const QPointF &);
-
-	// attributes
-	private:
-		/// diagram the movement takes place on.
-		Diagram *diagram;
-		/// text items to be moved
-		QSet<ElementTextItem *> texts_to_move;
-		/// applied movement
-		QPointF movement;
-		/// prevent the first call to redo()
-		bool first_redo;
-};
-
 /**
 	This command moves text items related to conductors on a particular
 	diagram.

Modified: trunk/sources/elementtextsmover.cpp
===================================================================
--- trunk/sources/elementtextsmover.cpp	2015-08-06 17:08:45 UTC (rev 4088)
+++ trunk/sources/elementtextsmover.cpp	2015-08-07 19:45:00 UTC (rev 4089)
@@ -16,126 +16,109 @@
 	along with QElectroTech.  If not, see <http://www.gnu.org/licenses/>.
 */
 #include "elementtextsmover.h"
-#include "conductor.h"
 #include "elementtextitem.h"
 #include "diagram.h"
-#include "diagramcommands.h"
-#include "element.h"
-#include "independenttextitem.h"
+#include "QPropertyUndoCommand/qpropertyundocommand.h"
 
 /**
-	Constructeur
-*/
+ * @brief ElementTextsMover::ElementTextsMover
+ */
 ElementTextsMover::ElementTextsMover() :
 	movement_running_(false),
-	current_movement_(),
-	diagram_(0),
-	movement_driver_(0),
-	moved_texts_()
-{
-	
-}
+	diagram_(nullptr),
+	movement_driver_(nullptr)
+{}
 
 /**
-	Destructeur
-*/
-ElementTextsMover::~ElementTextsMover() {
-}
-
-/**
-	@return true si ce gestionnaire de deplacement est pret a etre utilise,
-	false sinon. Un gestionnaire de deplacement est pret a etre utilise a partir
-	du moment ou le mouvement precedemment gere n'est plus en cours.
-*/
+ * @brief ElementTextsMover::isReady
+ * @return true if this ElementTextsMover is ready to process a new movement.
+ * False if this ElementTextsMover is actually process a movement
+ */
 bool ElementTextsMover::isReady() const {
 	return(!movement_running_);
 }
 
 /**
-	Demarre un nouveau mouvement d'ElementTextItems
-	@param diagram Schema sur lequel se deroule le deplacement
-	@param driver_item Item deplace par la souris et ne necessitant donc pas
-	d'etre deplace lors des appels a continueMovement.
-	@return le nombre d'items concernes par le deplacement, ou -1 si le
-	mouvement n'a pas ete initie
-*/
-int ElementTextsMover::beginMovement(Diagram *diagram, QGraphicsItem *driver_item) {
-	// il ne doit pas y avoir de mouvement en cours
-	if (movement_running_) return(-1);
-	
-	// on s'assure que l'on dispose d'un schema pour travailler
-	if (!diagram) return(-1);
+ * @brief ElementTextsMover::beginMovement
+ * Begin a movement
+ * @param diagram : diagram where the movement is apply
+ * @param driver_item : item moved by the mouse
+ * @return : the number of moved text (driver_item include), or -1 if this ElementTextsMover can't begin a movement
+ */
+int ElementTextsMover::beginMovement(Diagram *diagram, QGraphicsItem *driver_item)
+{
+	if (movement_running_ || !diagram) return(-1);
+
 	diagram_ = diagram;
-	
-	// on prend en compte le driver_item
 	movement_driver_ = driver_item;
-	
-	// au debut du mouvement, le deplacement est nul
-	current_movement_ = QPointF(0.0, 0.0);
-	
-	// on stocke dans cet objet les items concernes par le deplacement
-	moved_texts_.clear();
-	foreach(QGraphicsItem *item, diagram -> selectedItems()) {
-		if (ElementTextItem *text_item = qgraphicsitem_cast<ElementTextItem *>(item)) {
-			moved_texts_ << text_item;
+	m_texts_item_H.clear();
+
+	foreach(QGraphicsItem *item, diagram -> selectedItems())
+	{
+		if (item->type() == ElementTextItem::Type)
+		{
+			ElementTextItem *eti = static_cast<ElementTextItem *> (item);
+			m_texts_item_H.insert(eti, eti->pos());
 		}
 	}
 	
-	// on s'assure qu'il y a quelque chose a deplacer
-	if (!moved_texts_.count()) return(-1);
+	if (!m_texts_item_H.size()) return(-1);
 	
-	// a ce stade, on dispose de toutes les informations necessaires pour
-	// prendre en compte les mouvements
-	
-	// il y a desormais un mouvement en cours
 	movement_running_ = true;
 	
-	return(moved_texts_.count());
+	return(m_texts_item_H.size());
 }
 
 /**
-	Ajoute un mouvement au deplacement en cours. Cette methode
-	@param movement mouvement a ajouter au deplacement en cours
-*/
-void ElementTextsMover::continueMovement(const QPointF &movement) {
-	// un mouvement doit avoir ete initie
-	if (!movement_running_) return;
+ * @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 (!movement_running_ || movement.isNull()) return;
 	
-	// inutile de faire quoi que ce soit s'il n'y a pas eu de mouvement concret
-	if (movement.isNull()) return;
-	
-	// prise en compte du mouvement
-	current_movement_ += movement;
-	
-	// deplace les elements selectionnes
-	foreach(ElementTextItem *text_item, moved_texts_) {
-		if (movement_driver_ && text_item == movement_driver_) continue;
+	foreach(ElementTextItem *text_item, m_texts_item_H.keys())
+	{
+		if (text_item == movement_driver_) continue;
 		QPointF applied_movement = text_item -> mapMovementToParent(text_item-> mapMovementFromScene(movement));
 		text_item -> setPos(text_item -> pos() + applied_movement);
 	}
 }
 
 /**
-	Termine le deplacement en creant un objet d'annulation et en l'ajoutant a
-	la QUndoStack du schema concerne.
-	@see Diagram::undoStack()
-*/
-void ElementTextsMover::endMovement() {
-	// un mouvement doit avoir ete initie
-	if (!movement_running_) return;
+ * @brief ElementTextsMover::endMovement
+ * 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 (!movement_running_ || m_texts_item_H.isEmpty()) return;
+		//Movement is null
+	ElementTextItem *eti = m_texts_item_H.keys().first();
+	if (eti->pos() == m_texts_item_H.value(eti)) return;
 	
-	// inutile de faire quoi que ce soit s'il n'y a pas eu de mouvement concret
-	if (!current_movement_.isNull()) {
-		// cree un objet d'annulation pour le mouvement ainsi realise
-		MoveElementsTextsCommand*undo_object = new MoveElementsTextsCommand(
-			diagram_,
-			moved_texts_,
-			current_movement_
-		);
-		
-		diagram_ -> undoStack().push(undo_object);
+	QPropertyUndoCommand *undo = nullptr;
+
+	foreach (ElementTextItem *eti, m_texts_item_H.keys())
+	{
+		if (undo)
+		{
+			QPropertyUndoCommand *child_undo = new QPropertyUndoCommand(eti, "pos", m_texts_item_H.value(eti), eti->pos(), undo);
+			child_undo->enableAnimation();
+		}
+		else
+		{
+			undo = new QPropertyUndoCommand(eti, "pos", m_texts_item_H.value(eti), eti->pos());
+			undo->enableAnimation();
+			QString txt = m_texts_item_H.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_item_H.size()));
+			undo->setText(txt);
+		}
 	}
+
+	diagram_->undoStack().push(undo);
 	
-	// il n'y a plus de mouvement en cours
 	movement_running_ = false;
 }

Modified: trunk/sources/elementtextsmover.h
===================================================================
--- trunk/sources/elementtextsmover.h	2015-08-06 17:08:45 UTC (rev 4088)
+++ trunk/sources/elementtextsmover.h	2015-08-07 19:45:00 UTC (rev 4089)
@@ -17,35 +17,35 @@
 */
 #ifndef ELEMENT_TEXTS_MOVER_H
 #define ELEMENT_TEXTS_MOVER_H
-#include <QtWidgets>
-#include "diagramcontent.h"
+
+#include <QSet>
+#include <QPointF>
+
+class QGraphicsItem;
 class ElementTextItem;
 class Diagram;
+
 /**
 	This class manages the interactive movement of element text items on a
 	particular diagram.
 */
-class ElementTextsMover {
-	// constructors, destructor
+class ElementTextsMover
+{
 	public:
-	ElementTextsMover();
-	virtual ~ElementTextsMover();
+		ElementTextsMover();
 	private:
-	ElementTextsMover(const ElementTextsMover &);
+		ElementTextsMover(const ElementTextsMover &);
 	
-	// methods
 	public:
-	bool isReady() const;
-	int  beginMovement(Diagram *, QGraphicsItem * = 0);
-	void continueMovement(const QPointF &);
-	void endMovement();
+		bool isReady() const;
+		int  beginMovement(Diagram *, QGraphicsItem * = 0);
+		void continueMovement(const QPointF &);
+		void endMovement();
 	
-	// attributes
 	private:
-	bool movement_running_;
-	QPointF current_movement_;
-	Diagram *diagram_;
-	QGraphicsItem *movement_driver_;
-	QSet<ElementTextItem *> moved_texts_;
+		bool movement_running_;
+		Diagram *diagram_;
+		QGraphicsItem *movement_driver_;
+		QHash <ElementTextItem *, QPointF> m_texts_item_H;
 };
 #endif


Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/