diff --git a/ico/add_row.png b/ico/add_row.png new file mode 100755 index 000000000..8174ea172 Binary files /dev/null and b/ico/add_row.png differ diff --git a/ico/remove_row.png b/ico/remove_row.png new file mode 100755 index 000000000..974cd5470 Binary files /dev/null and b/ico/remove_row.png differ diff --git a/qelectrotech.qrc b/qelectrotech.qrc index 17c8bb222..2b3ede758 100644 --- a/qelectrotech.qrc +++ b/qelectrotech.qrc @@ -6,6 +6,7 @@ ico/qelectrotech.png ico/allowed.png ico/add_col.png + ico/add_row.png ico/arc.png ico/bring_forward.png ico/button_cancel.png @@ -57,6 +58,7 @@ ico/redo.png ico/reload.png ico/remove_col.png + ico/remove_row.png ico/restaurer.png ico/saveas.png ico/save.png diff --git a/sources/borderinset.cpp b/sources/borderinset.cpp index db435ac5c..6365821dc 100644 --- a/sources/borderinset.cpp +++ b/sources/borderinset.cpp @@ -18,23 +18,30 @@ #include #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"); + } + } } diff --git a/sources/borderinset.h b/sources/borderinset.h index c69d55f84..b65141528 100644 --- a/sources/borderinset.h +++ b/sources/borderinset.h @@ -39,29 +39,51 @@ class BorderInset : public QObject { // methodes public: + static int minNbColumns(); + static qreal minColumnsWidth(); + static int minNbRows(); + static qreal minRowsHeight(); + void draw(QPainter *, qreal = 0.0, qreal = 0.0); // methodes d'acces en lecture aux dimensions + // colonnes /// @return le nombre de colonnes du schema - int nbColumn() const { return(nb_columns); } - /// @return la taille des colonnes en pixels - qreal columnsWidth() const { return(columns_width); } + int nbColumns() const { return(nb_columns); } + /// @return la largeur des colonnes en pixels + qreal columnsWidth() const { return(columns_width); } + /// @return la taille de l'ensemble des colonnes, en-tete des lignes non inclus + qreal columnsTotalWidth() const { return(nb_columns * columns_width); } /// @return la hauteur, en pixels, des en-tetes des colonnes - qreal columnsHeaderHeight() const { return(columns_header_height); } - /// @return la hauteur des colonnes, en-tetes inclus - qreal columnsHeight() const { return(columns_height); } - /// @return la largeur de la bordure - qreal borderWidth() const { return(nb_columns * columns_width); } - /// @return la hauteur de la bordure - qreal borderHeight() const { return(columns_height + inset_height); } + qreal columnsHeaderHeight() const { return(columns_header_height); } + + // lignes + /// @return le nombre de lignes du schema + int nbRows() const { return(nb_rows); } + /// @return la hauteur des lignes en pixels + qreal rowsHeight() const { return(rows_height); } + /// @return la taille de l'ensemble des lignes, en-tete des colonnes non inclus + qreal rowsTotalHeight() const { return(nb_rows * rows_height); } + /// @return la largeur, en pixels, des en-tetes des lignes + qreal rowsHeaderWidth() const { return(rows_header_width); } + + // cadre sans le cartouche = schema + /// @return la largeur du schema, c'est-a-dire du cadre sans le cartouche + qreal diagramWidth() const { return(columnsTotalWidth() + rowsHeaderWidth()); } + /// @return la hauteurdu schema, c'est-a-dire du cadre sans le cartouche + qreal diagramHeight() const { return(rowsTotalHeight() + columnsHeaderHeight()); } + + // cartouche /// @return la largeur du cartouche - qreal insetWidth() const { return(inset_width); } + qreal insetWidth() const { return(inset_width); } /// @return la hauteur du cartouche - qreal insetHeight() const { return(inset_height); } - /// @return la hauteur minimale acceptee des colonnes - qreal minColumnsHeight() const { return(min_columns_height); } - /// @return le nombre minimum accepte de colonnes - int minNbColumns() const { return(min_nb_columns); } + qreal insetHeight() const { return(inset_height); } + + // cadre avec le cartouche + /// @return la hauteur de la bordure + qreal borderWidth() const { return(diagramWidth()); } + /// @return la hauteur de la bordure + qreal borderHeight() const { return(diagramHeight() + insetHeight()); } // methodes d'acces en lecture aux informations du cartouche /// @return le champ "Auteur" du cartouche @@ -80,16 +102,23 @@ class BorderInset : public QObject { bool insetIsDisplayed() const { return(display_inset); } /// @return true si les entetes des colonnes sont affiches, false sinon bool columnsAreDisplayed() const { return(display_columns); } + /// @return true si les entetes des lignes sont affiches, false sinon + bool rowsAreDisplayed() const { return(display_rows); } /// @return true si la bordure est affichee, false sinon bool borderIsDisplayed() const { return(display_border); } // methodes d'acces en ecriture aux dimensions void addColumn (); + void addRow (); void removeColumn (); + void removeRow (); void setNbColumns (int); + void setNbRows (int); void setColumnsWidth (const qreal &); + void setRowsHeight (const qreal &); void setColumnsHeaderHeight(const qreal &); - void setColumnsHeight (const qreal &); + void setRowsHeaderWidth (const qreal &); + void setDiagramHeight (const qreal &); void setInsetWidth (const qreal &); void setInsetHeight (const qreal &); void adjustInsetToColumns (); @@ -131,11 +160,14 @@ class BorderInset : public QObject { void displayInset (bool di) { display_inset = di; } /// @param dc true pour afficher les entetes des colonnes, false sinon void displayColumns (bool dc) { display_columns = dc; } + /// @param dr true pour afficher les entetes des lignes, false sinon + void displayRows (bool dr) { display_rows = dr; } /// @param db true pour afficher la bordure du schema, false sinon void displayBorder (bool db) { display_border = db; } private: void updateRectangles(); + QString incrementLetters(const QString &); // signaux signals: @@ -155,18 +187,23 @@ class BorderInset : public QObject { QString bi_folio; QString bi_filename; - // dimensions du cadre et du cartouche + // dimensions du cadre (lignes et colonnes) + // colonnes : nombres et dimensions int nb_columns; - int min_nb_columns; qreal columns_width; qreal columns_header_height; - qreal columns_height; - qreal min_columns_height; + + // lignes : nombres et dimensions + int nb_rows; + qreal rows_height; + qreal rows_header_width; + + // dimensions du cartouche qreal inset_width; qreal inset_height; // rectangles utilises pour le dessin - QRectF border; + QRectF diagram; QRectF inset; QRectF inset_author; QRectF inset_date; @@ -177,6 +214,7 @@ class BorderInset : public QObject { // booleens pour les options de dessin bool display_inset; bool display_columns; + bool display_rows; bool display_border; }; #endif diff --git a/sources/configpages.cpp b/sources/configpages.cpp index 0c23fa8dc..811cdf955 100644 --- a/sources/configpages.cpp +++ b/sources/configpages.cpp @@ -20,6 +20,7 @@ #include "insetpropertieswidget.h" #include "qetapp.h" #include "qetdiagrameditor.h" +#include "borderinset.h" /** Constructeur @@ -31,9 +32,10 @@ NewDiagramPage::NewDiagramPage(QWidget *parent) : ConfigPage(parent) { QSettings &settings = QETApp::settings(); // recupere les dimensions du schema - int columns_count_value = settings.value("diagrameditor/defaultcols", 15).toInt(); + int columns_count_value = settings.value("diagrameditor/defaultcols", 15).toInt(); int columns_width_value = qRound(settings.value("diagrameditor/defaultcolsize", 50.0).toDouble()); - int columns_height_value = qRound(settings.value("diagrameditor/defaultheight", 500.0).toDouble()); + int rows_count_value = settings.value("diagrameditor/defaultrows", 6).toDouble(); + int rows_height_value = qRound(settings.value("diagrameditor/defaultrowsize", 80.0).toDouble()); QVBoxLayout *vlayout1 = new QVBoxLayout(); @@ -54,28 +56,35 @@ NewDiagramPage::NewDiagramPage(QWidget *parent) : ConfigPage(parent) { QLabel *ds1 = new QLabel(tr("Colonnes :")); columns_count = new QSpinBox(diagram_size_box); - columns_count -> setMinimum(3); /// @todo methode statique pour recuperer ca + columns_count -> setMinimum(BorderInset::minNbColumns()); columns_count -> setValue(columns_count_value); columns_width = new QSpinBox(diagram_size_box); - columns_width -> setMinimum(1); + columns_width -> setMinimum(BorderInset::minColumnsWidth()); 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 :")); + QLabel *ds2 = new QLabel(tr("Lignes :")); - columns_height = new QSpinBox(diagram_size_box); - columns_height -> setRange(80, 10000); /// @todo methode statique pour recuperer ca - columns_height -> setSingleStep(80); - columns_height -> setValue(columns_height_value); + rows_count = new QSpinBox(diagram_size_box); + rows_count -> setMinimum(BorderInset::minNbRows()); + rows_count -> setValue(rows_count_value); + + rows_height = new QSpinBox(diagram_size_box); + rows_height -> setMinimum(BorderInset::minRowsHeight()); + rows_height -> setSingleStep(10); + rows_height -> setValue(rows_height_value); + rows_height -> setPrefix(tr("\327")); + rows_height -> setSuffix(tr("px")); 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); + diagram_size_box_layout -> addWidget(rows_count, 1, 1); + diagram_size_box_layout -> addWidget(rows_height, 1, 2); ipw = new InsetPropertiesWidget(QETDiagramEditor::defaultInsetProperties(), true, this); @@ -107,7 +116,8 @@ void NewDiagramPage::applyConf() { // dimensions des nouveaux schemas settings.setValue("diagrameditor/defaultcols", columns_count -> value()); settings.setValue("diagrameditor/defaultcolsize", columns_width -> value()); - settings.setValue("diagrameditor/defaultheight", columns_height -> value()); + settings.setValue("diagrameditor/defaultrows", rows_count -> value()); + settings.setValue("diagrameditor/defaultrowsize", rows_height -> value()); // proprietes du cartouche InsetProperties inset = ipw-> insetProperties(); diff --git a/sources/configpages.h b/sources/configpages.h index 083444c19..697fd014e 100644 --- a/sources/configpages.h +++ b/sources/configpages.h @@ -65,7 +65,8 @@ class NewDiagramPage : public ConfigPage { public: QSpinBox *columns_count; ///< Widget d'edition du nombre par defaut de colonnes QSpinBox *columns_width; ///< Widget d'edition de la largeur par defaut des colonnes - QSpinBox *columns_height; ///< Widget d'edition de la hauteur par defaut des colonnes + QSpinBox *rows_count; ///< Widget d'edition du nombre par defaut de lignes + QSpinBox *rows_height; ///< Widget d'edition de la hauteur par defaut des lignes InsetPropertiesWidget *ipw; ///< Widget d'edition des proprietes par defaut du cartouche ConductorPropertiesWidget *cpw; ///< Widget d'edition des proprietes par defaut des conducteurs }; diff --git a/sources/diagram.cpp b/sources/diagram.cpp index 05315eb99..bffd0e606 100644 --- a/sources/diagram.cpp +++ b/sources/diagram.cpp @@ -247,9 +247,12 @@ QDomDocument Diagram::toXml(bool diagram) { if (!border_and_inset.title().isNull()) racine.setAttribute("title", 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()); - racine.setAttribute("cols", border_and_inset.nbColumn()); + racine.setAttribute("cols", border_and_inset.nbColumns()); racine.setAttribute("colsize", border_and_inset.columnsWidth()); - racine.setAttribute("height", border_and_inset.columnsHeight()); + racine.setAttribute("rows", border_and_inset.nbRows()); + racine.setAttribute("rowsize", border_and_inset.rowsHeight()); + // attribut datant de la version 0.1 - laisse pour retrocompatibilite + racine.setAttribute("height", border_and_inset.diagramHeight()); // type de conducteur par defaut QDomElement default_conductor = document.createElement("defaultconductor"); @@ -353,9 +356,20 @@ bool Diagram::fromXml(QDomDocument &document, QPointF position, bool consider_in double col_size = root.attribute("colsize").toDouble(&ok); if (ok) border_and_inset.setColumnsWidth(col_size); - // hauteur du schema - double height = root.attribute("height").toDouble(&ok); - if (ok) border_and_inset.setColumnsHeight(height); + // retrocompatibilite : les schemas enregistres avec la 0.1 ont un attribut "height" + if (root.hasAttribute("rows") && root.hasAttribute("rowsize")) { + // nombre de lignes + int nb_rows = root.attribute("rows").toInt(&ok); + if (ok) border_and_inset.setNbRows(nb_rows); + + // taille des lignes + double row_size = root.attribute("rowsize").toDouble(&ok); + if (ok) border_and_inset.setRowsHeight(row_size); + } else { + // hauteur du schema + double height = root.attribute("height").toDouble(&ok); + if (ok) border_and_inset.setDiagramHeight(height); + } border_and_inset.adjustInsetToColumns(); diff --git a/sources/diagramcommands.cpp b/sources/diagramcommands.cpp index 3319ce597..21f6c7811 100644 --- a/sources/diagramcommands.cpp +++ b/sources/diagramcommands.cpp @@ -540,9 +540,11 @@ ChangeBorderCommand::ChangeBorderCommand(Diagram *dia, QUndoCommand *parent) : QUndoCommand(QObject::tr("modifier les dimensions du sch\351ma"), parent), diagram(dia), columnsCountDifference(0), - columnsHeightDifference(0.0), + rowsCountDifference(0), columnsWidthDifference(0.0), - headersHeightDifference(0.0) + rowsHeightDifference(0.0), + headersHeightDifference(0.0), + headersWidthDifference(0.0) { } @@ -561,17 +563,23 @@ void ChangeBorderCommand::applyChanges(int coeff) { // reference vers l'objet border_and_inset du schema BorderInset &border = diagram -> border_and_inset; if (columnsCountDifference) { - border.setNbColumns(border.nbColumn() + (columnsCountDifference * coeff)); + border.setNbColumns(border.nbColumns() + (columnsCountDifference * coeff)); } - if (columnsHeightDifference) { - border.setColumnsHeight(border.columnsHeight() + (columnsHeightDifference * coeff)); + if (rowsCountDifference) { + border.setNbRows(border.nbRows() + (rowsCountDifference * coeff)); } if (columnsWidthDifference) { border.setColumnsWidth(border.columnsWidth() + (columnsWidthDifference * coeff)); } + if (rowsHeightDifference) { + border.setRowsHeight(border.rowsHeight() + (rowsHeightDifference * coeff)); + } if (headersHeightDifference) { border.setColumnsHeaderHeight(border.columnsHeaderHeight() + (headersHeightDifference * coeff)); } + if (headersWidthDifference) { + border.setRowsHeaderWidth(border.rowsHeaderWidth() + (headersWidthDifference * coeff)); + } border.adjustInsetToColumns(); } diff --git a/sources/diagramcommands.h b/sources/diagramcommands.h index b4acc2f95..ef3b51131 100644 --- a/sources/diagramcommands.h +++ b/sources/diagramcommands.h @@ -353,12 +353,16 @@ class ChangeBorderCommand : public QUndoCommand { public: /// nombre de colonnes ajoutees / enlevees int columnsCountDifference; - /// delta pour la hauteur des colonnes - qreal columnsHeightDifference; + /// nombre de lignes ajoutees / enlevees + int rowsCountDifference; /// delta pour la largeur des colonnes qreal columnsWidthDifference; + /// delta pour la hauteur des lignes + qreal rowsHeightDifference; /// delta pour la hauteur des entetes des colonnes qreal headersHeightDifference; + /// delta pour la largeur des entetes des lignes + qreal headersWidthDifference; }; /** diff --git a/sources/diagramview.cpp b/sources/diagramview.cpp index c0cbaba22..7619bce9f 100644 --- a/sources/diagramview.cpp +++ b/sources/diagramview.cpp @@ -27,7 +27,7 @@ /** Constructeur - @param parent Le QWidegt parent de cette vue de schema + @param parent Le QWidget parent de cette vue de schema */ DiagramView::DiagramView(QWidget *parent) : QGraphicsView(parent), is_adding_text(false) { setAttribute(Qt::WA_DeleteOnClose, true); @@ -67,7 +67,7 @@ DiagramView::~DiagramView() { } /** - appelle la methode select sur tous les elements de la liste d'elements + Appelle la methode select sur tous les elements de la liste d'elements */ void DiagramView::selectAll() { if (scene -> items().isEmpty()) return; @@ -117,7 +117,7 @@ void DiagramView::rotateSelection() { } /** - 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 */ void DiagramView::dragEnterEvent(QDragEnterEvent *e) { @@ -126,14 +126,14 @@ void DiagramView::dragEnterEvent(QDragEnterEvent *e) { } /** - gere les dragleaveevent + Gere les dragleaveevent @param e le QDragEnterEvent correspondant au drag'n drop sortant */ void DiagramView::dragLeaveEvent(QDragLeaveEvent *) { } /** - 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 QDragMoveEvent correspondant au drag'n drop tente */ void DiagramView::dragMoveEvent(QDragMoveEvent *e) { @@ -142,7 +142,7 @@ void DiagramView::dragMoveEvent(QDragMoveEvent *e) { } /** - gere les depots (drop) acceptes sur le Diagram + Gere les depots (drop) acceptes sur le Diagram @param e le QDropEvent correspondant au drag'n drop effectue */ void DiagramView::dropEvent(QDropEvent *e) { @@ -210,7 +210,7 @@ void DiagramView::zoomReset() { } /** - copie les elements selectionnes du schema dans le presse-papier puis les supprime + Copie les elements selectionnes du schema dans le presse-papier puis les supprime */ void DiagramView::cut() { copy(); @@ -220,7 +220,7 @@ void DiagramView::cut() { } /** - copie les elements selectionnes du schema dans le presse-papier + Copie les elements selectionnes du schema dans le presse-papier */ void DiagramView::copy() { QClipboard *presse_papier = QApplication::clipboard(); @@ -551,9 +551,10 @@ void DiagramView::dialogEditInfos() { InsetProperties inset = scene -> border_and_inset.exportInset(); // recupere les dimensions du schema - int columns_count_value = scene -> border_and_inset.nbColumn(); + int columns_count_value = scene -> border_and_inset.nbColumns(); int columns_width_value = qRound(scene -> border_and_inset.columnsWidth()); - int columns_height_value = qRound(scene -> border_and_inset.columnsHeight()); + int rows_count_value = scene -> border_and_inset.nbRows(); + int rows_height_value = qRound(scene -> border_and_inset.rowsHeight()); // construit le dialogue QDialog popup; @@ -566,28 +567,35 @@ void DiagramView::dialogEditInfos() { QLabel *ds1 = new QLabel(tr("Colonnes :")); QSpinBox *columns_count = new QSpinBox(diagram_size_box); - columns_count -> setMinimum(scene -> border_and_inset.minNbColumns()); + columns_count -> setMinimum(BorderInset::minNbColumns()); columns_count -> setValue(columns_count_value); QSpinBox *columns_width = new QSpinBox(diagram_size_box); - columns_width -> setMinimum(1); + columns_width -> setMinimum(BorderInset::minColumnsWidth()); 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 :")); + QLabel *ds2 = new QLabel(tr("Lignes :")); - QSpinBox *columns_height = new QSpinBox(diagram_size_box); - columns_height -> setRange(qRound(scene -> border_and_inset.minColumnsHeight()), 10000); - columns_height -> setSingleStep(80); - columns_height -> setValue(columns_height_value); + QSpinBox *rows_count = new QSpinBox(diagram_size_box); + rows_count -> setMinimum(BorderInset::minNbRows()); + rows_count -> setValue(rows_count_value); + + QSpinBox *rows_height = new QSpinBox(diagram_size_box); + rows_height -> setMinimum(BorderInset::minRowsHeight()); + rows_height -> setSingleStep(10); + rows_height -> setValue(rows_height_value); + rows_height -> setPrefix(tr("\327")); + rows_height -> setSuffix(tr("px")); 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); + diagram_size_box_layout.addWidget(rows_count, 1, 1); + diagram_size_box_layout.addWidget(rows_height, 1, 2); diagram_size_box_layout.setColumnStretch(0, 1); diagram_size_box_layout.setColumnStretch(1, 1); diagram_size_box_layout.setColumnStretch(2, 1); @@ -619,12 +627,14 @@ void DiagramView::dialogEditInfos() { if ( columns_count_value != columns_count -> value() ||\ columns_width_value != columns_width -> value() ||\ - columns_height_value != columns_height -> value() + rows_count_value != rows_count -> value() ||\ + rows_height_value != rows_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; + cbc -> rowsCountDifference = rows_count -> value() - rows_count_value; + cbc -> rowsHeightDifference = rows_height -> value() - rows_height_value; scene -> undoStack().push(cbc); } } @@ -658,18 +668,18 @@ void DiagramView::removeColumn() { /** Agrandit le schema en hauteur */ -void DiagramView::expand() { +void DiagramView::addRow() { ChangeBorderCommand *cbc = new ChangeBorderCommand(scene); - cbc -> columnsHeightDifference = 80.0; + cbc -> rowsCountDifference = 1; scene -> undoStack().push(cbc); } /** Retrecit le schema en hauteur */ -void DiagramView::shrink() { +void DiagramView::removeRow() { ChangeBorderCommand *cbc = new ChangeBorderCommand(scene); - cbc -> columnsHeightDifference = -80.0; + cbc -> rowsCountDifference = -1; scene -> undoStack().push(cbc); } @@ -897,8 +907,8 @@ void DiagramView::contextMenuEvent(QContextMenuEvent *e) { 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); + context_menu -> addAction(qde -> add_row); + context_menu -> addAction(qde -> remove_row); } else { context_menu -> addAction(qde -> cut); context_menu -> addAction(qde -> copy); @@ -936,7 +946,7 @@ void DiagramView::mouseDoubleClickEvent(QMouseEvent *e) { // recupere le rectangle corespondant au cartouche QRectF inset_rect( Diagram::margin, - Diagram::margin + bi.columnsHeight(), + Diagram::margin + bi.diagramHeight(), bi.insetWidth(), bi.insetHeight() ); @@ -949,6 +959,14 @@ void DiagramView::mouseDoubleClickEvent(QMouseEvent *e) { bi.columnsHeaderHeight() ); + // recupere le rectangle correspondant aux en-tetes des lignes + QRectF rows_rect( + Diagram::margin, + Diagram::margin, + bi.rowsHeaderWidth(), + bi.diagramHeight() + ); + // coordonnees du clic par rapport au schema QPointF click_pos = viewportTransform().inverted().map(e -> pos()); @@ -959,7 +977,7 @@ void DiagramView::mouseDoubleClickEvent(QMouseEvent *e) { } else { QGraphicsView::mouseDoubleClickEvent(e); } - } else if (inset_rect.contains(click_pos) || columns_rect.contains(click_pos)) { + } else if (inset_rect.contains(click_pos) || columns_rect.contains(click_pos) || rows_rect.contains(click_pos)) { // edite les proprietes du schema dialogEditInfos(); } else { diff --git a/sources/diagramview.h b/sources/diagramview.h index e126cdf90..d8acfe8a1 100644 --- a/sources/diagramview.h +++ b/sources/diagramview.h @@ -59,8 +59,8 @@ class DiagramView : public QGraphicsView { void dialogPrint(); void addColumn(); void removeColumn(); - void expand(); - void shrink(); + void addRow(); + void removeRow(); /// @return Le schema visualise par ce DiagramView Diagram *diagram() { return(scene); } QETDiagramEditor *diagramEditor() const; diff --git a/sources/exportdialog.cpp b/sources/exportdialog.cpp index 9a0596b90..2443c2739 100644 --- a/sources/exportdialog.cpp +++ b/sources/exportdialog.cpp @@ -70,6 +70,7 @@ ExportDialog::ExportDialog(Diagram *dia, QWidget *parent) : QDialog(parent) { connect(draw_border, SIGNAL(stateChanged(int) ), this, SLOT(slot_refreshPreview())); connect(draw_inset, SIGNAL(stateChanged(int) ), this, SLOT(slot_refreshPreview())); connect(draw_columns, SIGNAL(stateChanged(int) ), this, SLOT(slot_refreshPreview())); + connect(draw_rows, SIGNAL(stateChanged(int) ), this, SLOT(slot_refreshPreview())); connect(draw_terminals, SIGNAL(stateChanged(int) ), this, SLOT(slot_refreshPreview())); connect(width, SIGNAL(valueChanged(int) ), this, SLOT(slot_refreshPreview())); connect(height, SIGNAL(valueChanged(int) ), this, SLOT(slot_refreshPreview())); @@ -158,6 +159,11 @@ QGroupBox *ExportDialog::setupOptionsGroupBox() { optionshlayout -> addWidget(draw_columns, 2, 1); draw_columns -> setChecked(diagram -> border_and_inset.columnsAreDisplayed()); + // dessiner les lignes + draw_rows = new QCheckBox(tr("Dessiner les lignes"), groupbox_options); + optionshlayout -> addWidget(draw_rows, 3, 1); + draw_rows -> setChecked(diagram -> border_and_inset.rowsAreDisplayed()); + // dessiner les bornes draw_terminals = new QCheckBox(tr("Dessiner les bornes"), groupbox_options); optionshlayout -> addWidget(draw_terminals, 3, 0); @@ -305,6 +311,7 @@ QImage ExportDialog::generateImage() { void ExportDialog::saveReloadDiagramParameters(bool save) { static bool state_drawBorder; static bool state_drawColumns; + static bool state_drawRows; static bool state_drawInset; static bool state_drawGrid; static bool state_drawTerm; @@ -314,6 +321,7 @@ void ExportDialog::saveReloadDiagramParameters(bool save) { // memorise les parametres relatifs au schema state_drawBorder = diagram -> border_and_inset.borderIsDisplayed(); state_drawColumns = diagram -> border_and_inset.columnsAreDisplayed(); + state_drawRows = diagram -> border_and_inset.rowsAreDisplayed(); state_drawInset = diagram -> border_and_inset.insetIsDisplayed(); state_drawGrid = diagram -> displayGrid(); state_drawTerm = diagram -> drawTerminals(); @@ -324,11 +332,13 @@ void ExportDialog::saveReloadDiagramParameters(bool save) { diagram -> setDisplayGrid(draw_grid -> isChecked()); diagram -> border_and_inset.displayBorder(draw_border -> isChecked()); diagram -> border_and_inset.displayColumns(draw_columns -> isChecked()); + diagram -> border_and_inset.displayRows(draw_rows -> isChecked()); diagram -> border_and_inset.displayInset(draw_inset -> isChecked()); } else { // restaure les parametres relatifs au schema diagram -> border_and_inset.displayBorder(state_drawBorder); diagram -> border_and_inset.displayColumns(state_drawColumns); + diagram -> border_and_inset.displayRows(state_drawRows); diagram -> border_and_inset.displayInset(state_drawInset); diagram -> setDisplayGrid(state_drawGrid); diagram -> setDrawTerminals(state_drawTerm); diff --git a/sources/exportdialog.h b/sources/exportdialog.h index 2739dfaad..783cf4a79 100644 --- a/sources/exportdialog.h +++ b/sources/exportdialog.h @@ -48,6 +48,7 @@ class ExportDialog : public QDialog { QCheckBox *draw_border; QCheckBox *draw_inset; QCheckBox *draw_columns; + QCheckBox *draw_rows; QCheckBox *draw_terminals; QRadioButton *export_elements; QRadioButton *export_border; diff --git a/sources/hotspoteditor.cpp b/sources/hotspoteditor.cpp index c24b2525b..74237f10d 100644 --- a/sources/hotspoteditor.cpp +++ b/sources/hotspoteditor.cpp @@ -44,8 +44,11 @@ HotspotEditor::HotspotEditor(QWidget *parent) : sb_hotspot_y -> setSingleStep(10); diagram_scene = new Diagram(); - diagram_scene -> border_and_inset.setNbColumns(4); - diagram_scene -> border_and_inset.setColumnsHeight(140); + diagram_scene -> border_and_inset.setColumnsWidth(50.0); + diagram_scene -> border_and_inset.setNbColumns(3); + diagram_scene -> border_and_inset.setRowsHeight(60.0); + diagram_scene -> border_and_inset.setNbRows(2); + diagram_scene -> border_and_inset.displayRows(false); diagram_scene -> border_and_inset.displayInset(false); diagram_view = new QGraphicsView(diagram_scene); diff --git a/sources/qetdiagrameditor.cpp b/sources/qetdiagrameditor.cpp index e143cdda9..38682becc 100644 --- a/sources/qetdiagrameditor.cpp +++ b/sources/qetdiagrameditor.cpp @@ -194,8 +194,8 @@ void QETDiagramEditor::actions() { add_text = new QAction(QIcon(":/ico/textfield.png"), tr("Ajouter un champ de texte"), this); add_column = new QAction(QIcon(":/ico/add_col.png"), tr("Ajouter une colonne"), this); remove_column = new QAction(QIcon(":/ico/remove_col.png"), tr("Enlever une colonne"), this); - expand_diagram = new QAction( tr("Agrandir le sch\351ma"), this); - shrink_diagram = new QAction( tr("R\351tr\351cir le sch\351ma"), this); + add_row = new QAction(QIcon(":/ico/add_row.png"), tr("Ajouter une ligne"), this); + remove_row = new QAction(QIcon(":/ico/remove_row.png"), tr("Enlever une ligne"), this); zoom_in = new QAction(QIcon(":/ico/viewmag+.png"), tr("Zoom avant"), this); zoom_out = new QAction(QIcon(":/ico/viewmag-.png"), tr("Zoom arri\350re"), this); @@ -281,8 +281,8 @@ void QETDiagramEditor::actions() { infos_diagram -> 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")); - expand_diagram -> setStatusTip(tr("Agrandit le sch\351ma en hauteur")); - shrink_diagram -> setStatusTip(tr("R\351tr\351cit le sch\351ma en hauteur")); + add_row -> setStatusTip(tr("Agrandit le sch\351ma en hauteur")); + remove_row -> setStatusTip(tr("R\351tr\351cit le sch\351ma en hauteur")); zoom_in -> setStatusTip(tr("Agrandit le sch\351ma")); zoom_out -> setStatusTip(tr("R\351tr\351cit le sch\351ma")); @@ -356,8 +356,8 @@ void QETDiagramEditor::actions() { connect(add_text, SIGNAL(triggered()), this, SLOT(slot_addText()) ); connect(add_column, SIGNAL(triggered()), this, SLOT(slot_addColumn()) ); connect(remove_column, SIGNAL(triggered()), this, SLOT(slot_removeColumn()) ); - connect(expand_diagram, SIGNAL(triggered()), this, SLOT(slot_expand()) ); - connect(shrink_diagram, SIGNAL(triggered()), this, SLOT(slot_shrink()) ); + connect(add_row, SIGNAL(triggered()), this, SLOT(slot_addRow()) ); + connect(remove_row, SIGNAL(triggered()), this, SLOT(slot_removeRow()) ); } /** @@ -419,8 +419,8 @@ void QETDiagramEditor::menus() { menu_edition -> addAction(infos_diagram); menu_edition -> addAction(add_column); menu_edition -> addAction(remove_column); - menu_edition -> addAction(expand_diagram); - menu_edition -> addAction(shrink_diagram); + menu_edition -> addAction(add_row); + menu_edition -> addAction(remove_row); // menu Configurer > Afficher QMenu *display_toolbars = createPopupMenu(); @@ -767,8 +767,8 @@ void QETDiagramEditor::slot_updateActions() { add_text -> setEnabled(opened_document); add_column -> setEnabled(opened_document); remove_column -> setEnabled(opened_document); - expand_diagram -> setEnabled(opened_document); - shrink_diagram -> setEnabled(opened_document); + add_row -> setEnabled(opened_document); + remove_row -> setEnabled(opened_document); // affiche les actions correspondant au diagram view en cours if (sv) undo_group.setActiveStack(&(sv -> diagram() -> undoStack())); @@ -957,45 +957,45 @@ void QETDiagramEditor::slot_updateWindowsMenu() { Edite les informations du schema en cours */ void QETDiagramEditor::slot_editInfos() { - DiagramView *sv = currentDiagram(); - if (!sv) return; - sv -> dialogEditInfos(); + if (DiagramView *dv = currentDiagram()) { + dv -> dialogEditInfos(); + } } /** Ajoute une colonne au schema en cours */ void QETDiagramEditor::slot_addColumn() { - DiagramView *sv = currentDiagram(); - if (!sv) return; - sv -> addColumn(); + if (DiagramView *dv = currentDiagram()) { + dv -> addColumn(); + } } /** Enleve une colonne au schema en cours */ void QETDiagramEditor::slot_removeColumn() { - DiagramView *sv = currentDiagram(); - if (!sv) return; - sv -> removeColumn(); + if (DiagramView *dv = currentDiagram()) { + dv -> removeColumn(); + } } /** Allonge le schema en cours en hauteur */ -void QETDiagramEditor::slot_expand() { - DiagramView *sv = currentDiagram(); - if (!sv) return; - sv -> expand(); +void QETDiagramEditor::slot_addRow() { + if (DiagramView *dv = currentDiagram()) { + dv -> addRow(); + } } /** Retrecit le schema en cours en hauteur */ -void QETDiagramEditor::slot_shrink() { - DiagramView *sv = currentDiagram(); - if (!sv) return; - sv -> shrink(); +void QETDiagramEditor::slot_removeRow() { + if (DiagramView *dv = currentDiagram()) { + dv -> removeRow(); + } } /** diff --git a/sources/qetdiagrameditor.h b/sources/qetdiagrameditor.h index 19a28b41c..396632cc4 100644 --- a/sources/qetdiagrameditor.h +++ b/sources/qetdiagrameditor.h @@ -92,8 +92,8 @@ class QETDiagramEditor : public QMainWindow { void slot_updateWindowsMenu(); void slot_addColumn(); void slot_removeColumn(); - void slot_expand(); - void slot_shrink(); + void slot_addRow(); + void slot_removeRow(); void slot_editConductor(); void slot_resetConductors(); void slot_editDefaultConductors(); @@ -133,8 +133,8 @@ class QETDiagramEditor : public QMainWindow { QAction *add_text; ///< Passe en mode "Ajout de texte" QAction *add_column; ///< Ajoute une colonne au schema QAction *remove_column; ///< Enleve une colonne du schema - QAction *expand_diagram; ///< Augmente la hauteur du schema - QAction *shrink_diagram; ///< Reduit la hauteur du schema + QAction *add_row; ///< Augmente la hauteur du schema + QAction *remove_row; ///< Reduit la hauteur du schema QAction *zoom_in; ///< Zoome avant QAction *zoom_out; ///< Zoome arriere QAction *zoom_fit; ///< Ajuste le zoom de facon a voir l'integralite des elements