Move terminal strip drawer class in is own file

This commit is contained in:
joshua
2022-12-02 19:35:17 +01:00
parent d23a5bbdc7
commit 1f99a40f1b
5 changed files with 461 additions and 189 deletions

View File

@@ -0,0 +1,226 @@
/*
Copyright 2006-2022 The QElectroTech Team
This file is part of QElectroTech.
QElectroTech is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
QElectroTech is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
*/
#include "terminalstripdrawer.h"
#include <QPainter>
#include "../physicalterminal.h"
#include "../realterminal.h"
#include "../terminalstrip.h"
#include "../terminalstripbridge.h"
/**
* @brief TerminalStripDrawer::TerminalStripDrawer
* @param strip
* @param pattern
*/
TerminalStripDrawer::TerminalStripDrawer(QPointer<TerminalStrip> strip) :
m_strip(strip)
{}
/**
* @brief TerminalStripDrawer::paint
* @param painter
*/
void TerminalStripDrawer::paint(QPainter *painter)
{
if (m_strip)
{
//To draw text, QPainter need a Qrect. Instead of create an instance
//for each text, we re-use the same instance of QRect.
QRect text_rect;
painter->save();
auto pen_{painter->pen()};
pen_.setColor(Qt::black);
pen_.setWidth(1);
auto brush_ = painter->brush();
brush_.setColor(Qt::white);
painter->setPen(pen_);
painter->setBrush(brush_);
//Draw header
painter->drawRect(m_pattern.m_header_rect);
//Draw the header text
painter->save();
if (m_pattern.m_header_text_orientation == Qt::Horizontal)
{
text_rect.setRect(0,m_pattern.m_header_rect.y(),m_pattern.m_header_rect.width(),m_pattern.m_header_rect.height());
}
else
{
painter->translate(m_pattern.m_header_rect.bottomLeft());
painter->rotate(270);
text_rect.setRect(0,0,m_pattern.m_header_rect.height(),m_pattern.m_header_rect.width());
}
const auto text_{m_strip->installation() + " " + m_strip->location() + " " + m_strip->name()};
painter->drawText(text_rect, text_, m_pattern.headerTextOption());
painter->restore();
//Move painter pos to next drawing
painter->translate(m_pattern.m_header_rect.width(),0);
int x_offset{m_pattern.m_header_rect.width()};
//Draw spacer
painter->drawRect(m_pattern.m_spacer_rect);
//Move painter pos to next drawing
painter->translate(m_pattern.m_spacer_rect.width(),0);
x_offset += m_pattern.m_spacer_rect.width();
//Draw terminals
const auto terminals_text_rect{m_pattern.m_terminals_text_rect};
const auto terminals_text_orientation{m_pattern.m_terminals_text_orientation};
const auto terminals_text_option{m_pattern.terminalsTextOption()};
QRect terminal_rect;
QHash<QUuid, QVector<QPointF>> bridges_anchor_points;
//Loop over physical terminals
for (const auto &physical_t : m_strip->physicalTerminal())
{
//Get the good offset according to how many level have the current physical terminal
const QVector<QSharedPointer<RealTerminal>> real_terminal{physical_t->realTerminals()};
const auto real_t_count{real_terminal.size()};
const auto offset_{4 - real_t_count};
//Loop over real terminals
for (auto i=0 ; i<real_t_count ; ++i)
{
const auto index_ = offset_ + i;
if (index_ >= 4) {
break;
}
terminal_rect = m_pattern.m_terminal_rect[index_];
//Draw terminal rect
painter->drawRect(terminal_rect);
//Draw text
painter->save();
if (terminals_text_orientation[index_] == Qt::Horizontal)
{
text_rect = terminals_text_rect[index_];
}
else
{
const auto rect_{terminals_text_rect[index_]};
painter->translate(rect_.bottomLeft());
painter->rotate(270);
text_rect.setRect(0, 0, rect_.height(), rect_.width());
}
const auto shared_real_terminal{real_terminal[i]};
painter->drawText(text_rect,
shared_real_terminal ? shared_real_terminal->label() : QLatin1String(),
terminals_text_option[index_]);
painter->restore();
//Add bridge anchor
if (shared_real_terminal->isBridged())
{
painter->save();
if (const auto bridge_ = shared_real_terminal->bridge())
{
const auto anchor_center{m_pattern.m_bridge_point_d/2};
painter->setBrush(Qt::SolidPattern);
painter->drawEllipse(QPointF{terminal_rect.width()/2, m_pattern.m_bridge_point_y_offset[index_]},
anchor_center,
anchor_center);
auto anchor_points{bridges_anchor_points.value(bridge_->uuid())};
anchor_points.append(QPointF{x_offset + terminal_rect.width()/2,
m_pattern.m_bridge_point_y_offset[index_]});
bridges_anchor_points.insert(bridge_->uuid(), anchor_points);
}
painter->restore();
}
//Move painter pos to next drawing
painter->translate(terminal_rect.width(),0);
x_offset += terminal_rect.width();
}
}
painter->restore();
//Draw the bridges
for (const auto &points_ : qAsConst(bridges_anchor_points))
{
painter->save();
auto pen_{painter->pen()};
pen_.setWidth(2);
painter->setPen(pen_);
painter->drawPolyline(QPolygonF{points_});
painter->restore();
}
}
}
QRectF TerminalStripDrawer::boundingRect() const
{
return QRect{0, 0, width(), height()};;
}
int TerminalStripDrawer::height() const
{
auto height_{m_pattern.m_header_rect.y() + m_pattern.m_header_rect.height()};
height_ = std::max(height_, m_pattern.m_spacer_rect.y() + m_pattern.m_spacer_rect.height());
for (const auto &rect : m_pattern.m_terminal_rect) {
height_ = std::max(height_, rect.y() + rect.height());
}
return height_;
}
int TerminalStripDrawer::width() const
{
int width_{m_pattern.m_header_rect.width() + m_pattern.m_spacer_rect.width()};
if (m_strip)
{
//Loop over physical terminals
for (const auto &physical_t : m_strip->physicalTerminal())
{
//Get the good offset according to how many level have the current physical terminal
const QVector<QSharedPointer<RealTerminal>> real_terminal{physical_t->realTerminals()};
const auto real_t_count{real_terminal.size()};
const auto offset_{4 - real_t_count};
//Loop over real terminals
for (auto i=0 ; i<real_t_count ; ++i)
{
const auto index_ = offset_ + i;
if (index_ >= 4) {
break;
}
width_ += m_pattern.m_terminal_rect[index_].width();
}
}
}
return width_;
}

View File

@@ -0,0 +1,45 @@
/*
Copyright 2006-2022 The QElectroTech Team
This file is part of QElectroTech.
QElectroTech is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
QElectroTech is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef TERMINALSTRIPDRAWER_H
#define TERMINALSTRIPDRAWER_H
#include <QPointer>
#include "terminalstriplayoutpattern.h"
class QPainter;
class TerminalStrip;
class TerminalStripDrawer
{
public:
TerminalStripDrawer(QPointer<TerminalStrip> strip);
void paint(QPainter *painter);
QRectF boundingRect() const;
private:
int height() const;
int width() const;
private:
QPointer<TerminalStrip> m_strip;
TerminalStripLayoutPattern m_pattern;
};
#endif // TERMINALSTRIPDRAWER_H

View File

@@ -20,7 +20,7 @@
#include <QGraphicsObject> #include <QGraphicsObject>
#include "terminalstriplayoutpattern.h" #include "terminalstripdrawer.h"
#include "../../qetgraphicsitem/qetgraphicsitem.h" #include "../../qetgraphicsitem/qetgraphicsitem.h"
class TerminalStrip; class TerminalStrip;

View File

@@ -16,215 +16,216 @@
along with QElectroTech. If not, see <http://www.gnu.org/licenses/>. along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "terminalstriplayoutpattern.h" #include "terminalstriplayoutpattern.h"
#include <QDebug>
#include "../physicalterminal.h" //#include "../physicalterminal.h"
#include "../realterminal.h" //#include "../realterminal.h"
#include "../terminalstrip.h" //#include "../terminalstrip.h"
#include "../terminalstripbridge.h" //#include "../terminalstripbridge.h"
#include <QPainter> //#include <QPainter>
/** ///**
* @brief TerminalStripDrawer::TerminalStripDrawer // * @brief TerminalStripDrawer::TerminalStripDrawer
* @param strip // * @param strip
* @param pattern // * @param pattern
*/ // */
TerminalStripDrawer::TerminalStripDrawer(QPointer<TerminalStrip> strip) : //TerminalStripDrawer::TerminalStripDrawer(QPointer<TerminalStrip> strip) :
m_strip(strip) // m_strip(strip)
{} //{}
/** ///**
* @brief TerminalStripDrawer::paint // * @brief TerminalStripDrawer::paint
* @param painter // * @param painter
*/ // */
void TerminalStripDrawer::paint(QPainter *painter) //void TerminalStripDrawer::paint(QPainter *painter)
{ //{
if (m_strip) // if (m_strip)
{ // {
//To draw text, QPainter need a Qrect. Instead of create an instance // //To draw text, QPainter need a Qrect. Instead of create an instance
//for each text, we re-use the same instance of QRect. // //for each text, we re-use the same instance of QRect.
QRect text_rect; // QRect text_rect;
painter->save(); // painter->save();
auto pen_{painter->pen()}; // auto pen_{painter->pen()};
pen_.setColor(Qt::black); // pen_.setColor(Qt::black);
pen_.setWidth(1); // pen_.setWidth(1);
auto brush_ = painter->brush(); // auto brush_ = painter->brush();
brush_.setColor(Qt::white); // brush_.setColor(Qt::white);
painter->setPen(pen_); // painter->setPen(pen_);
painter->setBrush(brush_); // painter->setBrush(brush_);
//Draw header // //Draw header
painter->drawRect(m_pattern.m_header_rect); // painter->drawRect(m_pattern.m_header_rect);
//Draw the header text // //Draw the header text
painter->save(); // painter->save();
if (m_pattern.m_header_text_orientation == Qt::Horizontal) // if (m_pattern.m_header_text_orientation == Qt::Horizontal)
{ // {
text_rect.setRect(0,m_pattern.m_header_rect.y(),m_pattern.m_header_rect.width(),m_pattern.m_header_rect.height()); // text_rect.setRect(0,m_pattern.m_header_rect.y(),m_pattern.m_header_rect.width(),m_pattern.m_header_rect.height());
} // }
else // else
{ // {
painter->translate(m_pattern.m_header_rect.bottomLeft()); // painter->translate(m_pattern.m_header_rect.bottomLeft());
painter->rotate(270); // painter->rotate(270);
text_rect.setRect(0,0,m_pattern.m_header_rect.height(),m_pattern.m_header_rect.width()); // text_rect.setRect(0,0,m_pattern.m_header_rect.height(),m_pattern.m_header_rect.width());
} // }
const auto text_{m_strip->installation() + " " + m_strip->location() + " " + m_strip->name()}; // const auto text_{m_strip->installation() + " " + m_strip->location() + " " + m_strip->name()};
painter->drawText(text_rect, text_, m_pattern.headerTextOption()); // painter->drawText(text_rect, text_, m_pattern.headerTextOption());
painter->restore(); // painter->restore();
//Move painter pos to next drawing // //Move painter pos to next drawing
painter->translate(m_pattern.m_header_rect.width(),0); // painter->translate(m_pattern.m_header_rect.width(),0);
int x_offset{m_pattern.m_header_rect.width()}; // int x_offset{m_pattern.m_header_rect.width()};
//Draw spacer // //Draw spacer
painter->drawRect(m_pattern.m_spacer_rect); // painter->drawRect(m_pattern.m_spacer_rect);
//Move painter pos to next drawing // //Move painter pos to next drawing
painter->translate(m_pattern.m_spacer_rect.width(),0); // painter->translate(m_pattern.m_spacer_rect.width(),0);
x_offset += m_pattern.m_spacer_rect.width(); // x_offset += m_pattern.m_spacer_rect.width();
//Draw terminals // //Draw terminals
const auto terminals_text_rect{m_pattern.m_terminals_text_rect}; // const auto terminals_text_rect{m_pattern.m_terminals_text_rect};
const auto terminals_text_orientation{m_pattern.m_terminals_text_orientation}; // const auto terminals_text_orientation{m_pattern.m_terminals_text_orientation};
const auto terminals_text_option{m_pattern.terminalsTextOption()}; // const auto terminals_text_option{m_pattern.terminalsTextOption()};
QRect terminal_rect; // QRect terminal_rect;
QHash<QUuid, QVector<QPointF>> bridges_anchor_points; // QHash<QUuid, QVector<QPointF>> bridges_anchor_points;
//Loop over physical terminals // //Loop over physical terminals
for (const auto &physical_t : m_strip->physicalTerminal()) // for (const auto &physical_t : m_strip->physicalTerminal())
{ // {
//Get the good offset according to how many level have the current physical terminal // //Get the good offset according to how many level have the current physical terminal
const QVector<QSharedPointer<RealTerminal>> real_terminal{physical_t->realTerminals()}; // const QVector<QSharedPointer<RealTerminal>> real_terminal{physical_t->realTerminals()};
const auto real_t_count{real_terminal.size()}; // const auto real_t_count{real_terminal.size()};
const auto offset_{4 - real_t_count}; // const auto offset_{4 - real_t_count};
//Loop over real terminals // //Loop over real terminals
for (auto i=0 ; i<real_t_count ; ++i) // for (auto i=0 ; i<real_t_count ; ++i)
{ // {
const auto index_ = offset_ + i; // const auto index_ = offset_ + i;
if (index_ >= 4) { // if (index_ >= 4) {
break; // break;
} // }
terminal_rect = m_pattern.m_terminal_rect[index_]; // terminal_rect = m_pattern.m_terminal_rect[index_];
//Draw terminal rect // //Draw terminal rect
painter->drawRect(terminal_rect); // painter->drawRect(terminal_rect);
//Draw text // //Draw text
painter->save(); // painter->save();
if (terminals_text_orientation[index_] == Qt::Horizontal) // if (terminals_text_orientation[index_] == Qt::Horizontal)
{ // {
text_rect = terminals_text_rect[index_]; // text_rect = terminals_text_rect[index_];
} // }
else // else
{ // {
const auto rect_{terminals_text_rect[index_]}; // const auto rect_{terminals_text_rect[index_]};
painter->translate(rect_.bottomLeft()); // painter->translate(rect_.bottomLeft());
painter->rotate(270); // painter->rotate(270);
text_rect.setRect(0, 0, rect_.height(), rect_.width()); // text_rect.setRect(0, 0, rect_.height(), rect_.width());
} // }
const auto shared_real_terminal{real_terminal[i]}; // const auto shared_real_terminal{real_terminal[i]};
painter->drawText(text_rect, // painter->drawText(text_rect,
shared_real_terminal ? shared_real_terminal->label() : QLatin1String(), // shared_real_terminal ? shared_real_terminal->label() : QLatin1String(),
terminals_text_option[index_]); // terminals_text_option[index_]);
painter->restore(); // painter->restore();
//Add bridge anchor // //Add bridge anchor
if (shared_real_terminal->isBridged()) // if (shared_real_terminal->isBridged())
{ // {
painter->save(); // painter->save();
if (const auto bridge_ = shared_real_terminal->bridge()) // if (const auto bridge_ = shared_real_terminal->bridge())
{ // {
const auto anchor_center{m_pattern.m_bridge_point_d/2}; // const auto anchor_center{m_pattern.m_bridge_point_d/2};
painter->setBrush(Qt::SolidPattern); // painter->setBrush(Qt::SolidPattern);
painter->drawEllipse(QPointF{terminal_rect.width()/2, m_pattern.m_bridge_point_y_offset[index_]}, // painter->drawEllipse(QPointF{terminal_rect.width()/2, m_pattern.m_bridge_point_y_offset[index_]},
anchor_center, // anchor_center,
anchor_center); // anchor_center);
auto anchor_points{bridges_anchor_points.value(bridge_->uuid())}; // auto anchor_points{bridges_anchor_points.value(bridge_->uuid())};
anchor_points.append(QPointF{x_offset + terminal_rect.width()/2, // anchor_points.append(QPointF{x_offset + terminal_rect.width()/2,
m_pattern.m_bridge_point_y_offset[index_]}); // m_pattern.m_bridge_point_y_offset[index_]});
bridges_anchor_points.insert(bridge_->uuid(), anchor_points); // bridges_anchor_points.insert(bridge_->uuid(), anchor_points);
} // }
painter->restore(); // painter->restore();
} // }
//Move painter pos to next drawing // //Move painter pos to next drawing
painter->translate(terminal_rect.width(),0); // painter->translate(terminal_rect.width(),0);
x_offset += terminal_rect.width(); // x_offset += terminal_rect.width();
} // }
} // }
painter->restore(); // painter->restore();
//Draw the bridges // //Draw the bridges
for (const auto &points_ : qAsConst(bridges_anchor_points)) // for (const auto &points_ : qAsConst(bridges_anchor_points))
{ // {
painter->save(); // painter->save();
auto pen_{painter->pen()}; // auto pen_{painter->pen()};
pen_.setWidth(2); // pen_.setWidth(2);
painter->setPen(pen_); // painter->setPen(pen_);
painter->drawPolyline(QPolygonF{points_}); // painter->drawPolyline(QPolygonF{points_});
painter->restore(); // painter->restore();
} // }
} // }
} //}
QRectF TerminalStripDrawer::boundingRect() const //QRectF TerminalStripDrawer::boundingRect() const
{ //{
return QRect{0, 0, width(), height()};; // return QRect{0, 0, width(), height()};;
} //}
int TerminalStripDrawer::height() const //int TerminalStripDrawer::height() const
{ //{
auto height_{m_pattern.m_header_rect.y() + m_pattern.m_header_rect.height()}; // auto height_{m_pattern.m_header_rect.y() + m_pattern.m_header_rect.height()};
height_ = std::max(height_, m_pattern.m_spacer_rect.y() + m_pattern.m_spacer_rect.height()); // height_ = std::max(height_, m_pattern.m_spacer_rect.y() + m_pattern.m_spacer_rect.height());
for (const auto &rect : m_pattern.m_terminal_rect) { // for (const auto &rect : m_pattern.m_terminal_rect) {
height_ = std::max(height_, rect.y() + rect.height()); // height_ = std::max(height_, rect.y() + rect.height());
} // }
return height_; // return height_;
} //}
int TerminalStripDrawer::width() const //int TerminalStripDrawer::width() const
{ //{
int width_{m_pattern.m_header_rect.width() + m_pattern.m_spacer_rect.width()}; // int width_{m_pattern.m_header_rect.width() + m_pattern.m_spacer_rect.width()};
if (m_strip) // if (m_strip)
{ // {
//Loop over physical terminals // //Loop over physical terminals
for (const auto &physical_t : m_strip->physicalTerminal()) // for (const auto &physical_t : m_strip->physicalTerminal())
{ // {
//Get the good offset according to how many level have the current physical terminal // //Get the good offset according to how many level have the current physical terminal
const QVector<QSharedPointer<RealTerminal>> real_terminal{physical_t->realTerminals()}; // const QVector<QSharedPointer<RealTerminal>> real_terminal{physical_t->realTerminals()};
const auto real_t_count{real_terminal.size()}; // const auto real_t_count{real_terminal.size()};
const auto offset_{4 - real_t_count}; // const auto offset_{4 - real_t_count};
//Loop over real terminals // //Loop over real terminals
for (auto i=0 ; i<real_t_count ; ++i) // for (auto i=0 ; i<real_t_count ; ++i)
{ // {
const auto index_ = offset_ + i; // const auto index_ = offset_ + i;
if (index_ >= 4) { // if (index_ >= 4) {
break; // break;
} // }
width_ += m_pattern.m_terminal_rect[index_].width(); // width_ += m_pattern.m_terminal_rect[index_].width();
} // }
} // }
} // }
return width_; // return width_;
} //}
TerminalStripLayoutPattern::TerminalStripLayoutPattern() TerminalStripLayoutPattern::TerminalStripLayoutPattern()
{ {

View File

@@ -18,14 +18,14 @@
#ifndef TERMINALSTRIPLAYOUTPATTERN_H #ifndef TERMINALSTRIPLAYOUTPATTERN_H
#define TERMINALSTRIPLAYOUTPATTERN_H #define TERMINALSTRIPLAYOUTPATTERN_H
#include <QPointer> //#include <QPointer>
#include <QSize> #include <QSize>
#include <QTextOption> #include <QTextOption>
#include <QVector> #include <QVector>
#include <QRect> #include <QRect>
class QPainter; //class QPainter;
class TerminalStrip; //class TerminalStrip;
/** /**
* @brief The TerminalStripLayoutPattern class * @brief The TerminalStripLayoutPattern class
@@ -110,21 +110,21 @@ class TerminalStripLayoutPattern
}; };
}; };
class TerminalStripDrawer //class TerminalStripDrawer
{ //{
public: // public:
TerminalStripDrawer(QPointer<TerminalStrip> strip); // TerminalStripDrawer(QPointer<TerminalStrip> strip);
void paint(QPainter *painter); // void paint(QPainter *painter);
QRectF boundingRect() const; // QRectF boundingRect() const;
private: // private:
int height() const; // int height() const;
int width() const; // int width() const;
private: // private:
QPointer<TerminalStrip> m_strip; // QPointer<TerminalStrip> m_strip;
TerminalStripLayoutPattern m_pattern; // TerminalStripLayoutPattern m_pattern;
}; //};
#endif // TERMINALSTRIPLAYOUTPATTERN_H #endif // TERMINALSTRIPLAYOUTPATTERN_H