La hauteur du schema est desormais geree via un systeme de lignes, dont le nombre et la hauteur sont ajustables.

git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@365 bfdf4180-ca20-0410-9c96-a3a8aa849046
This commit is contained in:
xavierqet
2008-08-10 15:07:59 +00:00
parent 818982272f
commit e0cf69d6bf
17 changed files with 397 additions and 157 deletions

View File

@@ -18,23 +18,30 @@
#include <QPainter>
#include "borderinset.h"
#include "qetapp.h"
#include "math.h"
/**
Constructeur simple : construit une bordure de 15 colonnes de 50x500 avec
un cartouche de 400x50.
Constructeur simple : construit une bordure en recuperant les dimensions
dans la configuration de l'application.
@param parent QObject parent de ce BorderInset
*/
BorderInset::BorderInset(QObject *parent) : QObject(parent) {
nb_columns = qMax(3, QETApp::settings().value("diagrameditor/defaultcols", 15).toInt());
min_nb_columns = 3;
columns_width = QETApp::settings().value("diagrameditor/defaultcolsize", 50.0).toDouble();
columns_height = QETApp::settings().value("diagrameditor/defaultheight", 500.0).toDouble();
min_columns_height = 80.0;
inset_width = nb_columns * columns_width;
inset_height = 50.0;
// initialise les dimensions des colonnes (ainsi que la largeur du cartouche)
columns_header_height = 20.0;
setNbColumns (QETApp::settings().value("diagrameditor/defaultcols", 15).toInt());
setColumnsWidth(QETApp::settings().value("diagrameditor/defaultcolsize", 50.0).toDouble());
// initialise les dimensions des lignes
rows_header_width = 20.0;
setNbRows(QETApp::settings().value("diagrameditor/defaultrows", 6).toInt());
setRowsHeight(QETApp::settings().value("diagrameditor/defaultrowsize", 80.0).toDouble());
// hauteur du cartouche
inset_height = 50.0;
display_inset = true;
display_columns = true;
display_rows = true;
display_border = true;
updateRectangles();
@@ -54,18 +61,46 @@ BorderInset::BorderInset(QObject *parent) : QObject(parent) {
BorderInset::~BorderInset() {
}
/**
@return Le nombre minimum de colonnes qu'un schema doit comporter
*/
int BorderInset::minNbColumns() {
return(3);
}
/**
@return la largeur minimale d'une colonne de schema
*/
qreal BorderInset::minColumnsWidth() {
return(5.0);
}
/**
@return Le nombre minimum de lignes qu'un schema doit comporter
*/
int BorderInset::minNbRows() {
return(2);
}
/**
@return la hauteur minimale d'une ligne de schema
*/
qreal BorderInset::minRowsHeight() {
return(5.0);
}
/**
Methode recalculant les rectangles composant le cadre et le cartouche en
fonction des attributs de taille
*/
void BorderInset::updateRectangles() {
// rectangle delimitant le schema
QRectF previous_border = border;
border = QRectF(0, 0, nb_columns * columns_width, columns_height);
if (border != previous_border) emit(borderChanged(previous_border, border));
QRectF previous_diagram = diagram;
diagram = QRectF(0, 0, diagramWidth(), diagramHeight());
if (diagram != previous_diagram) emit(borderChanged(previous_diagram, diagram));
// rectangles relatifs au cartouche
inset = QRectF(border.bottomLeft().x(), border.bottomLeft().y(), inset_width, inset_height);
inset = QRectF(diagram.bottomLeft().x(), diagram.bottomLeft().y(), 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));
@@ -81,7 +116,7 @@ void BorderInset::updateRectangles() {
*/
void BorderInset::draw(QPainter *qp, qreal x, qreal y) {
// translate tous les rectangles
border .translate(x, y);
diagram .translate(x, y);
inset .translate(x, y);
inset_author.translate(x, y);
inset_date .translate(x, y);
@@ -95,17 +130,28 @@ void BorderInset::draw(QPainter *qp, qreal x, qreal y) {
qp -> setBrush(Qt::NoBrush);
// dessine le cadre
if (display_border) qp -> drawRect(border);
if (display_border) qp -> drawRect(diagram);
qp -> setFont(QFont(QETApp::diagramTextsFont(), qp -> font().pointSize()));
// dessine la case vide qui apparait des qu'il y a un entete
if (display_columns || display_rows) {
qp -> setBrush(Qt::white);
QRectF first_rectangle(
diagram.topLeft().x(),
diagram.topLeft().y(),
rows_header_width,
columns_header_height
);
qp -> drawRect(first_rectangle);
}
// dessine la numerotation des colonnes
if (display_columns) {
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(),
diagram.topLeft().x() + (rows_header_width + ((i - 1) * columns_width)),
diagram.topLeft().y(),
columns_width,
columns_header_height
);
@@ -114,6 +160,22 @@ void BorderInset::draw(QPainter *qp, qreal x, qreal y) {
}
}
// dessine la numerotation des lignes
if (display_rows) {
QString row_string("A");
for (int i = 1 ; i <= nb_rows ; ++ i) {
QRectF lettered_rectangle = QRectF(
diagram.topLeft().x(),
diagram.topLeft().y() + (columns_header_height + ((i - 1) * rows_height)),
rows_header_width,
rows_height
);
qp -> drawRect(lettered_rectangle);
qp -> drawText(lettered_rectangle, Qt::AlignVCenter | Qt::AlignCenter, row_string);
row_string = incrementLetters(row_string);
}
}
// dessine le cartouche
if (display_inset) {
qp -> setBrush(Qt::white);
@@ -138,7 +200,7 @@ void BorderInset::draw(QPainter *qp, qreal x, qreal y) {
qp -> restore();
// annule la translation des rectangles
border .translate(-x, -y);
diagram .translate(-x, -y);
inset .translate(-x, -y);
inset_author.translate(-x, -y);
inset_date .translate(-x, -y);
@@ -151,47 +213,62 @@ void BorderInset::draw(QPainter *qp, qreal x, qreal y) {
Ajoute une colonne.
*/
void BorderInset::addColumn() {
++ nb_columns;
setInsetWidth(nb_columns * columns_width);
updateRectangles();
setNbColumns(nbColumns() + 1);
}
/**
Enleve une colonne. Il doit rester au moins 3 colonnes.
Enleve une colonne sans passer sous le minimum requis.
@see minNbColumns()
*/
void BorderInset::removeColumn() {
if (nb_columns == min_nb_columns) return;
-- nb_columns;
setInsetWidth(nb_columns * columns_width);
updateRectangles();
setNbColumns(nbColumns() - 1);
}
/**
Ajoute une ligne.
*/
void BorderInset::addRow() {
setNbRows(nbRows() + 1);
}
/**
Enleve une ligne sans passer sous le minimum requis.
@see minNbRows()
*/
void BorderInset::removeRow() {
setNbRows(nbRows() - 1);
}
/**
Permet de changer le nombre de colonnes.
Si ce nombre de colonnes est inferieur au minimum requis, cette fonction ne
fait rien
Si ce nombre de colonnes est inferieur au minimum requis, c'est ce minimum
qui est utilise.
@param nb_c nouveau nombre de colonnes
@see minNbColumns()
*/
void BorderInset::setNbColumns(int nb_c) {
if (nb_c < min_nb_columns) return;
nb_columns = nb_c;
setInsetWidth(nb_columns * columns_width);
updateRectangles();
if (nb_c == nbColumns()) return;
nb_columns = qMax(minNbColumns(), nb_c);
setInsetWidth(diagramWidth());
}
/**
Change la largeur des colonnes ; celle-ci doit rester comprise entre 10 et
200px.
Change la largeur des colonnes.
Si la largeur indiquee est inferieure au minimum requis, c'est ce minimum
qui est utilise.
@param new_cw nouvelle largeur des colonnes
@see minColumnsWidth()
*/
void BorderInset::setColumnsWidth(const qreal &new_cw) {
columns_width = qBound(10.0, new_cw, 200.0);
updateRectangles();
if (new_cw == columnsWidth()) return;
columns_width = qMax(minColumnsWidth(), new_cw);
setInsetWidth(diagramWidth());
}
/**
Change la hauteur des en-tetes contenant les numeros de colonnes. Celle-ci
doit rester comprise entre 5 et 50 px.
@param new_chh nouvelle hauteur des en-tetes de colonnes
*/
void BorderInset::setColumnsHeaderHeight(const qreal &new_chh) {
columns_header_height = qBound(5.0, new_chh, 50.0);
@@ -199,29 +276,66 @@ void BorderInset::setColumnsHeaderHeight(const qreal &new_chh) {
}
/**
Change la hauteur des colonnes (et donc du cadre). Cette hauteur doit
rester superieure a la hauteur des en-tetes de colonnes + 20px.
Permet de changer le nombre de lignes.
Si ce nombre de lignes est inferieur au minimum requis, cette fonction ne
fait rien
@param nb_r nouveau nombre de lignes
@see minNbRows()
*/
void BorderInset::setColumnsHeight(const qreal &new_ch) {
columns_height = qMax(columns_header_height + min_columns_height, new_ch);
void BorderInset::setNbRows(int nb_r) {
if (nb_r == nbRows()) return;
nb_rows = qMax(minNbRows(), nb_r);
setInsetWidth(diagramWidth());
updateRectangles();
}
/**
Change la largeur du cartouche. Cette largeur doit rester comprise entre
100px et la largeur du cartouche
Change la hauteur des lignes.
Si la hauteur indiquee est inferieure au minimum requis, c'est ce minimum
qui est utilise.
@param rh nouvelle hauteur des lignes
@see minRowsHeight()
*/
void BorderInset::setRowsHeight(const qreal &new_rh) {
if (new_rh == rowsHeight()) return;
rows_height = qMax(minRowsHeight(), new_rh);
updateRectangles();
}
/**
Change la largeur des en-tetes contenant les numeros de lignes. Celle-ci
doit rester comprise entre 5 et 50 px.
@param new_rhw nouvelle largeur des en-tetes des lignes
*/
void BorderInset::setRowsHeaderWidth(const qreal &new_rhw) {
rows_header_width = qBound(5.0, new_rhw, 50.0);
updateRectangles();
}
/**
Cette methode essaye de se rapprocher le plus possible de la hauteur donnee
en parametre en modifiant le nombre de lignes en cours.
*/
void BorderInset::setDiagramHeight(const qreal &height) {
// taille des lignes a utiliser = rows_height
setNbColumns(ceil(height / rows_height));
}
/**
Change la largeur du cartouche. Cette largeur sera restreinte a celle du
schema.
*/
void BorderInset::setInsetWidth(const qreal &new_iw) {
inset_width = qMax(100.0, qMin(nb_columns * columns_width, new_iw));
inset_width = qMin(diagramWidth(), new_iw);
updateRectangles();
}
/**
Change la hauteur du cartouche. Cette largeur doit rester comprise entre
20px et la hauteur du cartouche.
Change la hauteur du cartouche. Cette hauteur doit rester comprise entre
20px et la hauteur du schema.
*/
void BorderInset::setInsetHeight(const qreal &new_ih) {
inset_height = qMax(20.0, qMin(columns_height, new_ih));
inset_height = qMax(20.0, qMin(diagramHeight(), new_ih));
updateRectangles();
}
@@ -230,5 +344,22 @@ void BorderInset::setInsetHeight(const qreal &new_ih) {
que le schema
*/
void BorderInset::adjustInsetToColumns() {
setInsetWidth(nbColumn() * columnsWidth());
setInsetWidth(diagramWidth());
}
QString BorderInset::incrementLetters(const QString &string) {
if (string.isEmpty()) {
return("A");
} else {
// separe les digits precedents du dernier digit
QString first_digits(string.left(string.count() - 1));
QChar last_digit(string.at(string.count() - 1));
if (last_digit != 'Z') {
// incremente le dernier digit
last_digit = last_digit.toAscii() + 1;
return(first_digits + QString(last_digit));
} else {
return(incrementLetters(first_digits) + "A");
}
}
}