mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2025-12-18 22:00:35 +01:00
Debut d'implementation des annulations lors de l'edition des schemas
Sont desormais annulables : -les ajouts d'elements -les ajouts de conducteurs -les suppressions d'elements et de conducteurs git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@134 bfdf4180-ca20-0410-9c96-a3a8aa849046
This commit is contained in:
15
conducer.cpp
15
conducer.cpp
@@ -3,6 +3,7 @@
|
|||||||
#include "conducersegment.h"
|
#include "conducersegment.h"
|
||||||
#include "conducersegmentprofile.h"
|
#include "conducersegmentprofile.h"
|
||||||
#include "element.h"
|
#include "element.h"
|
||||||
|
#include "diagram.h"
|
||||||
#define PR(x) qDebug() << #x " = " << x;
|
#define PR(x) qDebug() << #x " = " << x;
|
||||||
|
|
||||||
bool Conducer::pen_and_brush_initialized = false;
|
bool Conducer::pen_and_brush_initialized = false;
|
||||||
@@ -55,7 +56,6 @@ Conducer::Conducer(Terminal *p1, Terminal* p2, Element *parent, QGraphicsScene *
|
|||||||
text_item -> setPlainText("_");
|
text_item -> setPlainText("_");
|
||||||
text_item -> setTextInteractionFlags(Qt::TextEditorInteraction);
|
text_item -> setTextInteractionFlags(Qt::TextEditorInteraction);
|
||||||
calculateTextItemPosition();
|
calculateTextItemPosition();
|
||||||
scene -> addItem(text_item);
|
|
||||||
text_item -> setParentItem(this);
|
text_item -> setParentItem(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -457,6 +457,11 @@ void Conducer::destroy() {
|
|||||||
terminal2 -> removeConducer(this);
|
terminal2 -> removeConducer(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// @return le Diagram auquel ce conducteur appartient, ou 0 si ce conducteur est independant
|
||||||
|
Diagram *Conducer::diagram() const {
|
||||||
|
return(qobject_cast<Diagram *>(scene()));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Methode de validation d'element XML
|
Methode de validation d'element XML
|
||||||
@param e Un element XML sense represente un Conducteur
|
@param e Un element XML sense represente un Conducteur
|
||||||
@@ -523,14 +528,6 @@ void Conducer::mousePressEvent(QGraphicsSceneMouseEvent *e) {
|
|||||||
/**
|
/**
|
||||||
Gere les deplacements de souris sur le conducteur.
|
Gere les deplacements de souris sur le conducteur.
|
||||||
@param e L'evenement decrivant le deplacement de souris.
|
@param e L'evenement decrivant le deplacement de souris.
|
||||||
@todo
|
|
||||||
-calculer le trajet du conducteur differemment selon l'etat du flag "trajet modifie"
|
|
||||||
-garder une liste des points constituants le trajet
|
|
||||||
-lorsque le fil est selectionne, dessiner ces points (cercles)
|
|
||||||
-lors d'un mousemoveevent: detecter la position du clic : si cela tombe dans la zone d'un point :
|
|
||||||
-deplacer ce point en consequence
|
|
||||||
-mettre le flag "trajet modifie" a true
|
|
||||||
-gerer les contraintes
|
|
||||||
*/
|
*/
|
||||||
void Conducer::mouseMoveEvent(QGraphicsSceneMouseEvent *e) {
|
void Conducer::mouseMoveEvent(QGraphicsSceneMouseEvent *e) {
|
||||||
// clic gauche
|
// clic gauche
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ class Conducer : public QGraphicsPathItem {
|
|||||||
virtual int type() const { return Type; }
|
virtual int type() const { return Type; }
|
||||||
void destroy();
|
void destroy();
|
||||||
bool isDestroyed() const { return(destroyed); }
|
bool isDestroyed() const { return(destroyed); }
|
||||||
|
Diagram *diagram() const;
|
||||||
void updateWithNewPos(const QRectF &, const Terminal *, const QPointF &);
|
void updateWithNewPos(const QRectF &, const Terminal *, const QPointF &);
|
||||||
void update(const QRectF & = QRectF());
|
void update(const QRectF & = QRectF());
|
||||||
void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *);
|
void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *);
|
||||||
|
|||||||
@@ -421,7 +421,7 @@ bool CustomElement::parseTerminal(QDomElement &e) {
|
|||||||
else if (e.attribute("orientation") == "e") terminalo = QET::East;
|
else if (e.attribute("orientation") == "e") terminalo = QET::East;
|
||||||
else if (e.attribute("orientation") == "w") terminalo = QET::West;
|
else if (e.attribute("orientation") == "w") terminalo = QET::West;
|
||||||
else return(false);
|
else return(false);
|
||||||
list_terminals << new Terminal(terminalx, terminaly, terminalo, this);
|
list_terminals << new Terminal(terminalx, terminaly, terminalo, this, qobject_cast<Diagram *>(scene()));
|
||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
Constructeur
|
Constructeur
|
||||||
@param parent Le QObject parent du schema
|
@param parent Le QObject parent du schema
|
||||||
*/
|
*/
|
||||||
Diagram::Diagram(QObject *parent) : QGraphicsScene(parent) {
|
Diagram::Diagram(QObject *parent) : QGraphicsScene(parent), qgi_manager(this) {
|
||||||
setBackgroundBrush(Qt::white);
|
setBackgroundBrush(Qt::white);
|
||||||
conducer_setter = new QGraphicsLineItem(0, 0);
|
conducer_setter = new QGraphicsLineItem(0, 0);
|
||||||
conducer_setter -> setZValue(1000000);
|
conducer_setter -> setZValue(1000000);
|
||||||
@@ -156,7 +156,6 @@ QImage Diagram::toImage(int width, int height, Qt::AspectRatioMode aspectRatioMo
|
|||||||
/**
|
/**
|
||||||
Permet de connaitre les dimensions qu'aura l'image generee par la methode toImage()
|
Permet de connaitre les dimensions qu'aura l'image generee par la methode toImage()
|
||||||
@return La taille de l'image generee par toImage()
|
@return La taille de l'image generee par toImage()
|
||||||
@todo tenir compte des arguments
|
|
||||||
*/
|
*/
|
||||||
QSize Diagram::imageSize() const {
|
QSize Diagram::imageSize() const {
|
||||||
// determine la zone source = contenu du schema + marges
|
// determine la zone source = contenu du schema + marges
|
||||||
@@ -259,7 +258,6 @@ QDomDocument Diagram::toXml(bool diagram) {
|
|||||||
bool Diagram::fromXml(QDomDocument &document, QPointF position, bool consider_informations) {
|
bool Diagram::fromXml(QDomDocument &document, QPointF position, bool consider_informations) {
|
||||||
QDomElement racine = document.documentElement();
|
QDomElement racine = document.documentElement();
|
||||||
// le premier element doit etre un schema
|
// le premier element doit etre un schema
|
||||||
/// @todo renommer schema en diagram
|
|
||||||
if (racine.tagName() != "diagram") return(false);
|
if (racine.tagName() != "diagram") return(false);
|
||||||
|
|
||||||
// lecture des attributs de ce schema
|
// lecture des attributs de ce schema
|
||||||
|
|||||||
17
diagram.h
17
diagram.h
@@ -7,6 +7,7 @@
|
|||||||
#include <QtXml>
|
#include <QtXml>
|
||||||
#include "qetdiagrameditor.h"
|
#include "qetdiagrameditor.h"
|
||||||
#include "borderinset.h"
|
#include "borderinset.h"
|
||||||
|
#include "qgimanager.h"
|
||||||
class Element;
|
class Element;
|
||||||
class Terminal;
|
class Terminal;
|
||||||
class Conducer;
|
class Conducer;
|
||||||
@@ -34,6 +35,9 @@ class Diagram : public QGraphicsScene {
|
|||||||
QSet<Element *> elements_to_move;
|
QSet<Element *> elements_to_move;
|
||||||
QSet<Conducer *> conducers_to_move;
|
QSet<Conducer *> conducers_to_move;
|
||||||
QHash<Conducer *, Terminal *> conducers_to_update;
|
QHash<Conducer *, Terminal *> conducers_to_update;
|
||||||
|
QGIManager qgi_manager;
|
||||||
|
QUndoStack undo_stack;
|
||||||
|
|
||||||
|
|
||||||
// methodes
|
// methodes
|
||||||
public:
|
public:
|
||||||
@@ -68,6 +72,9 @@ class Diagram : public QGraphicsScene {
|
|||||||
const QSet<Conducer *> &conducersToMove();
|
const QSet<Conducer *> &conducersToMove();
|
||||||
const QHash<Conducer *, Terminal *> &conducersToUpdate();
|
const QHash<Conducer *, Terminal *> &conducersToUpdate();
|
||||||
|
|
||||||
|
QUndoStack &undoStack();
|
||||||
|
QGIManager &qgiManager();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void slot_checkSelectionEmptinessChange();
|
void slot_checkSelectionEmptinessChange();
|
||||||
|
|
||||||
@@ -180,4 +187,14 @@ inline const QHash<Conducer *, Terminal *> &Diagram::conducersToUpdate() {
|
|||||||
return(conducers_to_update);
|
return(conducers_to_update);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// @return la pile d'annulations de ce schema
|
||||||
|
inline QUndoStack &Diagram::undoStack() {
|
||||||
|
return(undo_stack);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @return le egstionnaire de QGraphicsItem de ce schema
|
||||||
|
inline QGIManager &Diagram::qgiManager() {
|
||||||
|
return(qgi_manager);
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
132
diagramcommands.cpp
Normal file
132
diagramcommands.cpp
Normal file
@@ -0,0 +1,132 @@
|
|||||||
|
#include "diagramcommands.h"
|
||||||
|
#include "element.h"
|
||||||
|
#include "conducer.h"
|
||||||
|
#include "diagram.h"
|
||||||
|
#include "qgimanager.h"
|
||||||
|
/**
|
||||||
|
Constructeur
|
||||||
|
@param name Nom de la partie ajoutee
|
||||||
|
@param parts Liste des parties deplacees
|
||||||
|
@param parent QUndoCommand parent
|
||||||
|
*/
|
||||||
|
AddElementCommand::AddElementCommand(
|
||||||
|
Diagram *d,
|
||||||
|
Element *elmt,
|
||||||
|
const QPointF &p,
|
||||||
|
QUndoCommand *parent
|
||||||
|
) :
|
||||||
|
QUndoCommand(QObject::tr("ajout ") + elmt -> nom(), parent),
|
||||||
|
element(elmt),
|
||||||
|
diagram(d),
|
||||||
|
position(p)
|
||||||
|
{
|
||||||
|
diagram -> qgiManager().manage(element);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Destructeur
|
||||||
|
AddElementCommand::~AddElementCommand() {
|
||||||
|
diagram -> qgiManager().release(element);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Annule l'ajout
|
||||||
|
void AddElementCommand::undo() {
|
||||||
|
diagram -> removeItem(element);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Refait l'ajout
|
||||||
|
void AddElementCommand::redo() {
|
||||||
|
diagram -> addItem(element);
|
||||||
|
element -> setPos(position);
|
||||||
|
element -> setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Constructeur
|
||||||
|
@param d Schema auquel on ajoute un conducteur
|
||||||
|
@param t1 Premiere borne du conducteur
|
||||||
|
@param t2 Seconde borne du conducteur
|
||||||
|
@param parent QUndoCommand parent
|
||||||
|
*/
|
||||||
|
AddConducerCommand::AddConducerCommand(
|
||||||
|
Diagram *d,
|
||||||
|
Conducer *c,
|
||||||
|
QUndoCommand *parent
|
||||||
|
) :
|
||||||
|
QUndoCommand(QObject::tr("ajout conducteur"), parent),
|
||||||
|
conducer(c),
|
||||||
|
diagram(d)
|
||||||
|
{
|
||||||
|
diagram -> qgiManager().manage(conducer);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Destructeur
|
||||||
|
AddConducerCommand::~AddConducerCommand() {
|
||||||
|
diagram -> qgiManager().release(conducer);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Annule l'ajout
|
||||||
|
void AddConducerCommand::undo() {
|
||||||
|
// detache le conducteur sans le detruire
|
||||||
|
conducer -> terminal1 -> removeConducer(conducer);
|
||||||
|
conducer -> terminal2 -> removeConducer(conducer);
|
||||||
|
diagram -> removeItem(conducer);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Refait l'ajout
|
||||||
|
void AddConducerCommand::redo() {
|
||||||
|
diagram -> addItem(conducer);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Constructeur
|
||||||
|
*/
|
||||||
|
DeleteElementsCommand::DeleteElementsCommand(
|
||||||
|
Diagram *dia,
|
||||||
|
QSet<Element *> elements,
|
||||||
|
QSet<Conducer *> conducers,
|
||||||
|
QUndoCommand *parent
|
||||||
|
) :
|
||||||
|
QUndoCommand(parent),
|
||||||
|
removed_elements(elements),
|
||||||
|
removed_conducers(conducers),
|
||||||
|
diagram(dia)
|
||||||
|
{
|
||||||
|
foreach(QGraphicsItem *qgi, removed_elements) diagram -> qgiManager().manage(qgi);
|
||||||
|
foreach(QGraphicsItem *qgi, removed_conducers) diagram -> qgiManager().manage(qgi);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Destructeur
|
||||||
|
DeleteElementsCommand::~DeleteElementsCommand() {
|
||||||
|
foreach(QGraphicsItem *qgi, removed_elements) diagram -> qgiManager().release(qgi);
|
||||||
|
foreach(QGraphicsItem *qgi, removed_conducers) diagram -> qgiManager().release(qgi);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// annule les suppressions
|
||||||
|
void DeleteElementsCommand::undo() {
|
||||||
|
// remet les elements
|
||||||
|
foreach(Element *e, removed_elements) {
|
||||||
|
diagram -> addItem(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
// remet les conducteurs
|
||||||
|
foreach(Conducer *c, removed_conducers) {
|
||||||
|
diagram -> addItem(c);
|
||||||
|
c -> terminal1 -> addConducer(c);
|
||||||
|
c -> terminal2 -> addConducer(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// refait les suppressions
|
||||||
|
void DeleteElementsCommand::redo() {
|
||||||
|
// enleve les conducteurs
|
||||||
|
foreach(Conducer *c, removed_conducers) {
|
||||||
|
c -> terminal1 -> removeConducer(c);
|
||||||
|
c -> terminal2 -> removeConducer(c);
|
||||||
|
diagram -> removeItem(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
// enleve les elements
|
||||||
|
foreach(Element *e, removed_elements) {
|
||||||
|
diagram -> removeItem(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
79
diagramcommands.h
Normal file
79
diagramcommands.h
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
#ifndef DIAGRAM_COMMANDS_H
|
||||||
|
#define DIAGRAM_COMMANDS_H
|
||||||
|
#include "diagram.h"
|
||||||
|
#include <QtGui>
|
||||||
|
/**
|
||||||
|
Cette classe represente l'action d'ajouter un element au schema
|
||||||
|
*/
|
||||||
|
class AddElementCommand : public QUndoCommand {
|
||||||
|
// constructeurs, destructeur
|
||||||
|
public:
|
||||||
|
AddElementCommand(Diagram *, Element *, const QPointF &, QUndoCommand * = 0);
|
||||||
|
virtual ~AddElementCommand();
|
||||||
|
private:
|
||||||
|
AddElementCommand(const AddElementCommand &);
|
||||||
|
|
||||||
|
// methodes
|
||||||
|
virtual void undo();
|
||||||
|
virtual void redo();
|
||||||
|
|
||||||
|
// attributs
|
||||||
|
private:
|
||||||
|
/// Element ajoute
|
||||||
|
Element *element;
|
||||||
|
/// schema sur lequel on ajoute l'element
|
||||||
|
Diagram *diagram;
|
||||||
|
/// position de l'element sur le schema
|
||||||
|
QPointF position;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
Cette classe represente l'action d'ajouter un conducteur au schema
|
||||||
|
*/
|
||||||
|
class AddConducerCommand : public QUndoCommand {
|
||||||
|
// constructeurs, destructeur
|
||||||
|
public:
|
||||||
|
AddConducerCommand(Diagram *, Conducer *, QUndoCommand * = 0);
|
||||||
|
virtual ~AddConducerCommand();
|
||||||
|
private:
|
||||||
|
AddConducerCommand(const AddConducerCommand &);
|
||||||
|
|
||||||
|
// methodes
|
||||||
|
virtual void undo();
|
||||||
|
virtual void redo();
|
||||||
|
|
||||||
|
// attributs
|
||||||
|
private:
|
||||||
|
/// Conducteur ajoute
|
||||||
|
Conducer *conducer;
|
||||||
|
/// schema auquel on ajoute le conducteur
|
||||||
|
Diagram *diagram;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
Cette classe represente l'action de supprimer des elements et / ou
|
||||||
|
conducteurs d'un schema
|
||||||
|
*/
|
||||||
|
class DeleteElementsCommand : public QUndoCommand {
|
||||||
|
// constructeurs, destructeur
|
||||||
|
public:
|
||||||
|
DeleteElementsCommand(Diagram *, QSet<Element *>, QSet<Conducer *>, QUndoCommand * = 0);
|
||||||
|
virtual ~DeleteElementsCommand();
|
||||||
|
private:
|
||||||
|
DeleteElementsCommand(const DeleteElementsCommand &);
|
||||||
|
|
||||||
|
// methodes
|
||||||
|
virtual void undo();
|
||||||
|
virtual void redo();
|
||||||
|
|
||||||
|
// attributs
|
||||||
|
private:
|
||||||
|
/// Liste des elements enleves
|
||||||
|
QSet<Element *> removed_elements;
|
||||||
|
/// List des conducteurs enleves
|
||||||
|
QSet<Conducer *> removed_conducers;
|
||||||
|
/// schema dont on supprime des elements et conducteurs
|
||||||
|
Diagram *diagram;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -3,6 +3,7 @@
|
|||||||
#include "customelement.h"
|
#include "customelement.h"
|
||||||
#include "exportdialog.h"
|
#include "exportdialog.h"
|
||||||
#include "conducer.h"
|
#include "conducer.h"
|
||||||
|
#include "diagramcommands.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Initialise le DiagramView
|
Initialise le DiagramView
|
||||||
@@ -79,74 +80,23 @@ void DiagramView::selectInvert() {
|
|||||||
*/
|
*/
|
||||||
void DiagramView::supprimer() {
|
void DiagramView::supprimer() {
|
||||||
|
|
||||||
QList<QGraphicsItem *> garbage_elmt;
|
QSet<Element *> garbage_elmt;
|
||||||
QList<QGraphicsItem *> garbage_conducers;
|
QSet<Conducer *> garbage_conducers;
|
||||||
|
|
||||||
// creation de deux listes : une pour les conducteurs, une pour les elements
|
// creation de deux listes : une pour les conducteurs, une pour les elements
|
||||||
foreach (QGraphicsItem *qgi, scene -> selectedItems()) {
|
foreach (QGraphicsItem *qgi, scene -> selectedItems()) {
|
||||||
// pour chaque qgi selectionne, il s'agit soit d'un element soit d'un conducteur
|
// pour chaque qgi selectionne, il s'agit soit d'un element soit d'un conducteur
|
||||||
if (qgraphicsitem_cast<Conducer *>(qgi)) {
|
if (Conducer * c = qgraphicsitem_cast<Conducer *>(qgi)) {
|
||||||
// s'il s'agit d'un conducteur, on le met dans la liste des conducteurs
|
// s'il s'agit d'un conducteur, on le met dans la liste des conducteurs
|
||||||
if (!garbage_conducers.contains(qgi)) garbage_conducers.append(qgi);
|
garbage_conducers << c;
|
||||||
} else if (qgraphicsitem_cast<Element *>(qgi)) {
|
} else if (Element *e = qgraphicsitem_cast<Element *>(qgi)) {
|
||||||
|
garbage_elmt << e;
|
||||||
// s'il s'agit d'un element, on veille a enlever ses conducteurs
|
// s'il s'agit d'un element, on veille a enlever ses conducteurs
|
||||||
if (!garbage_elmt.contains(qgi)) garbage_elmt.append(qgi);
|
garbage_conducers += e -> conducers().toSet();
|
||||||
// pour chaque enfant de l'element
|
|
||||||
foreach (QGraphicsItem *child, qgi -> children()) {
|
|
||||||
// si cet enfant est une borne
|
|
||||||
if (Terminal *p = qgraphicsitem_cast<Terminal *>(child)) {
|
|
||||||
// alors chaque conducteur de la borne est recense
|
|
||||||
foreach (Conducer *f, p -> conducers()) {
|
|
||||||
if (!garbage_conducers.contains(f)) garbage_conducers.append(f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
scene -> clearSelection();
|
scene -> clearSelection();
|
||||||
|
scene -> undoStack().push(new DeleteElementsCommand(scene, garbage_elmt, garbage_conducers));
|
||||||
// "destroying" the wires, removing them from the scene and stocking them into the <20> garbage <20>
|
|
||||||
foreach (QGraphicsItem *qgi, garbage_conducers) {
|
|
||||||
if (Conducer *f = qgraphicsitem_cast<Conducer *>(qgi)) {
|
|
||||||
f -> destroy();
|
|
||||||
scene -> removeItem(f);
|
|
||||||
throwToGarbage(f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// removing the elements from the scene and stocking them into the <20> garbage <20>
|
|
||||||
foreach (QGraphicsItem *qgi, garbage_elmt) {
|
|
||||||
scene -> removeItem(qgi);
|
|
||||||
throwToGarbage(qgi);
|
|
||||||
}
|
|
||||||
resetCachedContent();
|
|
||||||
QTimer::singleShot(5000, this, SLOT(flushGarbage()));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Envoie un item vers le "garbage" pour qu'il soit supprime plus tard
|
|
||||||
@param qgi L'item a supprimer
|
|
||||||
*/
|
|
||||||
void DiagramView::throwToGarbage(QGraphicsItem *qgi) {
|
|
||||||
// pas de doublon dans le garbage (sinon ca va sentir la segfault)
|
|
||||||
bool qgi_deja_dans_le_garbage = false;
|
|
||||||
foreach(QGraphicsItem *gbg_qgi, garbage) {
|
|
||||||
if ((void *)gbg_qgi == (void *)qgi) {
|
|
||||||
qgi_deja_dans_le_garbage = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!qgi_deja_dans_le_garbage) garbage.append(qgi);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Supprime tous les elements du "garbage"
|
|
||||||
*/
|
|
||||||
void DiagramView::flushGarbage() {
|
|
||||||
foreach(QGraphicsItem *qgi, garbage) {
|
|
||||||
delete(qgi);
|
|
||||||
garbage.removeAll(qgi);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -175,7 +125,8 @@ void DiagramView::dragEnterEvent(QDragEnterEvent *e) {
|
|||||||
gere les dragleaveevent
|
gere les dragleaveevent
|
||||||
@param e le QDragEnterEvent correspondant au drag'n drop sortant
|
@param e le QDragEnterEvent correspondant au drag'n drop sortant
|
||||||
*/
|
*/
|
||||||
void DiagramView::dragLeaveEvent(QDragLeaveEvent *) {}
|
void DiagramView::dragLeaveEvent(QDragLeaveEvent *) {
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
accepte ou refuse le drag'n drop en fonction du type de donnees entrant
|
accepte ou refuse le drag'n drop en fonction du type de donnees entrant
|
||||||
@@ -194,11 +145,9 @@ void DiagramView::dropEvent(QDropEvent *e) {
|
|||||||
QString fichier = e -> mimeData() -> text();
|
QString fichier = e -> mimeData() -> text();
|
||||||
int etat;
|
int etat;
|
||||||
Element *el = new CustomElement(fichier, 0, 0, &etat);
|
Element *el = new CustomElement(fichier, 0, 0, &etat);
|
||||||
if (etat != 0) delete el;
|
if (etat) delete el;
|
||||||
else {
|
else {
|
||||||
scene -> addItem(el);
|
diagram() -> undoStack().push(new AddElementCommand(diagram(), el, mapToScene(e -> pos())));
|
||||||
el -> setPos(mapToScene(e -> pos().x(), e -> pos().y()));
|
|
||||||
el -> setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -44,7 +44,6 @@ class DiagramView : public QGraphicsView {
|
|||||||
private:
|
private:
|
||||||
bool private_enregistrer(QString &);
|
bool private_enregistrer(QString &);
|
||||||
void initialise();
|
void initialise();
|
||||||
void throwToGarbage(QGraphicsItem *);
|
|
||||||
void mousePressEvent(QMouseEvent *);
|
void mousePressEvent(QMouseEvent *);
|
||||||
void dragEnterEvent(QDragEnterEvent *);
|
void dragEnterEvent(QDragEnterEvent *);
|
||||||
void dragLeaveEvent(QDragLeaveEvent *);
|
void dragLeaveEvent(QDragLeaveEvent *);
|
||||||
@@ -74,7 +73,6 @@ class DiagramView : public QGraphicsView {
|
|||||||
void coller();
|
void coller();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void flushGarbage();
|
|
||||||
void slot_selectionChanged();
|
void slot_selectionChanged();
|
||||||
void adjustGridToZoom();
|
void adjustGridToZoom();
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -87,7 +87,8 @@ void MovePartsCommand::redo() {
|
|||||||
/**
|
/**
|
||||||
Constructeur
|
Constructeur
|
||||||
@param name Nom de la partie ajoutee
|
@param name Nom de la partie ajoutee
|
||||||
@param parts Liste des parties deplacees
|
@param scene ElementScene concernee
|
||||||
|
@param p partie ajoutee
|
||||||
@param parent QUndoCommand parent
|
@param parent QUndoCommand parent
|
||||||
*/
|
*/
|
||||||
AddPartCommand::AddPartCommand(
|
AddPartCommand::AddPartCommand(
|
||||||
@@ -109,12 +110,12 @@ AddPartCommand::~AddPartCommand() {
|
|||||||
editor_scene -> qgiManager().release(part);
|
editor_scene -> qgiManager().release(part);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Annule le deplacement
|
/// Annule l'ajout
|
||||||
void AddPartCommand::undo() {
|
void AddPartCommand::undo() {
|
||||||
editor_scene -> removeItem(part);
|
editor_scene -> removeItem(part);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Refait le deplacement
|
/// Refait l'ajout
|
||||||
void AddPartCommand::redo() {
|
void AddPartCommand::redo() {
|
||||||
// le premier appel a redo, lors de la construction de l'objet, ne doit pas se faire
|
// le premier appel a redo, lors de la construction de l'objet, ne doit pas se faire
|
||||||
if (first_redo) {
|
if (first_redo) {
|
||||||
|
|||||||
@@ -58,8 +58,8 @@ class MovePartsCommand : public QUndoCommand {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Cette classe represente l'action de deplacer une ou plusieurs
|
Cette classe represente l'action d'ajouter une partie lors de l'edition
|
||||||
parties lors de l'edition d'un element
|
d'un element
|
||||||
*/
|
*/
|
||||||
class AddPartCommand : public QUndoCommand {
|
class AddPartCommand : public QUndoCommand {
|
||||||
// constructeurs, destructeur
|
// constructeurs, destructeur
|
||||||
|
|||||||
@@ -457,3 +457,8 @@ QList<QDomElement> Element::findInDomElement(QDomElement e, QString parent, QStr
|
|||||||
}
|
}
|
||||||
return(return_list);
|
return(return_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// @return le Diagram auquel cet element appartient, ou 0 si cet element est independant
|
||||||
|
Diagram *Element::diagram() const {
|
||||||
|
return(qobject_cast<Diagram *>(scene()));
|
||||||
|
}
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ class Element : public QGraphicsItem {
|
|||||||
virtual void paint(QPainter *, const QStyleOptionGraphicsItem *) = 0;
|
virtual void paint(QPainter *, const QStyleOptionGraphicsItem *) = 0;
|
||||||
virtual QString typeId() const = 0;
|
virtual QString typeId() const = 0;
|
||||||
virtual QString nom() const = 0;
|
virtual QString nom() const = 0;
|
||||||
|
Diagram *diagram() const;
|
||||||
|
|
||||||
void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *);
|
void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *);
|
||||||
QRectF boundingRect() const;
|
QRectF boundingRect() const;
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#include "elementtextitem.h"
|
#include "elementtextitem.h"
|
||||||
|
#include "diagram.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Constructeur
|
Constructeur
|
||||||
@@ -76,3 +77,8 @@ QDomElement ElementTextItem::toXml(QDomDocument &document) const {
|
|||||||
result.setAttribute("text", toPlainText());
|
result.setAttribute("text", toPlainText());
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// @return le Diagram auquel ce texte appartient, ou 0 si ce texte est independant
|
||||||
|
Diagram *ElementTextItem::diagram() const {
|
||||||
|
return(qobject_cast<Diagram *>(scene()));
|
||||||
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
#define ELEMENT_TEXT_ITEM_H
|
#define ELEMENT_TEXT_ITEM_H
|
||||||
#include <QGraphicsTextItem>
|
#include <QGraphicsTextItem>
|
||||||
#include <QtXml>
|
#include <QtXml>
|
||||||
|
class Diagram;
|
||||||
/**
|
/**
|
||||||
Cette classe represente un element de texte editable.
|
Cette classe represente un element de texte editable.
|
||||||
Il est possible pour ce champ de texte de rester dans le sens de la lecture
|
Il est possible pour ce champ de texte de rester dans le sens de la lecture
|
||||||
@@ -31,6 +32,7 @@ class ElementTextItem : public QGraphicsTextItem {
|
|||||||
void setPos(const QPointF &);
|
void setPos(const QPointF &);
|
||||||
void setPos(qreal, qreal);
|
void setPos(qreal, qreal);
|
||||||
QPointF pos() const;
|
QPointF pos() const;
|
||||||
|
Diagram *diagram() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
IDI_ICON1 ICON DISCARDABLE "ico/windows_icon/application_icon/qet.ico"
|
IDI_ICON1 ICON DISCARDABLE "ico/windows_icon/application_icon/qet.ico"
|
||||||
|
|||||||
@@ -63,7 +63,8 @@ HEADERS += aboutqet.h \
|
|||||||
editor/styleeditor.h \
|
editor/styleeditor.h \
|
||||||
editor/terminaleditor.h \
|
editor/terminaleditor.h \
|
||||||
editor/texteditor.h \
|
editor/texteditor.h \
|
||||||
editor/textfieldeditor.h
|
editor/textfieldeditor.h \
|
||||||
|
diagramcommands.h
|
||||||
SOURCES += aboutqet.cpp \
|
SOURCES += aboutqet.cpp \
|
||||||
borderinset.cpp \
|
borderinset.cpp \
|
||||||
conducer.cpp \
|
conducer.cpp \
|
||||||
@@ -119,7 +120,8 @@ SOURCES += aboutqet.cpp \
|
|||||||
editor/styleeditor.cpp \
|
editor/styleeditor.cpp \
|
||||||
editor/terminaleditor.cpp \
|
editor/terminaleditor.cpp \
|
||||||
editor/texteditor.cpp \
|
editor/texteditor.cpp \
|
||||||
editor/textfieldeditor.cpp
|
editor/textfieldeditor.cpp \
|
||||||
|
diagramcommands.cpp
|
||||||
RESOURCES += qelectrotech.qrc
|
RESOURCES += qelectrotech.qrc
|
||||||
TRANSLATIONS += lang/qet_en.ts lang/qt_fr.ts
|
TRANSLATIONS += lang/qet_en.ts lang/qt_fr.ts
|
||||||
RC_FILE = ico/windows_icon/application_icon/qelectrotech.rc
|
RC_FILE = ico/windows_icon/application_icon/qelectrotech.rc
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "qetdiagrameditor.h"
|
#include "qetdiagrameditor.h"
|
||||||
#include "qetapp.h"
|
#include "qetapp.h"
|
||||||
#include "diagramview.h"
|
#include "diagramview.h"
|
||||||
|
#include "diagram.h"
|
||||||
#include "elementspanelwidget.h"
|
#include "elementspanelwidget.h"
|
||||||
#include "aboutqet.h"
|
#include "aboutqet.h"
|
||||||
|
|
||||||
@@ -94,7 +95,7 @@ QETDiagramEditor::~QETDiagramEditor() {
|
|||||||
void QETDiagramEditor::closeEvent(QCloseEvent *qce) {
|
void QETDiagramEditor::closeEvent(QCloseEvent *qce) {
|
||||||
// quitte directement s'il n'y a aucun schema ouvert
|
// quitte directement s'il n'y a aucun schema ouvert
|
||||||
bool peut_quitter = true;
|
bool peut_quitter = true;
|
||||||
if (diagramEnCours()) {
|
if (currentDiagram()) {
|
||||||
// sinon demande la permission de fermer chaque schema
|
// sinon demande la permission de fermer chaque schema
|
||||||
foreach(QWidget *fenetre, workspace.windowList()) {
|
foreach(QWidget *fenetre, workspace.windowList()) {
|
||||||
if (qobject_cast<DiagramView *>(fenetre)) {
|
if (qobject_cast<DiagramView *>(fenetre)) {
|
||||||
@@ -147,8 +148,10 @@ void QETDiagramEditor::actions() {
|
|||||||
imprimer = new QAction(QIcon(":/ico/print.png"), tr("Imprimer"), this);
|
imprimer = new QAction(QIcon(":/ico/print.png"), tr("Imprimer"), this);
|
||||||
quitter_qet = new QAction(QIcon(":/ico/exit.png"), tr("&Quitter"), this);
|
quitter_qet = new QAction(QIcon(":/ico/exit.png"), tr("&Quitter"), this);
|
||||||
|
|
||||||
annuler = new QAction(QIcon(":/ico/undo.png"), tr("Annu&ler"), this);
|
annuler = undo_group.createUndoAction(this, tr("Annuler"));
|
||||||
refaire = new QAction(QIcon(":/ico/redo.png"), tr("Re&faire"), this);
|
annuler -> setIcon(QIcon(":/ico/undo.png"));
|
||||||
|
refaire = undo_group.createRedoAction(this, tr("Refaire"));
|
||||||
|
refaire -> setIcon(QIcon(":/ico/redo.png"));
|
||||||
couper = new QAction(QIcon(":/ico/cut.png"), tr("Co&uper"), this);
|
couper = new QAction(QIcon(":/ico/cut.png"), tr("Co&uper"), this);
|
||||||
copier = new QAction(QIcon(":/ico/copy.png"), tr("Cop&ier"), this);
|
copier = new QAction(QIcon(":/ico/copy.png"), tr("Cop&ier"), this);
|
||||||
coller = new QAction(QIcon(":/ico/paste.png"), tr("C&oller"), this);
|
coller = new QAction(QIcon(":/ico/paste.png"), tr("C&oller"), this);
|
||||||
@@ -228,7 +231,7 @@ void QETDiagramEditor::actions() {
|
|||||||
quitter_qet -> setStatusTip(tr("Ferme l'application QElectroTech"));
|
quitter_qet -> setStatusTip(tr("Ferme l'application QElectroTech"));
|
||||||
|
|
||||||
annuler -> setStatusTip(tr("Annule l'action pr\351c\351dente"));
|
annuler -> setStatusTip(tr("Annule l'action pr\351c\351dente"));
|
||||||
refaire -> setStatusTip(tr("Restaure l'action annul\351e"));
|
annuler -> setStatusTip(tr("Restaure l'action annul\351e"));
|
||||||
couper -> setStatusTip(tr("Transf\350re les \351l\351ments s\351lectionn\351s dans le presse-papier"));
|
couper -> setStatusTip(tr("Transf\350re les \351l\351ments s\351lectionn\351s dans le presse-papier"));
|
||||||
copier -> setStatusTip(tr("Copie les \351l\351ments s\351lectionn\351s dans le presse-papier"));
|
copier -> setStatusTip(tr("Copie les \351l\351ments s\351lectionn\351s dans le presse-papier"));
|
||||||
coller -> setStatusTip(tr("Place les \351l\351ments du presse-papier sur le sch\351ma"));
|
coller -> setStatusTip(tr("Place les \351l\351ments du presse-papier sur le sch\351ma"));
|
||||||
@@ -435,7 +438,7 @@ void QETDiagramEditor::toolbar() {
|
|||||||
Imprime le schema courant
|
Imprime le schema courant
|
||||||
*/
|
*/
|
||||||
void QETDiagramEditor::dialog_print() {
|
void QETDiagramEditor::dialog_print() {
|
||||||
DiagramView *sv = diagramEnCours();
|
DiagramView *sv = currentDiagram();
|
||||||
if (!sv) return;
|
if (!sv) return;
|
||||||
sv -> dialogPrint();
|
sv -> dialogPrint();
|
||||||
}
|
}
|
||||||
@@ -444,7 +447,7 @@ void QETDiagramEditor::dialog_print() {
|
|||||||
Gere l'export de schema sous forme d'image
|
Gere l'export de schema sous forme d'image
|
||||||
*/
|
*/
|
||||||
void QETDiagramEditor::dialog_export() {
|
void QETDiagramEditor::dialog_export() {
|
||||||
DiagramView *sv = diagramEnCours();
|
DiagramView *sv = currentDiagram();
|
||||||
if (!sv) return;
|
if (!sv) return;
|
||||||
sv -> dialogExport();
|
sv -> dialogExport();
|
||||||
}
|
}
|
||||||
@@ -455,8 +458,8 @@ void QETDiagramEditor::dialog_export() {
|
|||||||
@return true si l'enregistrement a reussi, false sinon
|
@return true si l'enregistrement a reussi, false sinon
|
||||||
*/
|
*/
|
||||||
bool QETDiagramEditor::enregistrer() {
|
bool QETDiagramEditor::enregistrer() {
|
||||||
if (!diagramEnCours()) return(false);
|
if (!currentDiagram()) return(false);
|
||||||
return(diagramEnCours() -> enregistrer());
|
return(currentDiagram() -> enregistrer());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -469,8 +472,8 @@ bool QETDiagramEditor::enregistrer() {
|
|||||||
@todo detecter le chemin du bureau automatiquement
|
@todo detecter le chemin du bureau automatiquement
|
||||||
*/
|
*/
|
||||||
bool QETDiagramEditor::dialogue_enregistrer_sous() {
|
bool QETDiagramEditor::dialogue_enregistrer_sous() {
|
||||||
if (!diagramEnCours()) return(false);
|
if (!currentDiagram()) return(false);
|
||||||
return(diagramEnCours() -> enregistrer_sous());
|
return(currentDiagram() -> enregistrer_sous());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -532,7 +535,7 @@ bool QETDiagramEditor::ouvrir() {
|
|||||||
@todo detecter les modifications et ne demander que si besoin est
|
@todo detecter les modifications et ne demander que si besoin est
|
||||||
*/
|
*/
|
||||||
bool QETDiagramEditor::fermer() {
|
bool QETDiagramEditor::fermer() {
|
||||||
DiagramView *sv = diagramEnCours();
|
DiagramView *sv = currentDiagram();
|
||||||
if (!sv) return(false);
|
if (!sv) return(false);
|
||||||
return(sv -> close());
|
return(sv -> close());
|
||||||
}
|
}
|
||||||
@@ -540,7 +543,7 @@ bool QETDiagramEditor::fermer() {
|
|||||||
/**
|
/**
|
||||||
@return Le DiagramView qui a le focus dans l'interface MDI
|
@return Le DiagramView qui a le focus dans l'interface MDI
|
||||||
*/
|
*/
|
||||||
DiagramView *QETDiagramEditor::diagramEnCours() const {
|
DiagramView *QETDiagramEditor::currentDiagram() const {
|
||||||
return(qobject_cast<DiagramView *>(workspace.activeWindow()));
|
return(qobject_cast<DiagramView *>(workspace.activeWindow()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -548,105 +551,105 @@ DiagramView *QETDiagramEditor::diagramEnCours() const {
|
|||||||
Effectue l'action "couper" sur le schema en cours
|
Effectue l'action "couper" sur le schema en cours
|
||||||
*/
|
*/
|
||||||
void QETDiagramEditor::slot_couper() {
|
void QETDiagramEditor::slot_couper() {
|
||||||
if(diagramEnCours()) diagramEnCours() -> couper();
|
if(currentDiagram()) currentDiagram() -> couper();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Effectue l'action "copier" sur le diagram en cours
|
Effectue l'action "copier" sur le diagram en cours
|
||||||
*/
|
*/
|
||||||
void QETDiagramEditor::slot_copier() {
|
void QETDiagramEditor::slot_copier() {
|
||||||
if(diagramEnCours()) diagramEnCours() -> copier();
|
if(currentDiagram()) currentDiagram() -> copier();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Effectue l'action "coller" sur le schema en cours
|
Effectue l'action "coller" sur le schema en cours
|
||||||
*/
|
*/
|
||||||
void QETDiagramEditor::slot_coller() {
|
void QETDiagramEditor::slot_coller() {
|
||||||
if(diagramEnCours()) diagramEnCours() -> coller();
|
if(currentDiagram()) currentDiagram() -> coller();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Effectue l'action "zoom avant" sur le diagram en cours
|
Effectue l'action "zoom avant" sur le diagram en cours
|
||||||
*/
|
*/
|
||||||
void QETDiagramEditor::slot_zoomPlus() {
|
void QETDiagramEditor::slot_zoomPlus() {
|
||||||
if(diagramEnCours()) diagramEnCours() -> zoomPlus();
|
if(currentDiagram()) currentDiagram() -> zoomPlus();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Effectue l'action "zoom arriere" sur le schema en cours
|
Effectue l'action "zoom arriere" sur le schema en cours
|
||||||
*/
|
*/
|
||||||
void QETDiagramEditor::slot_zoomMoins() {
|
void QETDiagramEditor::slot_zoomMoins() {
|
||||||
if(diagramEnCours()) diagramEnCours() -> zoomMoins();
|
if(currentDiagram()) currentDiagram() -> zoomMoins();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Effectue l'action "zoom arriere" sur le diagram en cours
|
Effectue l'action "zoom arriere" sur le diagram en cours
|
||||||
*/
|
*/
|
||||||
void QETDiagramEditor::slot_zoomFit() {
|
void QETDiagramEditor::slot_zoomFit() {
|
||||||
if(diagramEnCours()) diagramEnCours() -> zoomFit();
|
if(currentDiagram()) currentDiagram() -> zoomFit();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Effectue l'action "zoom par defaut" sur le schema en cours
|
Effectue l'action "zoom par defaut" sur le schema en cours
|
||||||
*/
|
*/
|
||||||
void QETDiagramEditor::slot_zoomReset() {
|
void QETDiagramEditor::slot_zoomReset() {
|
||||||
if(diagramEnCours()) diagramEnCours() -> zoomReset();
|
if(currentDiagram()) currentDiagram() -> zoomReset();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Effectue l'action "selectionner tout" sur le schema en cours
|
Effectue l'action "selectionner tout" sur le schema en cours
|
||||||
*/
|
*/
|
||||||
void QETDiagramEditor::slot_selectAll() {
|
void QETDiagramEditor::slot_selectAll() {
|
||||||
if(diagramEnCours()) diagramEnCours() -> selectAll();
|
if(currentDiagram()) currentDiagram() -> selectAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Effectue l'action "deselectionenr tout" sur le schema en cours
|
Effectue l'action "deselectionenr tout" sur le schema en cours
|
||||||
*/
|
*/
|
||||||
void QETDiagramEditor::slot_selectNothing() {
|
void QETDiagramEditor::slot_selectNothing() {
|
||||||
if(diagramEnCours()) diagramEnCours() -> selectNothing();
|
if(currentDiagram()) currentDiagram() -> selectNothing();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Effectue l'action "inverser la selection" sur le schema en cours
|
Effectue l'action "inverser la selection" sur le schema en cours
|
||||||
*/
|
*/
|
||||||
void QETDiagramEditor::slot_selectInvert() {
|
void QETDiagramEditor::slot_selectInvert() {
|
||||||
if(diagramEnCours()) diagramEnCours() -> selectInvert();
|
if(currentDiagram()) currentDiagram() -> selectInvert();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Effectue l'action "supprimer" sur le schema en cours
|
Effectue l'action "supprimer" sur le schema en cours
|
||||||
*/
|
*/
|
||||||
void QETDiagramEditor::slot_supprimer() {
|
void QETDiagramEditor::slot_supprimer() {
|
||||||
if(diagramEnCours()) diagramEnCours() -> supprimer();
|
if(currentDiagram()) currentDiagram() -> supprimer();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Effectue l'action "pivoter" sur le schema en cours
|
Effectue l'action "pivoter" sur le schema en cours
|
||||||
*/
|
*/
|
||||||
void QETDiagramEditor::slot_pivoter() {
|
void QETDiagramEditor::slot_pivoter() {
|
||||||
if(diagramEnCours()) diagramEnCours() -> pivoter();
|
if(currentDiagram()) currentDiagram() -> pivoter();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Effectue l'action "mode selection" sur le schema en cours
|
Effectue l'action "mode selection" sur le schema en cours
|
||||||
*/
|
*/
|
||||||
void QETDiagramEditor::slot_setSelectionMode() {
|
void QETDiagramEditor::slot_setSelectionMode() {
|
||||||
if(diagramEnCours()) diagramEnCours() -> setSelectionMode();
|
if(currentDiagram()) currentDiagram() -> setSelectionMode();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Effectue l'action "mode visualisation" sur le schema en cours
|
Effectue l'action "mode visualisation" sur le schema en cours
|
||||||
*/
|
*/
|
||||||
void QETDiagramEditor::slot_setVisualisationMode() {
|
void QETDiagramEditor::slot_setVisualisationMode() {
|
||||||
if(diagramEnCours()) diagramEnCours() -> setVisualisationMode();
|
if(currentDiagram()) currentDiagram() -> setVisualisationMode();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
gere les actions ayant besoin d'un document ouvert
|
gere les actions ayant besoin d'un document ouvert
|
||||||
*/
|
*/
|
||||||
void QETDiagramEditor::slot_updateActions() {
|
void QETDiagramEditor::slot_updateActions() {
|
||||||
DiagramView *sv = diagramEnCours();
|
DiagramView *sv = currentDiagram();
|
||||||
bool document_ouvert = (sv != 0);
|
bool document_ouvert = (sv != 0);
|
||||||
|
|
||||||
// actions ayant juste besoin d'un document ouvert
|
// actions ayant juste besoin d'un document ouvert
|
||||||
@@ -669,9 +672,12 @@ void QETDiagramEditor::slot_updateActions() {
|
|||||||
expand_diagram -> setEnabled(document_ouvert);
|
expand_diagram -> setEnabled(document_ouvert);
|
||||||
shrink_diagram -> setEnabled(document_ouvert);
|
shrink_diagram -> setEnabled(document_ouvert);
|
||||||
|
|
||||||
// actions ayant aussi besoin d'un historique des actions
|
// affiche les actions correspondant au diagram view en cours
|
||||||
annuler -> setEnabled(document_ouvert);
|
if (sv) undo_group.setActiveStack(&(sv -> diagram() -> undoStack()));
|
||||||
refaire -> setEnabled(document_ouvert);
|
else {
|
||||||
|
annuler -> setEnabled(false);
|
||||||
|
refaire -> setEnabled(false);
|
||||||
|
}
|
||||||
|
|
||||||
// actions ayant aussi besoin d'elements selectionnes
|
// actions ayant aussi besoin d'elements selectionnes
|
||||||
bool elements_selectionnes = document_ouvert ? (sv -> hasSelectedItems()) : false;
|
bool elements_selectionnes = document_ouvert ? (sv -> hasSelectedItems()) : false;
|
||||||
@@ -716,17 +722,18 @@ void QETDiagramEditor::slot_updateActions() {
|
|||||||
Ajoute un schema dans l'espace de travail
|
Ajoute un schema dans l'espace de travail
|
||||||
@param sv L'objet DiagramView a ajouter a l'espace de travail
|
@param sv L'objet DiagramView a ajouter a l'espace de travail
|
||||||
*/
|
*/
|
||||||
void QETDiagramEditor::addDiagramView(DiagramView *sv) {
|
void QETDiagramEditor::addDiagramView(DiagramView *dv) {
|
||||||
if (!sv) return;
|
if (!dv) return;
|
||||||
|
undo_group.addStack(&(dv -> diagram() -> undoStack()));
|
||||||
|
|
||||||
// on maximise la nouvelle fenetre si la fenetre en cours est inexistante ou bien maximisee
|
// on maximise la nouvelle fenetre si la fenetre en cours est inexistante ou bien maximisee
|
||||||
DiagramView *s_v = diagramEnCours();
|
DiagramView *d_v = currentDiagram();
|
||||||
bool maximise = ((!s_v) || (s_v -> windowState() & Qt::WindowMaximized));
|
bool maximise = ((!d_v) || (d_v -> windowState() & Qt::WindowMaximized));
|
||||||
|
|
||||||
// ajoute la fenetre
|
// ajoute la fenetre
|
||||||
QWidget *p = workspace.addWindow(sv);
|
QWidget *p = workspace.addWindow(dv);
|
||||||
connect(sv, SIGNAL(selectionChanged()), this, SLOT(slot_updateActions()));
|
connect(dv, SIGNAL(selectionChanged()), this, SLOT(slot_updateActions()));
|
||||||
connect(sv, SIGNAL(modeChanged()), this, SLOT(slot_updateActions()));
|
connect(dv, SIGNAL(modeChanged()), this, SLOT(slot_updateActions()));
|
||||||
|
|
||||||
// affiche la fenetre
|
// affiche la fenetre
|
||||||
if (maximise) p -> showMaximized();
|
if (maximise) p -> showMaximized();
|
||||||
@@ -771,7 +778,7 @@ void QETDiagramEditor::slot_updateMenuFenetres() {
|
|||||||
QAction *action = menu_fenetres -> addAction(sv_titre);
|
QAction *action = menu_fenetres -> addAction(sv_titre);
|
||||||
action -> setStatusTip(tr("Active la fen\352tre ") + sv_titre);
|
action -> setStatusTip(tr("Active la fen\352tre ") + sv_titre);
|
||||||
action -> setCheckable(true);
|
action -> setCheckable(true);
|
||||||
action -> setChecked(sv == diagramEnCours());
|
action -> setChecked(sv == currentDiagram());
|
||||||
connect(action, SIGNAL(triggered()), &windowMapper, SLOT(map()));
|
connect(action, SIGNAL(triggered()), &windowMapper, SLOT(map()));
|
||||||
windowMapper.setMapping(action, sv);
|
windowMapper.setMapping(action, sv);
|
||||||
}
|
}
|
||||||
@@ -781,7 +788,7 @@ void QETDiagramEditor::slot_updateMenuFenetres() {
|
|||||||
Edite les informations du schema en cours
|
Edite les informations du schema en cours
|
||||||
*/
|
*/
|
||||||
void QETDiagramEditor::slot_editInfos() {
|
void QETDiagramEditor::slot_editInfos() {
|
||||||
DiagramView *sv = diagramEnCours();
|
DiagramView *sv = currentDiagram();
|
||||||
if (!sv) return;
|
if (!sv) return;
|
||||||
sv -> dialogEditInfos();
|
sv -> dialogEditInfos();
|
||||||
}
|
}
|
||||||
@@ -790,7 +797,7 @@ void QETDiagramEditor::slot_editInfos() {
|
|||||||
Ajoute une colonne au schema en cours
|
Ajoute une colonne au schema en cours
|
||||||
*/
|
*/
|
||||||
void QETDiagramEditor::slot_addColumn() {
|
void QETDiagramEditor::slot_addColumn() {
|
||||||
DiagramView *sv = diagramEnCours();
|
DiagramView *sv = currentDiagram();
|
||||||
if (!sv) return;
|
if (!sv) return;
|
||||||
sv -> addColumn();
|
sv -> addColumn();
|
||||||
}
|
}
|
||||||
@@ -799,7 +806,7 @@ void QETDiagramEditor::slot_addColumn() {
|
|||||||
Enleve une colonne au schema en cours
|
Enleve une colonne au schema en cours
|
||||||
*/
|
*/
|
||||||
void QETDiagramEditor::slot_removeColumn() {
|
void QETDiagramEditor::slot_removeColumn() {
|
||||||
DiagramView *sv = diagramEnCours();
|
DiagramView *sv = currentDiagram();
|
||||||
if (!sv) return;
|
if (!sv) return;
|
||||||
sv -> removeColumn();
|
sv -> removeColumn();
|
||||||
}
|
}
|
||||||
@@ -808,7 +815,7 @@ void QETDiagramEditor::slot_removeColumn() {
|
|||||||
Allonge le schema en cours en hauteur
|
Allonge le schema en cours en hauteur
|
||||||
*/
|
*/
|
||||||
void QETDiagramEditor::slot_expand() {
|
void QETDiagramEditor::slot_expand() {
|
||||||
DiagramView *sv = diagramEnCours();
|
DiagramView *sv = currentDiagram();
|
||||||
if (!sv) return;
|
if (!sv) return;
|
||||||
sv -> expand();
|
sv -> expand();
|
||||||
}
|
}
|
||||||
@@ -817,7 +824,7 @@ void QETDiagramEditor::slot_expand() {
|
|||||||
Retrecit le schema en cours en hauteur
|
Retrecit le schema en cours en hauteur
|
||||||
*/
|
*/
|
||||||
void QETDiagramEditor::slot_shrink() {
|
void QETDiagramEditor::slot_shrink() {
|
||||||
DiagramView *sv = diagramEnCours();
|
DiagramView *sv = currentDiagram();
|
||||||
if (!sv) return;
|
if (!sv) return;
|
||||||
sv -> shrink();
|
sv -> shrink();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ class QETDiagramEditor : public QMainWindow {
|
|||||||
void actions();
|
void actions();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DiagramView *diagramEnCours() const;
|
DiagramView *currentDiagram() const;
|
||||||
void menus();
|
void menus();
|
||||||
void toolbar();
|
void toolbar();
|
||||||
|
|
||||||
@@ -121,5 +121,6 @@ class QETDiagramEditor : public QMainWindow {
|
|||||||
ElementsPanelWidget *pa;
|
ElementsPanelWidget *pa;
|
||||||
QMenu *menu_fenetres;
|
QMenu *menu_fenetres;
|
||||||
QToolBar *barre_outils;
|
QToolBar *barre_outils;
|
||||||
|
QUndoGroup undo_group;
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
21
terminal.cpp
21
terminal.cpp
@@ -2,6 +2,7 @@
|
|||||||
#include "diagram.h"
|
#include "diagram.h"
|
||||||
#include "element.h"
|
#include "element.h"
|
||||||
#include "conducer.h"
|
#include "conducer.h"
|
||||||
|
#include "diagramcommands.h"
|
||||||
|
|
||||||
QColor Terminal::couleur_neutre = QColor(Qt::blue);
|
QColor Terminal::couleur_neutre = QColor(Qt::blue);
|
||||||
QColor Terminal::couleur_autorise = QColor(Qt::darkGreen);
|
QColor Terminal::couleur_autorise = QColor(Qt::darkGreen);
|
||||||
@@ -51,7 +52,6 @@ Terminal::Terminal() :
|
|||||||
couleur_hovered(Terminal::couleur_neutre)
|
couleur_hovered(Terminal::couleur_neutre)
|
||||||
{
|
{
|
||||||
initialise(QPointF(0.0, 0.0), QET::South);
|
initialise(QPointF(0.0, 0.0), QET::South);
|
||||||
diagram_scene = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -66,7 +66,6 @@ Terminal::Terminal(QPointF pf, QET::Orientation o, Element *e, Diagram *s) :
|
|||||||
couleur_hovered(Terminal::couleur_neutre)
|
couleur_hovered(Terminal::couleur_neutre)
|
||||||
{
|
{
|
||||||
initialise(pf, o);
|
initialise(pf, o);
|
||||||
diagram_scene = s;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -241,7 +240,7 @@ void Terminal::hoverLeaveEvent(QGraphicsSceneHoverEvent *) {
|
|||||||
@param e L'evenement souris correspondant
|
@param e L'evenement souris correspondant
|
||||||
*/
|
*/
|
||||||
void Terminal::mousePressEvent(QGraphicsSceneMouseEvent *e) {
|
void Terminal::mousePressEvent(QGraphicsSceneMouseEvent *e) {
|
||||||
if (Diagram *s = qobject_cast<Diagram *>(scene())) {
|
if (Diagram *s = diagram()) {
|
||||||
s -> setConducerStart(mapToScene(QPointF(amarrage_conducer)));
|
s -> setConducerStart(mapToScene(QPointF(amarrage_conducer)));
|
||||||
s -> setConducerStop(e -> scenePos());
|
s -> setConducerStop(e -> scenePos());
|
||||||
s -> setConducer(true);
|
s -> setConducer(true);
|
||||||
@@ -265,11 +264,14 @@ void Terminal::mouseMoveEvent(QGraphicsSceneMouseEvent *e) {
|
|||||||
terminal_precedente -> update();
|
terminal_precedente -> update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Diagram *s = diagram();
|
||||||
|
if (!s) return;
|
||||||
// si la scene est un Diagram, on actualise le poseur de conducteur
|
// si la scene est un Diagram, on actualise le poseur de conducteur
|
||||||
if (Diagram *s = qobject_cast<Diagram *>(scene())) s -> setConducerStop(e -> scenePos());
|
s -> setConducerStop(e -> scenePos());
|
||||||
|
|
||||||
// on recupere la liste des qgi sous le pointeur
|
// on recupere la liste des qgi sous le pointeur
|
||||||
QList<QGraphicsItem *> qgis = scene() -> items(e -> scenePos());
|
QList<QGraphicsItem *> qgis = s -> items(e -> scenePos());
|
||||||
|
|
||||||
/* le qgi le plus haut
|
/* le qgi le plus haut
|
||||||
= le poseur de conducer
|
= le poseur de conducer
|
||||||
@@ -326,7 +328,7 @@ void Terminal::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) {
|
|||||||
terminal_precedente = NULL;
|
terminal_precedente = NULL;
|
||||||
couleur_hovered = couleur_neutre;
|
couleur_hovered = couleur_neutre;
|
||||||
// verifie que la scene est bien un Diagram
|
// verifie que la scene est bien un Diagram
|
||||||
if (Diagram *s = qobject_cast<Diagram *>(scene())) {
|
if (Diagram *s = diagram()) {
|
||||||
// on arrete de dessiner l'apercu du conducteur
|
// on arrete de dessiner l'apercu du conducteur
|
||||||
s -> setConducer(false);
|
s -> setConducer(false);
|
||||||
// on recupere l'element sous le pointeur lors du MouseReleaseEvent
|
// on recupere l'element sous le pointeur lors du MouseReleaseEvent
|
||||||
@@ -346,7 +348,7 @@ void Terminal::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) {
|
|||||||
// derniere verification : verifier que cette borne n'est pas deja reliee a l'autre borne
|
// derniere verification : verifier que cette borne n'est pas deja reliee a l'autre borne
|
||||||
foreach (Conducer *f, liste_conducers) if (f -> terminal1 == p || f -> terminal2 == p) return;
|
foreach (Conducer *f, liste_conducers) if (f -> terminal1 == p || f -> terminal2 == p) return;
|
||||||
// autrement, on pose un conducteur
|
// autrement, on pose un conducteur
|
||||||
new Conducer(this, p, 0, scene());
|
s -> undoStack().push(new AddConducerCommand(s, new Conducer(this, p)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -436,3 +438,8 @@ bool Terminal::fromXml(QDomElement &terminal) {
|
|||||||
terminal.attribute("orientation").toInt() == sens
|
terminal.attribute("orientation").toInt() == sens
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// @return le Diagram auquel cette borne appartient, ou 0 si cette borne est independant
|
||||||
|
Diagram *Terminal::diagram() const {
|
||||||
|
return(qobject_cast<Diagram *>(scene()));
|
||||||
|
}
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ class Terminal : public QGraphicsItem {
|
|||||||
bool addConducer(Conducer *);
|
bool addConducer(Conducer *);
|
||||||
void removeConducer(Conducer *);
|
void removeConducer(Conducer *);
|
||||||
int nbConducers() const;
|
int nbConducers() const;
|
||||||
|
Diagram *diagram() const;
|
||||||
|
|
||||||
// methodes de lecture
|
// methodes de lecture
|
||||||
QList<Conducer *> conducers() const;
|
QList<Conducer *> conducers() const;
|
||||||
@@ -68,8 +69,6 @@ class Terminal : public QGraphicsItem {
|
|||||||
static QColor couleur_interdit;
|
static QColor couleur_interdit;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// pointeur vers la QGraphicsScene de type Diagram (evite quelques casts en interne)
|
|
||||||
Diagram *diagram_scene;
|
|
||||||
// coordonnees des points d'amarrage
|
// coordonnees des points d'amarrage
|
||||||
QPointF amarrage_conducer;
|
QPointF amarrage_conducer;
|
||||||
QPointF amarrage_elmt;
|
QPointF amarrage_elmt;
|
||||||
|
|||||||
Reference in New Issue
Block a user