2007-12-01 10:47:15 +00:00
|
|
|
/*
|
2009-04-03 19:30:25 +00:00
|
|
|
Copyright 2006-2009 Xavier Guerrin
|
2007-12-01 10:47:15 +00:00
|
|
|
This file is part of QElectroTech.
|
|
|
|
|
|
|
|
QElectroTech is free software: you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation, either version 2 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
QElectroTech is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
2007-08-25 03:43:05 +00:00
|
|
|
#ifndef ELEMENT_SCENE_H
|
|
|
|
#define ELEMENT_SCENE_H
|
2007-06-30 17:41:07 +00:00
|
|
|
#include <QtGui>
|
|
|
|
#include <QtXml>
|
|
|
|
#include "nameslistwidget.h"
|
|
|
|
#include "orientationsetwidget.h"
|
2007-08-23 15:33:55 +00:00
|
|
|
#include "qgimanager.h"
|
2009-04-03 19:30:25 +00:00
|
|
|
#include "elementcontent.h"
|
2007-08-25 03:43:05 +00:00
|
|
|
class QETElementEditor;
|
2007-06-30 17:41:07 +00:00
|
|
|
class PartLine;
|
2009-04-03 19:30:25 +00:00
|
|
|
class PartRectangle;
|
2007-06-30 17:41:07 +00:00
|
|
|
class PartEllipse;
|
|
|
|
class PartCircle;
|
|
|
|
class PartPolygon;
|
2007-07-10 22:54:22 +00:00
|
|
|
class PartArc;
|
2007-10-21 16:10:21 +00:00
|
|
|
/**
|
|
|
|
Cette classe est le canevas permettant l'edition d'un element electrique.
|
|
|
|
Elle regroupe les differentes parties composant le dessin de l'element mais
|
|
|
|
egalement les informations complementaires : dimensions, orientations,
|
|
|
|
noms.
|
|
|
|
*/
|
2007-08-25 03:43:05 +00:00
|
|
|
class ElementScene : public QGraphicsScene {
|
2007-06-30 17:41:07 +00:00
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
// enum
|
2009-04-03 19:30:25 +00:00
|
|
|
enum Behavior { Normal, Line, Rectangle, Circle, Ellipse, Polygon, Text, Terminal, Arc, TextField, PasteArea };
|
2007-06-30 17:41:07 +00:00
|
|
|
|
|
|
|
// constructeurs, destructeur
|
|
|
|
public:
|
2007-08-25 03:43:05 +00:00
|
|
|
ElementScene(QETElementEditor *, QObject * = 0);
|
|
|
|
virtual ~ElementScene();
|
2007-06-30 17:41:07 +00:00
|
|
|
|
|
|
|
private:
|
2007-08-25 03:43:05 +00:00
|
|
|
ElementScene(const ElementScene &);
|
2007-06-30 17:41:07 +00:00
|
|
|
|
|
|
|
// attributs
|
|
|
|
private:
|
|
|
|
/// longueur de l'element en dizaines de pixels
|
|
|
|
uint _width;
|
|
|
|
/// hauteur de l'element en dizaines de pixels
|
|
|
|
uint _height;
|
|
|
|
/// position du point de saisie
|
|
|
|
QPoint _hotspot;
|
|
|
|
/// Liste des noms de l'element
|
|
|
|
NamesList _names;
|
|
|
|
/// Liste des orientations de l'element
|
|
|
|
OrientationSet ori;
|
2007-12-09 10:30:35 +00:00
|
|
|
/// booleen indiquant si les bornes de l'element peuvent etre reliees a des bornes de ce meme element
|
|
|
|
bool internal_connections;
|
2007-08-23 15:33:55 +00:00
|
|
|
/// Gestionnaire de QGraphicsItem
|
|
|
|
QGIManager qgi_manager;
|
2007-08-23 21:06:15 +00:00
|
|
|
/// Pile des actions annulables
|
|
|
|
QUndoStack undo_stack;
|
2007-09-21 11:48:37 +00:00
|
|
|
/// Position du premier item selectionne (utilise pour annuler les deplacements)
|
|
|
|
QPointF fsi_pos;
|
2009-04-03 19:30:25 +00:00
|
|
|
QPointF moving_press_pos;
|
|
|
|
bool moving_parts_;
|
2007-06-30 17:41:07 +00:00
|
|
|
|
|
|
|
/// Variables relatives a la gestion du dessin des parties sur la scene
|
|
|
|
Behavior behavior;
|
|
|
|
PartLine *current_line;
|
2009-04-03 19:30:25 +00:00
|
|
|
PartRectangle *current_rectangle;
|
2007-06-30 17:41:07 +00:00
|
|
|
PartEllipse *current_ellipse;
|
|
|
|
PartCircle *current_circle;
|
|
|
|
PartPolygon *current_polygon;
|
2007-07-10 22:54:22 +00:00
|
|
|
PartArc *current_arc;
|
2007-08-25 03:43:05 +00:00
|
|
|
QETElementEditor *element_editor;
|
2007-06-30 17:41:07 +00:00
|
|
|
|
2009-04-03 19:30:25 +00:00
|
|
|
/// Variables relatives a la gestion de la zone de collage sur la scene
|
|
|
|
QGraphicsRectItem *paste_area_;
|
|
|
|
QRectF defined_paste_area_;
|
|
|
|
|
|
|
|
/// Variables relatives au copier-coller avec decalage
|
|
|
|
QString last_copied_;
|
|
|
|
|
|
|
|
///< Taille horizontale de la grille
|
|
|
|
int x_grid;
|
|
|
|
///< Taille verticale de la grille
|
|
|
|
int y_grid;
|
|
|
|
|
2007-06-30 17:41:07 +00:00
|
|
|
// methodes
|
|
|
|
public:
|
2007-12-16 14:05:39 +00:00
|
|
|
void setWidth(const uint &);
|
2007-06-30 17:41:07 +00:00
|
|
|
uint width() const;
|
2007-12-16 14:05:39 +00:00
|
|
|
void setHeight(const uint &);
|
2007-06-30 17:41:07 +00:00
|
|
|
uint height() const;
|
|
|
|
void setHotspot(const QPoint &);
|
|
|
|
QPoint hotspot() const;
|
2007-12-16 14:05:39 +00:00
|
|
|
void setNames(const NamesList &);
|
2007-06-30 17:41:07 +00:00
|
|
|
NamesList names() const;
|
|
|
|
OrientationSet orientations();
|
|
|
|
void setOrientations(const OrientationSet &);
|
2007-12-09 10:54:59 +00:00
|
|
|
bool internalConnections();
|
|
|
|
void setInternalConnections(bool);
|
2009-04-03 19:30:25 +00:00
|
|
|
virtual int xGrid() const;
|
|
|
|
virtual int yGrid() const;
|
|
|
|
virtual void setGrid(int, int);
|
|
|
|
virtual const QDomDocument toXml(bool = true) const;
|
|
|
|
virtual QRectF boundingRectFromXml(const QDomDocument &);
|
|
|
|
virtual void fromXml(const QDomDocument &, const QPointF & = QPointF(), bool = true, ElementContent * = 0);
|
2007-12-09 12:00:11 +00:00
|
|
|
virtual void reset();
|
2007-10-07 18:52:01 +00:00
|
|
|
virtual QList<QGraphicsItem *> zItems(bool = false) const;
|
2009-04-03 19:30:25 +00:00
|
|
|
virtual ElementContent selectedContent() const;
|
|
|
|
virtual void getPasteArea(const QRectF &);
|
|
|
|
QRectF borderRect() const;
|
2007-09-10 21:12:49 +00:00
|
|
|
QRectF sceneContent() const;
|
2009-04-03 19:30:25 +00:00
|
|
|
bool borderContainsEveryParts() const;
|
2009-06-01 02:05:20 +00:00
|
|
|
bool containsTerminals() const;
|
2007-08-23 15:33:55 +00:00
|
|
|
QUndoStack &undoStack();
|
|
|
|
QGIManager &qgiManager();
|
2009-04-03 19:30:25 +00:00
|
|
|
static bool clipboardMayContainElement();
|
|
|
|
bool wasCopiedFromThisElement(const QString &);
|
|
|
|
void cut();
|
|
|
|
void copy();
|
|
|
|
void paste();
|
2007-06-30 17:41:07 +00:00
|
|
|
|
|
|
|
protected:
|
|
|
|
virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *);
|
|
|
|
virtual void mousePressEvent(QGraphicsSceneMouseEvent *);
|
|
|
|
virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *);
|
|
|
|
virtual void drawBackground(QPainter *, const QRectF &);
|
|
|
|
virtual void drawForeground(QPainter *, const QRectF &);
|
2009-04-03 19:30:25 +00:00
|
|
|
virtual void endCurrentBehavior(const QGraphicsSceneMouseEvent *);
|
|
|
|
|
|
|
|
private:
|
|
|
|
QRectF elementContentBoundingRect(const ElementContent &);
|
|
|
|
bool applyInformations(const QDomDocument &, QString * = 0);
|
|
|
|
ElementContent loadContent(const QDomDocument &, QString * = 0);
|
|
|
|
ElementContent addContent(const ElementContent &, QString * = 0);
|
|
|
|
ElementContent addContentAtPos(const ElementContent &, const QPointF &, QString * = 0);
|
|
|
|
void initPasteArea();
|
|
|
|
void snapToGrid(QPointF &);
|
|
|
|
bool mustSnapToGrid(QGraphicsSceneMouseEvent *);
|
2007-06-30 17:41:07 +00:00
|
|
|
|
|
|
|
public slots:
|
|
|
|
void slot_move();
|
|
|
|
void slot_addLine();
|
2009-04-03 19:30:25 +00:00
|
|
|
void slot_addRectangle();
|
2007-06-30 17:41:07 +00:00
|
|
|
void slot_addCircle();
|
|
|
|
void slot_addEllipse();
|
|
|
|
void slot_addPolygon();
|
|
|
|
void slot_addText();
|
|
|
|
void slot_addArc();
|
|
|
|
void slot_addTerminal();
|
|
|
|
void slot_addTextField();
|
2009-04-18 18:08:54 +00:00
|
|
|
void slot_select(const ElementContent &);
|
2007-06-30 17:41:07 +00:00
|
|
|
void slot_selectAll();
|
|
|
|
void slot_deselectAll();
|
|
|
|
void slot_invertSelection();
|
|
|
|
void slot_delete();
|
2007-08-18 22:59:10 +00:00
|
|
|
void slot_editSizeHotSpot();
|
2007-06-30 17:41:07 +00:00
|
|
|
void slot_editNames();
|
|
|
|
void slot_editOrientations();
|
2007-10-07 18:52:01 +00:00
|
|
|
void slot_bringForward();
|
|
|
|
void slot_raise();
|
|
|
|
void slot_lower();
|
|
|
|
void slot_sendBackward();
|
2007-06-30 17:41:07 +00:00
|
|
|
|
|
|
|
signals:
|
2007-12-16 14:05:39 +00:00
|
|
|
/**
|
|
|
|
Signal emis lorsque la scene exige que l'editeur d'element repasse
|
|
|
|
en mode normal
|
|
|
|
*/
|
2007-06-30 17:41:07 +00:00
|
|
|
void needNormalMode();
|
2007-12-16 14:05:39 +00:00
|
|
|
/// Signal emis lorsqu'une ou plusieurs parties sont ajoutees
|
2007-11-07 20:23:24 +00:00
|
|
|
void partsAdded();
|
2007-12-16 14:05:39 +00:00
|
|
|
/// Signal emis lorsqu'une ou plusieurs parties sont enlevees
|
2007-11-07 20:23:24 +00:00
|
|
|
void partsRemoved();
|
2007-12-16 14:05:39 +00:00
|
|
|
/// Signal emis lorsque la zValue d'une ou plusieurs parties change
|
2007-11-07 20:23:24 +00:00
|
|
|
void partsZValueChanged();
|
2009-04-03 19:30:25 +00:00
|
|
|
/// Signal emis lorsque l'utilisateur a fini de choisir une zone pour un copier/coller
|
|
|
|
void pasteAreaDefined(const QRectF &);
|
2007-06-30 17:41:07 +00:00
|
|
|
};
|
|
|
|
|
2007-12-05 21:16:01 +00:00
|
|
|
/**
|
|
|
|
@param wid Nouvelle largeur de l'element edite
|
|
|
|
*/
|
2007-08-25 03:43:05 +00:00
|
|
|
inline void ElementScene::setWidth(const uint &wid) {
|
2007-06-30 17:41:07 +00:00
|
|
|
_width = wid;
|
|
|
|
while (_width % 10) ++ _width;
|
|
|
|
_width /= 10;
|
|
|
|
}
|
|
|
|
|
2007-12-05 21:16:01 +00:00
|
|
|
/**
|
|
|
|
@return la largeur de l'element edite
|
|
|
|
*/
|
2007-08-25 03:43:05 +00:00
|
|
|
inline uint ElementScene::width() const {
|
2007-06-30 17:41:07 +00:00
|
|
|
return(_width * 10);
|
|
|
|
}
|
|
|
|
|
2007-12-05 21:16:01 +00:00
|
|
|
/**
|
2007-12-16 14:05:39 +00:00
|
|
|
@param hei Nouvelle hauteur de l'element edite
|
2007-12-05 21:16:01 +00:00
|
|
|
*/
|
2007-08-25 03:43:05 +00:00
|
|
|
inline void ElementScene::setHeight(const uint &hei) {
|
2007-06-30 17:41:07 +00:00
|
|
|
_height = hei;
|
|
|
|
while (_height % 10) ++ _height;
|
|
|
|
_height /= 10;
|
|
|
|
}
|
|
|
|
|
2007-12-05 21:16:01 +00:00
|
|
|
/**
|
|
|
|
@return la largeur de l'element edite
|
|
|
|
*/
|
2007-08-25 03:43:05 +00:00
|
|
|
inline uint ElementScene::height() const {
|
2007-06-30 17:41:07 +00:00
|
|
|
return(_height * 10);
|
|
|
|
}
|
|
|
|
|
2007-12-05 21:16:01 +00:00
|
|
|
/**
|
|
|
|
@param hs Nouveau point de saisie de l'element edite
|
|
|
|
*/
|
2007-08-25 03:43:05 +00:00
|
|
|
inline void ElementScene::setHotspot(const QPoint &hs) {
|
2007-06-30 17:41:07 +00:00
|
|
|
_hotspot = hs;
|
|
|
|
}
|
|
|
|
|
2007-12-05 21:16:01 +00:00
|
|
|
/**
|
|
|
|
@return le point de saisie de l'element edite
|
|
|
|
*/
|
2007-08-25 03:43:05 +00:00
|
|
|
inline QPoint ElementScene::hotspot() const {
|
2007-06-30 17:41:07 +00:00
|
|
|
return(_hotspot);
|
|
|
|
}
|
|
|
|
|
2007-12-05 21:16:01 +00:00
|
|
|
/**
|
2007-12-16 14:05:39 +00:00
|
|
|
@param nameslist Nouvel ensemble de noms de l'element edite
|
2007-12-05 21:16:01 +00:00
|
|
|
*/
|
2007-12-16 14:05:39 +00:00
|
|
|
inline void ElementScene::setNames(const NamesList &nameslist) {
|
2007-06-30 17:41:07 +00:00
|
|
|
_names = nameslist;
|
|
|
|
}
|
|
|
|
|
2007-12-05 21:16:01 +00:00
|
|
|
/**
|
|
|
|
@return l'ensemble de noms de l'element edite
|
|
|
|
*/
|
2007-08-25 03:43:05 +00:00
|
|
|
inline NamesList ElementScene::names() const {
|
2007-06-30 17:41:07 +00:00
|
|
|
return(_names);
|
|
|
|
}
|
|
|
|
|
2007-12-05 21:16:01 +00:00
|
|
|
/**
|
|
|
|
@return l'ensemble d'orientations de l'element edite
|
|
|
|
*/
|
2007-08-25 03:43:05 +00:00
|
|
|
inline OrientationSet ElementScene::orientations() {
|
2007-06-30 17:41:07 +00:00
|
|
|
return(ori);
|
|
|
|
}
|
|
|
|
|
2007-12-05 21:16:01 +00:00
|
|
|
/**
|
|
|
|
@param orientation_set Nouvel ensemble d'orientations de l'element edite
|
|
|
|
*/
|
2007-08-25 03:43:05 +00:00
|
|
|
inline void ElementScene::setOrientations(const OrientationSet &orientation_set) {
|
2007-06-30 17:41:07 +00:00
|
|
|
ori = orientation_set;
|
|
|
|
}
|
|
|
|
|
2007-12-09 10:54:59 +00:00
|
|
|
/**
|
|
|
|
@return true si les connexions internes sont acceptees, false sinon
|
|
|
|
*/
|
|
|
|
inline bool ElementScene::internalConnections() {
|
|
|
|
return(internal_connections);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
@param ic true pour que les connexions internes soient acceptees, false sinon
|
|
|
|
*/
|
|
|
|
inline void ElementScene::setInternalConnections(bool ic) {
|
|
|
|
internal_connections = ic;
|
|
|
|
}
|
|
|
|
|
2007-06-30 17:41:07 +00:00
|
|
|
#endif
|