[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
]
- To: qet@xxxxxxxxxxxxxxxxxxx
- Subject: [qet] [3594] Finish a move element with free terminal aligned with other terminal from other element , will create auto creation of conductor
- From: subversion@xxxxxxxxxxxxx
- Date: Fri, 09 Jan 2015 18:18:17 +0100
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);
}
}