2007-01-29 00:41:12 +00:00
|
|
|
#include "diagramview.h"
|
|
|
|
#include "diagram.h"
|
2007-01-30 22:32:21 +00:00
|
|
|
#include "customelement.h"
|
2007-02-01 01:07:26 +00:00
|
|
|
#include "exportdialog.h"
|
2007-04-12 03:13:13 +00:00
|
|
|
#include "conducer.h"
|
2007-09-25 23:24:36 +00:00
|
|
|
#include "diagramcommands.h"
|
2006-10-27 15:47:22 +00:00
|
|
|
|
|
|
|
/**
|
2007-01-29 00:41:12 +00:00
|
|
|
Initialise le DiagramView
|
2006-10-27 15:47:22 +00:00
|
|
|
*/
|
2007-01-29 00:41:12 +00:00
|
|
|
void DiagramView::initialise() {
|
2006-10-27 15:47:22 +00:00
|
|
|
setInteractive(true);
|
2007-09-08 19:09:59 +00:00
|
|
|
setCacheMode(QGraphicsView::CacheBackground);
|
|
|
|
setOptimizationFlags(QGraphicsView::DontClipPainter|QGraphicsView::DontSavePainterState|QGraphicsView::DontAdjustForAntialiasing);
|
2007-02-17 18:59:18 +00:00
|
|
|
|
|
|
|
// active l'antialiasing
|
|
|
|
setRenderHint(QPainter::Antialiasing, true);
|
|
|
|
setRenderHint(QPainter::TextAntialiasing, true);
|
|
|
|
setRenderHint(QPainter::SmoothPixmapTransform, true);
|
|
|
|
|
2007-01-29 00:41:12 +00:00
|
|
|
setScene(scene = new Diagram(this));
|
2006-10-27 15:47:22 +00:00
|
|
|
setDragMode(RubberBandDrag);
|
|
|
|
setAcceptDrops(true);
|
|
|
|
setWindowTitle(tr("Nouveau sch\351ma") + "[*]");
|
2007-08-25 18:18:51 +00:00
|
|
|
setWindowIcon(QIcon(":/ico/qet-16.png"));
|
2007-01-28 00:53:17 +00:00
|
|
|
setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
|
|
|
|
setResizeAnchor(QGraphicsView::AnchorUnderMouse);
|
|
|
|
setAlignment(Qt::AlignLeft | Qt::AlignTop);
|
2007-03-03 23:35:14 +00:00
|
|
|
adjustSceneRect();
|
2007-02-25 17:53:16 +00:00
|
|
|
connect(scene, SIGNAL(selectionEmptinessChanged()), this, SLOT(slot_selectionChanged()));
|
2007-09-28 21:02:53 +00:00
|
|
|
connect(&(scene -> border_and_inset), SIGNAL(borderChanged(QRectF, QRectF)), this, SLOT(adjustSceneRect()));
|
2006-10-27 15:47:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
Constructeur par defaut
|
|
|
|
*/
|
2007-01-29 00:41:12 +00:00
|
|
|
DiagramView::DiagramView() : QGraphicsView() {
|
2006-10-27 15:47:22 +00:00
|
|
|
initialise();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
Constructeur
|
|
|
|
@param parent Le QWidegt parent de cette vue de schema
|
|
|
|
*/
|
2007-01-29 00:41:12 +00:00
|
|
|
DiagramView::DiagramView(QWidget *parent) : QGraphicsView(parent) {
|
2006-10-27 15:47:22 +00:00
|
|
|
initialise();
|
|
|
|
}
|
|
|
|
|
2007-04-12 03:13:13 +00:00
|
|
|
/**
|
|
|
|
Destructeur
|
|
|
|
*/
|
|
|
|
DiagramView::~DiagramView() {
|
|
|
|
}
|
|
|
|
|
2006-10-27 15:47:22 +00:00
|
|
|
/**
|
|
|
|
appelle la methode select sur tous les elements de la liste d'elements
|
|
|
|
*/
|
2007-01-29 00:41:12 +00:00
|
|
|
void DiagramView::selectAll() {
|
2006-10-27 15:47:22 +00:00
|
|
|
if (scene -> items().isEmpty()) return;
|
|
|
|
foreach (QGraphicsItem *item, scene -> items()) item -> setSelected(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
appelle la methode deselect sur tous les elements de la liste d'elements
|
|
|
|
*/
|
2007-01-29 00:41:12 +00:00
|
|
|
void DiagramView::selectNothing() {
|
2006-10-27 15:47:22 +00:00
|
|
|
if (scene -> items().isEmpty()) return;
|
|
|
|
foreach (QGraphicsItem *item, scene -> items()) item -> setSelected(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
Inverse l'etat de selection de tous les elements de la liste d'elements
|
|
|
|
*/
|
2007-01-29 00:41:12 +00:00
|
|
|
void DiagramView::selectInvert() {
|
2006-10-27 15:47:22 +00:00
|
|
|
if (scene -> items().isEmpty()) return;
|
|
|
|
foreach (QGraphicsItem *item, scene -> items()) item -> setSelected(!item -> isSelected());
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
Supprime les composants selectionnes
|
|
|
|
*/
|
2007-01-29 00:41:12 +00:00
|
|
|
void DiagramView::supprimer() {
|
2006-11-26 21:35:05 +00:00
|
|
|
|
2007-09-25 23:24:36 +00:00
|
|
|
QSet<Element *> garbage_elmt;
|
|
|
|
QSet<Conducer *> garbage_conducers;
|
2006-10-27 15:47:22 +00:00
|
|
|
|
2006-11-26 21:35:05 +00:00
|
|
|
// creation de deux listes : une pour les conducteurs, une pour les elements
|
2006-10-27 15:47:22 +00:00
|
|
|
foreach (QGraphicsItem *qgi, scene -> selectedItems()) {
|
2006-11-26 21:35:05 +00:00
|
|
|
// pour chaque qgi selectionne, il s'agit soit d'un element soit d'un conducteur
|
2007-09-25 23:24:36 +00:00
|
|
|
if (Conducer * c = qgraphicsitem_cast<Conducer *>(qgi)) {
|
2006-11-26 21:35:05 +00:00
|
|
|
// s'il s'agit d'un conducteur, on le met dans la liste des conducteurs
|
2007-09-25 23:24:36 +00:00
|
|
|
garbage_conducers << c;
|
|
|
|
} else if (Element *e = qgraphicsitem_cast<Element *>(qgi)) {
|
|
|
|
garbage_elmt << e;
|
2006-11-26 21:35:05 +00:00
|
|
|
// s'il s'agit d'un element, on veille a enlever ses conducteurs
|
2007-09-25 23:24:36 +00:00
|
|
|
garbage_conducers += e -> conducers().toSet();
|
2006-10-27 15:47:22 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
scene -> clearSelection();
|
2007-09-25 23:24:36 +00:00
|
|
|
scene -> undoStack().push(new DeleteElementsCommand(scene, garbage_elmt, garbage_conducers));
|
2006-10-27 15:47:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
Pivote les composants selectionnes
|
|
|
|
*/
|
2007-01-29 00:41:12 +00:00
|
|
|
void DiagramView::pivoter() {
|
2006-10-27 15:47:22 +00:00
|
|
|
if (scene -> selectedItems().isEmpty()) return;
|
2007-09-27 15:36:15 +00:00
|
|
|
QHash<Element *, QET::Orientation> elements_to_rotate;
|
2006-10-27 15:47:22 +00:00
|
|
|
foreach (QGraphicsItem *item, scene -> selectedItems()) {
|
2007-09-27 15:36:15 +00:00
|
|
|
if (Element *e = qgraphicsitem_cast<Element *>(item)) {
|
|
|
|
elements_to_rotate.insert(e, e -> orientation().current());
|
2006-10-27 15:47:22 +00:00
|
|
|
}
|
|
|
|
}
|
2007-09-27 15:36:15 +00:00
|
|
|
scene -> undoStack().push(new RotateElementsCommand(elements_to_rotate));
|
2006-10-27 15:47:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
accepte ou refuse le drag'n drop en fonction du type de donnees entrant
|
|
|
|
@param e le QDragEnterEvent correspondant au drag'n drop tente
|
|
|
|
*/
|
2007-01-29 00:41:12 +00:00
|
|
|
void DiagramView::dragEnterEvent(QDragEnterEvent *e) {
|
2006-10-27 15:47:22 +00:00
|
|
|
if (e -> mimeData() -> hasFormat("text/plain")) e -> acceptProposedAction();
|
|
|
|
else e-> ignore();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
gere les dragleaveevent
|
|
|
|
@param e le QDragEnterEvent correspondant au drag'n drop sortant
|
|
|
|
*/
|
2007-09-25 23:24:36 +00:00
|
|
|
void DiagramView::dragLeaveEvent(QDragLeaveEvent *) {
|
|
|
|
}
|
2006-10-27 15:47:22 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
accepte ou refuse le drag'n drop en fonction du type de donnees entrant
|
|
|
|
@param e le QDragMoveEvent correspondant au drag'n drop tente
|
|
|
|
*/
|
2007-01-29 00:41:12 +00:00
|
|
|
void DiagramView::dragMoveEvent(QDragMoveEvent *e) {
|
2006-10-27 15:47:22 +00:00
|
|
|
if (e -> mimeData() -> hasFormat("text/plain")) e -> acceptProposedAction();
|
|
|
|
else e-> ignore();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2007-01-29 00:41:12 +00:00
|
|
|
gere les depots (drop) acceptes sur le Diagram
|
2006-10-27 15:47:22 +00:00
|
|
|
@param e le QDropEvent correspondant au drag'n drop effectue
|
|
|
|
*/
|
2007-01-29 00:41:12 +00:00
|
|
|
void DiagramView::dropEvent(QDropEvent *e) {
|
2006-10-27 15:47:22 +00:00
|
|
|
QString fichier = e -> mimeData() -> text();
|
|
|
|
int etat;
|
2007-01-30 22:32:21 +00:00
|
|
|
Element *el = new CustomElement(fichier, 0, 0, &etat);
|
2007-09-25 23:24:36 +00:00
|
|
|
if (etat) delete el;
|
2006-10-27 15:47:22 +00:00
|
|
|
else {
|
2007-09-25 23:24:36 +00:00
|
|
|
diagram() -> undoStack().push(new AddElementCommand(diagram(), el, mapToScene(e -> pos())));
|
2006-10-27 15:47:22 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2007-01-29 00:41:12 +00:00
|
|
|
Passe le Diagram en mode visualisation
|
2006-10-27 15:47:22 +00:00
|
|
|
*/
|
2007-01-29 00:41:12 +00:00
|
|
|
void DiagramView::setVisualisationMode() {
|
2006-10-27 15:47:22 +00:00
|
|
|
setDragMode(ScrollHandDrag);
|
2007-09-08 19:09:59 +00:00
|
|
|
setInteractive(false);
|
2006-10-27 15:47:22 +00:00
|
|
|
emit(modeChanged());
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2007-01-29 00:41:12 +00:00
|
|
|
Passe le Diagram en mode Selection
|
2006-10-27 15:47:22 +00:00
|
|
|
*/
|
2007-01-29 00:41:12 +00:00
|
|
|
void DiagramView::setSelectionMode() {
|
2006-10-27 15:47:22 +00:00
|
|
|
setDragMode(RubberBandDrag);
|
2007-09-08 19:09:59 +00:00
|
|
|
setInteractive(true);
|
2006-10-27 15:47:22 +00:00
|
|
|
emit(modeChanged());
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
Agrandit le schema (+33% = inverse des -25 % de zoomMoins())
|
|
|
|
*/
|
2007-01-29 00:41:12 +00:00
|
|
|
void DiagramView::zoomPlus() {
|
2006-10-27 15:47:22 +00:00
|
|
|
scale(4.0/3.0, 4.0/3.0);
|
2007-09-04 18:15:41 +00:00
|
|
|
adjustGridToZoom();
|
2006-10-27 15:47:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
Retrecit le schema (-25% = inverse des +33 % de zoomPlus())
|
|
|
|
*/
|
2007-01-29 00:41:12 +00:00
|
|
|
void DiagramView::zoomMoins() {
|
2006-10-27 15:47:22 +00:00
|
|
|
scale(0.75, 0.75);
|
2007-09-04 18:15:41 +00:00
|
|
|
adjustGridToZoom();
|
2006-10-27 15:47:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
Agrandit ou rectrecit le schema de facon a ce que tous les elements du
|
|
|
|
schema soient visibles a l'ecran. S'il n'y a aucun element sur le schema,
|
|
|
|
le zoom est reinitialise
|
|
|
|
*/
|
2007-01-29 00:41:12 +00:00
|
|
|
void DiagramView::zoomFit() {
|
2006-10-27 15:47:22 +00:00
|
|
|
if (scene -> items().isEmpty()) {
|
|
|
|
zoomReset();
|
|
|
|
return;
|
|
|
|
}
|
2007-03-03 23:35:14 +00:00
|
|
|
adjustSceneRect();
|
|
|
|
fitInView(sceneRect(), Qt::KeepAspectRatio);
|
2007-09-04 18:15:41 +00:00
|
|
|
adjustGridToZoom();
|
2006-10-27 15:47:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
Reinitialise le zoom
|
|
|
|
*/
|
2007-01-29 00:41:12 +00:00
|
|
|
void DiagramView::zoomReset() {
|
2006-10-27 15:47:22 +00:00
|
|
|
resetMatrix();
|
2007-09-04 18:15:41 +00:00
|
|
|
adjustGridToZoom();
|
2006-10-27 15:47:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
copie les elements selectionnes du schema dans le presse-papier puis les supprime
|
|
|
|
*/
|
2007-01-29 00:41:12 +00:00
|
|
|
void DiagramView::couper() {
|
2006-10-27 15:47:22 +00:00
|
|
|
copier();
|
2007-09-26 12:36:31 +00:00
|
|
|
QSet<Element *> cut_elmt;
|
|
|
|
QSet<Conducer *> cut_conducers;
|
|
|
|
|
|
|
|
// creation de deux listes : une pour les conducteurs, une pour les elements
|
|
|
|
foreach (QGraphicsItem *qgi, scene -> selectedItems()) {
|
|
|
|
// pour chaque qgi selectionne, il s'agit soit d'un element soit d'un conducteur
|
|
|
|
if (Conducer * c = qgraphicsitem_cast<Conducer *>(qgi)) {
|
|
|
|
// s'il s'agit d'un conducteur, on le met dans la liste des conducteurs
|
|
|
|
cut_conducers << c;
|
|
|
|
} else if (Element *e = qgraphicsitem_cast<Element *>(qgi)) {
|
|
|
|
cut_elmt << e;
|
|
|
|
// s'il s'agit d'un element, on veille a enlever ses conducteurs
|
|
|
|
cut_conducers += e -> conducers().toSet();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
scene -> clearSelection();
|
|
|
|
scene -> undoStack().push(new CutDiagramCommand(scene, cut_elmt, cut_conducers));
|
2006-10-27 15:47:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
copie les elements selectionnes du schema dans le presse-papier
|
|
|
|
*/
|
2007-01-29 00:41:12 +00:00
|
|
|
void DiagramView::copier() {
|
2006-10-27 15:47:22 +00:00
|
|
|
QClipboard *presse_papier = QApplication::clipboard();
|
|
|
|
QString contenu_presse_papier = scene -> toXml(false).toString(4);
|
|
|
|
if (presse_papier -> supportsSelection()) presse_papier -> setText(contenu_presse_papier, QClipboard::Selection);
|
|
|
|
presse_papier -> setText(contenu_presse_papier);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
importe les elements contenus dans le presse-papier dans le schema
|
|
|
|
*/
|
2007-01-29 00:41:12 +00:00
|
|
|
void DiagramView::coller() {
|
2006-10-27 15:47:22 +00:00
|
|
|
QString texte_presse_papier;
|
|
|
|
QDomDocument document_xml;
|
|
|
|
if ((texte_presse_papier = QApplication::clipboard() -> text()) == QString()) return;
|
|
|
|
if (!document_xml.setContent(texte_presse_papier)) return;
|
2007-09-26 12:36:31 +00:00
|
|
|
|
|
|
|
// listes pour recupere les elements et conducteurs ajoutes au schema par le coller
|
|
|
|
QList<Element *> elements_pasted;
|
|
|
|
QList<Conducer *> conducers_pasted;
|
|
|
|
scene -> fromXml(document_xml, QPointF(), false, &elements_pasted, &conducers_pasted);
|
|
|
|
|
|
|
|
// si quelque chose a effectivement ete ajoute au schema, on cree
|
|
|
|
if (elements_pasted.count() || conducers_pasted.count()) {
|
|
|
|
scene -> clearSelection();
|
|
|
|
scene -> undoStack().push(new PasteDiagramCommand(scene, elements_pasted, conducers_pasted));
|
|
|
|
}
|
2006-10-27 15:47:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
gere les clics et plus particulierement le clic du milieu (= coller pour X11)
|
|
|
|
*/
|
2007-01-29 00:41:12 +00:00
|
|
|
void DiagramView::mousePressEvent(QMouseEvent *e) {
|
2006-10-27 15:47:22 +00:00
|
|
|
if (e -> buttons() == Qt::MidButton) {
|
|
|
|
QString texte_presse_papier;
|
|
|
|
QDomDocument document_xml;
|
|
|
|
if ((texte_presse_papier = QApplication::clipboard() -> text(QClipboard::Selection)) == QString()) return;
|
|
|
|
if (!document_xml.setContent(texte_presse_papier)) return;
|
2007-09-26 12:36:31 +00:00
|
|
|
|
|
|
|
// listes pour recupere les elements et conducteurs ajoutes au schema par le coller
|
|
|
|
QList<Element *> elements_pasted;
|
|
|
|
QList<Conducer *> conducers_pasted;
|
|
|
|
scene -> fromXml(document_xml, mapToScene(e -> pos()), false, &elements_pasted, &conducers_pasted);
|
|
|
|
|
|
|
|
// si quelque chose a effectivement ete ajoute au schema, on cree
|
|
|
|
if (elements_pasted.count() || conducers_pasted.count()) {
|
|
|
|
scene -> clearSelection();
|
|
|
|
scene -> undoStack().push(new PasteDiagramCommand(scene, elements_pasted, conducers_pasted));
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
QGraphicsView::mousePressEvent(e);
|
2006-10-27 15:47:22 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2007-01-29 00:41:12 +00:00
|
|
|
Ouvre un fichier *.qet dans cette DiagramView
|
2006-10-27 15:47:22 +00:00
|
|
|
@param nom_fichier Nom du fichier a ouvrir
|
|
|
|
@param erreur Si le pointeur est specifie, cet entier est mis a 0 en cas de reussite de l'ouverture, 1 si le fichier n'existe pas, 2 si le fichier n'est pas lisible, 3 si le fichier n'est pas un element XML, 4 si l'ouverture du fichier a echoue pour une autre raison (c'est pas ca qui manque ^^)
|
|
|
|
@return true si l'ouverture a reussi, false sinon
|
|
|
|
*/
|
2007-01-29 00:41:12 +00:00
|
|
|
bool DiagramView::ouvrir(QString n_fichier, int *erreur) {
|
2006-10-27 15:47:22 +00:00
|
|
|
// verifie l'existence du fichier
|
|
|
|
if (!QFileInfo(n_fichier).exists()) {
|
|
|
|
if (erreur != NULL) *erreur = 1;
|
|
|
|
return(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
// ouvre le fichier
|
|
|
|
QFile fichier(n_fichier);
|
|
|
|
if (!fichier.open(QIODevice::ReadOnly)) {
|
|
|
|
if (erreur != NULL) *erreur = 2;
|
|
|
|
return(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
// lit son contenu dans un QDomDocument
|
|
|
|
QDomDocument document;
|
|
|
|
if (!document.setContent(&fichier)) {
|
|
|
|
if (erreur != NULL) *erreur = 3;
|
|
|
|
fichier.close();
|
|
|
|
return(false);
|
|
|
|
}
|
|
|
|
fichier.close();
|
|
|
|
|
|
|
|
// construit le schema a partir du QDomDocument
|
|
|
|
QDomDocument &doc = document;
|
|
|
|
if (scene -> fromXml(doc)) {
|
|
|
|
if (erreur != NULL) *erreur = 0;
|
|
|
|
nom_fichier = n_fichier;
|
|
|
|
setWindowTitle(nom_fichier + "[*]");
|
|
|
|
return(true);
|
|
|
|
} else {
|
|
|
|
if (erreur != NULL) *erreur = 4;
|
|
|
|
return(false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-04-09 02:56:47 +00:00
|
|
|
/**
|
|
|
|
Slot appele lorsque la selection change.
|
|
|
|
*/
|
2007-01-29 00:41:12 +00:00
|
|
|
void DiagramView::slot_selectionChanged() {
|
2006-10-27 15:47:22 +00:00
|
|
|
emit(selectionChanged());
|
|
|
|
}
|
|
|
|
|
2007-04-09 02:56:47 +00:00
|
|
|
/**
|
|
|
|
Gere la fermeture du schema.
|
|
|
|
@param event Le QCloseEvent decrivant l'evenement
|
|
|
|
*/
|
2007-01-29 00:41:12 +00:00
|
|
|
void DiagramView::closeEvent(QCloseEvent *event) {
|
2006-10-27 15:47:22 +00:00
|
|
|
// demande d'abord a l'utilisateur s'il veut enregistrer le schema en cours
|
|
|
|
QMessageBox::StandardButton reponse = QMessageBox::question(
|
|
|
|
this,
|
|
|
|
tr("Enregistrer le sch\351ma en cours ?"),
|
2006-10-28 13:41:50 +00:00
|
|
|
tr("Voulez-vous enregistrer le sch\351ma ") + windowTitle() + tr(" ?"),
|
2006-10-27 15:47:22 +00:00
|
|
|
QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel,
|
|
|
|
QMessageBox::Cancel
|
|
|
|
);
|
|
|
|
bool retour;
|
|
|
|
switch(reponse) {
|
|
|
|
case QMessageBox::Cancel: retour = false; break; // l'utilisateur annule : echec de la fermeture
|
|
|
|
case QMessageBox::Yes: retour = enregistrer(); break; // l'utilisateur dit oui : la reussite depend de l'enregistrement
|
|
|
|
default: retour = true; // l'utilisateur dit non ou ferme le dialogue: c'est reussi
|
|
|
|
}
|
2007-09-08 19:40:27 +00:00
|
|
|
if (retour) {
|
|
|
|
event -> accept();
|
|
|
|
delete this;
|
|
|
|
} else event -> ignore();
|
|
|
|
|
2006-10-27 15:47:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
Methode enregistrant le schema dans le dernier nom de fichier connu.
|
|
|
|
Si aucun nom de fichier n'est connu, cette methode appelle la methode enregistrer_sous
|
|
|
|
@return true si l'enregistrement a reussi, false sinon
|
|
|
|
*/
|
2007-01-29 00:41:12 +00:00
|
|
|
bool DiagramView::enregistrer() {
|
2006-10-27 15:47:22 +00:00
|
|
|
if (nom_fichier == QString()) return(enregistrer_sous());
|
|
|
|
else return(private_enregistrer(nom_fichier));
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
Cette methode demande un nom de fichier a l'utilisateur pour enregistrer le schema
|
|
|
|
Si aucun nom n'est entre, elle renvoie faux.
|
|
|
|
Si le nom ne se termine pas par l'extension .qet, celle-ci est ajoutee.
|
|
|
|
Si l'enregistrement reussit, le nom du fichier est conserve et la fonction renvoie true.
|
|
|
|
Sinon, faux est renvoye.
|
|
|
|
@return true si l'enregistrement a reussi, false sinon
|
|
|
|
*/
|
2007-01-29 00:41:12 +00:00
|
|
|
bool DiagramView::enregistrer_sous() {
|
2006-10-27 15:47:22 +00:00
|
|
|
// demande un nom de fichier a l'utilisateur pour enregistrer le schema
|
|
|
|
QString n_fichier = QFileDialog::getSaveFileName(
|
|
|
|
this,
|
|
|
|
tr("Enregistrer sous"),
|
|
|
|
QDir::homePath(),
|
2007-02-23 01:51:13 +00:00
|
|
|
tr("Sch\351ma QElectroTech (*.qet)")
|
2006-10-27 15:47:22 +00:00
|
|
|
);
|
|
|
|
// si aucun nom n'est entre, renvoie faux.
|
|
|
|
if (n_fichier == "") return(false);
|
|
|
|
// si le nom ne se termine pas par l'extension .qet, celle-ci est ajoutee
|
|
|
|
if (!n_fichier.endsWith(".qet", Qt::CaseInsensitive)) n_fichier += ".qet";
|
|
|
|
// tente d'enregistrer le fichier
|
|
|
|
bool resultat_enregistrement = private_enregistrer(n_fichier);
|
|
|
|
// si l'enregistrement reussit, le nom du fichier est conserve
|
|
|
|
if (resultat_enregistrement) {
|
|
|
|
nom_fichier = n_fichier;
|
|
|
|
setWindowTitle(nom_fichier + "[*]");
|
|
|
|
}
|
|
|
|
// retourne un booleen representatif de la reussite de l'enregistrement
|
|
|
|
return(resultat_enregistrement);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
Methode privee gerant l'enregistrement du fichier XML. S'il n'est pas possible
|
|
|
|
d'ecrire dans le fichier, cette fonction affiche un message d'erreur et renvoie false.
|
|
|
|
Autrement, elle renvoie true.
|
|
|
|
@param nom_fichier Nom du fichier dans lequel l'arbre XML doit etre ecrit
|
|
|
|
@return true si l'enregistrement a reussi, false sinon
|
|
|
|
*/
|
2007-01-29 00:41:12 +00:00
|
|
|
bool DiagramView::private_enregistrer(QString &n_fichier) {
|
2006-10-27 15:47:22 +00:00
|
|
|
QFile fichier(n_fichier);
|
|
|
|
if (!fichier.open(QIODevice::WriteOnly | QIODevice::Text)) {
|
|
|
|
QMessageBox::warning(this, tr("Erreur"), tr("Impossible d'ecrire dans ce fichier"));
|
|
|
|
return(false);
|
|
|
|
}
|
|
|
|
QTextStream out(&fichier);
|
|
|
|
out.setCodec("UTF-8");
|
|
|
|
out << scene -> toXml().toString(4);
|
|
|
|
fichier.close();
|
|
|
|
return(true);
|
|
|
|
}
|
|
|
|
|
2007-04-09 02:56:47 +00:00
|
|
|
/**
|
|
|
|
Exporte le schema.
|
|
|
|
*/
|
2007-02-01 01:07:26 +00:00
|
|
|
void DiagramView::dialogExport() {
|
|
|
|
ExportDialog ed(scene, this);
|
|
|
|
ed.exec();
|
|
|
|
}
|
|
|
|
|
2007-04-09 02:56:47 +00:00
|
|
|
/**
|
|
|
|
Imprime le schema.
|
|
|
|
*/
|
2007-02-01 01:07:26 +00:00
|
|
|
void DiagramView::dialogPrint() {
|
|
|
|
QPrinter qprin;
|
|
|
|
qprin.setOutputFormat(QPrinter::PdfFormat);
|
|
|
|
qprin.setOrientation(QPrinter::Landscape);
|
|
|
|
qprin.setPageSize(QPrinter::A4);
|
2007-04-04 02:13:14 +00:00
|
|
|
#ifdef Q_WS_X11
|
|
|
|
// qprin.setPrintProgram("lpr");
|
|
|
|
#endif
|
2007-02-01 01:07:26 +00:00
|
|
|
QPrintDialog qpd(&qprin, this);
|
|
|
|
|
|
|
|
if (qpd.exec() == QDialog::Accepted) {
|
|
|
|
QPainter qp(&qprin);
|
2007-04-12 03:13:13 +00:00
|
|
|
scene -> setDisplayGrid(false);
|
2007-02-01 01:07:26 +00:00
|
|
|
scene -> render(&qp);
|
2007-04-12 03:13:13 +00:00
|
|
|
scene -> setDisplayGrid(true);
|
2007-02-01 01:07:26 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-04-09 02:56:47 +00:00
|
|
|
/**
|
|
|
|
Edite les informations du schema.
|
|
|
|
*/
|
2007-02-01 01:07:26 +00:00
|
|
|
void DiagramView::dialogEditInfos() {
|
|
|
|
// recupere le cartouche du schema
|
2007-09-28 17:39:30 +00:00
|
|
|
InsetProperties inset = scene -> border_and_inset.exportInset();
|
2007-02-01 01:07:26 +00:00
|
|
|
|
|
|
|
// construit le dialogue
|
|
|
|
QDialog popup;
|
|
|
|
popup.setMinimumWidth(400);
|
|
|
|
popup.setWindowTitle(tr("Cartouche du sch\351ma"));
|
|
|
|
|
2007-09-28 17:39:30 +00:00
|
|
|
QLineEdit *titre = new QLineEdit(inset.title, &popup);
|
|
|
|
QLineEdit *auteur = new QLineEdit(inset.author, &popup);
|
|
|
|
QDate date_diagram = QDate(inset.date);
|
2007-02-01 01:07:26 +00:00
|
|
|
if (date_diagram.isNull() || !date_diagram.isValid()) date_diagram = QDate::currentDate();
|
|
|
|
QDateEdit *date = new QDateEdit(date_diagram, &popup);
|
|
|
|
date -> setCalendarPopup(true);
|
2007-09-28 17:39:30 +00:00
|
|
|
QLineEdit *fichier = new QLineEdit(inset.filename, &popup);
|
|
|
|
QLineEdit *folio = new QLineEdit(inset.folio, &popup);
|
2007-02-01 01:07:26 +00:00
|
|
|
QWidget bidon(&popup);
|
|
|
|
QGridLayout layout_champs(&bidon);
|
|
|
|
layout_champs.addWidget(new QLabel(tr("Titre : ")), 0, 0);
|
|
|
|
layout_champs.addWidget(titre, 0, 1);
|
|
|
|
layout_champs.addWidget(new QLabel(tr("Auteur : ")), 1, 0);
|
|
|
|
layout_champs.addWidget(auteur, 1, 1);
|
|
|
|
layout_champs.addWidget(new QLabel(tr("Date : ")), 2, 0);
|
|
|
|
layout_champs.addWidget(date, 2, 1);
|
|
|
|
layout_champs.addWidget(new QLabel(tr("Fichier : ")), 3, 0);
|
|
|
|
layout_champs.addWidget(fichier, 3, 1);
|
|
|
|
layout_champs.addWidget(new QLabel(tr("Folio : ")), 4, 0);
|
|
|
|
layout_champs.addWidget(folio, 4, 1);
|
|
|
|
|
|
|
|
// boutons
|
|
|
|
QDialogButtonBox boutons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
|
|
|
|
connect(&boutons, SIGNAL(accepted()), &popup, SLOT(accept()));
|
|
|
|
connect(&boutons, SIGNAL(rejected()), &popup, SLOT(accept()));
|
|
|
|
|
|
|
|
// ajout dans une disposition verticale
|
|
|
|
QVBoxLayout layout_v(&popup);
|
|
|
|
layout_v.addWidget(&bidon);
|
|
|
|
layout_v.addWidget(&boutons);
|
2007-09-28 17:39:30 +00:00
|
|
|
// si le dialogue est accepte
|
2007-02-01 01:07:26 +00:00
|
|
|
if (popup.exec() == QDialog::Accepted) {
|
2007-09-28 17:39:30 +00:00
|
|
|
InsetProperties new_inset;
|
|
|
|
new_inset.title = titre -> text();
|
|
|
|
new_inset.author = auteur -> text();
|
|
|
|
new_inset.date = date -> date();
|
|
|
|
new_inset.filename = fichier -> text();
|
|
|
|
new_inset.folio = folio -> text();
|
|
|
|
|
|
|
|
// s'il y a des modifications
|
|
|
|
if (new_inset != inset) {
|
|
|
|
scene -> undoStack().push(new ChangeInsetCommand(scene, inset, new_inset));
|
|
|
|
}
|
2007-02-01 01:07:26 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-04-09 02:56:47 +00:00
|
|
|
/**
|
|
|
|
@return true s'il y a des elements selectionnes sur le schema, false sinon
|
|
|
|
*/
|
2007-02-01 01:07:26 +00:00
|
|
|
bool DiagramView::hasSelectedItems() {
|
|
|
|
return(scene -> selectedItems().size() > 0);
|
|
|
|
}
|
|
|
|
|
2007-04-09 02:56:47 +00:00
|
|
|
/**
|
|
|
|
Ajoute une colonne au schema.
|
|
|
|
*/
|
2007-02-01 01:07:26 +00:00
|
|
|
void DiagramView::addColumn() {
|
|
|
|
scene -> border_and_inset.addColumn();
|
|
|
|
}
|
|
|
|
|
2007-04-09 02:56:47 +00:00
|
|
|
/**
|
|
|
|
Enleve une colonne au schema.
|
|
|
|
*/
|
2007-02-01 01:07:26 +00:00
|
|
|
void DiagramView::removeColumn() {
|
|
|
|
scene -> border_and_inset.removeColumn();
|
|
|
|
}
|
2007-02-03 02:00:18 +00:00
|
|
|
|
2007-04-09 02:56:47 +00:00
|
|
|
/**
|
|
|
|
Agrandit le schema en hauteur
|
|
|
|
*/
|
2007-02-03 02:00:18 +00:00
|
|
|
void DiagramView::expand() {
|
2007-09-28 21:02:53 +00:00
|
|
|
qreal new_height = scene -> border_and_inset.columnsHeight() + 20.0;
|
|
|
|
scene -> border_and_inset.setColumnsHeight(new_height);
|
2007-03-03 23:35:14 +00:00
|
|
|
}
|
|
|
|
|
2007-04-09 02:56:47 +00:00
|
|
|
/**
|
|
|
|
Retrecit le schema en hauteur
|
|
|
|
*/
|
2007-03-03 23:35:14 +00:00
|
|
|
void DiagramView::shrink() {
|
2007-09-28 21:02:53 +00:00
|
|
|
qreal new_height = scene -> border_and_inset.columnsHeight() - 20.0;
|
|
|
|
scene -> border_and_inset.setColumnsHeight(new_height);
|
2007-02-03 02:00:18 +00:00
|
|
|
}
|
|
|
|
|
2007-03-03 23:35:14 +00:00
|
|
|
/**
|
|
|
|
Ajuste le sceneRect (zone du schema visualisee par le DiagramView) afin que
|
|
|
|
celui inclut a la fois les elements dans et en dehors du cadre et le cadre
|
|
|
|
lui-meme.
|
|
|
|
*/
|
|
|
|
void DiagramView::adjustSceneRect() {
|
2007-09-28 21:02:53 +00:00
|
|
|
QRectF old_scene_rect = sceneRect();
|
|
|
|
|
2007-03-03 23:35:14 +00:00
|
|
|
// rectangle delimitant l'ensemble des elements
|
|
|
|
QRectF elements_bounding_rect = scene -> itemsBoundingRect();
|
2007-02-03 02:00:18 +00:00
|
|
|
|
2007-03-03 23:35:14 +00:00
|
|
|
// rectangle contenant le cadre = colonnes + cartouche
|
|
|
|
QRectF border_bounding_rect = scene -> border().adjusted(-MARGIN, -MARGIN, MARGIN, MARGIN);
|
|
|
|
|
|
|
|
// ajuste la sceneRect
|
2007-09-28 21:02:53 +00:00
|
|
|
QRectF new_scene_rect = elements_bounding_rect.united(border_bounding_rect);
|
|
|
|
setSceneRect(new_scene_rect);
|
|
|
|
|
|
|
|
// met a jour la scene
|
|
|
|
scene -> update(old_scene_rect.united(new_scene_rect));
|
2007-02-03 02:00:18 +00:00
|
|
|
}
|
2007-09-04 18:15:41 +00:00
|
|
|
|
|
|
|
void DiagramView::adjustGridToZoom() {
|
|
|
|
QRectF viewed_scene = viewedSceneRect();
|
|
|
|
scene -> setDisplayGrid(viewed_scene.width() < 2000 || viewed_scene.height() < 2000);
|
|
|
|
}
|
|
|
|
|
|
|
|
QRectF DiagramView::viewedSceneRect() const {
|
|
|
|
// recupere la taille du widget viewport
|
|
|
|
QSize viewport_size = viewport() -> size();
|
|
|
|
|
|
|
|
// recupere la transformation viewport -> scene
|
|
|
|
QTransform view_to_scene = viewportTransform().inverted();
|
|
|
|
|
|
|
|
// mappe le coin superieur gauche et le coin inferieur droit de la viewport sur la scene
|
|
|
|
QPointF scene_left_top = view_to_scene.map(QPointF(0.0, 0.0));
|
|
|
|
QPointF scene_right_bottom = view_to_scene.map(QPointF(viewport_size.width(), viewport_size.height()));
|
|
|
|
|
|
|
|
// en deduit le rectangle visualise par la scene
|
|
|
|
return(QRectF(scene_left_top, scene_right_bottom));
|
|
|
|
}
|