2006-10-27 15:47:22 +00:00
|
|
|
|
#ifndef SCHEMA_H
|
2007-04-09 02:56:47 +00:00
|
|
|
|
#define SCHEMA_H
|
|
|
|
|
#define GRILLE_X 10
|
|
|
|
|
#define GRILLE_Y 10
|
|
|
|
|
#define MARGIN 5.0
|
|
|
|
|
#include <QtGui>
|
|
|
|
|
#include <QtXml>
|
2007-09-21 12:35:28 +00:00
|
|
|
|
#include "qetdiagrameditor.h"
|
2007-04-09 02:56:47 +00:00
|
|
|
|
#include "borderinset.h"
|
2007-09-25 23:24:36 +00:00
|
|
|
|
#include "qgimanager.h"
|
2007-04-09 02:56:47 +00:00
|
|
|
|
class Element;
|
|
|
|
|
class Terminal;
|
2007-09-15 22:14:23 +00:00
|
|
|
|
class Conducer;
|
2007-04-09 02:56:47 +00:00
|
|
|
|
class Diagram : public QGraphicsScene {
|
|
|
|
|
Q_OBJECT
|
2007-04-12 03:13:13 +00:00
|
|
|
|
|
|
|
|
|
// constructeurs, destructeur
|
2007-04-09 02:56:47 +00:00
|
|
|
|
public:
|
|
|
|
|
Diagram(QObject * = 0);
|
2007-04-12 03:13:13 +00:00
|
|
|
|
virtual ~Diagram();
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
Diagram(const Diagram &diagram);
|
|
|
|
|
|
|
|
|
|
// attributs
|
|
|
|
|
public:
|
|
|
|
|
enum BorderOptions { EmptyBorder, Inset, Columns };
|
|
|
|
|
BorderInset border_and_inset;
|
2007-09-26 17:14:09 +00:00
|
|
|
|
QPointF current_movement;
|
2007-04-12 03:13:13 +00:00
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
QGraphicsLineItem *conducer_setter;
|
|
|
|
|
bool draw_grid;
|
|
|
|
|
bool use_border;
|
2007-09-15 22:14:23 +00:00
|
|
|
|
bool moved_elements_fetched;
|
|
|
|
|
QSet<Element *> elements_to_move;
|
|
|
|
|
QSet<Conducer *> conducers_to_move;
|
|
|
|
|
QHash<Conducer *, Terminal *> conducers_to_update;
|
2007-09-25 23:24:36 +00:00
|
|
|
|
QGIManager qgi_manager;
|
|
|
|
|
QUndoStack undo_stack;
|
2007-09-30 12:35:25 +00:00
|
|
|
|
bool draw_terminals;
|
2007-04-12 03:13:13 +00:00
|
|
|
|
|
|
|
|
|
// methodes
|
|
|
|
|
public:
|
2007-04-09 02:56:47 +00:00
|
|
|
|
void drawBackground(QPainter *, const QRectF &);
|
2007-09-15 23:45:27 +00:00
|
|
|
|
void keyPressEvent(QKeyEvent *);
|
|
|
|
|
void keyReleaseEvent(QKeyEvent *);
|
2007-04-09 02:56:47 +00:00
|
|
|
|
|
|
|
|
|
// fonctions relatives a la pose de conducteurs
|
2007-04-12 03:13:13 +00:00
|
|
|
|
void setConducer(bool);
|
|
|
|
|
void setConducerStart (QPointF);
|
|
|
|
|
void setConducerStop(QPointF);
|
2007-04-09 02:56:47 +00:00
|
|
|
|
|
|
|
|
|
// fonctions relatives a l'import / export XML
|
|
|
|
|
QDomDocument toXml(bool = true);
|
2007-09-26 12:36:31 +00:00
|
|
|
|
bool fromXml(QDomDocument &, QPointF = QPointF(), bool = true, QList<Element *> * = NULL, QList<Conducer *> * = NULL);
|
2007-04-09 02:56:47 +00:00
|
|
|
|
|
|
|
|
|
// fonctions relatives aux options graphiques
|
2007-04-12 03:13:13 +00:00
|
|
|
|
void setDisplayGrid(bool);
|
2007-04-09 02:56:47 +00:00
|
|
|
|
bool displayGrid();
|
|
|
|
|
void setUseBorder(bool);
|
|
|
|
|
bool useBorder();
|
|
|
|
|
void setBorderOptions(BorderOptions);
|
|
|
|
|
BorderOptions borderOptions();
|
2007-04-12 03:13:13 +00:00
|
|
|
|
|
2007-09-30 12:35:25 +00:00
|
|
|
|
bool drawTerminals() const;
|
|
|
|
|
void setDrawTerminals(bool);
|
|
|
|
|
|
2007-04-09 02:56:47 +00:00
|
|
|
|
QRectF border() const;
|
|
|
|
|
QImage toImage(int = -1, int = -1, Qt::AspectRatioMode = Qt::KeepAspectRatio);
|
|
|
|
|
QSize imageSize() const;
|
|
|
|
|
|
2007-09-15 22:14:23 +00:00
|
|
|
|
void invalidateMovedElements();
|
|
|
|
|
void fetchMovedElements();
|
|
|
|
|
const QSet<Element *> &elementsToMove();
|
|
|
|
|
const QSet<Conducer *> &conducersToMove();
|
|
|
|
|
const QHash<Conducer *, Terminal *> &conducersToUpdate();
|
2007-10-03 13:11:47 +00:00
|
|
|
|
QSet<Conducer *> selectedConducers() const;
|
2007-09-15 22:14:23 +00:00
|
|
|
|
|
2007-09-25 23:24:36 +00:00
|
|
|
|
QUndoStack &undoStack();
|
|
|
|
|
QGIManager &qgiManager();
|
|
|
|
|
|
2007-04-09 02:56:47 +00:00
|
|
|
|
private slots:
|
|
|
|
|
void slot_checkSelectionEmptinessChange();
|
|
|
|
|
|
|
|
|
|
signals:
|
|
|
|
|
void selectionEmptinessChanged();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
Permet d'ajouter ou enlever le <EFBFBD> poseur de conducteur <EFBFBD>, c'est-a-dire la
|
|
|
|
|
droite en pointilles qui apparait lorsqu'on pose un conducteur entre deux
|
|
|
|
|
bornes.
|
|
|
|
|
@param true pour ajouter le poseur de conducteur, false pour l'enlever
|
|
|
|
|
*/
|
2007-04-12 03:13:13 +00:00
|
|
|
|
inline void Diagram::setConducer(bool pf) {
|
2007-04-09 02:56:47 +00:00
|
|
|
|
if (pf) {
|
2007-04-12 03:13:13 +00:00
|
|
|
|
if (!conducer_setter -> scene()) addItem(conducer_setter);
|
2007-04-09 02:56:47 +00:00
|
|
|
|
} else {
|
2007-04-12 03:13:13 +00:00
|
|
|
|
if (conducer_setter -> scene()) removeItem(conducer_setter);
|
2007-04-09 02:56:47 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
Specifie les coordonnees du point de depart du poseur de conducteur
|
|
|
|
|
@param d Le nouveau point de depart du poseur de conducteur
|
|
|
|
|
*/
|
2007-04-12 03:13:13 +00:00
|
|
|
|
inline void Diagram::setConducerStart(QPointF d) {
|
|
|
|
|
conducer_setter -> setLine(QLineF(d, conducer_setter -> line().p2()));
|
2007-04-09 02:56:47 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
Specifie les coordonnees du point d'arrivee du poseur de conducteur
|
|
|
|
|
@param d Le nouveau point d'arrivee du poseur de conducteur
|
|
|
|
|
*/
|
2007-04-12 03:13:13 +00:00
|
|
|
|
inline void Diagram::setConducerStop(QPointF a) {
|
|
|
|
|
conducer_setter -> setLine(QLineF(conducer_setter -> line().p1(), a));
|
2007-04-09 02:56:47 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
Permet de specifier si la grille du schema doit etre dessinee ou non
|
|
|
|
|
@param dg true pour afficher la grille, false pour ne pas l'afficher
|
|
|
|
|
*/
|
2007-04-12 03:13:13 +00:00
|
|
|
|
inline void Diagram::setDisplayGrid(bool dg) {
|
2007-04-09 02:56:47 +00:00
|
|
|
|
draw_grid = dg;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
Permet de savoir si la grille du schema est dessinee ou non
|
|
|
|
|
@return true si la grille est affichee , false sinon
|
|
|
|
|
*/
|
|
|
|
|
inline bool Diagram::displayGrid() {
|
|
|
|
|
return(draw_grid);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
Permet de specifier si le cadre du schema doit etre pris en compte pour
|
|
|
|
|
determiner le contour du schema.
|
|
|
|
|
@param ub true pour prendre le schema en compte, false sinon
|
|
|
|
|
*/
|
|
|
|
|
inline void Diagram::setUseBorder(bool ub) {
|
|
|
|
|
use_border = ub;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
Permet de savoir si le cadre du schema est pris en compte pour
|
|
|
|
|
determiner le contour du schema.
|
|
|
|
|
@param ub true le cadre est pris en compte, false sinon
|
|
|
|
|
*/
|
|
|
|
|
inline bool Diagram::useBorder() {
|
|
|
|
|
return(use_border);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
Permet de definir les options du cadre, des colonnes et du cartouche.
|
|
|
|
|
@param bo Un OU binaire entre les options possibles
|
|
|
|
|
@see BorderOptions
|
|
|
|
|
*/
|
|
|
|
|
inline void Diagram::setBorderOptions(Diagram::BorderOptions bo) {
|
|
|
|
|
border_and_inset.displayBorder(!(bo & EmptyBorder));
|
|
|
|
|
border_and_inset.displayColumns(bo & Columns);
|
|
|
|
|
border_and_inset.displayInset(bo & Inset);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
Permet de savoir les options du cadre, des colonnes et du cartouche.
|
|
|
|
|
@return Un OU binaire entre les options possibles
|
|
|
|
|
@see BorderOptions
|
|
|
|
|
*/
|
|
|
|
|
inline Diagram::BorderOptions Diagram::borderOptions() {
|
|
|
|
|
BorderOptions retour = EmptyBorder;
|
|
|
|
|
if (border_and_inset.insetIsDisplayed()) retour = (BorderOptions)(retour|Inset);
|
|
|
|
|
if (border_and_inset.columnsAreDisplayed()) retour = (BorderOptions)(retour|Columns);
|
|
|
|
|
return(retour);
|
|
|
|
|
}
|
|
|
|
|
|
2007-09-15 22:14:23 +00:00
|
|
|
|
/// @return la liste des elements a deplacer
|
|
|
|
|
inline const QSet<Element *> &Diagram::elementsToMove() {
|
|
|
|
|
if (!moved_elements_fetched) fetchMovedElements();
|
|
|
|
|
return(elements_to_move);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// @return la liste des conducteurs a deplacer
|
|
|
|
|
inline const QSet<Conducer *> &Diagram::conducersToMove() {
|
|
|
|
|
if (!moved_elements_fetched) fetchMovedElements();
|
|
|
|
|
return(conducers_to_move);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// @return la liste des conducteurs a modifier (typiquement les conducteurs dont seul un element est deplace)
|
|
|
|
|
inline const QHash<Conducer *, Terminal *> &Diagram::conducersToUpdate() {
|
|
|
|
|
if (!moved_elements_fetched) fetchMovedElements();
|
|
|
|
|
return(conducers_to_update);
|
|
|
|
|
}
|
|
|
|
|
|
2007-09-25 23:24:36 +00:00
|
|
|
|
/// @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);
|
|
|
|
|
}
|
|
|
|
|
|
2007-09-30 12:35:25 +00:00
|
|
|
|
inline bool Diagram::drawTerminals() const {
|
|
|
|
|
return(draw_terminals);
|
|
|
|
|
}
|
|
|
|
|
|
2006-10-27 15:47:22 +00:00
|
|
|
|
#endif
|