QElectroTech  0.70
diagramfoliolist.cpp
Go to the documentation of this file.
1 /*
2  Copyright 2006-2019 The QElectroTech Team
3  This file is part of QElectroTech.
4 
5  QElectroTech is free software: you can redistribute it and/or modify
6  it under the terms of the GNU General Public License as published by
7  the Free Software Foundation, either version 2 of the License, or
8  (at your option) any later version.
9 
10  QElectroTech is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU General Public License for more details.
14 
15  You should have received a copy of the GNU General Public License
16  along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
17 */
18 #include "diagramfoliolist.h"
19 #include <QPainter>
20 #include "qetapp.h"
21 
22 qreal DiagramFolioList::colWidths[7] = {0.05, 0.50, 0.10, 0.10, 0.05, 0.10, 0.10};
23 
30  Diagram(project)
31 {
32  id = project -> getFolioSheetsQuantity();
33 }
34 
40 {
41  qDeleteAll (list_lines_);
42  qDeleteAll (list_rectangles_);
43  int folioSheetQty = project() -> getFolioSheetsQuantity();
44  if (folioSheetQty > 0)
45  project() -> setFolioSheetsQuantity(folioSheetQty-1);
46 }
47 
54 void DiagramFolioList::drawBackground(QPainter *p, const QRectF &r)
55 {
56  p -> save();
57  QSettings settings;
58  // disable all antialiasing, except for the texts
59  p -> setRenderHint(QPainter::Antialiasing, false);
60  p -> setRenderHint(QPainter::TextAntialiasing, true);
61  p -> setRenderHint(QPainter::SmoothPixmapTransform, false);
62 
63  // draw white background
64  p -> setPen(Qt::NoPen);
65  p -> setBrush(Diagram::background_color);
66  p -> drawRect(r);
67  p -> setPen(Qt::black);
68 
70  qreal height = border_and_titleblock.rowsTotalHeight();
71 
72  //top left corner of drawable area
75  QRectF row_RectBorder(x0, y0, width, height);
76 
77  buildGrid(p, row_RectBorder,30,1,colWidths);
78 
79  x0 = list_rectangles_[0] -> topLeft().x();
80  y0 = list_rectangles_[0] -> topLeft().y();
81 
82  qreal rowHeight = (list_rectangles_[0] -> height())/30;
83  QRectF row_RectF(x0, y0, list_rectangles_[0] -> width(), rowHeight);
84 
85  fillHeader(p, row_RectF);
86  QList<Diagram *> diagram_list = project() -> diagrams();
87 
88  int startDiagram = id * 29;
89  for (int i = startDiagram; i < startDiagram+29 && i < diagram_list.size(); ++i) {
90  y0 += rowHeight;
91  QRectF row_rect(x0, y0, list_rectangles_[0] -> width(), rowHeight);
92  if (settings.value("genericpanel/folio", true).toBool()){
93  fillRow(p, row_rect, diagram_list[i] -> border_and_titleblock.author(),
94  diagram_list[i] -> title(),
95  diagram_list[i] -> border_and_titleblock.finalfolio(),
96  diagram_list[i] -> border_and_titleblock.plant(),
97  diagram_list[i] -> border_and_titleblock.locmach(),
98  diagram_list[i] -> border_and_titleblock.indexrev(),
99  diagram_list[i] -> border_and_titleblock.date().toString(Qt::SystemLocaleShortDate));
100  }else{
101  fillRow(p, row_rect, diagram_list[i] -> border_and_titleblock.author(),
102  diagram_list[i] -> title(),
103  QString::number(diagram_list[i] ->folioIndex()+1),
104  diagram_list[i] -> border_and_titleblock.plant(),
105  diagram_list[i] -> border_and_titleblock.locmach(),
106  diagram_list[i] -> border_and_titleblock.indexrev(),
107  diagram_list[i] -> border_and_titleblock.date().toString(Qt::SystemLocaleShortDate));
108  }
109 
110  }
111 
113  p -> restore();
114 }
115 
122 void DiagramFolioList::fillRow(QPainter *qp, const QRectF &row_rect, const QString& author, const QString& title,
123  const QString& folio, const QString& plant, const QString& loc, const QString& indexrev, const QString& date)
124 {
125  qreal x = row_rect.topLeft().x();
126  qreal y = row_rect.topLeft().y();
127  QSettings settings;
128 
129 
130  QFontMetrics origFontMetrics(QETApp::foliolistTextsFont());
131  qreal origFontSize = QETApp::foliolistTextsFont().pointSizeF();
132  QFont workingFont(QETApp::foliolistTextsFont());
133 
134  if (settings.value("genericpanel/folio", true).toBool()){
135  // reduce the font size if the text entry is long
136  if (origFontMetrics.width(folio) > 0.95*colWidths[0]*row_rect.width())
137  workingFont.setPointSizeF(origFontSize * 0.95*colWidths[0]*row_rect.width() / origFontMetrics.width(folio));
138  else
139  workingFont.setPointSizeF(origFontSize);
140  qp -> setFont(workingFont);
141  qp -> drawText(QRectF(x, y, colWidths[0]*row_rect.width(), row_rect.height()), Qt::AlignCenter, folio);
142 
143  x += colWidths[0]*row_rect.width();
144  }else{
145  if (origFontMetrics.width(folio) > 0.95*colWidths[0]*row_rect.width())
146  workingFont.setPointSizeF(origFontSize * 0.95*colWidths[0]*row_rect.width() / origFontMetrics.width(folio));
147  else
148  workingFont.setPointSizeF(origFontSize);
149  qp -> setFont(workingFont);
150  qp -> drawText(QRectF(x, y, colWidths[0]*row_rect.width(), row_rect.height()), Qt::AlignCenter, folio);
151  x += colWidths[0]*row_rect.width();
152  }
153 
154 
155  if (origFontMetrics.width(title) > 0.95*colWidths[1]*row_rect.width())
156  workingFont.setPointSizeF(origFontSize * 0.95*colWidths[1]*row_rect.width() / origFontMetrics.width(title));
157  else
158  workingFont.setPointSizeF(origFontSize);
159  qp -> setFont(workingFont);
160  QString heading = tr("Titre");
161  if (title == heading)
162  qp -> drawText(QRectF(x, y, colWidths[1]*row_rect.width(),row_rect.height()), Qt::AlignCenter, title);
163  else
164  qp -> drawText(QRectF(x+0.01*row_rect.width(), y, colWidths[1]*row_rect.width()*10.2,
165  row_rect.height()), Qt::AlignLeft | Qt::AlignVCenter, title);
166  x += colWidths[1]*row_rect.width();
167 
168 
169  if (origFontMetrics.width(plant) > 0.95*colWidths[2]*row_rect.width())
170  workingFont.setPointSizeF(origFontSize * 0.95*colWidths[2]*row_rect.width() / origFontMetrics.width(plant));
171  else
172  workingFont.setPointSizeF(origFontSize);
173  qp -> setFont(workingFont);
174  qp -> drawText(QRectF(x, y, colWidths[3]*row_rect.width(), row_rect.height()), Qt::AlignCenter, plant);
175  x += colWidths[2]*row_rect.width();
176 
177 
178  if (origFontMetrics.width(loc) > 0.95*colWidths[3]*row_rect.width())
179  workingFont.setPointSizeF(origFontSize * 0.95*colWidths[3]*row_rect.width() / origFontMetrics.width(loc));
180  else
181  workingFont.setPointSizeF(origFontSize);
182  qp -> setFont(workingFont);
183  qp -> drawText(QRectF(x, y, colWidths[3]*row_rect.width(), row_rect.height()), Qt::AlignCenter, loc);
184  x += colWidths[3]*row_rect.width();
185 
186 
187  if (origFontMetrics.width(indexrev) > 0.95*colWidths[4]*row_rect.width())
188  workingFont.setPointSizeF(origFontSize * 0.95*colWidths[4]*row_rect.width() / origFontMetrics.width(indexrev));
189  else
190  workingFont.setPointSizeF(origFontSize);
191  qp -> setFont(workingFont);
192  qp -> drawText(QRectF(x, y, colWidths[4]*row_rect.width(), row_rect.height()), Qt::AlignCenter, indexrev);
193  x += colWidths[4]*row_rect.width();
194 
195 
196 
197 
198  if (origFontMetrics.width(author) > 0.95*colWidths[5]*row_rect.width())
199  workingFont.setPointSizeF(origFontSize * 0.95*colWidths[5]*row_rect.width() / origFontMetrics.width(author));
200  else
201  workingFont.setPointSizeF(origFontSize);
202  qp -> setFont(workingFont);
203  qp -> drawText(QRectF(x, y, colWidths[6]*row_rect.width(), row_rect.height()), Qt::AlignCenter, author);
204  x += colWidths[5]*row_rect.width();
205 
206 
207  if (origFontMetrics.width(date) > 0.95*colWidths[6]*row_rect.width())
208  workingFont.setPointSizeF(origFontSize * 0.95*colWidths[6]*row_rect.width() / origFontMetrics.width(date));
209  else
210  workingFont.setPointSizeF(origFontSize);
211  qp -> setFont(workingFont);
212  qp -> drawText(QRectF(x, y, colWidths[6]*row_rect.width(), row_rect.height()), Qt::AlignCenter, date);
213 }
214 
215 void DiagramFolioList::buildGrid(QPainter *qp, const QRectF &rect, int rows, int tables, qreal colWidths[])
216 {
217  qDeleteAll (list_lines_);
218  list_lines_.clear();
219  qDeleteAll (list_rectangles_);
220  list_rectangles_.clear();
221 
222  qreal sum = 0;
223  for (int i = 0; i < 7; i++ )
224  sum += colWidths[i];
225  if ( sum < 0.99 || sum > 1.01 ) {
226  qDebug() << "Invalid input: Column widths do not sum to 1";
227  return;
228  }
229 
230  qreal tablesSpacing = rect.height() * 0.02;
231  qreal tableWidth = (rect.width() - tablesSpacing*(tables+1) ) / tables;
232  qreal rowHeight = (rect.height() - 2*tablesSpacing) / rows;
233  int cols = 7;//colWidths.size();
234 
235  qreal x0 = tablesSpacing + rect.topLeft().x();
236  qreal y0 = tablesSpacing + rect.topLeft().y();
237 
238  for (int i = 0; i < tables; ++i) {
239  QRectF *tableRect = new QRectF(x0, y0, tableWidth, rect.height() - 2*tablesSpacing);
240  qp->drawRect(*tableRect);
241  list_rectangles_.push_back(tableRect);
242  for (int j = 1; j < rows; ++j) {
243  QLineF *line = new QLineF(x0, y0 + j*rowHeight, x0 + tableWidth,y0 + j*rowHeight);
244  qp->drawLine(*line);
245  list_lines_.push_back(line);
246  }
247  for (int j = 0; j < cols-1; ++j) {
248  QLineF *line = new QLineF(x0 + colWidths[j]*tableWidth, y0, x0 + colWidths[j]*tableWidth,y0 + rows*rowHeight);
249  qp->drawLine(*line);
250  list_lines_.push_back(line);
251  x0 += colWidths[j]*tableWidth;
252  }
253  x0 += colWidths[cols-1]*tableWidth + tablesSpacing;
254  }
255 }
256 
263 void DiagramFolioList::fillHeader(QPainter *qp, const QRectF &row_RectF) {
264  QString authorTranslatable(QObject::tr("Auteur"));
265  QString titleTranslatable(QObject::tr("Titre"));
266  QString folioTranslatable(QObject::tr("Folio"));
267  QString plantTranslatable(QObject::tr("Installation"));
268  QString locTranslatable(QObject::tr("Localisation"));
269  QString indexrevTranslatable(QObject::tr("Rev"));
270  QString dateTranslatable(QObject::tr("Date"));
271 
272  qp->save();
273  qp->setFont(QETApp::diagramTextsFont(13));
274  fillRow(qp, row_RectF, authorTranslatable, titleTranslatable, folioTranslatable, plantTranslatable, locTranslatable, indexrevTranslatable, dateTranslatable);
275  qp->restore();
276 }
void fillRow(QPainter *, const QRectF &, const QString &, const QString &, const QString &, const QString &, const QString &, const QString &, const QString &)
DiagramFolioList::fillRow Add new row and fill it with the given information.
QString author() const
void drawBackground(QPainter *, const QRectF &) override
DiagramFolioList::drawBackground Draw background, and call method to draw the folio list (grid) ...
int folioIndex() const
Definition: diagram.cpp:1738
DiagramFolioList(QETProject *project)
DiagramFolioList::DiagramFolioList Constructor.
static QFont foliolistTextsFont(qreal=-1.0)
QETApp::foliolistTextsFont the font for to use in summary pages.
Definition: qetapp.cpp:982
QString finalfolio() const
QString indexrev() const
qreal rowsHeaderWidth() const
void draw(QPainter *painter)
BorderTitleBlock::draw Draw the border and the titleblock.
QString locmach() const
QString title() const
Definition: diagram.cpp:1473
QIcon tr
Definition: qeticons.cpp:204
~DiagramFolioList() override
DiagramFolioList::~DiagramFolioList Destructor.
qreal columnsHeaderHeight() const
QString plant() const
qreal columnsTotalWidth() const
static QColor background_color
background color of diagram
Definition: diagram.h:91
void buildGrid(QPainter *, const QRectF &, int, int, qreal[])
QList< QLineF * > list_lines_
qreal rowsTotalHeight() const
void fillHeader(QPainter *, const QRectF &)
DiagramFolioList::fillHeader Fill the header with bigger font.
static QFont diagramTextsFont(qreal=-1.0)
QETApp::diagramTextsFont The font to use By default the font is "sans Serif" and size 9...
Definition: qetapp.cpp:910
QDate date() const
BorderTitleBlock border_and_titleblock
Diagram dimensions and title block.
Definition: diagram.h:74
QETProject * project() const
Definition: diagram.cpp:1716
QList< QRectF * > list_rectangles_
static qreal colWidths[7]