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-10-03 17:02:39 +00:00
|
|
|
#include "conductor.h"
|
2007-09-25 23:24:36 +00:00
|
|
|
#include "diagramcommands.h"
|
2007-10-14 10:09:46 +00:00
|
|
|
#include "conductorpropertieswidget.h"
|
2006-10-27 15:47:22 +00:00
|
|
|
|
|
|
|
/**
|
2007-09-29 12:54:01 +00:00
|
|
|
Constructeur
|
|
|
|
@param parent Le QWidegt parent de cette vue de schema
|
2006-10-27 15:47:22 +00:00
|
|
|
*/
|
2007-10-27 13:18:17 +00:00
|
|
|
DiagramView::DiagramView(QWidget *parent) : QGraphicsView(parent), is_adding_text(false) {
|
2006-10-27 15:47:22 +00:00
|
|
|
setInteractive(true);
|
2007-09-08 19:09:59 +00:00
|
|
|
setCacheMode(QGraphicsView::CacheBackground);
|
2007-10-12 12:54:25 +00:00
|
|
|
setOptimizationFlags(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));
|
2007-09-29 09:52:35 +00:00
|
|
|
scene -> undoStack().setClean();
|
2006-10-27 15:47:22 +00:00
|
|
|
setDragMode(RubberBandDrag);
|
|
|
|
setAcceptDrops(true);
|
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-09-29 09:52:35 +00:00
|
|
|
updateWindowTitle();
|
|
|
|
|
2007-11-02 18:04:13 +00:00
|
|
|
context_menu = new QMenu(this);
|
|
|
|
paste_here = new QAction(QIcon(":/ico/paste.png"), tr("Coller ici"), this);
|
|
|
|
connect(paste_here, SIGNAL(triggered()), this, SLOT(pasteHere()));
|
|
|
|
|
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()));
|
2007-09-29 09:52:35 +00:00
|
|
|
connect(&(scene -> undoStack()), SIGNAL(cleanChanged(bool)), this, SLOT(updateWindowTitle()));
|
2006-10-27 15:47:22 +00:00
|
|
|
}
|
|
|
|
|
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;
|
2007-10-10 22:35:32 +00:00
|
|
|
QPainterPath path;
|
|
|
|
path.addRect(scene -> itemsBoundingRect());
|
|
|
|
scene -> setSelectionArea(path);
|
2006-10-27 15:47:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
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;
|
2007-10-10 22:35:32 +00:00
|
|
|
scene -> clearSelection();
|
2006-10-27 15:47:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
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-09-29 12:54:01 +00:00
|
|
|
void DiagramView::deleteSelection() {
|
2007-11-09 13:06:51 +00:00
|
|
|
DiagramContent removed_content = scene -> selectedContent();
|
2006-10-27 15:47:22 +00:00
|
|
|
scene -> clearSelection();
|
2007-11-09 13:06:51 +00:00
|
|
|
scene -> undoStack().push(new DeleteElementsCommand(scene, removed_content));
|
2006-10-27 15:47:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
Pivote les composants selectionnes
|
|
|
|
*/
|
2007-09-29 12:54:01 +00:00
|
|
|
void DiagramView::rotateSelection() {
|
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-10-10 17:50:26 +00:00
|
|
|
if (elements_to_rotate.isEmpty()) return;
|
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-09-29 12:54:01 +00:00
|
|
|
void DiagramView::zoomIn() {
|
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-09-29 12:54:01 +00:00
|
|
|
void DiagramView::zoomOut() {
|
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() {
|
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-09-29 12:54:01 +00:00
|
|
|
void DiagramView::cut() {
|
|
|
|
copy();
|
2007-11-11 16:12:45 +00:00
|
|
|
DiagramContent cut_content = scene -> selectedContent();
|
2007-09-26 12:36:31 +00:00
|
|
|
scene -> clearSelection();
|
2007-11-11 16:12:45 +00:00
|
|
|
scene -> undoStack().push(new CutDiagramCommand(scene, cut_content));
|
2006-10-27 15:47:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
copie les elements selectionnes du schema dans le presse-papier
|
|
|
|
*/
|
2007-09-29 12:54:01 +00:00
|
|
|
void DiagramView::copy() {
|
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);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2007-11-02 18:04:13 +00:00
|
|
|
Importe les elements contenus dans le presse-papier dans le schema
|
|
|
|
@param pos coin superieur gauche (en coordonnees de la scene) du rectangle
|
|
|
|
englobant le contenu colle
|
|
|
|
@param clipboard_mode Type de presse-papier a prendre en compte
|
2006-10-27 15:47:22 +00:00
|
|
|
*/
|
2007-11-02 18:04:13 +00:00
|
|
|
void DiagramView::paste(const QPointF &pos, QClipboard::Mode clipboard_mode) {
|
|
|
|
QString texte_presse_papier = QApplication::clipboard() -> text(clipboard_mode);
|
|
|
|
if ((texte_presse_papier).isEmpty()) return;
|
|
|
|
|
2006-10-27 15:47:22 +00:00
|
|
|
QDomDocument document_xml;
|
|
|
|
if (!document_xml.setContent(texte_presse_papier)) return;
|
2007-09-26 12:36:31 +00:00
|
|
|
|
2007-11-09 13:06:51 +00:00
|
|
|
// objet pour recuperer le contenu ajoute au schema par le coller
|
|
|
|
DiagramContent content_pasted;
|
|
|
|
scene -> fromXml(document_xml, pos, false, &content_pasted);
|
2007-09-26 12:36:31 +00:00
|
|
|
|
2007-11-02 18:04:13 +00:00
|
|
|
// si quelque chose a effectivement ete ajoute au schema, on cree un objet d'annulation
|
2007-11-09 13:06:51 +00:00
|
|
|
if (content_pasted.count()) {
|
2007-09-26 12:36:31 +00:00
|
|
|
scene -> clearSelection();
|
2007-11-09 13:06:51 +00:00
|
|
|
scene -> undoStack().push(new PasteDiagramCommand(scene, content_pasted));
|
2007-09-26 12:36:31 +00:00
|
|
|
}
|
2006-10-27 15:47:22 +00:00
|
|
|
}
|
|
|
|
|
2007-11-02 18:04:13 +00:00
|
|
|
/// Colle le contenu du presse-papier sur le schema a la position de la souris
|
|
|
|
void DiagramView::pasteHere() {
|
|
|
|
paste(mapToScene(paste_here_pos));
|
|
|
|
}
|
|
|
|
|
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) {
|
2007-11-02 18:04:13 +00:00
|
|
|
paste(mapToScene(e -> pos()), QClipboard::Selection);
|
2007-09-26 12:36:31 +00:00
|
|
|
} else {
|
2007-10-27 13:18:17 +00:00
|
|
|
if (is_adding_text && e -> buttons() == Qt::LeftButton) {
|
|
|
|
DiagramTextItem *dti = new DiagramTextItem();
|
|
|
|
dti -> setPlainText("_");
|
|
|
|
dti -> previous_text = "_";
|
|
|
|
scene -> undoStack().push(new AddTextCommand(scene, dti, e -> pos()));
|
|
|
|
is_adding_text = false;
|
|
|
|
emit(textAdded(false));
|
|
|
|
}
|
2007-09-26 12:36:31 +00:00
|
|
|
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
|
2007-09-29 12:54:01 +00:00
|
|
|
@param n_fichier Nom du fichier a ouvrir
|
2006-10-27 15:47:22 +00:00
|
|
|
@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-09-29 12:54:01 +00:00
|
|
|
bool DiagramView::open(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();
|
|
|
|
|
2007-11-24 18:29:33 +00:00
|
|
|
/**
|
|
|
|
La notion de projet (ensemble de documents [schemas, nomenclatures,
|
|
|
|
...] et d'elements) n'est pas encore geree.
|
|
|
|
Toutefois, pour gerer au mieux la transition de la 0.1 a la 0.2,
|
|
|
|
les schemas enregistres (element XML "diagram") sont integres dans un
|
|
|
|
pseudo projet (element XML "project").
|
|
|
|
S'il y a plusieurs schemas dans un projet, tous les schemas seront
|
|
|
|
ouverts comme etant des fichiers separes
|
|
|
|
*/
|
|
|
|
// repere les schemas dans le fichier
|
2007-11-24 22:20:39 +00:00
|
|
|
QDomElement root = document.documentElement();
|
2007-11-24 18:29:33 +00:00
|
|
|
// cas 1 : l'element racine est un "diagram" : un seul schema, pas de probleme
|
2007-11-24 22:20:39 +00:00
|
|
|
if (root.tagName() == "diagram") {
|
2007-11-24 18:29:33 +00:00
|
|
|
// construit le schema a partir du QDomDocument
|
|
|
|
QDomDocument &doc = document;
|
|
|
|
if (scene -> fromXml(doc)) {
|
|
|
|
if (erreur != NULL) *erreur = 0;
|
|
|
|
file_name = n_fichier;
|
|
|
|
scene -> undoStack().setClean();
|
|
|
|
updateWindowTitle();
|
|
|
|
return(true);
|
|
|
|
} else {
|
|
|
|
if (erreur != NULL) *erreur = 4;
|
|
|
|
return(false);
|
|
|
|
}
|
|
|
|
// cas 2 : l'element racine est un "project"
|
2007-11-24 22:20:39 +00:00
|
|
|
} else if (root.tagName() == "project") {
|
|
|
|
// verifie basiquement que la version actuelle est capable de lire ce fichier
|
|
|
|
if (root.hasAttribute("version")) {
|
|
|
|
bool conv_ok;
|
|
|
|
qreal diagram_version = root.attribute("version").toDouble(&conv_ok);
|
|
|
|
if (conv_ok && QET::version.toDouble() < diagram_version) {
|
|
|
|
QMessageBox::warning(
|
|
|
|
0,
|
|
|
|
tr("Avertissement"),
|
|
|
|
tr("Ce document semble avoir \351t\351 enregistr\351 avec une "
|
|
|
|
"version ult\351rieure de QElectroTech. Il est possible que "
|
|
|
|
"l'ouverture de tout ou partie de ce document \351choue.")
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-11-24 18:29:33 +00:00
|
|
|
// compte le nombre de schemas dans le projet
|
|
|
|
QList<QDomElement> diagrams;
|
|
|
|
|
2007-11-24 22:20:39 +00:00
|
|
|
QDomNodeList diagram_nodes = root.elementsByTagName("diagram");
|
2007-11-24 18:29:33 +00:00
|
|
|
for (uint i = 0 ; i < diagram_nodes.length() ; ++ i) {
|
|
|
|
if (diagram_nodes.at(i).isElement()) {
|
|
|
|
diagrams << diagram_nodes.at(i).toElement();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// il n'y aucun schema la-dedans
|
|
|
|
if (!diagrams.count()) {
|
|
|
|
if (erreur != NULL) *erreur = 4;
|
|
|
|
return(false);
|
|
|
|
} else {
|
|
|
|
|
|
|
|
bool keep_doc_name = diagrams.count() == 1;
|
|
|
|
bool current_dv_loaded = false;
|
|
|
|
for (int i = 0 ; i < diagrams.count() ; ++ i) {
|
|
|
|
// cree un QDomDocument representant le schema
|
|
|
|
QDomDocument diagram_doc;
|
|
|
|
diagram_doc.appendChild(diagram_doc.importNode(diagrams[i], true));
|
|
|
|
|
|
|
|
// charge le premier schema valide et cree de nouveau DiagramView pour les suivants
|
|
|
|
if (!current_dv_loaded) {
|
|
|
|
if (scene -> fromXml(diagram_doc)) {
|
|
|
|
if (keep_doc_name) file_name = n_fichier;
|
|
|
|
scene -> undoStack().setClean();
|
|
|
|
updateWindowTitle();
|
|
|
|
current_dv_loaded = true;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
DiagramView *new_dv = new DiagramView(parentWidget());
|
|
|
|
if (new_dv -> scene -> fromXml(diagram_doc)) {
|
|
|
|
if (keep_doc_name) new_dv -> file_name = n_fichier;
|
|
|
|
new_dv -> scene -> undoStack().setClean();
|
|
|
|
new_dv -> updateWindowTitle();
|
|
|
|
diagramEditor() -> addDiagramView(new_dv);
|
|
|
|
} else {
|
|
|
|
delete(new_dv);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return(true);
|
|
|
|
}
|
|
|
|
|
2006-10-27 15:47:22 +00:00
|
|
|
} 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
|
|
|
bool retour;
|
2007-09-29 09:52:35 +00:00
|
|
|
// si le schema est modifie
|
|
|
|
if (!isWindowModified()) {
|
|
|
|
retour = true;
|
|
|
|
} else {
|
|
|
|
// 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 ?"),
|
|
|
|
tr("Voulez-vous enregistrer le sch\351ma ") + windowTitle() + tr(" ?"),
|
|
|
|
QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel,
|
|
|
|
QMessageBox::Cancel
|
|
|
|
);
|
|
|
|
switch(reponse) {
|
|
|
|
case QMessageBox::Cancel: retour = false; break; // l'utilisateur annule : echec de la fermeture
|
2007-09-29 12:54:01 +00:00
|
|
|
case QMessageBox::Yes: retour = save(); break; // l'utilisateur dit oui : la reussite depend de l'enregistrement
|
2007-09-29 09:52:35 +00:00
|
|
|
default: retour = true; // l'utilisateur dit non ou ferme le dialogue: c'est reussi
|
|
|
|
}
|
2006-10-27 15:47:22 +00:00
|
|
|
}
|
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.
|
2007-09-29 12:54:01 +00:00
|
|
|
Si aucun nom de fichier n'est connu, cette methode appelle la methode saveAs
|
2006-10-27 15:47:22 +00:00
|
|
|
@return true si l'enregistrement a reussi, false sinon
|
|
|
|
*/
|
2007-09-29 12:54:01 +00:00
|
|
|
bool DiagramView::save() {
|
2007-10-21 12:53:57 +00:00
|
|
|
if (file_name.isEmpty()) return(saveAs());
|
2007-09-29 12:54:01 +00:00
|
|
|
else return(saveDiagramToFile(file_name));
|
2006-10-27 15:47:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
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-09-29 12:54:01 +00:00
|
|
|
bool DiagramView::saveAs() {
|
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"),
|
2007-10-21 12:53:57 +00:00
|
|
|
(file_name.isEmpty() ? QDir::homePath() : QDir(file_name)).absolutePath(),
|
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.
|
2007-10-21 12:53:57 +00:00
|
|
|
if (n_fichier.isEmpty()) return(false);
|
2006-10-27 15:47:22 +00:00
|
|
|
// 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
|
2007-09-29 12:54:01 +00:00
|
|
|
bool resultat_enregistrement = saveDiagramToFile(n_fichier);
|
2006-10-27 15:47:22 +00:00
|
|
|
// si l'enregistrement reussit, le nom du fichier est conserve
|
|
|
|
if (resultat_enregistrement) {
|
2007-09-29 12:54:01 +00:00
|
|
|
file_name = n_fichier;
|
|
|
|
updateWindowTitle();
|
2006-10-27 15:47:22 +00:00
|
|
|
}
|
|
|
|
// retourne un booleen representatif de la reussite de l'enregistrement
|
|
|
|
return(resultat_enregistrement);
|
|
|
|
}
|
|
|
|
|
2007-10-04 14:30:52 +00:00
|
|
|
/**
|
|
|
|
Gere les actions liees a la rollette de la souris
|
|
|
|
@param e QWheelEvent decrivant l'evenement rollette
|
|
|
|
*/
|
|
|
|
void DiagramView::wheelEvent(QWheelEvent *e) {
|
|
|
|
// si la touche Ctrl est enfoncee, on zoome / dezoome
|
|
|
|
if (e -> modifiers() & Qt::ControlModifier) {
|
|
|
|
if (e -> delta() > 0) {
|
|
|
|
zoomIn();
|
|
|
|
} else {
|
|
|
|
zoomOut();
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
QAbstractScrollArea::wheelEvent(e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-10-27 15:47:22 +00:00
|
|
|
/**
|
|
|
|
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.
|
2007-09-29 12:54:01 +00:00
|
|
|
@param n_fichier Nom du fichier dans lequel l'arbre XML doit etre ecrit
|
2006-10-27 15:47:22 +00:00
|
|
|
@return true si l'enregistrement a reussi, false sinon
|
|
|
|
*/
|
2007-09-29 12:54:01 +00:00
|
|
|
bool DiagramView::saveDiagramToFile(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");
|
2007-11-24 18:29:33 +00:00
|
|
|
|
|
|
|
// l'export XML du schema est encapsule dans un pseudo-projet
|
|
|
|
QDomDocument final_document;
|
|
|
|
QDomElement project_root = final_document.createElement("project");
|
|
|
|
project_root.setAttribute("version", QET::version);
|
|
|
|
project_root.appendChild(final_document.importNode(scene -> toXml().documentElement(), true));
|
|
|
|
final_document.appendChild(project_root);
|
|
|
|
|
|
|
|
out << final_document.toString(4);
|
2006-10-27 15:47:22 +00:00
|
|
|
fichier.close();
|
2007-09-29 09:52:35 +00:00
|
|
|
scene -> undoStack().setClean();
|
2006-10-27 15:47:22 +00:00
|
|
|
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() {
|
2007-10-05 14:42:56 +00:00
|
|
|
// initialise l'acces a l'imprimante
|
2007-02-01 01:07:26 +00:00
|
|
|
QPrinter qprin;
|
2007-11-10 17:52:30 +00:00
|
|
|
#ifndef Q_OS_WIN32
|
2007-02-01 01:07:26 +00:00
|
|
|
qprin.setOutputFormat(QPrinter::PdfFormat);
|
2007-11-10 17:52:30 +00:00
|
|
|
#endif
|
2007-02-01 01:07:26 +00:00
|
|
|
qprin.setOrientation(QPrinter::Landscape);
|
|
|
|
qprin.setPageSize(QPrinter::A4);
|
|
|
|
QPrintDialog qpd(&qprin, this);
|
|
|
|
|
|
|
|
if (qpd.exec() == QDialog::Accepted) {
|
|
|
|
QPainter qp(&qprin);
|
2007-10-05 14:42:56 +00:00
|
|
|
// impression physique (!= fichier PDF)
|
2007-10-21 12:53:57 +00:00
|
|
|
if (qprin.outputFileName().isEmpty()) {
|
2007-10-05 14:42:56 +00:00
|
|
|
// lorsqu'on imprime en paysage sur imprimante reelle, il faut pivoter soi-meme le rendu
|
|
|
|
if (qprin.orientation() == QPrinter::Landscape) {
|
|
|
|
qp.rotate(90.0);
|
|
|
|
qp.translate(0.0, -qprin.pageRect().height());
|
|
|
|
}
|
|
|
|
}
|
2007-04-12 03:13:13 +00:00
|
|
|
scene -> setDisplayGrid(false);
|
2007-10-03 23:09:05 +00:00
|
|
|
scene -> setDrawTerminals(false);
|
2007-10-05 14:42:56 +00:00
|
|
|
scene -> render(&qp, QRectF(), scene -> border(), Qt::KeepAspectRatio);
|
2007-10-03 23:09:05 +00:00
|
|
|
scene -> setDrawTerminals(true);
|
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
|
|
|
|
2007-10-12 12:54:25 +00:00
|
|
|
// recupere les dimensions du schema
|
|
|
|
int columns_count_value = scene -> border_and_inset.nbColumn();
|
2007-10-19 16:21:35 +00:00
|
|
|
int columns_width_value = qRound(scene -> border_and_inset.columnsWidth());
|
|
|
|
int columns_height_value = qRound(scene -> border_and_inset.columnsHeight());
|
2007-10-12 12:54:25 +00:00
|
|
|
|
2007-02-01 01:07:26 +00:00
|
|
|
// construit le dialogue
|
|
|
|
QDialog popup;
|
|
|
|
popup.setMinimumWidth(400);
|
2007-10-12 12:54:25 +00:00
|
|
|
popup.setWindowTitle(tr("Propri\351t\351s du sch\351ma"));
|
|
|
|
|
|
|
|
QGroupBox *diagram_size_box = new QGroupBox(tr("Dimensions du sch\351ma"), &popup);
|
|
|
|
QGridLayout diagram_size_box_layout(diagram_size_box);
|
|
|
|
|
|
|
|
QLabel *ds1 = new QLabel(tr("Colonnes :"));
|
|
|
|
|
|
|
|
QSpinBox *columns_count = new QSpinBox(diagram_size_box);
|
|
|
|
columns_count -> setMinimum(scene -> border_and_inset.minNbColumns());
|
|
|
|
columns_count -> setValue(columns_count_value);
|
|
|
|
|
|
|
|
QSpinBox *columns_width = new QSpinBox(diagram_size_box);
|
|
|
|
columns_width -> setMinimum(1);
|
|
|
|
columns_width -> setSingleStep(10);
|
|
|
|
columns_width -> setValue(columns_width_value);
|
|
|
|
columns_width -> setPrefix(tr("\327"));
|
|
|
|
columns_width -> setSuffix(tr("px"));
|
|
|
|
|
|
|
|
QLabel *ds2 = new QLabel(tr("Hauteur :"));
|
|
|
|
|
|
|
|
QSpinBox *columns_height = new QSpinBox(diagram_size_box);
|
2007-10-19 16:21:35 +00:00
|
|
|
columns_height -> setRange(qRound(scene -> border_and_inset.minColumnsHeight()), 10000);
|
2007-10-12 12:54:25 +00:00
|
|
|
columns_height -> setSingleStep(80);
|
|
|
|
columns_height -> setValue(columns_height_value);
|
|
|
|
|
|
|
|
diagram_size_box_layout.addWidget(ds1, 0, 0);
|
|
|
|
diagram_size_box_layout.addWidget(columns_count, 0, 1);
|
|
|
|
diagram_size_box_layout.addWidget(columns_width, 0, 2);
|
|
|
|
diagram_size_box_layout.addWidget(ds2, 1, 0);
|
|
|
|
diagram_size_box_layout.addWidget(columns_height, 1, 1);
|
|
|
|
|
|
|
|
QGroupBox *inset_infos = new QGroupBox(tr("Informations du cartouche"), &popup);
|
2007-02-01 01:07:26 +00:00
|
|
|
|
2007-09-28 17:39:30 +00:00
|
|
|
QLineEdit *titre = new QLineEdit(inset.title, &popup);
|
|
|
|
QLineEdit *auteur = new QLineEdit(inset.author, &popup);
|
2007-11-18 00:22:19 +00:00
|
|
|
|
|
|
|
QButtonGroup *date_policy_group = new QButtonGroup(this);
|
|
|
|
QRadioButton *inset_no_date = new QRadioButton(tr("Pas de date"));
|
|
|
|
QRadioButton *inset_fixed_date = new QRadioButton(tr("Date fixe : "));
|
|
|
|
date_policy_group -> addButton(inset_no_date);
|
|
|
|
date_policy_group -> addButton(inset_fixed_date);
|
|
|
|
|
|
|
|
QDate date_diagram(inset.date);
|
|
|
|
inset_no_date -> setChecked(date_diagram.isNull());
|
|
|
|
inset_fixed_date -> setChecked(!date_diagram.isNull());
|
|
|
|
QDateEdit *date = new QDateEdit(date_diagram.isNull() ? QDate::currentDate() : date_diagram);
|
2007-02-01 01:07:26 +00:00
|
|
|
date -> setCalendarPopup(true);
|
2007-11-18 00:22:19 +00:00
|
|
|
date -> setEnabled(inset_fixed_date -> isChecked());
|
|
|
|
connect(inset_fixed_date, SIGNAL(toggled(bool)), date, SLOT(setEnabled(bool)));
|
|
|
|
|
2007-09-28 17:39:30 +00:00
|
|
|
QLineEdit *fichier = new QLineEdit(inset.filename, &popup);
|
|
|
|
QLineEdit *folio = new QLineEdit(inset.folio, &popup);
|
2007-10-12 12:54:25 +00:00
|
|
|
QGridLayout layout_champs(inset_infos);
|
|
|
|
|
2007-11-18 00:22:19 +00:00
|
|
|
QGridLayout *layout_date = new QGridLayout();
|
|
|
|
layout_date -> addWidget(inset_no_date, 0, 0);
|
|
|
|
layout_date -> addWidget(inset_fixed_date, 1, 0);
|
|
|
|
layout_date -> addWidget(date, 1, 1);
|
|
|
|
|
2007-02-01 01:07:26 +00:00
|
|
|
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);
|
2007-11-18 00:22:19 +00:00
|
|
|
layout_champs.addLayout(layout_date, 3, 1);
|
|
|
|
layout_champs.addWidget(new QLabel(tr("Fichier : ")), 4, 0);
|
|
|
|
layout_champs.addWidget(fichier, 4, 1);
|
|
|
|
layout_champs.addWidget(new QLabel(tr("Folio : ")), 5, 0);
|
|
|
|
layout_champs.addWidget(folio, 5, 1);
|
2007-02-01 01:07:26 +00:00
|
|
|
|
|
|
|
// boutons
|
|
|
|
QDialogButtonBox boutons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
|
|
|
|
connect(&boutons, SIGNAL(accepted()), &popup, SLOT(accept()));
|
2007-11-18 00:22:19 +00:00
|
|
|
connect(&boutons, SIGNAL(rejected()), &popup, SLOT(reject()));
|
2007-02-01 01:07:26 +00:00
|
|
|
|
|
|
|
// ajout dans une disposition verticale
|
|
|
|
QVBoxLayout layout_v(&popup);
|
2007-10-12 12:54:25 +00:00
|
|
|
layout_v.addWidget(diagram_size_box);
|
|
|
|
layout_v.addWidget(inset_infos);
|
2007-02-01 01:07:26 +00:00
|
|
|
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();
|
2007-11-18 00:22:19 +00:00
|
|
|
new_inset.date = inset_no_date -> isChecked() ? QDate() : date -> date();
|
2007-09-28 17:39:30 +00:00
|
|
|
new_inset.filename = fichier -> text();
|
|
|
|
new_inset.folio = folio -> text();
|
|
|
|
|
2007-10-12 12:54:25 +00:00
|
|
|
// s'il y a des modifications au cartouche
|
2007-09-28 17:39:30 +00:00
|
|
|
if (new_inset != inset) {
|
|
|
|
scene -> undoStack().push(new ChangeInsetCommand(scene, inset, new_inset));
|
|
|
|
}
|
2007-10-12 12:54:25 +00:00
|
|
|
|
|
|
|
// s'il y a des modifications
|
|
|
|
if (
|
|
|
|
columns_count_value != columns_count -> value() ||\
|
|
|
|
columns_width_value != columns_width -> value() ||\
|
|
|
|
columns_height_value != columns_height -> value()
|
|
|
|
) {
|
|
|
|
ChangeBorderCommand *cbc = new ChangeBorderCommand(scene);
|
|
|
|
cbc -> columnsCountDifference = columns_count -> value() - columns_count_value;
|
|
|
|
cbc -> columnsWidthDifference = columns_width -> value() - columns_width_value;
|
|
|
|
cbc -> columnsHeightDifference = columns_height -> value() - columns_height_value;
|
|
|
|
scene -> undoStack().push(cbc);
|
|
|
|
}
|
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() {
|
2007-09-28 21:48:59 +00:00
|
|
|
ChangeBorderCommand *cbc = new ChangeBorderCommand(scene);
|
|
|
|
cbc -> columnsCountDifference = 1;
|
|
|
|
scene -> undoStack().push(cbc);
|
2007-02-01 01:07:26 +00:00
|
|
|
}
|
|
|
|
|
2007-04-09 02:56:47 +00:00
|
|
|
/**
|
|
|
|
Enleve une colonne au schema.
|
|
|
|
*/
|
2007-02-01 01:07:26 +00:00
|
|
|
void DiagramView::removeColumn() {
|
2007-09-28 21:48:59 +00:00
|
|
|
ChangeBorderCommand *cbc = new ChangeBorderCommand(scene);
|
|
|
|
cbc -> columnsCountDifference = -1;
|
|
|
|
scene -> undoStack().push(cbc);
|
2007-02-01 01:07:26 +00:00
|
|
|
}
|
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:48:59 +00:00
|
|
|
ChangeBorderCommand *cbc = new ChangeBorderCommand(scene);
|
2007-10-12 12:54:25 +00:00
|
|
|
cbc -> columnsHeightDifference = 80.0;
|
2007-09-28 21:48:59 +00:00
|
|
|
scene -> undoStack().push(cbc);
|
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:48:59 +00:00
|
|
|
ChangeBorderCommand *cbc = new ChangeBorderCommand(scene);
|
2007-10-12 12:54:25 +00:00
|
|
|
cbc -> columnsHeightDifference = -80.0;
|
2007-09-28 21:48:59 +00:00
|
|
|
scene -> undoStack().push(cbc);
|
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
|
2007-10-10 22:35:32 +00:00
|
|
|
QRectF border_bounding_rect = scene -> border().adjusted(-Diagram::margin, -Diagram::margin, Diagram::margin, Diagram::margin);
|
2007-03-03 23:35:14 +00:00
|
|
|
|
|
|
|
// 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
|
|
|
|
2007-10-10 17:50:26 +00:00
|
|
|
/**
|
|
|
|
Met a jour le titre du widget
|
|
|
|
*/
|
2007-09-29 09:52:35 +00:00
|
|
|
void DiagramView::updateWindowTitle() {
|
|
|
|
QString window_title;
|
2007-09-29 12:54:01 +00:00
|
|
|
if (file_name.isNull()) window_title += tr("nouveau sch\351ma");
|
|
|
|
else window_title += file_name;
|
2007-09-29 09:52:35 +00:00
|
|
|
window_title += "[*]";
|
|
|
|
setWindowTitle(window_title);
|
|
|
|
setWindowModified(!(scene -> undoStack().isClean()));
|
|
|
|
}
|
|
|
|
|
2007-10-10 17:50:26 +00:00
|
|
|
/**
|
|
|
|
Active ou desactive le dessin de grille selon la quantite de pixels affichee
|
|
|
|
*/
|
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);
|
|
|
|
}
|
|
|
|
|
2007-10-10 17:50:26 +00:00
|
|
|
/**
|
|
|
|
@return le rectangle du schema (classe Diagram) visualise par ce DiagramView
|
|
|
|
*/
|
2007-09-04 18:15:41 +00:00
|
|
|
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));
|
|
|
|
}
|
2007-10-03 13:11:47 +00:00
|
|
|
|
2007-10-10 17:50:26 +00:00
|
|
|
/**
|
|
|
|
Affiche un dialogue permettant d'editer le conducteur selectionne.
|
|
|
|
Ne fait rien s'il y a 0 ou plusieurs conducteurs selectionnes.
|
|
|
|
*/
|
2007-10-03 17:02:39 +00:00
|
|
|
void DiagramView::editConductor() {
|
|
|
|
QList<Conductor *> selected_conductors(scene -> selectedConductors().toList());
|
2007-10-03 13:11:47 +00:00
|
|
|
|
|
|
|
// on ne peut editer qu'un conducteur a la fois
|
2007-10-03 17:02:39 +00:00
|
|
|
if (selected_conductors.count() != 1) return;
|
|
|
|
Conductor *edited_conductor = selected_conductors.first();
|
2007-10-03 13:11:47 +00:00
|
|
|
|
|
|
|
// initialise l'editeur de proprietes pour le conducteur
|
2007-10-14 14:44:33 +00:00
|
|
|
ConductorProperties old_properties = edited_conductor -> properties();
|
|
|
|
ConductorPropertiesWidget *cpw = new ConductorPropertiesWidget(old_properties);
|
2007-10-03 15:51:04 +00:00
|
|
|
|
2007-10-03 13:11:47 +00:00
|
|
|
// l'insere dans un dialogue
|
2007-10-03 17:02:39 +00:00
|
|
|
QDialog conductor_dialog;
|
|
|
|
conductor_dialog.setWindowTitle(tr("\311diter les propri\351t\351s d'un conducteur"));
|
|
|
|
QVBoxLayout *dialog_layout = new QVBoxLayout(&conductor_dialog);
|
2007-10-03 13:11:47 +00:00
|
|
|
dialog_layout -> addWidget(cpw);
|
|
|
|
QDialogButtonBox *dbb = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
|
|
|
|
dialog_layout -> addWidget(dbb);
|
2007-10-03 17:02:39 +00:00
|
|
|
connect(dbb, SIGNAL(accepted()), &conductor_dialog, SLOT(accept()));
|
|
|
|
connect(dbb, SIGNAL(rejected()), &conductor_dialog, SLOT(reject()));
|
2007-10-03 13:11:47 +00:00
|
|
|
|
|
|
|
// execute le dialogue et met a jour le conducteur
|
2007-10-03 17:02:39 +00:00
|
|
|
if (conductor_dialog.exec() == QDialog::Accepted) {
|
2007-10-14 15:16:37 +00:00
|
|
|
// recupere les nouvelles proprietes
|
2007-10-14 14:44:33 +00:00
|
|
|
ConductorProperties new_properties = cpw -> conductorProperties();
|
|
|
|
|
|
|
|
if (new_properties != old_properties) {
|
|
|
|
// initialise l'objet UndoCommand correspondant
|
|
|
|
ChangeConductorPropertiesCommand *ccpc = new ChangeConductorPropertiesCommand(edited_conductor);
|
|
|
|
ccpc -> setOldSettings(old_properties);
|
|
|
|
ccpc -> setNewSettings(new_properties);
|
|
|
|
diagram() -> undoStack().push(ccpc);
|
|
|
|
}
|
2007-10-03 13:11:47 +00:00
|
|
|
}
|
|
|
|
}
|
2007-10-06 18:37:21 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
Reinitialise le profil des conducteurs selectionnes
|
|
|
|
*/
|
|
|
|
void DiagramView::resetConductors() {
|
|
|
|
// recupere les conducteurs selectionnes
|
|
|
|
QSet<Conductor *> selected_conductors = scene -> selectedConductors();
|
|
|
|
|
|
|
|
// repere les conducteurs modifies (= profil non nul)
|
2007-10-22 20:27:39 +00:00
|
|
|
QHash<Conductor *, ConductorProfilesGroup> conductors_and_profiles;
|
2007-10-06 18:37:21 +00:00
|
|
|
foreach(Conductor *conductor, selected_conductors) {
|
2007-10-22 20:27:39 +00:00
|
|
|
ConductorProfilesGroup profile = conductor -> profiles();
|
|
|
|
if (
|
|
|
|
!profile[Qt::TopLeftCorner].isNull() ||\
|
|
|
|
!profile[Qt::TopRightCorner].isNull() ||\
|
|
|
|
!profile[Qt::BottomLeftCorner].isNull() ||\
|
|
|
|
!profile[Qt::BottomRightCorner].isNull()
|
|
|
|
) {
|
|
|
|
conductors_and_profiles.insert(conductor, profile);
|
|
|
|
}
|
2007-10-06 18:37:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (conductors_and_profiles.isEmpty()) return;
|
|
|
|
scene -> undoStack().push(new ResetConductorCommand(conductors_and_profiles));
|
|
|
|
}
|
2007-10-12 10:58:57 +00:00
|
|
|
|
2007-10-14 15:16:37 +00:00
|
|
|
/**
|
|
|
|
Lance un dialogue permettant de modifier les proprietes par defaut des
|
|
|
|
futurs nouveaux conducteurs
|
|
|
|
*/
|
|
|
|
void DiagramView::editDefaultConductorProperties() {
|
|
|
|
// initialise l'editeur de proprietes pour le conducteur
|
|
|
|
ConductorPropertiesWidget *cpw = new ConductorPropertiesWidget(scene -> defaultConductorProperties);
|
|
|
|
|
|
|
|
// l'insere dans un dialogue
|
|
|
|
QDialog conductor_dialog;
|
|
|
|
conductor_dialog.setWindowTitle(tr("\311diter les propri\351t\351s par d\351faut des conducteurs"));
|
|
|
|
QVBoxLayout *dialog_layout = new QVBoxLayout(&conductor_dialog);
|
|
|
|
dialog_layout -> addWidget(cpw);
|
|
|
|
QDialogButtonBox *dbb = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
|
|
|
|
dialog_layout -> addWidget(dbb);
|
|
|
|
connect(dbb, SIGNAL(accepted()), &conductor_dialog, SLOT(accept()));
|
|
|
|
connect(dbb, SIGNAL(rejected()), &conductor_dialog, SLOT(reject()));
|
|
|
|
|
|
|
|
// execute le dialogue et met a jour le conducteur
|
|
|
|
if (conductor_dialog.exec() == QDialog::Accepted) {
|
|
|
|
scene -> defaultConductorProperties = cpw -> conductorProperties();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-10-12 10:58:57 +00:00
|
|
|
/**
|
|
|
|
Gere les evenements de la DiagramView
|
|
|
|
@param e Evenement
|
|
|
|
*/
|
|
|
|
bool DiagramView::event(QEvent *e) {
|
|
|
|
// fait en sorte que les raccourcis clavier arrivent prioritairement sur la
|
|
|
|
// vue plutot que de remonter vers les QMenu / QAction
|
|
|
|
if (e -> type() == QEvent::ShortcutOverride && scene -> focusItem()) {
|
|
|
|
e -> accept();
|
|
|
|
return(true);
|
|
|
|
}
|
|
|
|
return(QGraphicsView::event(e));
|
2007-10-12 12:54:25 +00:00
|
|
|
}
|
2007-10-27 13:18:17 +00:00
|
|
|
|
|
|
|
void DiagramView::addText() {
|
|
|
|
is_adding_text = true;
|
|
|
|
}
|
2007-11-02 18:04:13 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
Gere le menu contextuel
|
|
|
|
@param e Evenement decrivant la demande de menu contextuel
|
|
|
|
*/
|
|
|
|
void DiagramView::contextMenuEvent(QContextMenuEvent *e) {
|
|
|
|
if (QGraphicsItem *qgi = scene -> itemAt(mapToScene(e -> pos()))) {
|
|
|
|
if (!qgi -> isSelected()) scene -> clearSelection();
|
|
|
|
qgi -> setSelected(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (QETDiagramEditor *qde = diagramEditor()) {
|
|
|
|
context_menu -> clear();
|
|
|
|
if (scene -> selectedItems().isEmpty()) {
|
|
|
|
paste_here_pos = e -> pos();
|
2007-11-03 20:20:34 +00:00
|
|
|
paste_here -> setEnabled(Diagram::clipboardMayContainDiagram());
|
2007-11-02 18:04:13 +00:00
|
|
|
context_menu -> addAction(paste_here);
|
|
|
|
context_menu -> addSeparator();
|
|
|
|
context_menu -> addAction(qde -> infos_diagram);
|
|
|
|
context_menu -> addAction(qde -> add_column);
|
|
|
|
context_menu -> addAction(qde -> remove_column);
|
|
|
|
context_menu -> addAction(qde -> expand_diagram);
|
|
|
|
context_menu -> addAction(qde -> shrink_diagram);
|
|
|
|
} else {
|
|
|
|
context_menu -> addAction(qde -> cut);
|
|
|
|
context_menu -> addAction(qde -> copy);
|
|
|
|
context_menu -> addSeparator();
|
|
|
|
context_menu -> addAction(qde -> delete_selection);
|
|
|
|
context_menu -> addAction(qde -> rotate_selection);
|
|
|
|
context_menu -> addSeparator();
|
|
|
|
context_menu -> addAction(qde -> conductor_prop);
|
|
|
|
context_menu -> addAction(qde -> conductor_reset);
|
|
|
|
}
|
|
|
|
|
|
|
|
// affiche le menu contextuel
|
|
|
|
context_menu -> popup(e -> globalPos());
|
|
|
|
}
|
|
|
|
e -> accept();
|
|
|
|
}
|
|
|
|
|
|
|
|
/// @return l'editeur de schemas parent ou 0
|
|
|
|
QETDiagramEditor *DiagramView::diagramEditor() const {
|
|
|
|
// remonte la hierarchie des widgets
|
|
|
|
QWidget *w = const_cast<DiagramView *>(this);
|
|
|
|
while (w -> parentWidget() && !w -> isWindow()) {
|
|
|
|
w = w -> parentWidget();
|
|
|
|
}
|
|
|
|
// la fenetre est supposee etre un QETDiagramEditor
|
|
|
|
return(qobject_cast<QETDiagramEditor *>(w));
|
|
|
|
}
|