Apparition d'un ensemble Cadre + cartouche (classe BorderInset)

git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@43 bfdf4180-ca20-0410-9c96-a3a8aa849046
This commit is contained in:
xavierqet
2007-01-28 00:53:17 +00:00
parent 9a45f81f98
commit 647a0a8985
10 changed files with 396 additions and 74 deletions

168
borderinset.cpp Normal file
View File

@@ -0,0 +1,168 @@
#include "borderinset.h"
/**
Constructeur simple : construit une bordure de 15 colonnes de 50x500 avec
un cartouche de 400x50.
@param parent QObject parent de ce BorderInset
*/
BorderInset::BorderInset(QObject *parent) : QObject(parent) {
nb_columns = 15;
columns_width = 50.0;
columns_height = 500.0;
inset_width = nb_columns * columns_width;
inset_height = 50.0;
columns_header_height = 20.0;
updateRectangles();
}
/**
Destructeur - ne fait rien
*/
BorderInset::~BorderInset() {
}
/**
Methode recalculant les rectangles composant le cadre et le cartouche en
fonction des attributs de taille
*/
void BorderInset::updateRectangles() {
// rectangle delimitant le schema
border = QRectF(0, 0, nb_columns * columns_width, columns_height);
// rectangles relatifs au cartouche
inset = QRectF(border.bottomRight().x() - inset_width, border.bottomRight().y() - inset_height, inset_width, inset_height);
inset_author = QRectF(inset.topLeft(), QSizeF(2.0 * inset_width / 9.0, 0.5 * inset_height));
inset_date = QRectF(inset_author.bottomLeft(), inset_author.size());
inset_title = QRectF(inset_author.topRight(), QSizeF(5.0 * inset_width / 9.0, inset_height));
inset_file = QRectF(inset_title.topRight(), inset_author.size());
inset_folio = QRectF(inset_file.bottomLeft(), inset_author.size());
}
/**
Dessine le cadre et le cartouche
@param qp QPainter a utiliser pour dessiner le cadre et le cartouche
@param x Abscisse du cadre
@param y Ordonnee du cadre
*/
void BorderInset::draw(QPainter *qp, qreal x, qreal y) {
// translate tous les rectangles
border .translate(x, y);
inset .translate(x, y);
inset_author.translate(x, y);
inset_date .translate(x, y);
inset_title .translate(x, y);
inset_file .translate(x, y);
inset_folio .translate(x, y);
// prepare le QPainter
qp -> save();
qp -> setPen(Qt::black);
qp -> setBrush(Qt::NoBrush);
// dessine le cadre
qp -> drawRect(border);
// dessine la numerotation des colonnes
qp -> setBrush(Qt::white);
for (int i = 1 ; i <= nb_columns ; ++ i) {
QRectF numbered_rectangle = QRectF(
border.topLeft().x() + ((i - 1) * columns_width),
border.topLeft().y(),
columns_width,
columns_header_height
);
qp -> drawRect(numbered_rectangle);
qp -> drawText(numbered_rectangle, Qt::AlignVCenter | Qt::AlignCenter, QString("%1").arg(i));
}
// dessine le cartouche
qp -> drawRect(inset);
qp -> drawRect(inset_author);
qp -> drawText(inset_author, Qt::AlignVCenter | Qt::AlignLeft, tr(" Auteur : ") + bi_author);
qp -> drawRect(inset_date);
qp -> drawText(inset_date, Qt::AlignVCenter | Qt::AlignLeft, tr(" Date : ") + bi_date.toString());
qp -> drawRect(inset_title);
qp -> drawText(inset_title, Qt::AlignVCenter | Qt::AlignCenter, tr("Titre du document: ") + bi_title);
qp -> drawRect(inset_file);
qp -> drawText(inset_file, Qt::AlignVCenter | Qt::AlignLeft, tr(" Fichier : ") + bi_filename);
qp -> drawRect(inset_folio);
qp -> drawText(inset_folio, Qt::AlignVCenter | Qt::AlignLeft, tr(" Folio : ") + bi_folio);
qp -> restore();
// annule la translation des rectangles
border .translate(-x, -y);
inset .translate(-x, -y);
inset_author.translate(-x, -y);
inset_date .translate(-x, -y);
inset_title .translate(-x, -y);
inset_file .translate(-x, -y);
inset_folio .translate(-x, -y);
}
/**
Ajoute une colonne.
*/
void BorderInset::addColumn() {
++ nb_columns;
updateRectangles();
}
/**
Enleve une colonne. Il doit rester au moins 3 colonnes.
*/
void BorderInset::removeColumn() {
if (nb_columns == 3) return;
-- nb_columns;
updateRectangles();
}
/**
Change la largeur des colonnes ; celle-ci doit rester comprise entre 10 et
200px.
*/
void BorderInset::setColumnsWidth(const qreal &new_cw) {
columns_width = qMax(10.0, qMin(200.0, new_cw));
updateRectangles();
}
/**
Change la hauteur des en-tetes contenant les numeros de colonnes. Celle-ci
doit rester comprise entre 5 et 50 px.
*/
void BorderInset::setColumnsHeaderHeight(const qreal &new_chh) {
columns_header_height = qMax(5.0, qMin(50.0, new_chh));
updateRectangles();
}
/**
Change la hauteur des colonnes (et donc du cadre). Cette hauteur doit
rester superieure a 10px.
*/
void BorderInset::setColumnsHeight(const qreal &new_ch) {
columns_height = qMax(10.0, new_ch);
updateRectangles();
}
/**
Change la largeur du cartouche. Cette largeur doit rester comprise entre
100px et la largeur du cartouche
*/
void BorderInset::setInsetWidth(const qreal &new_iw) {
inset_width = qMax(100.0, qMin(nb_columns * columns_width, new_iw));
updateRectangles();
}
/**
Change la hauteur du cartouche. Cette largeur doit rester comprise entre
20px et la hauteur du cartouche.
*/
void BorderInset::setInsetHeight(const qreal &new_ih) {
inset_height = qMax(20.0, qMin(columns_height, new_ih));
updateRectangles();
}

93
borderinset.h Normal file
View File

@@ -0,0 +1,93 @@
#ifndef BORDERINSET_H
#define BORDERINSET_H
#include <QObject>
#include <QRectF>
#include <QPainter>
#include <QDate>
/**
Cette classe represente l'ensemble bordure + cartouche qui encadre le
schema electrique.
*/
class BorderInset : public QObject {
Q_OBJECT
public:
BorderInset(QObject * = 0);
~BorderInset();
void draw(QPainter *, qreal = 0.0, qreal = 0.0);
// methodes d'acces en lecture aux dimensions
int nbColumn() const { return(nb_columns); }
qreal columnsWidth() const { return(columns_width); }
qreal columnsHeaderHeight() const { return(columns_header_height); }
qreal columnsHeight() const { return(columns_height); }
qreal borderWidth() const { return(nb_columns * columns_width); }
qreal borderHeight() const { return(columns_height); }
qreal insetWidth() const { return(inset_width); }
qreal insetHeight() const { return(inset_height); }
// methodes d'acces en lecture aux informations du cartouche
QString author() const { return(bi_author); }
QDate date() const { return(bi_date); }
QString title() const { return(bi_title); }
QString folio() const { return(bi_folio); }
QString fileName() const { return(bi_filename); }
// methodes d'acces en lecture aux options
bool insetIsDisplayed() const { return(display_inset); }
bool columnsAreDisplayed() const { return(display_columns); }
bool borderIsDisplayed() const { return(display_border); }
// methodes d'acces en ecriture aux dimensions
void addColumn ();
void removeColumn ();
void setColumnsWidth (const qreal &);
void setColumnsHeaderHeight(const qreal &);
void setColumnsHeight (const qreal &);
void setInsetWidth (const qreal &);
void setInsetHeight (const qreal &);
// methodes d'acces en ecriture aux informations du cartouche
void setAuthor (const QString &author) { bi_author = author; }
void setDate (const QDate &date) { bi_date = date; }
void setTitle (const QString &title) { bi_title = title; }
void setFolio (const QString &folio) { bi_folio = folio; }
void setFileName (const QString &filename) { bi_filename = filename; }
// methodes d'acces en ecriture aux options
void displayInset (bool di) { display_inset = di; }
void displayColumns (bool dc) { display_columns = dc; }
void displayBorder (bool db) { display_border = db; }
private:
// informations du cartouche
QString bi_author;
QDate bi_date;
QString bi_title;
QString bi_folio; // vraiment necessaire ce truc ?
QString bi_filename; // meme remarque
// dimensions du cadre et du cartouche
int nb_columns;
qreal columns_width;
qreal columns_header_height;
qreal columns_height;
qreal inset_width;
qreal inset_height;
// rectangles utilises pour le dessin
QRectF border;
QRectF inset;
QRectF inset_author;
QRectF inset_date;
QRectF inset_title;
QRectF inset_file;
QRectF inset_folio;
// booleens pour les options de dessin
bool display_inset;
bool display_columns;
bool display_border;
void updateRectangles();
};
#endif

View File

@@ -2,14 +2,14 @@
/** /**
Constructeur Constructeur
@param schema Le schema a exporter @param dia Le schema a exporter
@param parent Le Widget parent de ce dialogue @param parent Le Widget parent de ce dialogue
*/ */
ExportDialog::ExportDialog(Schema &schema, QWidget *parent) : QDialog(parent) { ExportDialog::ExportDialog(Schema &dia, QWidget *parent) : QDialog(parent) {
// recupere le schema a exporter, sa taille et ses proportions // recupere le schema a exporter, sa taille et ses proportions
schema_schema = &schema; diagram = &dia;
schema_size = schema_schema -> imageSize(); diagram_size = diagram -> imageSize();
schema_ratio = (qreal)schema_size.width() / (qreal)schema_size.height(); diagram_ratio = (qreal)diagram_size.width() / (qreal)diagram_size.height();
// la taille du dialogue est fixee // la taille du dialogue est fixee
setFixedSize(400, 310); setFixedSize(400, 310);
@@ -80,7 +80,7 @@ QGroupBox *ExportDialog::setupDimensionsGroupBox() {
width = new QSpinBox(groupbox_dimensions); width = new QSpinBox(groupbox_dimensions);
width -> setRange(1, 10000); width -> setRange(1, 10000);
width -> setValue(schema_size.width()); width -> setValue(diagram_size.width());
gridLayout -> addWidget(width, 0, 1, 1, 1); gridLayout -> addWidget(width, 0, 1, 1, 1);
gridLayout -> addWidget(new QLabel(tr("px"), groupbox_dimensions), 0, 2, 1, 1); gridLayout -> addWidget(new QLabel(tr("px"), groupbox_dimensions), 0, 2, 1, 1);
@@ -90,7 +90,7 @@ QGroupBox *ExportDialog::setupDimensionsGroupBox() {
height = new QSpinBox(groupbox_dimensions); height = new QSpinBox(groupbox_dimensions);
height -> setRange(1, 10000); height -> setRange(1, 10000);
height -> setValue(schema_size.height()); height -> setValue(diagram_size.height());
gridLayout -> addWidget(height, 2, 1, 1, 1); gridLayout -> addWidget(height, 2, 1, 1, 1);
gridLayout -> addWidget(new QLabel(tr("px"), groupbox_dimensions), 2, 2, 1, 1); gridLayout -> addWidget(new QLabel(tr("px"), groupbox_dimensions), 2, 2, 1, 1);
@@ -127,14 +127,14 @@ QGroupBox *ExportDialog::setupOptionsGroupBox() {
void ExportDialog::slot_correctWidth() { void ExportDialog::slot_correctWidth() {
if (!keep_aspect_ratio -> isChecked() || dontchangewidth) return; if (!keep_aspect_ratio -> isChecked() || dontchangewidth) return;
dontchangeheight = true; dontchangeheight = true;
width -> setValue(qRound(height -> value() * schema_ratio)); width -> setValue(qRound(height -> value() * diagram_ratio));
dontchangeheight = false; dontchangeheight = false;
} }
void ExportDialog::slot_correctHeight() { void ExportDialog::slot_correctHeight() {
if (!keep_aspect_ratio -> isChecked() || dontchangeheight) return; if (!keep_aspect_ratio -> isChecked() || dontchangeheight) return;
dontchangewidth = true; dontchangewidth = true;
height -> setValue(qRound(width -> value() / schema_ratio)); height -> setValue(qRound(width -> value() / diagram_ratio));
dontchangewidth = false; dontchangewidth = false;
} }
@@ -146,15 +146,15 @@ void ExportDialog::slot_chooseAFile() {
tr("Images (*.png *.bmp *.jpg)") tr("Images (*.png *.bmp *.jpg)")
); );
if (user_file != "") { if (user_file != "") {
schema_path = user_file; diagram_path = user_file;
filename -> setText(schema_path); filename -> setText(diagram_path);
} }
} }
void ExportDialog::slot_check() { void ExportDialog::slot_check() {
// verifie que le fichier a ete specifie // verifie que le fichier a ete specifie
if (schema_path == "") { if (diagram_path == "") {
QMessageBox::information( QMessageBox::information(
this, this,
tr("Fichier non sp\351cifi\351"), tr("Fichier non sp\351cifi\351"),
@@ -169,10 +169,10 @@ void ExportDialog::slot_check() {
QString format_extension = "." + format_acronym.toLower(); QString format_extension = "." + format_acronym.toLower();
// corrige l'extension du fichier // corrige l'extension du fichier
if (!schema_path.endsWith(format_extension, Qt::CaseInsensitive)) schema_path += format_extension; if (!diagram_path.endsWith(format_extension, Qt::CaseInsensitive)) diagram_path += format_extension;
// recupere des informations sur le fichier specifie // recupere des informations sur le fichier specifie
QFileInfo file_infos(schema_path); QFileInfo file_infos(diagram_path);
// verifie qu'il est possible d'ecrire dans le fichier en question // verifie qu'il est possible d'ecrire dans le fichier en question
if (file_infos.exists() && !file_infos.isWritable()) { if (file_infos.exists() && !file_infos.isWritable()) {
@@ -186,12 +186,12 @@ void ExportDialog::slot_check() {
} }
// ouvre le fichier // ouvre le fichier
QFile fichier(schema_path); QFile fichier(diagram_path);
// genere l'image // genere l'image
if (!export_grid -> isChecked()) schema_schema -> setAffichageGrille(false); if (!export_grid -> isChecked()) diagram -> setAffichageGrille(false);
QImage image = schema_schema -> toImage(width -> value(), height -> value(), keep_aspect_ratio -> isChecked()); QImage image = diagram -> toImage(width -> value(), height -> value(), keep_aspect_ratio -> isChecked());
if (!export_grid -> isChecked()) schema_schema -> setAffichageGrille(true); if (!export_grid -> isChecked()) diagram -> setAffichageGrille(true);
// convertit l'image en niveaux de gris si besoin // convertit l'image en niveaux de gris si besoin
if (!keep_colors -> isChecked()) { if (!keep_colors -> isChecked()) {

View File

@@ -28,10 +28,10 @@
bool dontchangeheight; bool dontchangeheight;
// elements relatifs au traitement effectue par le dialogue // elements relatifs au traitement effectue par le dialogue
Schema *schema_schema; Schema *diagram;
QSize schema_size; QSize diagram_size;
QString schema_path; QString diagram_path;
qreal schema_ratio; qreal diagram_ratio;
QGroupBox *setupDimensionsGroupBox(); QGroupBox *setupDimensionsGroupBox();
QGroupBox *setupOptionsGroupBox(); QGroupBox *setupOptionsGroupBox();

View File

@@ -9,6 +9,7 @@ INCLUDEPATH += .
# Input # Input
HEADERS += aboutqet.h \ HEADERS += aboutqet.h \
borderinset.h \
borne.h \ borne.h \
conducteur.h \ conducteur.h \
element.h \ element.h \
@@ -20,6 +21,7 @@ HEADERS += aboutqet.h \
schema.h \ schema.h \
schemavue.h schemavue.h
SOURCES += aboutqet.cpp \ SOURCES += aboutqet.cpp \
borderinset.cpp \
borne.cpp \ borne.cpp \
conducteur.cpp \ conducteur.cpp \
element.cpp \ element.cpp \

View File

@@ -4,6 +4,7 @@
#include "panelappareils.h" #include "panelappareils.h"
#include "aboutqet.h" #include "aboutqet.h"
#include "exportdialog.h" #include "exportdialog.h"
// #include "borderinset.h"
/** /**
constructeur constructeur
@@ -227,6 +228,8 @@ void QETApp::actions() {
supprimer = new QAction(QIcon(":/ico/delete.png"), tr("Supprimer"), this); supprimer = new QAction(QIcon(":/ico/delete.png"), tr("Supprimer"), this);
pivoter = new QAction(QIcon(":/ico/pivoter.png"), tr("Pivoter"), this); pivoter = new QAction(QIcon(":/ico/pivoter.png"), tr("Pivoter"), this);
infos_schema = new QAction(QIcon(":/ico/info.png"), tr("Informations sur le sch\351ma"), this); infos_schema = new QAction(QIcon(":/ico/info.png"), tr("Informations sur le sch\351ma"), this);
add_column = new QAction( tr("Ajouter une colonne"), this);
remove_column = new QAction( tr("Enlever une colonne"), this);
toggle_aa = new QAction( tr("D\351sactiver l'&antialiasing"), this); toggle_aa = new QAction( tr("D\351sactiver l'&antialiasing"), this);
zoom_avant = new QAction(QIcon(":/ico/viewmag+.png"), tr("Zoom avant"), this); zoom_avant = new QAction(QIcon(":/ico/viewmag+.png"), tr("Zoom avant"), this);
@@ -308,6 +311,8 @@ void QETApp::actions() {
supprimer -> setStatusTip(tr("Enl\350ve les \351l\351ments s\351lectionn\351s du sch\351ma")); supprimer -> setStatusTip(tr("Enl\350ve les \351l\351ments s\351lectionn\351s du sch\351ma"));
pivoter -> setStatusTip(tr("Pivote les \351l\351ments s\351lectionn\351s")); pivoter -> setStatusTip(tr("Pivote les \351l\351ments s\351lectionn\351s"));
infos_schema -> setStatusTip(tr("\311dite les informations affich\351es par le cartouche")); infos_schema -> setStatusTip(tr("\311dite les informations affich\351es par le cartouche"));
add_column -> setStatusTip(tr("Ajoute une colonne au sch\351ma"));
remove_column -> setStatusTip(tr("Enl\350ve une colonne au sch\351ma"));
toggle_aa -> setStatusTip(tr("Active / d\351sactive l'antialiasing pour le rendu du sch\351ma courant")); toggle_aa -> setStatusTip(tr("Active / d\351sactive l'antialiasing pour le rendu du sch\351ma courant"));
zoom_avant -> setStatusTip(tr("Agrandit le sch\351ma")); zoom_avant -> setStatusTip(tr("Agrandit le sch\351ma"));
@@ -377,6 +382,8 @@ void QETApp::actions() {
connect(f_suiv, SIGNAL(triggered()), &workspace, SLOT(activateNextWindow()) ); connect(f_suiv, SIGNAL(triggered()), &workspace, SLOT(activateNextWindow()) );
connect(f_prec, SIGNAL(triggered()), &workspace, SLOT(activatePreviousWindow()) ); connect(f_prec, SIGNAL(triggered()), &workspace, SLOT(activatePreviousWindow()) );
connect(infos_schema, SIGNAL(activated()), this, SLOT(editInfos()) ); connect(infos_schema, SIGNAL(activated()), this, SLOT(editInfos()) );
connect(add_column, SIGNAL(activated()), this, SLOT(slot_addColumn()) );
connect(remove_column, SIGNAL(activated()), this, SLOT(slot_removeColumn()) );
} }
/** /**
@@ -429,6 +436,8 @@ void QETApp::menus() {
menu_edition -> addAction(pivoter); menu_edition -> addAction(pivoter);
menu_edition -> addSeparator(); menu_edition -> addSeparator();
menu_edition -> addAction(infos_schema); menu_edition -> addAction(infos_schema);
menu_edition -> addAction(add_column);
menu_edition -> addAction(remove_column);
// menu Affichage > Afficher // menu Affichage > Afficher
QMenu *menu_aff_aff = new QMenu(tr("Afficher")); QMenu *menu_aff_aff = new QMenu(tr("Afficher"));
@@ -519,21 +528,6 @@ void QETApp::dialogue_exporter() {
Schema *sc = schemaEnCours() -> scene; Schema *sc = schemaEnCours() -> scene;
ExportDialog ed(*sc); ExportDialog ed(*sc);
ed.exec(); ed.exec();
/*
// demande un nom de fichier
// exporte le schema
if (nom_fichier != "") {
if (!nom_fichier.endsWith(".png", Qt::CaseInsensitive)) nom_fichier += ".png";
QFile fichier(nom_fichier);
Schema *sc = schemaEnCours() -> scene;
sc -> setAffichageGrille(false);
QImage image = sc -> toImage();
sc -> setAffichageGrille(true);
image.save(&fichier, "PNG");
fichier.close();
}
*/
} }
/** /**
@@ -938,18 +932,23 @@ void QETApp::editInfos() {
SchemaVue *sv = schemaEnCours(); SchemaVue *sv = schemaEnCours();
if (!sv) return; if (!sv) return;
// recupere le cartouche du schema
BorderInset *inset = &(sv -> scene -> border_and_inset);
// construit le dialogue // construit le dialogue
QDialog popup; QDialog popup;
popup.setMinimumWidth(400); popup.setMinimumWidth(400);
popup.setWindowTitle(tr("Cartouche du sch\351ma")); popup.setWindowTitle(tr("Cartouche du sch\351ma"));
QLineEdit *titre = new QLineEdit(sv -> scene -> titre); QLineEdit *titre = new QLineEdit(inset -> title(), &popup);
QLineEdit *auteur = new QLineEdit(sv -> scene -> auteur); QLineEdit *auteur = new QLineEdit(inset -> author(), &popup);
QDate date_schema = QDate(sv -> scene -> date); QDate date_schema = QDate(inset -> date());
if (date_schema.isNull() || !date_schema.isValid()) date_schema = QDate::currentDate(); if (date_schema.isNull() || !date_schema.isValid()) date_schema = QDate::currentDate();
QDateEdit *date = new QDateEdit(date_schema); QDateEdit *date = new QDateEdit(date_schema, &popup);
date -> setCalendarPopup(true); date -> setCalendarPopup(true);
QWidget bidon; QLineEdit *fichier = new QLineEdit(inset -> fileName(), &popup);
QLineEdit *folio = new QLineEdit(inset -> folio(), &popup);
QWidget bidon(&popup);
QGridLayout layout_champs(&bidon); QGridLayout layout_champs(&bidon);
layout_champs.addWidget(new QLabel(tr("Titre : ")), 0, 0); layout_champs.addWidget(new QLabel(tr("Titre : ")), 0, 0);
layout_champs.addWidget(titre, 0, 1); layout_champs.addWidget(titre, 0, 1);
@@ -957,6 +956,10 @@ void QETApp::editInfos() {
layout_champs.addWidget(auteur, 1, 1); layout_champs.addWidget(auteur, 1, 1);
layout_champs.addWidget(new QLabel(tr("Date : ")), 2, 0); layout_champs.addWidget(new QLabel(tr("Date : ")), 2, 0);
layout_champs.addWidget(date, 2, 1); 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 // boutons
QDialogButtonBox boutons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); QDialogButtonBox boutons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
@@ -968,9 +971,37 @@ void QETApp::editInfos() {
layout_v.addWidget(&bidon); layout_v.addWidget(&bidon);
layout_v.addWidget(&boutons); layout_v.addWidget(&boutons);
if (popup.exec() == QDialog::Accepted) { if (popup.exec() == QDialog::Accepted) {
sv -> scene -> titre = titre -> text(); inset -> setTitle(titre -> text());
sv -> scene -> auteur = auteur -> text(); inset -> setAuthor(auteur -> text());
sv -> scene -> date = date -> date(); inset -> setDate(date -> date());
inset -> setFileName(fichier -> text());
inset -> setFolio(folio -> text());
} }
} }
void QETApp::slot_addColumn() {
SchemaVue *sv = schemaEnCours();
if (!sv) return;
// ajoute la colonne
sv -> scene -> border_and_inset.addColumn();
// met a jour la zone affichee par la vue
QRectF sr = sv -> sceneRect();
sr.setWidth(5.0 + sv -> scene -> border_and_inset.borderWidth());
sv -> setSceneRect(sr);
// rafraichit la vue
sv -> scene -> update(sv -> sceneRect());
}
void QETApp::slot_removeColumn() {
SchemaVue *sv = schemaEnCours();
if (!sv) return;
sv -> scene -> border_and_inset.removeColumn();
// on pourrait mettre a jour la zone affichee par la vue
// rafraichit la vue
sv -> scene -> update(sv -> sceneRect());
}

View File

@@ -64,6 +64,8 @@
QAction *selectionner; QAction *selectionner;
QAction *pivoter; QAction *pivoter;
QAction *infos_schema; QAction *infos_schema;
QAction *add_column;
QAction *remove_column;
QAction *poser_fil; QAction *poser_fil;
QAction *masquer_appli; QAction *masquer_appli;
QAction *restaurer_appli; QAction *restaurer_appli;
@@ -126,5 +128,7 @@
void slot_setVisualisationMode(); void slot_setVisualisationMode();
void slot_updateActions(); void slot_updateActions();
void slot_updateMenuFenetres(); void slot_updateMenuFenetres();
void slot_addColumn();
void slot_removeColumn();
}; };
#endif #endif

View File

@@ -56,10 +56,9 @@ void Schema::drawBackground(QPainter *p, const QRectF &r) {
p -> drawPoint(gx, gy); p -> drawPoint(gx, gy);
} }
} }
p -> drawLine(0, 0, 0, 10);
p -> drawLine(0, 0, 10, 0);
} }
border_and_inset.draw(p, MARGIN, MARGIN);
p -> restore(); p -> restore();
} }
@@ -146,9 +145,11 @@ QDomDocument Schema::toXml(bool schema) {
// proprietes du schema // proprietes du schema
if (schema) { if (schema) {
if (!auteur.isNull()) racine.setAttribute("auteur", auteur); if (!border_and_inset.author().isNull()) racine.setAttribute("auteur", border_and_inset.author());
if (!date.isNull()) racine.setAttribute("date", date.toString("yyyyMMdd")); if (!border_and_inset.date().isNull()) racine.setAttribute("date", border_and_inset.date().toString("yyyyMMdd"));
if (!titre.isNull()) racine.setAttribute("titre", titre); if (!border_and_inset.title().isNull()) racine.setAttribute("titre", border_and_inset.title());
if (!border_and_inset.fileName().isNull()) racine.setAttribute("filename", border_and_inset.fileName());
if (!border_and_inset.folio().isNull()) racine.setAttribute("folio", border_and_inset.folio());
} }
document.appendChild(racine); document.appendChild(racine);
@@ -239,16 +240,21 @@ QDomDocument Schema::toXml(bool schema) {
(le bounding rect) soit a cette position. (le bounding rect) soit a cette position.
@param document Le document XML a analyser @param document Le document XML a analyser
@param position La position du schema importe @param position La position du schema importe
@param consider_informations Si vrai, les informations complementaires (auteur, titre, ...) seront prises en compte
@return true si l'import a reussi, false sinon @return true si l'import a reussi, false sinon
*/ */
bool Schema::fromXml(QDomDocument &document, QPointF position) { bool Schema::fromXml(QDomDocument &document, QPointF position, bool consider_informations) {
QDomElement racine = document.documentElement(); QDomElement racine = document.documentElement();
// le premier element doit etre un schema // le premier element doit etre un schema
if (racine.tagName() != "schema") return(false); if (racine.tagName() != "schema") return(false);
// lecture des attributs de ce schema // lecture des attributs de ce schema
auteur = racine.attribute("auteur"); if (consider_informations) {
titre = racine.attribute("titre"); border_and_inset.setAuthor(racine.attribute("auteur"));
date = QDate::fromString(racine.attribute("date"), "yyyyMMdd"); border_and_inset.setTitle(racine.attribute("titre"));
border_and_inset.setDate(QDate::fromString(racine.attribute("date"), "yyyyMMdd"));
border_and_inset.setFileName(racine.attribute("filename"));
border_and_inset.setFolio(racine.attribute("folio"));
}
// si la racine n'a pas d'enfant : le chargement est fini (schema vide) // si la racine n'a pas d'enfant : le chargement est fini (schema vide)
if (racine.firstChild().isNull()) return(true); if (racine.firstChild().isNull()) return(true);
@@ -366,9 +372,27 @@ Element *Schema::elementFromXml(QDomElement &e, QHash<int, Borne *> &table_id_ad
return(retour ? nvel_elmt : NULL); return(retour ? nvel_elmt : NULL);
} }
/**
Verifie si la liste des elements selectionnes a change. Si oui, le signal
selectionChanged() est emis.
*/
void Schema::slot_checkSelectionChange() { void Schema::slot_checkSelectionChange() {
static QList<QGraphicsItem *> cache_selecteditems = QList<QGraphicsItem *>(); static QList<QGraphicsItem *> cache_selecteditems = QList<QGraphicsItem *>();
QList<QGraphicsItem *> selecteditems = selectedItems(); QList<QGraphicsItem *> selecteditems = selectedItems();
if (cache_selecteditems != selecteditems) emit(selectionChanged()); if (cache_selecteditems != selecteditems) emit(selectionChanged());
cache_selecteditems = selecteditems; cache_selecteditems = selecteditems;
} }
/**
@return Le rectangle (coordonnees par rapport a la scene) delimitant le bord du schema
*/
QRectF Schema::border() const {
return(
QRectF(
MARGIN,
MARGIN,
border_and_inset.borderWidth(),
border_and_inset.borderHeight()
)
);
}

View File

@@ -2,9 +2,11 @@
#define SCHEMA_H #define SCHEMA_H
#define GRILLE_X 10 #define GRILLE_X 10
#define GRILLE_Y 10 #define GRILLE_Y 10
#define MARGIN 5.0
#include <QtGui> #include <QtGui>
#include <QtXml> #include <QtXml>
#include <qetapp.h> #include "qetapp.h"
#include "borderinset.h"
class Element; class Element;
class Borne; class Borne;
class Schema : public QGraphicsScene { class Schema : public QGraphicsScene {
@@ -24,15 +26,11 @@
QImage toImage(int = -1, int = -1, bool = true); QImage toImage(int = -1, int = -1, bool = true);
QSize imageSize() const; QSize imageSize() const;
QDomDocument toXml(bool = true); QDomDocument toXml(bool = true);
bool fromXml(QDomDocument &, QPointF = QPointF()); bool fromXml(QDomDocument &, QPointF = QPointF(), bool = true);
QGraphicsItem *getElementById(uint id); QGraphicsItem *getElementById(uint id);
inline void setAffichageGrille(bool ddg) { doit_dessiner_grille = ddg; } inline void setAffichageGrille(bool ddg) { doit_dessiner_grille = ddg; }
// elements du cartouche BorderInset border_and_inset;
QString auteur; QRectF border() const;
QDate date;
QString titre;
QString folio; // vraiment necessaire ce truc ?
QString nom_fichier; // meme remarque
private: private:
QGraphicsLineItem *poseur_de_conducteur; QGraphicsLineItem *poseur_de_conducteur;

View File

@@ -12,6 +12,10 @@ void SchemaVue::initialise() {
setDragMode(RubberBandDrag); setDragMode(RubberBandDrag);
setAcceptDrops(true); setAcceptDrops(true);
setWindowTitle(tr("Nouveau sch\351ma") + "[*]"); setWindowTitle(tr("Nouveau sch\351ma") + "[*]");
setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
setResizeAnchor(QGraphicsView::AnchorUnderMouse);
setAlignment(Qt::AlignLeft | Qt::AlignTop);
setSceneRect(QRectF(0.0, 0.0, scene -> border_and_inset.borderWidth() + 10.0, scene -> border_and_inset.borderHeight() + 10.0));
connect(scene, SIGNAL(selectionChanged()), this, SLOT(slot_selectionChanged())); connect(scene, SIGNAL(selectionChanged()), this, SLOT(slot_selectionChanged()));
} }
@@ -165,7 +169,6 @@ void SchemaVue::pivoter() {
/** /**
accepte ou refuse le drag'n drop en fonction du type de donnees entrant accepte ou refuse le drag'n drop en fonction du type de donnees entrant
@param e le QDragEnterEvent correspondant au drag'n drop tente @param e le QDragEnterEvent correspondant au drag'n drop tente
@todo trouver un MIME Type plus adapte
*/ */
void SchemaVue::dragEnterEvent(QDragEnterEvent *e) { void SchemaVue::dragEnterEvent(QDragEnterEvent *e) {
if (e -> mimeData() -> hasFormat("text/plain")) e -> acceptProposedAction(); if (e -> mimeData() -> hasFormat("text/plain")) e -> acceptProposedAction();
@@ -190,7 +193,6 @@ void SchemaVue::dragMoveEvent(QDragMoveEvent *e) {
/** /**
gere les depots (drop) acceptes sur le Schema gere les depots (drop) acceptes sur le Schema
@param e le QDropEvent correspondant au drag'n drop effectue @param e le QDropEvent correspondant au drag'n drop effectue
@todo Ajouter directement l'objet Element a la scene lorsque le drag'n drop aura ete ameliore
*/ */
void SchemaVue::dropEvent(QDropEvent *e) { void SchemaVue::dropEvent(QDropEvent *e) {
QString fichier = e -> mimeData() -> text(); QString fichier = e -> mimeData() -> text();
@@ -287,7 +289,7 @@ void SchemaVue::coller() {
QDomDocument document_xml; QDomDocument document_xml;
if ((texte_presse_papier = QApplication::clipboard() -> text()) == QString()) return; if ((texte_presse_papier = QApplication::clipboard() -> text()) == QString()) return;
if (!document_xml.setContent(texte_presse_papier)) return; if (!document_xml.setContent(texte_presse_papier)) return;
scene -> fromXml(document_xml); scene -> fromXml(document_xml, QPointF(), false);
} }
/** /**
@@ -299,7 +301,7 @@ void SchemaVue::mousePressEvent(QMouseEvent *e) {
QDomDocument document_xml; QDomDocument document_xml;
if ((texte_presse_papier = QApplication::clipboard() -> text(QClipboard::Selection)) == QString()) return; if ((texte_presse_papier = QApplication::clipboard() -> text(QClipboard::Selection)) == QString()) return;
if (!document_xml.setContent(texte_presse_papier)) return; if (!document_xml.setContent(texte_presse_papier)) return;
scene -> fromXml(document_xml, mapToScene(e -> pos())); scene -> fromXml(document_xml, mapToScene(e -> pos()), false);
} }
QGraphicsView::mousePressEvent(e); QGraphicsView::mousePressEvent(e);
} }