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:
xavierqet
2007-09-25 23:24:36 +00:00
parent a434d2d7fc
commit 3c43edb2ee
21 changed files with 342 additions and 140 deletions

View File

@@ -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

View File

@@ -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 *);

View File

@@ -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);
} }

View File

@@ -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

View File

@@ -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
View 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
View 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

View File

@@ -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);
} }
} }

View File

@@ -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();
}; };

View File

@@ -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) {

View File

@@ -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

View File

@@ -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()));
}

View File

@@ -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;

View File

@@ -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()));
}

View File

@@ -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;
}; };
/** /**

View File

@@ -1 +1 @@
IDI_ICON1 ICON DISCARDABLE "ico/windows_icon/application_icon/qet.ico" IDI_ICON1 ICON DISCARDABLE "ico/windows_icon/application_icon/qet.ico"

View File

@@ -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

View File

@@ -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();
} }

View File

@@ -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

View File

@@ -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()));
}

View File

@@ -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;