[qet] [3594] Finish a move element with free terminal aligned with other terminal from other element , will create auto creation of conductor

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


Revision: 3594
Author:   blacksun
Date:     2015-01-09 18:18:16 +0100 (Fri, 09 Jan 2015)
Log Message:
-----------
Finish a move element with free terminal aligned with other terminal from other element, will create auto creation of conductor

Modified Paths:
--------------
    trunk/sources/conductorautonumerotation.cpp
    trunk/sources/conductorautonumerotation.h
    trunk/sources/diagramcommands.cpp
    trunk/sources/diagramcommands.h
    trunk/sources/elementsmover.cpp
    trunk/sources/qetgraphicsitem/conductor.cpp
    trunk/sources/qetgraphicsitem/conductor.h
    trunk/sources/qetgraphicsitem/element.cpp
    trunk/sources/qetgraphicsitem/element.h
    trunk/sources/qetgraphicsitem/terminal.cpp

Modified: trunk/sources/conductorautonumerotation.cpp
===================================================================
--- trunk/sources/conductorautonumerotation.cpp	2015-01-08 18:59:23 UTC (rev 3593)
+++ trunk/sources/conductorautonumerotation.cpp	2015-01-09 17:18:16 UTC (rev 3594)
@@ -25,13 +25,20 @@
 #include "qet.h"
 
 /**
- *Constructor
- * @param c the conductor to apply automatic numerotation
+ * @brief ConductorAutoNumerotation::ConductorAutoNumerotation
+ * Constructor of autonum, after create a class, call numerate to apply the autonum.
+ * When autonum is applyed, they do with an undo command added to the stack of diagram.
+ * If you give a parent_undo at constructor, the undo command create in this class have parent_undo for parent,
+ * and wasn't added to the stack of diagram (it's the responsabillty of the parent_undo)
+ * @param conductor   : the conductor to apply automatic numerotation
+ * @param diagram     : the diagram of conductor
+ * @param parent_undo : parent undo command
  */
-ConductorAutoNumerotation::ConductorAutoNumerotation(Conductor *c) :
-	m_diagram      (c -> diagram()),
-	conductor_     (c),
-	conductor_list (c -> relatedPotentialConductors())
+ConductorAutoNumerotation::ConductorAutoNumerotation(Conductor *conductor, Diagram *diagram, QUndoCommand *parent_undo) :
+	m_diagram      (diagram),
+	conductor_     (conductor),
+	conductor_list (conductor -> relatedPotentialConductors()),
+	m_parent_undo  (parent_undo)
 {}
 
 /**
@@ -63,7 +70,7 @@
 	if (!QET::eachStrIsEqual(strl)) {
 		PotentialTextsDialog ptd(conductor, conductor->diagramEditor());
 		if ( ptd.exec() == QDialog::Accepted ) {
-			ConductorAutoNumerotation can(conductor);
+			ConductorAutoNumerotation can(conductor, conductor -> diagram());
 			can.applyText(ptd.selectedText());
 		}
 	}
@@ -75,32 +82,39 @@
  */
 void ConductorAutoNumerotation::applyText(QString t) {
 	if (!conductor_) return;
-	if (conductor_list.empty()) {
-		//initialize the corresponding UndoCommand object
-		ChangeConductorPropertiesCommand *ccpc = new ChangeConductorPropertiesCommand (conductor_);
+
+	if (conductor_list.empty())
+	{
+			//initialize the corresponding UndoCommand object
+		ChangeConductorPropertiesCommand *ccpc = new ChangeConductorPropertiesCommand (conductor_, m_parent_undo);
 		ccpc -> setOldSettings (conductor_ -> properties());
 		ConductorProperties cp = conductor_ -> properties();
 		cp.text = t;
 		ccpc -> setNewSettings(cp);
-		m_diagram -> undoStack().push(ccpc);
+		if (!m_parent_undo)
+			m_diagram -> undoStack().push(ccpc);
 	}
-	else {
+	else
+	{
 		QList <Conductor *> clist = conductor_list.toList();
 		clist << conductor_;
 		QList <ConductorProperties> old_properties, new_properties;
 		ConductorProperties cp;
 
-		foreach (Conductor *c, clist) {
+		foreach (Conductor *c, clist)
+		{
 			old_properties << c -> properties();
 			cp = c -> properties();
 			cp.text = t;
 			new_properties << cp;
 		}
-		//initialize the corresponding UndoCommand object
-		ChangeSeveralConductorsPropertiesCommand *cscpc = new ChangeSeveralConductorsPropertiesCommand(clist);
+
+			//initialize the corresponding UndoCommand object
+		ChangeSeveralConductorsPropertiesCommand *cscpc = new ChangeSeveralConductorsPropertiesCommand(clist, m_parent_undo);
 		cscpc -> setOldSettings(old_properties);
 		cscpc -> setNewSettings(new_properties);
-		m_diagram -> undoStack().push(cscpc);
+		if (!m_parent_undo)
+			m_diagram -> undoStack().push(cscpc);
 	}
 }
 

Modified: trunk/sources/conductorautonumerotation.h
===================================================================
--- trunk/sources/conductorautonumerotation.h	2015-01-08 18:59:23 UTC (rev 3593)
+++ trunk/sources/conductorautonumerotation.h	2015-01-09 17:18:16 UTC (rev 3594)
@@ -22,26 +22,29 @@
 
 class Diagram;
 class Conductor;
+class QUndoCommand;
 
-class ConductorAutoNumerotation {
+class ConductorAutoNumerotation
+{
 	public:
-	//constructors & destructor
-	ConductorAutoNumerotation (Conductor *);
+		//constructors & destructor
+		ConductorAutoNumerotation (Conductor *conductor, Diagram *diagram, QUndoCommand *undo_parent = nullptr);
 
-	//methods
-	void numerate();
-	static void checkPotential(Conductor *);
-	void applyText(QString);
+			//methods
+		void        numerate       ();
+		static void checkPotential (Conductor *);
+		void        applyText      (QString);
 
 	private:
-	//methods
-	void numeratePotential ();
-	void numerateNewConductor ();
+			//methods
+		void numeratePotential ();
+		void numerateNewConductor ();
 
-	//attributes
-	Diagram           *m_diagram;
-	Conductor         *conductor_;
-	QSet <Conductor *> conductor_list;
+		//attributes
+		Diagram            *m_diagram;
+		Conductor          *conductor_;
+		QSet <Conductor *>  conductor_list;
+		QUndoCommand       *m_parent_undo;
 };
 
 #endif // CONDUCTORAUTONUMEROTATION_H

Modified: trunk/sources/diagramcommands.cpp
===================================================================
--- trunk/sources/diagramcommands.cpp	2015-01-08 18:59:23 UTC (rev 3593)
+++ trunk/sources/diagramcommands.cpp	2015-01-09 17:18:16 UTC (rev 3594)
@@ -297,12 +297,12 @@
 	const QPointF &m,
 	QUndoCommand *parent
 ) :
-	QUndoCommand(parent),
-	diagram(dia),
-	content_to_move(diagram_content),
-	movement(m),
-	m_anim_group(nullptr),
-	first_redo(true)
+	QUndoCommand    (parent),
+	diagram         (dia),
+	content_to_move (diagram_content),
+	movement        (m),
+	m_anim_group    (nullptr),
+	first_redo      (true)
 {
 	QString moved_content_sentence = content_to_move.sentence(
 		DiagramContent::Elements |
@@ -336,8 +336,9 @@
  */
 void MoveElementsCommand::undo() {
 	diagram -> showMe();
-		m_anim_group->setDirection(QAnimationGroup::Forward);
-		m_anim_group->start();
+	m_anim_group->setDirection(QAnimationGroup::Forward);
+	m_anim_group->start();
+	QUndoCommand::undo();
 }
 
 /**
@@ -353,6 +354,7 @@
 		m_anim_group->setDirection(QAnimationGroup::Backward);
 		m_anim_group->start();
 	}
+	QUndoCommand::redo();
 }
 
 /**
@@ -924,8 +926,7 @@
 	QUndoCommand(QObject::tr("modifier les propri\351t\351s d'un conducteur", "undo caption"), parent),
 	conductor(c),
 	old_settings_set(false),
-	new_settings_set(false),
-	diagram(c->diagram())
+	new_settings_set(false)
 {
 }
 
@@ -950,7 +951,7 @@
 	doivent avoir ete definis a l'aide de setNewSettings et setOldSettings
 */
 void ChangeConductorPropertiesCommand::undo() {
-	diagram -> showMe();
+	if (conductor -> diagram()) conductor -> diagram() -> showMe();
 	if (old_settings_set && new_settings_set) {
 		conductor -> setProperties(old_properties);
 		conductor -> update();
@@ -962,7 +963,7 @@
 	doivent avoir ete definis a l'aide de setNewSettings et setOldSettings
 */
 void ChangeConductorPropertiesCommand::redo() {
-	diagram -> showMe();
+	if (conductor -> diagram()) conductor -> diagram() -> showMe();
 	if (old_settings_set && new_settings_set) {
 		conductor -> setProperties(new_properties);
 		conductor -> update();
@@ -978,8 +979,7 @@
 	QUndoCommand(QObject::tr("modifier les propri\351t\351s de plusieurs conducteurs", "undo caption"), parent),
 	conductors(c),
 	old_settings_set(false),
-	new_settings_set(false),
-	diagram(c.first()->diagram())
+	new_settings_set(false)
 {
 }
 
@@ -1015,7 +1015,7 @@
 	doivent avoir ete definis a l'aide de setNewSettings et setOldSettings
 */
 void ChangeSeveralConductorsPropertiesCommand::undo() {
-	//diagram -> showMe();
+	if (conductors.first() -> diagram()) conductors.first() -> diagram() -> showMe();
 	if (old_settings_set && new_settings_set) {
 		int i=0;
 		foreach(Conductor *c, conductors) {
@@ -1031,7 +1031,7 @@
 	doivent avoir ete definis a l'aide de setNewSettings et setOldSettings
 */
 void ChangeSeveralConductorsPropertiesCommand::redo() {
-	//diagram -> showMe();
+	if (conductors.first() -> diagram()) conductors.first() -> diagram() -> showMe();
 	if (old_settings_set && new_settings_set) {
 
 		//new propertie are the same for each conductor

Modified: trunk/sources/diagramcommands.h
===================================================================
--- trunk/sources/diagramcommands.h	2015-01-08 18:59:23 UTC (rev 3593)
+++ trunk/sources/diagramcommands.h	2015-01-09 17:18:16 UTC (rev 3594)
@@ -60,12 +60,14 @@
 		virtual void undo() {
 			m_diagram -> showMe();
 			m_diagram -> removeItem(m_item);
+			QUndoCommand::undo();
 		}
 
 		virtual void redo() {
 			m_diagram -> showMe();
 			m_diagram -> addItem(m_item);
 			m_item    -> setPos(m_pos);
+			QUndoCommand::redo();
 		}
 
 	private:
@@ -149,21 +151,21 @@
 	This command moves some content on a particular diagram.
 */
 class MoveElementsCommand : public QUndoCommand {
-	// constructors, destructor
+		// constructors, destructor
 	public:
-	MoveElementsCommand(Diagram *, const DiagramContent &, const QPointF &m, QUndoCommand * = 0);
-	virtual ~MoveElementsCommand();
+		MoveElementsCommand(Diagram *, const DiagramContent &, const QPointF &m, QUndoCommand * = 0);
+		virtual ~MoveElementsCommand();
 	private:
-	MoveElementsCommand(const MoveElementsCommand &);
+		MoveElementsCommand(const MoveElementsCommand &);
 	
-	// methods
+		// methods
 	public:
-	virtual void undo();
-	virtual void redo();
-	virtual void move(const QPointF &);
+		virtual void undo();
+		virtual void redo();
+		virtual void move(const QPointF &);
 
 	private:
-	void setupAnimation (QObject * target, const QByteArray &propertyName, const QVariant start, const QVariant end);
+		void setupAnimation (QObject * target, const QByteArray &propertyName, const QVariant start, const QVariant end);
 	
 	// attributes
 	private:
@@ -471,7 +473,6 @@
 	bool old_settings_set;
 	/// track whether post-change properties were set
 	bool new_settings_set;
-	Diagram *diagram;
 };
 
 /**
@@ -507,7 +508,6 @@
 	bool old_settings_set;
 	/// track whether post-change properties were set
 	bool new_settings_set;
-	Diagram *diagram;
 };
 
 class ItemResizerCommand : public QUndoCommand {

Modified: trunk/sources/elementsmover.cpp
===================================================================
--- trunk/sources/elementsmover.cpp	2015-01-08 18:59:23 UTC (rev 3593)
+++ trunk/sources/elementsmover.cpp	2015-01-09 17:18:16 UTC (rev 3594)
@@ -24,6 +24,7 @@
 #include "independenttextitem.h"
 #include "diagramimageitem.h"
 #include "elementtextitem.h"
+#include "conductorautonumerotation.h"
 
 /**
  * @brief ElementsMover::ElementsMover Constructor
@@ -116,23 +117,47 @@
 /**
  * @brief ElementsMover::endMovement
  * Ended the current movement by creating an undo added to the undostack of the diagram.
+ * If there is only one element moved, we try to auto-connect new conductor from this element
+ * and other possible element.
  */
-void ElementsMover::endMovement() {
-	// A movement must be inited
+void ElementsMover::endMovement()
+{
+		// A movement must be inited
 	if (!movement_running_) return;
 	
-	// No need of an undo command if the movement is NULL
+		// No need of an undo command if the movement is NULL
 	if (!current_movement_.isNull()) {
-		// Create an undo object for this new movement
+			// Create an undo object for this new movement
 		MoveElementsCommand *undo_object = new MoveElementsCommand(
 			diagram_,
 			moved_content_,
 			current_movement_
 		);
+
+			//There is only one element moved, we try auto connection of conductor;
+		typedef DiagramContent dc;
+		if (moved_content_.items(dc::TextFields | dc::Images | dc::Shapes).size() == 0 &&
+			moved_content_.items(dc::Elements).size() == 1)
+		{
+			Element *elmt = moved_content_.elements.toList().first();
+
+			while (!elmt -> AlignedFreeTerminals().isEmpty())
+			{
+				QPair <Terminal *, Terminal *> pair = elmt->AlignedFreeTerminals().takeFirst();
+
+				Conductor *conductor = new Conductor(pair.first, pair.second);
+				conductor -> setProperties(diagram_ -> defaultConductorProperties);
+					//Create an undo object for each new auto conductor, with undo_object for parent;
+				new AddItemCommand<Conductor *>(conductor, diagram_, QPointF(), undo_object);
+					//Autonum the new conductor, the undo command associated for this, have for parent undo_object
+				ConductorAutoNumerotation can  (conductor, diagram_, undo_object);
+				can.numerate();
+			};
+		}
 		
 		diagram_ -> undoStack().push(undo_object);
 	}
 	
-	// There is no movement in progress now
+		// There is no movement in progress now
 	movement_running_ = false;
 }

Modified: trunk/sources/qetgraphicsitem/conductor.cpp
===================================================================
--- trunk/sources/qetgraphicsitem/conductor.cpp	2015-01-08 18:59:23 UTC (rev 3593)
+++ trunk/sources/qetgraphicsitem/conductor.cpp	2015-01-09 17:18:16 UTC (rev 3594)
@@ -1381,36 +1381,32 @@
 }
 
 /**
- * @brief Conductor::autoText
- *lance l'autoNumerotation sur ce conducteur
- */
-void Conductor::autoText() {
-	ConductorAutoNumerotation can(this);
-	can.numerate();
-}
-
-/**
 	Met a jour les proprietes du conducteur apres modification du champ de texte affiche
 */
 void Conductor::displayedTextChanged() {
 	// verifie que le texte a reellement change
 	if (text_item -> toPlainText() == properties_.text) return;
 	
-	if (Diagram *my_diagram = diagram()) {
+	if (Diagram *my_diagram = diagram())
+	{
 		int qmbreturn=0;
-		//if conductor isn't alone at this potential
-		//ask user to apply text on every conductors of this potential
-		if (relatedPotentialConductors().size() >= 1){
+			//if conductor isn't alone at this potential
+			//ask user to apply text on every conductors of this potential
+		if (relatedPotentialConductors().size() >= 1)
+		{
 			qmbreturn = QMessageBox::question(diagramEditor(), tr("Textes de conducteurs"),
 											  tr("Voulez-vous appliquer le nouveau texte \n"
 												 "\340 l'ensemble des conducteurs de ce potentiel ?"),
 											  QMessageBox::No| QMessageBox::Yes, QMessageBox::Yes);
-			if (qmbreturn == QMessageBox::Yes){
-				ConductorAutoNumerotation can(this);
+			if (qmbreturn == QMessageBox::Yes)
+			{
+				ConductorAutoNumerotation can(this, my_diagram);
 				can.applyText(text_item -> toPlainText());
 			}
 		}
-		if (qmbreturn == 0 || qmbreturn == QMessageBox::No) {
+
+		if (qmbreturn == 0 || qmbreturn == QMessageBox::No)
+		{
 			// initialise l'objet UndoCommand correspondant
 			ConductorProperties new_properties(properties_);
 			new_properties.text = text_item -> toPlainText();

Modified: trunk/sources/qetgraphicsitem/conductor.h
===================================================================
--- trunk/sources/qetgraphicsitem/conductor.h	2015-01-08 18:59:23 UTC (rev 3593)
+++ trunk/sources/qetgraphicsitem/conductor.h	2015-01-09 17:18:16 UTC (rev 3594)
@@ -112,7 +112,6 @@
 	void calculateTextItemPosition();
 	virtual Highlight highlight() const;
 	virtual void setHighlighted(Highlight);
-	void autoText();
 	QSet<Conductor *> relatedPotentialConductors(const bool all_diagram = true, QList <Terminal *> *t_list=0);
 	QETDiagramEditor* diagramEditor() const;
 	void editProperty ();

Modified: trunk/sources/qetgraphicsitem/element.cpp
===================================================================
--- trunk/sources/qetgraphicsitem/element.cpp	2015-01-08 18:59:23 UTC (rev 3593)
+++ trunk/sources/qetgraphicsitem/element.cpp	2015-01-09 17:18:16 UTC (rev 3594)
@@ -495,6 +495,31 @@
 }
 
 /**
+ * @brief Element::AlignedFreeTerminals
+ * @return a list of terminal (owned by this element) aligned to other terminal (from other element)
+ * The first Terminal of QPair is a Terminal owned by this element,
+ * this terminal haven't got any conductor docked.
+ * The second Terminal of QPair is a Terminal owned by an other element,
+ * which is aligned with the first Terminal. The second Terminal can have or not docked conductors.
+ */
+QList <QPair <Terminal *, Terminal *> > Element::AlignedFreeTerminals() const
+{
+	QList <QPair <Terminal *, Terminal *> > list;
+
+	foreach (Terminal *terminal, terminals())
+	{
+		if (terminal->conductors().isEmpty())
+		{
+			Terminal *other_terminal = terminal -> alignedWithTerminal();
+			if (other_terminal)
+				list << qMakePair(terminal, other_terminal);
+		}
+	}
+
+	return list;
+}
+
+/**
  * @brief Element::initLink
  * Initialise the link between this element and other elements.
  * This method can be call once because init the link according to
@@ -549,6 +574,10 @@
 	return elmt1->pos().x() <= elmt2->pos().x();
 }
 
+/**
+ * @brief Element::mouseMoveEvent
+ * @param event
+ */
 void Element::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
 {
 	QetGraphicsItem::mouseMoveEvent(event);
@@ -558,6 +587,10 @@
 	}
 }
 
+/**
+ * @brief Element::mouseReleaseEvent
+ * @param event
+ */
 void Element::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
 {
 	QetGraphicsItem::mouseReleaseEvent(event);

Modified: trunk/sources/qetgraphicsitem/element.h
===================================================================
--- trunk/sources/qetgraphicsitem/element.h	2015-01-08 18:59:23 UTC (rev 3593)
+++ trunk/sources/qetgraphicsitem/element.h	2015-01-09 17:18:16 UTC (rev 3594)
@@ -94,6 +94,7 @@
 		/// @return the maximum number of terminals for this element
 	virtual int maxTerminalsCount() const = 0;
 
+		QList <QPair <Terminal *, Terminal *> > AlignedFreeTerminals () const;
 
 	/**
 	 *related method and attributes,
@@ -121,7 +122,7 @@
 	signals:
 		void elementInfoChange(DiagramContext old_info, DiagramContext new_info);
 
-	//METHODS related to information
+		//METHODS related to information
 	public:
 		DiagramContext  elementInformations    ()const              {return element_informations_;}
 		DiagramContext& rElementInformations   ()                   {return element_informations_;}

Modified: trunk/sources/qetgraphicsitem/terminal.cpp
===================================================================
--- trunk/sources/qetgraphicsitem/terminal.cpp	2015-01-08 18:59:23 UTC (rev 3593)
+++ trunk/sources/qetgraphicsitem/terminal.cpp	2015-01-09 17:18:16 UTC (rev 3594)
@@ -21,6 +21,7 @@
 #include "qetgraphicsitem/conductor.h"
 #include "diagramcommands.h"
 #include "qetapp.h"
+#include "conductorautonumerotation.h"
 
 QColor Terminal::neutralColor      = QColor(Qt::blue);
 QColor Terminal::allowedColor      = QColor(Qt::darkGreen);
@@ -527,35 +528,44 @@
 	other_terminal -> update();
 }
 
+
 /**
-	Gere le fait qu'on relache la souris sur la Borne.
-	@param e L'evenement souris correspondant
-*/
-void Terminal::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) {
-	//setCursor(Qt::ArrowCursor);
+ * @brief Terminal::mouseReleaseEvent
+ * @param e
+ */
+void Terminal::mouseReleaseEvent(QGraphicsSceneMouseEvent *e)
+{
 	previous_terminal_ = 0;
-	hovered_color_  = neutralColor;
-	// verifie que la scene est bien un Diagram
-	if (Diagram *d = diagram()) {
-		// on arrete de dessiner l'apercu du conducteur
+	hovered_color_     = neutralColor;
+
+	if (Diagram *d = diagram())
+	{
+			//Stop conductor preview
 		d -> setConductor(false);
-		// on recupere l'element sous le pointeur lors du MouseReleaseEvent
+
+			//Get item under cursor
 		QGraphicsItem *qgi = d -> itemAt(e -> scenePos());
-		// s'il n'y a rien, on arrete la
 		if (!qgi) return;
-		// idem si l'element obtenu n'est pas une borne
+
+			//Element must be a terminal
 		Terminal *other_terminal = qgraphicsitem_cast<Terminal *>(qgi);
 		if (!other_terminal) return;
-		// on remet la couleur de hover a sa valeur par defaut
+
 		other_terminal -> hovered_color_ = neutralColor;
-		other_terminal -> hovered_ = false;
-		// on s'arrete la s'il n'est pas possible de relier les bornes
+		other_terminal -> hovered_       = false;
+
+			//We stop her if we can't link this terminal with other terminal
 		if (!canBeLinkedTo(other_terminal)) return;
-		// autrement, on pose un conducteur
+
+			//Create conductor
 		Conductor *new_conductor = new Conductor(this, other_terminal);
 		new_conductor -> setProperties(d -> defaultConductorProperties);
-		d -> undoStack().push(new AddItemCommand<Conductor *>(new_conductor, d));
-		new_conductor -> autoText();
+		QUndoCommand *undo = new AddItemCommand<Conductor *>(new_conductor, d);
+			//Autonum it
+		ConductorAutoNumerotation can (new_conductor, d, undo);
+		can.numerate();
+			//Add undo command to the parent diagram
+		d -> undoStack().push(undo);
 	}
 }
 


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