Revert "Merge branch 'XMLPropertiesNew'"

**Break a lot of thing.**

This reverts commit 1db1800572, reversing
changes made to 4c563821e8.
This commit is contained in:
joshua
2021-03-11 19:52:50 +01:00
parent 83b69253dc
commit 11b8ef927b
88 changed files with 1587 additions and 2778 deletions

View File

@@ -53,7 +53,7 @@ class QetGraphicsHandlerItem : public QGraphicsItem
QRectF m_handler_rect, QRectF m_handler_rect,
m_br; m_br;
qreal m_size; qreal m_size;
QColor m_color{Qt::black}; QColor m_color;
QPen m_pen; QPen m_pen;
public: public:

View File

@@ -16,7 +16,6 @@
along with QElectroTech. If not, see <http://www.gnu.org/licenses/>. along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "borderproperties.h" #include "borderproperties.h"
#include "qetxml.h"
/** /**
@brief BorderProperties::BorderProperties @brief BorderProperties::BorderProperties
@@ -26,14 +25,22 @@
Initializes a BorderProperties object Initializes a BorderProperties object
with the following default properties: with the following default properties:
- 17 columns of 60.0 px wide by 20.0px high - 17 columns of 60.0 px wide by 20.0px high
- 8 lines of 80.0 px high by 20.0px wide - 8 lines of 80.0 px high by 20.0px wide
\~French Initialise un objet BorderProperties avec les proprietes par \~French Initialise un objet BorderProperties avec les proprietes par
defaut suivantes : defaut suivantes :
- 17 colonnes affichees de 60.0 px de large pour 20.0px de haut - 17 colonnes affichees de 60.0 px de large pour 20.0px de haut
- 8 lignes affichees de 80.0 px de haut pour 20.0px de large - 8 lignes affichees de 80.0 px de haut pour 20.0px de large
*/ */
BorderProperties::BorderProperties(): PropertiesInterface("border") BorderProperties::BorderProperties() :
columns_count(17),
columns_width(60.0),
columns_header_height(20.0),
display_columns(true),
rows_count(8),
rows_height(80.0),
rows_header_width(20.0),
display_rows(true)
{ {
} }
@@ -81,7 +88,7 @@ bool BorderProperties::operator!=(const BorderProperties &bp) {
} }
/** /**
@brief BorderProperties::toXmlPriv @brief BorderProperties::toXml
Exports dimensions as XML attributes added to element e. Exports dimensions as XML attributes added to element e.
\~French Exporte les dimensions sous formes d'attributs XML ajoutes a l'element e. \~French Exporte les dimensions sous formes d'attributs XML ajoutes a l'element e.
@@ -89,17 +96,18 @@ bool BorderProperties::operator!=(const BorderProperties &bp) {
XML element to which attributes will be added XML element to which attributes will be added
\~French Element XML auquel seront ajoutes des attributs \~French Element XML auquel seront ajoutes des attributs
*/ */
void BorderProperties::toXmlPriv(QDomElement& e) const { void BorderProperties::toXml(QDomElement &e) const
e.setAttribute("cols", columns_count); {
e.setAttribute("colsize", QString("%1").arg(columns_width)); e.setAttribute("cols", columns_count);
e.setAttribute("rows", rows_count); e.setAttribute("colsize", QString("%1").arg(columns_width));
e.setAttribute("rowsize", QString("%1").arg(rows_height)); e.setAttribute("rows", rows_count);
e.setAttribute("displaycols", display_columns ? "true" : "false"); e.setAttribute("rowsize", QString("%1").arg(rows_height));
e.setAttribute("displayrows", display_rows ? "true" : "false"); e.setAttribute("displaycols", display_columns ? "true" : "false");
e.setAttribute("displayrows", display_rows ? "true" : "false");
} }
/*!RETURNS True /**
@brief BorderProperties::fromXmlPriv @brief BorderProperties::fromXml
Import dimensions from XML attributes of element e Import dimensions from XML attributes of element e
\~French Importe les dimensions a partir des attributs XML de l'element e \~French Importe les dimensions a partir des attributs XML de l'element e
@@ -107,29 +115,13 @@ void BorderProperties::toXmlPriv(QDomElement& e) const {
XML element whose attributes will be read XML element whose attributes will be read
\~French Element XML dont les attributs seront lus \~French Element XML dont les attributs seront lus
*/ */
bool BorderProperties::fromXmlPriv(const QDomElement &e) { void BorderProperties::fromXml(QDomElement &e) {
if (e.hasAttribute("cols")) columns_count = e.attribute("cols").toInt();
if (QETXML::propertyInteger(e, "cols", &columns_count) == QETXML::PropertyFlags::NoValidConversion || if (e.hasAttribute("colsize")) columns_width = e.attribute("colsize").toInt();
QETXML::propertyDouble(e, "colsize", &columns_width) == QETXML::PropertyFlags::NoValidConversion || if (e.hasAttribute("rows")) rows_count = e.attribute("rows").toInt();
QETXML::propertyInteger(e, "rows", &rows_count) == QETXML::PropertyFlags::NoValidConversion || if (e.hasAttribute("rowsize")) rows_height = e.attribute("rowsize").toInt();
QETXML::propertyDouble(e, "rowsize", &rows_height) == QETXML::PropertyFlags::NoValidConversion || if (e.hasAttribute("displaycols")) display_columns = e.attribute("displaycols") == "true";
QETXML::propertyBool(e, "displaycols", &display_columns) == QETXML::PropertyFlags::NoValidConversion || if (e.hasAttribute("displayrows")) display_rows = e.attribute("displayrows") == "true";
QETXML::propertyBool(e, "displayrows", &display_rows) == QETXML::PropertyFlags::NoValidConversion)
return false;
return true;
}
bool BorderProperties::valideXml(QDomElement& e) {
if (QETXML::propertyInteger(e, "cols") == QETXML::PropertyFlags::Success ||
QETXML::propertyDouble(e, "colsize") == QETXML::PropertyFlags::Success ||
QETXML::propertyInteger(e, "rows") == QETXML::PropertyFlags::Success ||
QETXML::propertyDouble(e, "rowsize") == QETXML::PropertyFlags::Success ||
QETXML::propertyBool(e, "displaycols") == QETXML::PropertyFlags::Success ||
QETXML::propertyBool(e, "displayrows") == QETXML::PropertyFlags::Success)
return true;
return false;
} }
/** /**
@@ -146,11 +138,11 @@ bool BorderProperties::valideXml(QDomElement& e) {
*/ */
void BorderProperties::toSettings(QSettings &settings, const QString &prefix) const void BorderProperties::toSettings(QSettings &settings, const QString &prefix) const
{ {
settings.setValue(prefix + "cols", columns_count); settings.setValue(prefix + "cols", columns_count);
settings.setValue(prefix + "colsize", columns_width); settings.setValue(prefix + "colsize", columns_width);
settings.setValue(prefix + "displaycols", display_columns); settings.setValue(prefix + "displaycols", display_columns);
settings.setValue(prefix + "rows", rows_count); settings.setValue(prefix + "rows", rows_count);
settings.setValue(prefix + "rowsize", rows_height); settings.setValue(prefix + "rowsize", rows_height);
settings.setValue(prefix + "displayrows", display_rows); settings.setValue(prefix + "displayrows", display_rows);
} }
@@ -164,13 +156,13 @@ void BorderProperties::toSettings(QSettings &settings, const QString &prefix) co
\~French prefixe a ajouter devant les noms des parametres \~French prefixe a ajouter devant les noms des parametres
*/ */
void BorderProperties::fromSettings(QSettings &settings, const QString &prefix) { void BorderProperties::fromSettings(QSettings &settings, const QString &prefix) {
columns_count = settings.value(prefix + "cols", columns_count).toInt(); columns_count = settings.value(prefix + "cols", columns_count).toInt();
columns_width = qRound(settings.value(prefix + "colsize", columns_width).toDouble()); columns_width = qRound(settings.value(prefix + "colsize", columns_width).toDouble());
display_columns = settings.value(prefix + "displaycols", display_columns).toBool(); display_columns = settings.value(prefix + "displaycols", display_columns).toBool();
rows_count = settings.value(prefix + "rows", rows_count).toInt(); rows_count = settings.value(prefix + "rows", rows_count).toInt();
rows_height = qRound(settings.value(prefix + "rowsize", rows_height).toDouble()); rows_height = qRound(settings.value(prefix + "rowsize", rows_height).toDouble());
display_rows = settings.value(prefix + "displayrows", display_rows).toBool(); display_rows = settings.value(prefix + "displayrows", display_rows).toBool();
} }
/** /**

View File

@@ -20,15 +20,13 @@
#include <QtCore> #include <QtCore>
#include <QtXml> #include <QtXml>
#include "properties/propertiesinterface.h"
/** /**
@brief The BorderProperties class @brief The BorderProperties class
This class is a container for dimensions and display properties of a This class is a container for dimensions and display properties of a
diagram. diagram.
@remark Attributes are public @remark Attributes are public
*/ */
class BorderProperties : public PropertiesInterface { class BorderProperties {
public: public:
// constructor, destructor, operators // constructor, destructor, operators
BorderProperties(); BorderProperties();
@@ -37,23 +35,22 @@ class BorderProperties : public PropertiesInterface {
bool operator==(const BorderProperties &); bool operator==(const BorderProperties &);
bool operator!=(const BorderProperties &); bool operator!=(const BorderProperties &);
void toXmlPriv(QDomElement&) const override; void toXml(QDomElement &) const;
bool fromXmlPriv(const QDomElement &) override; void fromXml(QDomElement &);
static bool valideXml(QDomElement& e); void toSettings(QSettings &, const QString & = QString()) const;
void toSettings(QSettings &, const QString & = QString()) const override; void fromSettings(QSettings &, const QString & = QString());
void fromSettings(QSettings &, const QString & = QString()) override;
static BorderProperties defaultProperties(); static BorderProperties defaultProperties();
// attributes // attributes
int columns_count{17}; ///< Columns count int columns_count; ///< Columns count
qreal columns_width{60.0}; ///< Columns width qreal columns_width; ///< Columns width
qreal columns_header_height{20.0}; ///< Column headers height qreal columns_header_height; ///< Column headers height
bool display_columns{true}; ///< Whether to display column headers bool display_columns; ///< Whether to display column headers
int rows_count{8}; ///< Rows count int rows_count; ///< Rows count
qreal rows_height{80.0}; ///< Rows height qreal rows_height; ///< Rows height
qreal rows_header_width{20.0}; ///< Row headers width qreal rows_header_width; ///< Row headers width
bool display_rows{true}; ///< Whether to display row headers bool display_rows; ///< Whether to display row headers
}; };
#endif #endif

View File

@@ -65,6 +65,8 @@ BorderTitleBlock::BorderTitleBlock(QObject *parent) :
// contenu par defaut du cartouche // contenu par defaut du cartouche
importTitleBlock(TitleBlockProperties()); importTitleBlock(TitleBlockProperties());
display_titleblock_ = true;
display_border_ = true;
setFolioData(1, 1); setFolioData(1, 1);
updateRectangles(); updateRectangles();
} }
@@ -85,14 +87,14 @@ QRectF BorderTitleBlock::titleBlockRect() const
{ {
if (m_edge == Qt::BottomEdge) if (m_edge == Qt::BottomEdge)
return QRectF(diagram_rect_.bottomLeft(), return QRectF(diagram_rect_.bottomLeft(),
QSize(diagram_rect_.width(), QSize(diagram_rect_.width(),
m_titleblock_template_renderer -> height() m_titleblock_template_renderer -> height()
)); ));
else else
return QRectF(diagram_rect_.topRight(), return QRectF(diagram_rect_.topRight(),
QSize(m_titleblock_template_renderer -> height(), QSize(m_titleblock_template_renderer -> height(),
diagram_rect_.height() diagram_rect_.height()
)); ));
} }
/** /**
@@ -123,9 +125,9 @@ QRectF BorderTitleBlock::titleBlockRectForQPainter() const
return titleBlockRect(); return titleBlockRect();
else else
return QRectF (diagram_rect_.bottomRight(), return QRectF (diagram_rect_.bottomRight(),
QSize(diagram_rect_.height(), QSize(diagram_rect_.height(),
m_titleblock_template_renderer -> height() m_titleblock_template_renderer -> height()
)); ));
} }
@@ -149,9 +151,9 @@ QRectF BorderTitleBlock::columnsRect() const
{ {
if (!display_columns_) return QRectF(); if (!display_columns_) return QRectF();
return QRectF (Diagram::margin, return QRectF (Diagram::margin,
Diagram::margin, Diagram::margin,
(columns_count_*columns_width_) + rows_header_width_, (columns_count_*columns_width_) + rows_header_width_,
columns_header_height_); columns_header_height_);
} }
/** /**
@@ -163,9 +165,9 @@ QRectF BorderTitleBlock::rowsRect() const
{ {
if (!display_rows_) return QRectF(); if (!display_rows_) return QRectF();
return QRectF (Diagram::margin, return QRectF (Diagram::margin,
Diagram::margin, Diagram::margin,
rows_header_width_, rows_header_width_,
(rows_count_*rows_height_) + columns_header_height_); (rows_count_*rows_height_) + columns_header_height_);
} }
/** /**
@@ -176,9 +178,9 @@ QRectF BorderTitleBlock::rowsRect() const
QRectF BorderTitleBlock::outsideBorderRect() const QRectF BorderTitleBlock::outsideBorderRect() const
{ {
return QRectF (Diagram::margin, return QRectF (Diagram::margin,
Diagram::margin, Diagram::margin,
(columns_width_*columns_count_) + rows_header_width_, (columns_width_*columns_count_) + rows_header_width_,
(rows_height_*rows_count_) + columns_header_height_); (rows_height_*rows_count_) + columns_header_height_);
} }
/** /**
@@ -205,8 +207,8 @@ QRectF BorderTitleBlock::insideBorderRect() const
Exports the title block current values to XML. Exports the title block current values to XML.
@param xml_elmt the XML element attributes will be added to @param xml_elmt the XML element attributes will be added to
*/ */
QDomElement BorderTitleBlock::titleBlockToXml(QDomDocument& doc) { void BorderTitleBlock::titleBlockToXml(QDomElement &xml_elmt) {
return exportTitleBlock().toXml(doc); exportTitleBlock().toXml(xml_elmt);
} }
/** /**
@@ -215,23 +217,9 @@ QDomElement BorderTitleBlock::titleBlockToXml(QDomDocument& doc) {
@param xml_elmt the XML element values will be read from @param xml_elmt the XML element values will be read from
*/ */
void BorderTitleBlock::titleBlockFromXml(const QDomElement &xml_elmt) { void BorderTitleBlock::titleBlockFromXml(const QDomElement &xml_elmt) {
TitleBlockProperties tbp;
TitleBlockProperties tbp; tbp.fromXml(xml_elmt);
QString tagname = tbp.tagName(); importTitleBlock(tbp);
QDomElement titleBlockProperties = xml_elmt.firstChildElement(tagname);
if (!titleBlockProperties.isNull())
{
tbp.fromXml(titleBlockProperties);
importTitleBlock(tbp);
}
else
{
// legacy
// Remove this part in a later step
tbp.fromXml(xml_elmt);
importTitleBlock(tbp);
}
} }
/** /**
@@ -240,12 +228,12 @@ void BorderTitleBlock::titleBlockFromXml(const QDomElement &xml_elmt) {
@param xml_elmt the XML element attributes will be added to @param xml_elmt the XML element attributes will be added to
*/ */
void BorderTitleBlock::borderToXml(QDomElement &xml_elmt) { void BorderTitleBlock::borderToXml(QDomElement &xml_elmt) {
xml_elmt.setAttribute("cols", columnsCount()); xml_elmt.setAttribute("cols", columnsCount());
xml_elmt.setAttribute("colsize", QString("%1").arg(columnsWidth())); xml_elmt.setAttribute("colsize", QString("%1").arg(columnsWidth()));
xml_elmt.setAttribute("displaycols", columnsAreDisplayed() ? "true" : "false"); xml_elmt.setAttribute("displaycols", columnsAreDisplayed() ? "true" : "false");
xml_elmt.setAttribute("rows", rowsCount()); xml_elmt.setAttribute("rows", rowsCount());
xml_elmt.setAttribute("rowsize", QString("%1").arg(rowsHeight())); xml_elmt.setAttribute("rowsize", QString("%1").arg(rowsHeight()));
xml_elmt.setAttribute("displayrows", rowsAreDisplayed() ? "true" : "false"); xml_elmt.setAttribute("displayrows", rowsAreDisplayed() ? "true" : "false");
// attribut datant de la version 0.1 - laisse pour retrocompatibilite // attribut datant de la version 0.1 - laisse pour retrocompatibilite
@@ -512,9 +500,9 @@ void BorderTitleBlock::updateRectangles()
{ {
QRectF previous_diagram = diagram_rect_; QRectF previous_diagram = diagram_rect_;
diagram_rect_ = QRectF(Diagram::margin, diagram_rect_ = QRectF(Diagram::margin,
Diagram::margin, Diagram::margin,
diagramWidth(), diagramWidth(),
diagramHeight()); diagramHeight());
if (diagram_rect_ != previous_diagram) if (diagram_rect_ != previous_diagram)
emit(borderChanged(previous_diagram, diagram_rect_)); emit(borderChanged(previous_diagram, diagram_rect_));
} }
@@ -566,14 +554,14 @@ void BorderTitleBlock::draw(QPainter *painter)
painter -> drawRect(numbered_rectangle); painter -> drawRect(numbered_rectangle);
if (settings.value("border-columns_0", true).toBool()){ if (settings.value("border-columns_0", true).toBool()){
painter -> drawText(numbered_rectangle, painter -> drawText(numbered_rectangle,
Qt::AlignVCenter Qt::AlignVCenter
| Qt::AlignCenter, | Qt::AlignCenter,
QString("%1").arg(i - 1)); QString("%1").arg(i - 1));
}else{ }else{
painter -> drawText(numbered_rectangle, painter -> drawText(numbered_rectangle,
Qt::AlignVCenter Qt::AlignVCenter
| Qt::AlignCenter, | Qt::AlignCenter,
QString("%1").arg(i)); QString("%1").arg(i));
} }
} }
} }
@@ -594,9 +582,9 @@ void BorderTitleBlock::draw(QPainter *painter)
); );
painter -> drawRect(lettered_rectangle); painter -> drawRect(lettered_rectangle);
painter -> drawText(lettered_rectangle, painter -> drawText(lettered_rectangle,
Qt::AlignVCenter Qt::AlignVCenter
| Qt::AlignCenter, | Qt::AlignCenter,
row_string); row_string);
row_string = incrementLetters(row_string); row_string = incrementLetters(row_string);
} }
} }
@@ -638,9 +626,9 @@ void BorderTitleBlock::drawDxf(
{ {
// Transform to DXF scale. // Transform to DXF scale.
columns_header_height_ *= Createdxf::yScale; columns_header_height_ *= Createdxf::yScale;
rows_height_ *= Createdxf::yScale; rows_height_ *= Createdxf::yScale;
rows_header_width_ *= Createdxf::xScale; rows_header_width_ *= Createdxf::xScale;
columns_width_ *= Createdxf::xScale; columns_width_ *= Createdxf::xScale;
// draw the empty box that appears as soon as there is a header // draw the empty box that appears as soon as there is a header
// dessine la case vide qui apparait des qu'il y a un entete // dessine la case vide qui apparait des qu'il y a un entete
@@ -669,11 +657,11 @@ void BorderTitleBlock::drawDxf(
display_columns_) { display_columns_) {
int offset = settings.value("border-columns_0", true).toBool() ? -1 : 0; int offset = settings.value("border-columns_0", true).toBool() ? -1 : 0;
for (int i = 1 ; i <= columns_count_ ; ++ i) { for (int i = 1 ; i <= columns_count_ ; ++ i) {
double xCoord = diagram_rect_.topLeft().x() * Createdxf::xScale + double xCoord = diagram_rect_.topLeft().x() * Createdxf::xScale +
(rows_header_width_ + ((i - 1) * (rows_header_width_ + ((i - 1) *
columns_width_)); columns_width_));
double yCoord = Createdxf::sheetHeight double yCoord = Createdxf::sheetHeight
- diagram_rect_.topLeft().y()*Createdxf::yScale - diagram_rect_.topLeft().y()*Createdxf::yScale
- columns_header_height_; - columns_header_height_;
double recWidth = columns_width_; double recWidth = columns_width_;
double recHeight = columns_header_height_; double recHeight = columns_header_height_;
@@ -702,8 +690,8 @@ void BorderTitleBlock::drawDxf(
for (int i = 1 ; i <= rows_count_ ; ++ i) { for (int i = 1 ; i <= rows_count_ ; ++ i) {
double xCoord = diagram_rect_.topLeft().x() double xCoord = diagram_rect_.topLeft().x()
* Createdxf::xScale; * Createdxf::xScale;
double yCoord = Createdxf::sheetHeight double yCoord = Createdxf::sheetHeight
- diagram_rect_.topLeft().y() - diagram_rect_.topLeft().y()
*Createdxf::yScale *Createdxf::yScale
- ( - (
columns_header_height_ columns_header_height_
@@ -735,17 +723,17 @@ void BorderTitleBlock::drawDxf(
//qp -> translate(titleblock_rect_.topLeft()); //qp -> translate(titleblock_rect_.topLeft());
QRectF rect = titleBlockRect(); QRectF rect = titleBlockRect();
m_titleblock_template_renderer -> renderDxf(rect, m_titleblock_template_renderer -> renderDxf(rect,
rect.width(), rect.width(),
file_path, file_path,
color); color);
//qp -> translate(-titleblock_rect_.topLeft()); //qp -> translate(-titleblock_rect_.topLeft());
} }
// Transform back to QET scale // Transform back to QET scale
columns_header_height_ /= Createdxf::yScale; columns_header_height_ /= Createdxf::yScale;
rows_height_ /= Createdxf::yScale; rows_height_ /= Createdxf::yScale;
rows_header_width_ /= Createdxf::xScale; rows_header_width_ /= Createdxf::xScale;
columns_width_ /= Createdxf::xScale; columns_width_ /= Createdxf::xScale;
} }
@@ -865,7 +853,7 @@ void BorderTitleBlock::setRowsHeaderWidth(const qreal &new_rhw) {
\~ @param height : \~ @param height :
*/ */
void BorderTitleBlock::setDiagramHeight(const qreal &height) { void BorderTitleBlock::setDiagramHeight(const qreal &height) {
// size of rows to use = rows_height // size of rows to use = rows_height
// taille des lignes a utiliser = rows_height // taille des lignes a utiliser = rows_height
setRowsCount(qRound(ceil(height / rows_height_))); setRowsCount(qRound(ceil(height / rows_height_)));
} }
@@ -883,7 +871,7 @@ DiagramPosition BorderTitleBlock::convertPosition(const QPointF &pos)
return (DiagramPosition("", 0)); return (DiagramPosition("", 0));
QPointF relative_pos = pos - insideBorderRect().topLeft(); QPointF relative_pos = pos - insideBorderRect().topLeft();
int row_number = int(ceil(relative_pos.x() / columnsWidth())); int row_number = int(ceil(relative_pos.x() / columnsWidth()));
int column_number = int(ceil(relative_pos.y() / rowsHeight())); int column_number = int(ceil(relative_pos.y() / rowsHeight()));
QString letter = "A"; QString letter = "A";
@@ -951,18 +939,18 @@ void BorderTitleBlock::updateDiagramContextForTitleBlock(
// ... overridden by the historical and/or dynamically generated fields // ... overridden by the historical and/or dynamically generated fields
QLocale var; QLocale var;
var.dateFormat(QLocale::ShortFormat); var.dateFormat(QLocale::ShortFormat);
context.addValue("author", btb_author_); context.addValue("author", btb_author_);
context.addValue( context.addValue(
"date", "date",
QLocale::system().toString(btb_date_, QLocale::ShortFormat)); QLocale::system().toString(btb_date_, QLocale::ShortFormat));
context.addValue("title", btb_title_); context.addValue("title", btb_title_);
context.addValue("filename", btb_filename_); context.addValue("filename", btb_filename_);
context.addValue("plant", btb_plant_); context.addValue("plant", btb_plant_);
context.addValue("locmach", btb_locmach_); context.addValue("locmach", btb_locmach_);
context.addValue("indexrev", btb_indexrev_); context.addValue("indexrev", btb_indexrev_);
context.addValue("version", btb_version_); context.addValue("version", btb_version_);
context.addValue("folio", btb_final_folio_); context.addValue("folio", btb_final_folio_);
context.addValue("folio-id", folio_index_); context.addValue("folio-id", folio_index_);
context.addValue("folio-total", folio_total_); context.addValue("folio-total", folio_total_);
context.addValue("auto_page_num", btb_auto_page_num_); context.addValue("auto_page_num", btb_auto_page_num_);
context.addValue("previous-folio-num", m_previous_folio_num); context.addValue("previous-folio-num", m_previous_folio_num);
@@ -1040,7 +1028,7 @@ void BorderTitleBlock::setFolioData(
btb_final_folio_.replace("%autonum", autonum); btb_final_folio_.replace("%autonum", autonum);
btb_folio_ = btb_final_folio_; btb_folio_ = btb_final_folio_;
} }
btb_final_folio_.replace("%id", QString::number(folio_index_)); btb_final_folio_.replace("%id", QString::number(folio_index_));
btb_final_folio_.replace("%total", QString::number(folio_total_)); btb_final_folio_.replace("%total", QString::number(folio_total_));
updateDiagramContextForTitleBlock(project_properties); updateDiagramContextForTitleBlock(project_properties);

View File

@@ -174,7 +174,7 @@ class BorderTitleBlock : public QObject
void setPreviousFolioNum(const QString &previous); void setPreviousFolioNum(const QString &previous);
void setNextFolioNum(const QString &next); void setNextFolioNum(const QString &next);
QDomElement titleBlockToXml(QDomDocument &doc); void titleBlockToXml(QDomElement &);
void titleBlockFromXml(const QDomElement &); void titleBlockFromXml(const QDomElement &);
void borderToXml(QDomElement &); void borderToXml(QDomElement &);
void borderFromXml(const QDomElement &); void borderFromXml(const QDomElement &);
@@ -249,34 +249,34 @@ class BorderTitleBlock : public QObject
// attributes // attributes
private: private:
// titleblock basic data // titleblock basic data
QString btb_author_; ///< titleblock author QString btb_author_; ///< titleblock author
QDate btb_date_; ///< titleblock date QDate btb_date_; ///< titleblock date
QString btb_title_; ///< titleblock title QString btb_title_; ///< titleblock title
QString btb_folio_; ///< titleblock folio QString btb_folio_; ///< titleblock folio
QString btb_plant_; ///< titleblock plant QString btb_plant_; ///< titleblock plant
QString btb_locmach_; ///< titleblock locmach QString btb_locmach_; ///< titleblock locmach
QString btb_indexrev_; ///< titleblock index rev QString btb_indexrev_; ///< titleblock index rev
QString btb_final_folio_; ///< titleblock final folio QString btb_final_folio_; ///< titleblock final folio
QString btb_auto_page_num_; ///< titleblock auto page num QString btb_auto_page_num_; ///< titleblock auto page num
int folio_index_; ///< titleblock index int folio_index_; ///< titleblock index
int folio_total_; ///< titleblock total int folio_total_; ///< titleblock total
QString btb_filename_; ///< titleblock filename QString btb_filename_; ///< titleblock filename
QString btb_version_; ///< titleblock version QString btb_version_; ///< titleblock version
/// titleblock additional fields /// titleblock additional fields
DiagramContext additional_fields_; DiagramContext additional_fields_;
Qt::Edge m_edge; ///< titleblock edge Qt::Edge m_edge; ///< titleblock edge
QString m_next_folio_num; ///< titleblock next folio num QString m_next_folio_num; ///< titleblock next folio num
QString m_previous_folio_num; ///< titleblock previous folio num QString m_previous_folio_num; ///< titleblock previous folio num
// border dimensions (rows and columns) // border dimensions (rows and columns)
// columns: number and dimensions // columns: number and dimensions
int columns_count_; ///< columns count int columns_count_; ///< columns count
qreal columns_width_; ///< columns width qreal columns_width_; ///< columns width
qreal columns_header_height_; ///< columns header height qreal columns_header_height_; ///< columns header height
// rows: number and dimensions // rows: number and dimensions
int rows_count_; ///< rows count int rows_count_; ///< rows count
qreal rows_height_; ///< rows height qreal rows_height_; ///< rows height
qreal rows_header_width_; ///< rows header width qreal rows_header_width_; ///< rows header width
// title block dimensions // title block dimensions
@@ -286,10 +286,10 @@ class BorderTitleBlock : public QObject
QRectF diagram_rect_; QRectF diagram_rect_;
// display options // display options
bool display_titleblock_{true}; bool display_titleblock_;
bool display_columns_; bool display_columns_;
bool display_rows_; bool display_rows_;
bool display_border_{true}; bool display_border_;
TitleBlockTemplateRenderer *m_titleblock_template_renderer; TitleBlockTemplateRenderer *m_titleblock_template_renderer;
}; };
#endif #endif

View File

@@ -20,16 +20,14 @@
#include <QMetaEnum> #include <QMetaEnum>
#include <QRegularExpression> #include <QRegularExpression>
#include <QtDebug> #include <QtDebug>
#include "qetxml.h"
namespace {
const QString conductorPropertiesXmlName = "conductorProperties";
}
/** /**
Constructeur par defaut Constructeur par defaut
*/ */
SingleLineProperties::SingleLineProperties(): PropertiesInterface("SingleLine") SingleLineProperties::SingleLineProperties() :
hasGround(true),
hasNeutral(true),
is_pen(false),
phases(1)
{ {
} }
@@ -125,9 +123,9 @@ void SingleLineProperties::draw(QPainter *painter,
@param size taille du segment @param size taille du segment
*/ */
void SingleLineProperties::drawGround(QPainter *painter, void SingleLineProperties::drawGround(QPainter *painter,
QET::ConductorSegmentType direction, QET::ConductorSegmentType direction,
QPointF center, QPointF center,
qreal size) { qreal size) {
painter -> save(); painter -> save();
// prepare le QPainter // prepare le QPainter
@@ -217,12 +215,12 @@ void SingleLineProperties::drawPen(QPainter *painter,
ajoutes a l'element e. ajoutes a l'element e.
@param e Element XML auquel seront ajoutes des attributs @param e Element XML auquel seront ajoutes des attributs
*/ */
void SingleLineProperties::toXmlPriv(QDomElement& e) const { void SingleLineProperties::toXml(QDomElement &e) const
{
e.setAttribute("ground", hasGround ? "true" : "false"); e.setAttribute("ground", hasGround ? "true" : "false");
e.setAttribute("neutral", hasNeutral ? "true" : "false"); e.setAttribute("neutral", hasNeutral ? "true" : "false");
e.setAttribute("phase", phases); e.setAttribute("phase", phases);
if (isPen()) e.setAttribute("pen", "true"); if (isPen()) e.setAttribute("pen", "true");
} }
/** /**
@@ -230,36 +228,11 @@ void SingleLineProperties::toXmlPriv(QDomElement& e) const {
de l'element e de l'element e
@param e Element XML dont les attributs seront lus @param e Element XML dont les attributs seront lus
*/ */
bool SingleLineProperties::fromXmlPriv(const QDomElement &e) { void SingleLineProperties::fromXml(QDomElement &e) {
if (QETXML::propertyBool(e, "ground", &hasGround) != QETXML::PropertyFlags::Success || hasGround = e.attribute("ground") == "true";
QETXML::propertyBool(e, "neutral", &hasNeutral) != QETXML::PropertyFlags::Success) hasNeutral = e.attribute("neutral") == "true";
return false; setPhasesCount(e.attribute("phase").toInt());
is_pen = (hasGround && hasNeutral && e.attribute("pen", "false") == "true");
int phase;
if (QETXML::propertyInteger(e, "phase", &phase) != QETXML::PropertyFlags::Success)
return false;
setPhasesCount(phase);
bool pen;
if (QETXML::propertyBool(e, "pen", &pen) != QETXML::PropertyFlags::Success)
return false;
is_pen = (hasGround && hasNeutral && pen);
return true;
}
bool SingleLineProperties::valideXml(QDomElement& e) {
if (QETXML::propertyBool(e, "ground") != QETXML::PropertyFlags::Success ||
QETXML::propertyBool(e, "neutral") != QETXML::PropertyFlags::Success)
return false;
if (QETXML::propertyInteger(e, "phase") != QETXML::PropertyFlags::Success)
return false;
if (QETXML::propertyBool(e, "pen") != QETXML::PropertyFlags::Success)
return false;
return true;
} }
/** /**
@@ -267,7 +240,17 @@ bool SingleLineProperties::valideXml(QDomElement& e) {
multifilaire noir dont le texte est "_" multifilaire noir dont le texte est "_"
*/ */
ConductorProperties::ConductorProperties() : ConductorProperties::ConductorProperties() :
PropertiesInterface(xmlTagName()) type(Multi),
color(Qt::black),
text_color(Qt::black),
text("_"),
text_size(9),
cond_size(1),
verti_rotate_text(270),
horiz_rotate_text(0),
m_show_text(true),
m_one_text_per_folio(false),
style(Qt::SolidLine)
{} {}
/** /**
@@ -283,143 +266,108 @@ ConductorProperties::~ConductorProperties()
Export conductor propertie, in the XML element 'e' Export conductor propertie, in the XML element 'e'
@param e the xml element @param e the xml element
*/ */
void ConductorProperties::toXmlPriv(QDomElement& e) const void ConductorProperties::toXml(QDomElement &e) const
{ {
e.setAttribute("type", typeToString(type));
e.setAttribute("type", typeToString(type)); if (color != QColor(Qt::black))
e.setAttribute("color", color.name());
if (color != QColor(Qt::black)) e.setAttribute("bicolor", m_bicolor? "true" : "false");
e.setAttribute("color", color.name()); e.setAttribute("color2", m_color_2.name());
e.setAttribute("dash-size", QString::number(m_dash_size));
e.setAttribute("bicolor", m_bicolor? "true" : "false"); if (type == Single)
e.setAttribute("color2", m_color_2.name()); singleLineProperties.toXml(e);
e.setAttribute("dash-size", QString::number(m_dash_size));
if (type == Single) e.setAttribute("num", text);
{ e.setAttribute("text_color", text_color.name());
QDomDocument doc = e.ownerDocument(); e.setAttribute("formula", m_formula);
singleLineProperties.toXml(doc); e.setAttribute("cable", m_cable);
} e.setAttribute("bus", m_bus);
e.setAttribute("function", m_function);
e.setAttribute("tension_protocol", m_tension_protocol);
e.setAttribute("conductor_color", m_wire_color);
e.setAttribute("conductor_section", m_wire_section);
e.setAttribute("numsize", QString::number(text_size));
e.setAttribute("condsize", QString::number(cond_size));
e.setAttribute("displaytext", m_show_text);
e.setAttribute("onetextperfolio", m_one_text_per_folio);
e.setAttribute("vertirotatetext", QString::number(verti_rotate_text));
e.setAttribute("horizrotatetext", QString::number(horiz_rotate_text));
e.setAttribute("num", text); QMetaEnum me = QMetaEnum::fromType<Qt::Alignment>();
e.setAttribute("text_color", text_color.name()); e.setAttribute("horizontal-alignment", me.valueToKey(m_horizontal_alignment));
e.setAttribute("formula", m_formula); e.setAttribute("vertical-alignment", me.valueToKey(m_vertical_alignment));
e.setAttribute("cable", m_cable);
e.setAttribute("bus", m_bus);
e.setAttribute("function", m_function);
e.setAttribute("tension_protocol", m_tension_protocol);
e.setAttribute("conductor_color", m_wire_color);
e.setAttribute("conductor_section", m_wire_section);
e.setAttribute("numsize", QString::number(text_size));
e.setAttribute("condsize", QString::number(cond_size));
e.setAttribute("displaytext", m_show_text);
e.setAttribute("onetextperfolio", m_one_text_per_folio);
e.setAttribute("vertirotatetext", QString::number(verti_rotate_text));
e.setAttribute("horizrotatetext", QString::number(horiz_rotate_text));
QMetaEnum me = QMetaEnum::fromType<Qt::Alignment>(); QString conductor_style = writeStyle();
e.setAttribute("horizontal-alignment", me.valueToKey(m_horizontal_alignment)); if (!conductor_style.isEmpty())
e.setAttribute("vertical-alignment", me.valueToKey(m_vertical_alignment)); e.setAttribute("style", conductor_style);
QString conductor_style = writeStyle();
if (!conductor_style.isEmpty())
e.setAttribute("style", conductor_style);
} }
/** RETURNS True /**
@brief ConductorProperties::fromXml @brief ConductorProperties::fromXml
Import conductor propertie, from the attribute of the xml element 'e' Import conductor propertie, from the attribute of the xml element 'e'
@param e the xml document @param e the xml document
*/ */
bool ConductorProperties::fromXmlPriv(const QDomElement &e) void ConductorProperties::fromXml(QDomElement &e)
{ {
// get conductor color // get conductor color
QETXML::propertyColor(e, "color", &color); QColor xml_color= QColor(e.attribute("color"));
QETXML::propertyBool(e, "bicolor", &m_bicolor); color = (xml_color.isValid()? xml_color : QColor(Qt::black));
QETXML::propertyColor(e, "color2", &m_color_2);
QETXML::propertyInteger(e, "dash-size", &m_dash_size); QString bicolor_str = e.attribute("bicolor", "false");
m_bicolor = bicolor_str == "true"? true : false;
QColor xml_color_2 = QColor(e.attribute("color2"));
m_color_2 = xml_color_2.isValid()? xml_color_2 : QColor(Qt::black);
m_dash_size = e.attribute("dash-size", QString::number(1)).toInt();
// read style of conductor // read style of conductor
QString style_string; readStyle(e.attribute("style"));
QETXML::propertyString(e, "style", &style_string);
readStyle(style_string);
QString type_t; if (e.attribute("type") == typeToString(Single))
if (QETXML::propertyString(e, "type", &type_t) == QETXML::PropertyFlags::Success) {
if (type_t == typeToString(Single))
{ {
// get specific properties for single conductor // get specific properties for single conductor
singleLineProperties.fromXml(e); singleLineProperties.fromXml(e);
type = Single; type = Single;
} }
else if (type_t == typeToString(Multi)) else
type = Multi; type = Multi;
else {
//Keep retrocompatible with version older than 0,4
//If the propertie @type is simple (removed since QET 0,4), we set text no visible.
//@TODO remove this code for qet 0.6 or later
if (type_t == "simple") m_show_text = false; text = e.attribute("num");
}
}
QETXML::propertyString(e, "num", &text);
// TODO: implement:
//m_cable = e.attribute("cable");
//m_bus = e.attribute("bus");
// get text color // get text color
QETXML::propertyColor(e, "text_color", &text_color); QColor xml_text_color= QColor(e.attribute("text_color"));
QETXML::propertyString(e, "formula", &m_formula); text_color = (xml_text_color.isValid()? xml_text_color : QColor(Qt::black));
QETXML::propertyString(e, "function", &m_function); m_formula = e.attribute("formula");
QETXML::propertyString(e, "tension_protocol", &m_tension_protocol); m_cable = e.attribute("cable");
QETXML::propertyString(e, "conductor_color", &m_wire_color); m_bus = e.attribute("bus");
QETXML::propertyString(e, "conductor_section", &m_wire_section); m_function = e.attribute("function");
QETXML::propertyInteger(e, "numsize", &text_size); m_tension_protocol = e.attribute("tension_protocol");
QETXML::propertyDouble(e, "condsize", &cond_size); m_wire_color = e.attribute("conductor_color");
QETXML::propertyBool(e, "displaytext", &m_show_text); m_wire_section = e.attribute("conductor_section");
QETXML::propertyBool(e, "onetextperfolio", &m_one_text_per_folio); text_size = e.attribute("numsize", QString::number(9)).toInt();
QETXML::propertyDouble(e, "vertirotatetext", &verti_rotate_text); cond_size = e.attribute("condsize", QString::number(1)).toDouble();
QETXML::propertyDouble(e, "horizrotatetext", &horiz_rotate_text); m_show_text = e.attribute("displaytext", QString::number(1)).toInt();
m_one_text_per_folio = e.attribute("onetextperfolio", QString::number(0)).toInt();
verti_rotate_text = e.attribute("vertirotatetext").toDouble();
horiz_rotate_text = e.attribute("horizrotatetext").toDouble();
QMetaEnum me = QMetaEnum::fromType<Qt::Alignment>(); QMetaEnum me = QMetaEnum::fromType<Qt::Alignment>();
QString alinment_temp; m_horizontal_alignment = Qt::Alignment(
if (QETXML::propertyString(e, "horizontal-alignment", &alinment_temp) == QETXML::PropertyFlags::Success) me.keyToValue(
m_horizontal_alignment = Qt::Alignment(me.keyToValue(alinment_temp.toStdString().data())); e.attribute(
if (QETXML::propertyString(e, "vertical-alignment", &alinment_temp) == QETXML::PropertyFlags::Success) "horizontal-alignment",
m_vertical_alignment = Qt::Alignment(me.keyToValue(alinment_temp.toStdString().data())); "AlignBottom"
).toStdString().data()));
return true; m_vertical_alignment = Qt::Alignment(
} me.keyToValue(
e.attribute(
bool ConductorProperties::valideXml(QDomElement& e) { "vertical-alignment",
if (QETXML::propertyColor(e, "color") || "AlignRight"
QETXML::propertyBool(e, "bicolor") || ).toStdString().data()));
QETXML::propertyColor(e, "color2") ||
QETXML::propertyInteger(e, "dash-size") ||
QETXML::propertyString(e, "type") ||
QETXML::propertyString(e, "num") ||
QETXML::propertyColor(e, "text_color") ||
QETXML::propertyString(e, "formula") ||
QETXML::propertyString(e, "function") ||
QETXML::propertyString(e, "tension_protocol") ||
QETXML::propertyString(e, "conductor_color") ||
QETXML::propertyString(e, "conductor_section") ||
QETXML::propertyInteger(e, "numsize") ||
QETXML::propertyDouble(e, "condsize") ||
QETXML::propertyBool(e, "displaytext") ||
QETXML::propertyBool(e, "onetextperfolio") ||
QETXML::propertyDouble(e, "vertirotatetext") ||
QETXML::propertyDouble(e, "horizrotatetext") ||
QETXML::propertyString(e, "horizontal-alignment") ||
QETXML::propertyString(e, "vertical-alignment"))
return false;
return true;
}
QString ConductorProperties::xmlTagName()
{
return conductorPropertiesXmlName;
} }
/** /**
@@ -477,22 +425,22 @@ void ConductorProperties::fromSettings(QSettings &settings, const QString &prefi
singleLineProperties.fromSettings(settings, prefix); singleLineProperties.fromSettings(settings, prefix);
text = settings.value(prefix + "text", "_").toString(); text = settings.value(prefix + "text", "_").toString();
QColor settings_text_color = QColor(settings.value(prefix + "text_color").toString()); QColor settings_text_color = QColor(settings.value(prefix + "text_color").toString());
text_color = (settings_text_color.isValid()? settings_text_color : QColor(Qt::black)); text_color = (settings_text_color.isValid()? settings_text_color : QColor(Qt::black));
m_formula = settings.value(prefix + "formula", "").toString(); m_formula = settings.value(prefix + "formula", "").toString();
m_cable = settings.value(prefix + "cable", "").toString(); m_cable = settings.value(prefix + "cable", "").toString();
m_bus = settings.value(prefix + "bus", "").toString(); m_bus = settings.value(prefix + "bus", "").toString();
m_function = settings.value(prefix + "function", "").toString(); m_function = settings.value(prefix + "function", "").toString();
m_tension_protocol = settings.value(prefix + "tension_protocol", "").toString(); m_tension_protocol = settings.value(prefix + "tension_protocol", "").toString();
m_wire_color = settings.value(prefix + "conductor_color", "").toString(); m_wire_color = settings.value(prefix + "conductor_color", "").toString();
m_wire_section = settings.value(prefix + "conductor_section", "").toString(); m_wire_section = settings.value(prefix + "conductor_section", "").toString();
text_size = settings.value(prefix + "textsize", "7").toInt(); text_size = settings.value(prefix + "textsize", "7").toInt();
cond_size = settings.value(prefix + "size", "1").toInt(); cond_size = settings.value(prefix + "size", "1").toInt();
m_show_text = settings.value(prefix + "displaytext", true).toBool(); m_show_text = settings.value(prefix + "displaytext", true).toBool();
m_one_text_per_folio = settings.value(prefix + "onetextperfolio", false).toBool(); m_one_text_per_folio = settings.value(prefix + "onetextperfolio", false).toBool();
verti_rotate_text = settings.value((prefix + "vertirotatetext"), "270").toDouble(); verti_rotate_text = settings.value((prefix + "vertirotatetext"), "270").toDouble();
horiz_rotate_text = settings.value((prefix + "horizrotatetext"), "0").toDouble(); horiz_rotate_text = settings.value((prefix + "horizrotatetext"), "0").toDouble();
QMetaEnum me = QMetaEnum::fromType<Qt::Alignment>(); QMetaEnum me = QMetaEnum::fromType<Qt::Alignment>();
m_horizontal_alignment = Qt::Alignment(me.keyToValue(settings.value(prefix + "horizontal-alignment", "AlignBottom").toString().toStdString().data())); m_horizontal_alignment = Qt::Alignment(me.keyToValue(settings.value(prefix + "horizontal-alignment", "AlignBottom").toString().toStdString().data()));
@@ -530,25 +478,25 @@ void ConductorProperties::applyForEqualAttributes(QList<ConductorProperties> lis
if (clist.size() == 1) if (clist.size() == 1)
{ {
ConductorProperties cp = clist.first(); ConductorProperties cp = clist.first();
color = cp.color; color = cp.color;
m_bicolor = cp.m_bicolor; m_bicolor = cp.m_bicolor;
m_color_2 = cp.m_color_2; m_color_2 = cp.m_color_2;
m_dash_size = cp.m_dash_size; m_dash_size = cp.m_dash_size;
text = cp.text; text = cp.text;
text_color = cp.text_color; text_color = cp.text_color;
m_formula = cp.m_formula; m_formula = cp.m_formula;
m_cable = cp.m_cable; m_cable = cp.m_cable;
m_bus = cp.m_bus; m_bus = cp.m_bus;
m_function = cp.m_function; m_function = cp.m_function;
m_tension_protocol = cp.m_tension_protocol; m_tension_protocol = cp.m_tension_protocol;
m_wire_color = cp.m_wire_color; m_wire_color = cp.m_wire_color;
m_wire_section = cp.m_wire_section; m_wire_section = cp.m_wire_section;
text_size = cp.text_size; text_size = cp.text_size;
cond_size = cp.cond_size; cond_size = cp.cond_size;
m_show_text = cp.m_show_text; m_show_text = cp.m_show_text;
m_one_text_per_folio = cp.m_one_text_per_folio; m_one_text_per_folio = cp.m_one_text_per_folio;
verti_rotate_text = cp.verti_rotate_text; verti_rotate_text = cp.verti_rotate_text;
horiz_rotate_text = cp.horiz_rotate_text; horiz_rotate_text = cp.horiz_rotate_text;
m_vertical_alignment = cp.m_vertical_alignment; m_vertical_alignment = cp.m_vertical_alignment;
m_horizontal_alignment = cp.m_horizontal_alignment; m_horizontal_alignment = cp.m_horizontal_alignment;
@@ -886,7 +834,7 @@ void ConductorProperties::readStyle(const QString &style_string) {
if (!match.hasMatch()) if (!match.hasMatch())
{ {
qDebug()<<"no Match" qDebug()<<"no Match"
<<style_str; <<style_str;
} else { } else {
QString style_name = match.captured("name"); QString style_name = match.captured("name");
QString style_value = match.captured("value"); QString style_value = match.captured("value");
@@ -946,12 +894,12 @@ int SingleLineProperties::operator!=(const SingleLineProperties &other) const
@param prefix prefix a ajouter devant les noms des parametres @param prefix prefix a ajouter devant les noms des parametres
*/ */
void SingleLineProperties::toSettings(QSettings &settings, void SingleLineProperties::toSettings(QSettings &settings,
const QString &prefix) const const QString &prefix) const
{ {
settings.setValue(prefix + "hasGround", hasGround); settings.setValue(prefix + "hasGround", hasGround);
settings.setValue(prefix + "hasNeutral", hasNeutral); settings.setValue(prefix + "hasNeutral", hasNeutral);
settings.setValue(prefix + "phases", phases); settings.setValue(prefix + "phases", phases);
settings.setValue(prefix + "pen", is_pen); settings.setValue(prefix + "pen", is_pen);
} }
/** /**
@@ -962,6 +910,6 @@ void SingleLineProperties::fromSettings(QSettings &settings,
const QString &prefix) { const QString &prefix) {
hasGround = settings.value(prefix + "hasGround", true).toBool(); hasGround = settings.value(prefix + "hasGround", true).toBool();
hasNeutral = settings.value(prefix + "hasNeutral", true).toBool(); hasNeutral = settings.value(prefix + "hasNeutral", true).toBool();
phases = settings.value(prefix + "phases", 1).toInt(); phases = settings.value(prefix + "phases", 1).toInt();
is_pen = settings.value(prefix + "pen", false).toBool(); is_pen = settings.value(prefix + "pen", false).toBool();
} }

View File

@@ -22,15 +22,13 @@
#include <QColor> #include <QColor>
#include <QSettings> #include <QSettings>
#include "properties/propertiesinterface.h"
class QPainter; class QPainter;
/** /**
@brief The SingleLineProperties class @brief The SingleLineProperties class
This class represents the properties of a singleline conductor. This class represents the properties of a singleline conductor.
*/ */
class SingleLineProperties: public PropertiesInterface { class SingleLineProperties {
public: public:
SingleLineProperties(); SingleLineProperties();
virtual ~SingleLineProperties(); virtual ~SingleLineProperties();
@@ -39,24 +37,23 @@ class SingleLineProperties: public PropertiesInterface {
unsigned short int phasesCount(); unsigned short int phasesCount();
bool isPen() const; bool isPen() const;
void draw(QPainter *, QET::ConductorSegmentType, const QRectF &); void draw(QPainter *, QET::ConductorSegmentType, const QRectF &);
void toXmlPriv(QDomElement&) const override; void toXml(QDomElement &) const;
bool fromXmlPriv(const QDomElement &) override; void fromXml(QDomElement &);
static bool valideXml(QDomElement& element);
void toSettings(QSettings &, const QString & = QString()) const; void toSettings(QSettings &, const QString & = QString()) const;
void fromSettings(QSettings &, const QString & = QString()); void fromSettings(QSettings &, const QString & = QString());
/// Whether the singleline conductor should display the ground symbol /// Whether the singleline conductor should display the ground symbol
bool hasGround{true}; bool hasGround;
/// Whether the singleline conductor should display the neutral symbol /// Whether the singleline conductor should display the neutral symbol
bool hasNeutral{true}; bool hasNeutral;
/// Protective Earth Neutral: visually merge neutral and ground /// Protective Earth Neutral: visually merge neutral and ground
bool is_pen{false}; bool is_pen;
int operator==(const SingleLineProperties &) const; int operator==(const SingleLineProperties &) const;
int operator!=(const SingleLineProperties &) const; int operator!=(const SingleLineProperties &) const;
private: private:
unsigned short int phases{1}; unsigned short int phases;
void drawGround (QPainter *, QET::ConductorSegmentType, QPointF, qreal); void drawGround (QPainter *, QET::ConductorSegmentType, QPointF, qreal);
void drawNeutral(QPainter *, QPointF, qreal); void drawNeutral(QPainter *, QPointF, qreal);
void drawPen(QPainter *, QET::ConductorSegmentType, QPointF, qreal); void drawPen(QPainter *, QET::ConductorSegmentType, QPointF, qreal);
@@ -67,7 +64,7 @@ class SingleLineProperties: public PropertiesInterface {
This class represents the functional properties of a particular conductor, This class represents the functional properties of a particular conductor,
i.e. properties other than path and terminals. i.e. properties other than path and terminals.
*/ */
class ConductorProperties: public PropertiesInterface class ConductorProperties
{ {
public: public:
ConductorProperties(); ConductorProperties();
@@ -83,15 +80,15 @@ class ConductorProperties: public PropertiesInterface
//Attributes //Attributes
ConductorType type{ConductorType::Multi}; ConductorType type;
// TODO: set default values! QColor
QColor color{QColor(Qt::black)}, color,
m_color_2{QColor(Qt::black)}, m_color_2,
text_color{QColor(Qt::black)}; text_color;
QString QString
text{"_"}, text,
m_function, m_function,
m_tension_protocol, m_tension_protocol,
m_wire_color, m_wire_color,
@@ -100,31 +97,33 @@ class ConductorProperties: public PropertiesInterface
m_bus, m_bus,
m_cable; m_cable;
int text_size{9}, int
text_size,
m_dash_size = 1; m_dash_size = 1;
double double
cond_size{1}, cond_size,
verti_rotate_text{270}, verti_rotate_text,
horiz_rotate_text{0}; horiz_rotate_text;
bool m_show_text{true}, bool
m_one_text_per_folio{false}, m_show_text,
m_one_text_per_folio,
m_bicolor = false; m_bicolor = false;
Qt::Alignment Qt::Alignment
m_horizontal_alignment = Qt::AlignBottom, m_horizontal_alignment = Qt::AlignBottom,
m_vertical_alignment = Qt::AlignRight; m_vertical_alignment = Qt::AlignRight;
Qt::PenStyle style{Qt::PenStyle::SolidLine}; Qt::PenStyle style;
SingleLineProperties singleLineProperties; SingleLineProperties singleLineProperties;
// methods // methods
static bool valideXml(QDomElement& element); void toXml(QDomElement &) const;
static QString xmlTagName(); void fromXml(QDomElement &);
void toSettings(QSettings &, const QString & = QString()) const override; void toSettings(QSettings &, const QString & = QString()) const;
void fromSettings(QSettings &, const QString & = QString()) override; void fromSettings(QSettings &, const QString & = QString());
static QString typeToString(ConductorType); static QString typeToString(ConductorType);
void applyForEqualAttributes(QList<ConductorProperties> list); void applyForEqualAttributes(QList<ConductorProperties> list);
@@ -134,10 +133,6 @@ class ConductorProperties: public PropertiesInterface
bool operator==(const ConductorProperties &) const; bool operator==(const ConductorProperties &) const;
bool operator!=(const ConductorProperties &) const; bool operator!=(const ConductorProperties &) const;
private:
void toXmlPriv(QDomElement&) const override;
bool fromXmlPriv(const QDomElement &) override;
private: private:
void readStyle(const QString &); void readStyle(const QString &);
QString writeStyle() const; QString writeStyle() const;

View File

@@ -44,8 +44,6 @@
#include <cassert> #include <cassert>
#include <math.h> #include <math.h>
#include "qetxml.h"
int Diagram::xGrid = 10; int Diagram::xGrid = 10;
int Diagram::yGrid = 10; int Diagram::yGrid = 10;
int Diagram::xKeyGrid = 10; int Diagram::xKeyGrid = 10;
@@ -66,11 +64,11 @@ QColor Diagram::background_color = Qt::white;
@param project : The project of this diagram and also parent QObject @param project : The project of this diagram and also parent QObject
*/ */
Diagram::Diagram(QETProject *project) : Diagram::Diagram(QETProject *project) :
QGraphicsScene (project), QGraphicsScene (project),
m_project (project), m_project (project),
draw_grid_ (true), draw_grid_ (true),
use_border_ (true), use_border_ (true),
draw_terminals_ (true), draw_terminals_ (true),
draw_colored_conductors_ (true), draw_colored_conductors_ (true),
m_event_interface (nullptr), m_event_interface (nullptr),
m_freeze_new_elements (false), m_freeze_new_elements (false),
@@ -182,7 +180,7 @@ void Diagram::drawBackground(QPainter *p, const QRectF &r) {
*/ */
QPen pen; QPen pen;
Diagram::background_color == Qt::black? pen.setColor(Qt::white) Diagram::background_color == Qt::black? pen.setColor(Qt::white)
: pen.setColor(Qt::black); : pen.setColor(Qt::black);
pen.setCosmetic(true); pen.setCosmetic(true);
p->setPen(pen); p->setPen(pen);
@@ -328,9 +326,9 @@ void Diagram::keyPressEvent(QKeyEvent *event)
{ {
QSettings settings; QSettings settings;
int xKeyGrid = settings.value("diagrameditor/key_Xgrid", int xKeyGrid = settings.value("diagrameditor/key_Xgrid",
Diagram::xKeyGrid).toInt(); Diagram::xKeyGrid).toInt();
int yKeyGrid = settings.value("diagrameditor/key_Ygrid", int yKeyGrid = settings.value("diagrameditor/key_Ygrid",
Diagram::yKeyGrid).toInt(); Diagram::yKeyGrid).toInt();
int xKeyGridFine = settings.value("diagrameditor/key_fine_Xgrid", int xKeyGridFine = settings.value("diagrameditor/key_fine_Xgrid",
Diagram::xKeyGridFine).toInt(); Diagram::xKeyGridFine).toInt();
int yKeyGridFine = settings.value("diagrameditor/key_fine_Ygrid", int yKeyGridFine = settings.value("diagrameditor/key_fine_Ygrid",
@@ -585,9 +583,9 @@ void Diagram::setConductorsAutonumName(const QString &name) {
@return Une QImage representant le schema @return Une QImage representant le schema
*/ */
bool Diagram::toPaintDevice(QPaintDevice &pix, bool Diagram::toPaintDevice(QPaintDevice &pix,
int width, int width,
int height, int height,
Qt::AspectRatioMode aspectRatioMode) { Qt::AspectRatioMode aspectRatioMode) {
// determine the source area = schema content + margins // determine the source area = schema content + margins
// determine la zone source = contenu du schema + marges // determine la zone source = contenu du schema + marges
QRectF source_area; QRectF source_area;
@@ -634,9 +632,9 @@ bool Diagram::toPaintDevice(QPaintDevice &pix,
// renders itself // renders itself
// effectue le rendu lui-meme // effectue le rendu lui-meme
render(&p, render(&p,
QRect(QPoint(0, 0),image_size), QRect(QPoint(0, 0),image_size),
source_area, source_area,
aspectRatioMode); aspectRatioMode);
p.end(); p.end();
// restore selected items // restore selected items
@@ -739,28 +737,29 @@ QDomDocument Diagram::toXml(bool whole_content) {
// schema properties // schema properties
// proprietes du schema // proprietes du schema
if (whole_content) { if (whole_content) {
// TODO: compare with old version border_and_titleblock.titleBlockToXml(dom_root);
dom_root.appendChild(border_and_titleblock.titleBlockToXml(document));
border_and_titleblock.borderToXml(dom_root); border_and_titleblock.borderToXml(dom_root);
// Default conductor properties // Default conductor properties
defaultConductorProperties.setTagName("defaultconductor"); QDomElement default_conductor =
dom_root.appendChild(defaultConductorProperties.toXml(document)); document.createElement("defaultconductor");
defaultConductorProperties.toXml(default_conductor);
dom_root.appendChild(default_conductor);
// Conductor autonum // Conductor autonum
if (!m_conductors_autonum_name.isEmpty()) { if (!m_conductors_autonum_name.isEmpty()) {
dom_root.setAttribute("conductorAutonum", dom_root.setAttribute("conductorAutonum",
m_conductors_autonum_name); m_conductors_autonum_name);
} }
//Default New Element //Default New Element
dom_root.setAttribute("freezeNewElement", dom_root.setAttribute("freezeNewElement",
m_freeze_new_elements ? "true" : "false"); m_freeze_new_elements ? "true" : "false");
//Default New Conductor //Default New Conductor
dom_root.setAttribute("freezeNewConductor", dom_root.setAttribute("freezeNewConductor",
m_freeze_new_conductors_ m_freeze_new_conductors_
? "true" : "false"); ? "true" : "false");
//Element Folio Sequential Variables //Element Folio Sequential Variables
if (!m_elmt_unitfolio_max.isEmpty() if (!m_elmt_unitfolio_max.isEmpty()
@@ -774,10 +773,10 @@ QDomDocument Diagram::toXml(bool whole_content) {
document.createElement( document.createElement(
"elementunitfolioseq"); "elementunitfolioseq");
folioSequentialsToXml(&m_elmt_unitfolio_max, folioSequentialsToXml(&m_elmt_unitfolio_max,
&elmtfolioseq, &elmtfolioseq,
"sequf_", "sequf_",
"unitfolioseq", "unitfolioseq",
&document); &document);
elmtfoliosequential.appendChild(elmtfolioseq); elmtfoliosequential.appendChild(elmtfolioseq);
} }
if (!m_elmt_tenfolio_max.isEmpty()) { if (!m_elmt_tenfolio_max.isEmpty()) {
@@ -785,10 +784,10 @@ QDomDocument Diagram::toXml(bool whole_content) {
document.createElement( document.createElement(
"elementtenfolioseq"); "elementtenfolioseq");
folioSequentialsToXml(&m_elmt_tenfolio_max, folioSequentialsToXml(&m_elmt_tenfolio_max,
&elmtfolioseq, &elmtfolioseq,
"seqtf_", "seqtf_",
"tenfolioseq", "tenfolioseq",
&document); &document);
elmtfoliosequential.appendChild(elmtfolioseq); elmtfoliosequential.appendChild(elmtfolioseq);
} }
if (!m_elmt_hundredfolio_max.isEmpty()) { if (!m_elmt_hundredfolio_max.isEmpty()) {
@@ -796,10 +795,10 @@ QDomDocument Diagram::toXml(bool whole_content) {
document.createElement( document.createElement(
"elementhundredfolioseq"); "elementhundredfolioseq");
folioSequentialsToXml(&m_elmt_hundredfolio_max, folioSequentialsToXml(&m_elmt_hundredfolio_max,
&elmtfolioseq, &elmtfolioseq,
"seqhf_", "seqhf_",
"hundredfolioseq", "hundredfolioseq",
&document); &document);
elmtfoliosequential.appendChild(elmtfolioseq); elmtfoliosequential.appendChild(elmtfolioseq);
} }
dom_root.appendChild(elmtfoliosequential); dom_root.appendChild(elmtfoliosequential);
@@ -817,10 +816,10 @@ QDomDocument Diagram::toXml(bool whole_content) {
document.createElement( document.createElement(
"conductorunitfolioseq"); "conductorunitfolioseq");
folioSequentialsToXml(&m_cnd_unitfolio_max, folioSequentialsToXml(&m_cnd_unitfolio_max,
&cndfolioseq, &cndfolioseq,
"sequf_", "sequf_",
"unitfolioseq", "unitfolioseq",
&document); &document);
cndfoliosequential.appendChild(cndfolioseq); cndfoliosequential.appendChild(cndfolioseq);
} }
if (!m_cnd_tenfolio_max.isEmpty()) { if (!m_cnd_tenfolio_max.isEmpty()) {
@@ -828,10 +827,10 @@ QDomDocument Diagram::toXml(bool whole_content) {
document.createElement( document.createElement(
"conductortenfolioseq"); "conductortenfolioseq");
folioSequentialsToXml(&m_cnd_tenfolio_max, folioSequentialsToXml(&m_cnd_tenfolio_max,
&cndfolioseq, &cndfolioseq,
"seqtf_", "seqtf_",
"tenfolioseq", "tenfolioseq",
&document); &document);
cndfoliosequential.appendChild(cndfolioseq); cndfoliosequential.appendChild(cndfolioseq);
} }
if (!m_cnd_hundredfolio_max.isEmpty()) { if (!m_cnd_hundredfolio_max.isEmpty()) {
@@ -839,10 +838,10 @@ QDomDocument Diagram::toXml(bool whole_content) {
document.createElement( document.createElement(
"conductorhundredfolioseq"); "conductorhundredfolioseq");
folioSequentialsToXml(&m_cnd_hundredfolio_max, folioSequentialsToXml(&m_cnd_hundredfolio_max,
&cndfolioseq, &cndfolioseq,
"seqhf_", "seqhf_",
"hundredfolioseq", "hundredfolioseq",
&document); &document);
cndfoliosequential.appendChild(cndfolioseq); cndfoliosequential.appendChild(cndfolioseq);
} }
dom_root.appendChild(cndfoliosequential); dom_root.appendChild(cndfoliosequential);
@@ -919,11 +918,13 @@ QDomDocument Diagram::toXml(bool whole_content) {
// correspondence table between the addresses of the terminals and their ids // correspondence table between the addresses of the terminals and their ids
// table de correspondance entre les adresses des bornes et leurs ids // table de correspondance entre les adresses des bornes et leurs ids
QHash<Terminal *, int> table_adr_id;
if (!list_elements.isEmpty()) { if (!list_elements.isEmpty()) {
auto dom_elements = document.createElement("elements"); auto dom_elements = document.createElement("elements");
for (auto elmt : list_elements) { for (auto elmt : list_elements) {
dom_elements.appendChild(elmt->toXml(document)); dom_elements.appendChild(elmt->toXml(document,
table_adr_id));
} }
dom_root.appendChild(dom_elements); dom_root.appendChild(dom_elements);
} }
@@ -931,7 +932,8 @@ QDomDocument Diagram::toXml(bool whole_content) {
if (!list_conductors.isEmpty()) { if (!list_conductors.isEmpty()) {
auto dom_conductors = document.createElement("conductors"); auto dom_conductors = document.createElement("conductors");
for (auto cond : list_conductors) { for (auto cond : list_conductors) {
dom_conductors.appendChild(cond->toXml(document)); dom_conductors.appendChild(cond->toXml(document,
table_adr_id));
} }
dom_root.appendChild(dom_conductors); dom_root.appendChild(dom_conductors);
} }
@@ -981,18 +983,18 @@ QDomDocument Diagram::toXml(bool whole_content) {
@param doc @param doc
*/ */
void Diagram::folioSequentialsToXml(QHash<QString, void Diagram::folioSequentialsToXml(QHash<QString,
QStringList> *hash, QStringList> *hash,
QDomElement *domElement, QDomElement *domElement,
const QString& seq_type, const QString& seq_type,
const QString& type, const QString& type,
QDomDocument *doc) { QDomDocument *doc) {
QHash<QString, QStringList>::iterator i; QHash<QString, QStringList>::iterator i;
for (i = hash->begin(); i != hash->end(); i++) { for (i = hash->begin(); i != hash->end(); i++) {
QDomElement folioseq = doc->createElement(type); QDomElement folioseq = doc->createElement(type);
folioseq.setAttribute("title", i.key()); folioseq.setAttribute("title", i.key());
for (int j = 0; j < i.value().size(); j++) { for (int j = 0; j < i.value().size(); j++) {
folioseq.setAttribute(seq_type + QString::number(j+1), folioseq.setAttribute(seq_type + QString::number(j+1),
i.value().at(j)); i.value().at(j));
} }
domElement->appendChild(folioseq); domElement->appendChild(folioseq);
} }
@@ -1030,9 +1032,9 @@ void Diagram::folioSequentialsToXml(QHash<QString,
\~French true si l'import a reussi, false sinon \~French true si l'import a reussi, false sinon
*/ */
bool Diagram::fromXml(QDomDocument &document, bool Diagram::fromXml(QDomDocument &document,
QPointF position, QPointF position,
bool consider_informations, bool consider_informations,
DiagramContent *content_ptr) { DiagramContent *content_ptr) {
QDomElement root = document.documentElement(); QDomElement root = document.documentElement();
return(fromXml(root, position, consider_informations, content_ptr)); return(fromXml(root, position, consider_informations, content_ptr));
} }
@@ -1094,17 +1096,17 @@ bool Diagram::initFromXml(QDomElement &document,
@return @return
*/ */
Terminal* findTerminal(int conductor_index, Terminal* findTerminal(int conductor_index,
QDomElement& conductor, QDomElement& f,
QHash<int, QHash<int,
Terminal *>& table_adr_id, Terminal *>& table_adr_id,
QList<Element *>& added_elements) { QList<Element *>& added_elements) {
assert(conductor_index == 1 || conductor_index == 2); assert(conductor_index == 1 || conductor_index == 2);
QString element_index = "element" + QString::number(conductor_index); QString element_index = "element" + QString::number(conductor_index);
QString terminal_index = "terminal" + QString::number(conductor_index); QString terminal_index = "terminal" + QString::number(conductor_index);
QUuid element_uuid; if (f.hasAttribute(element_index)) {
if (QETXML::propertyUuid(conductor, element_index, &element_uuid) == QETXML::PropertyFlags::Success) { QUuid element_uuid = QUuid(f.attribute(element_index));
// element1 did not exist in the conductor part of the xml until prior 0.7 // element1 did not exist in the conductor part of the xml until prior 0.7
// It is used as an indicator that uuid's are used to identify terminals // It is used as an indicator that uuid's are used to identify terminals
bool element_found = false; bool element_found = false;
@@ -1112,8 +1114,7 @@ Terminal* findTerminal(int conductor_index,
if (element->uuid() != element_uuid) if (element->uuid() != element_uuid)
continue; continue;
element_found = true; element_found = true;
QUuid terminal_uuid; QUuid terminal_uuid = QUuid(f.attribute(terminal_index));
QETXML::propertyUuid(conductor, terminal_index, &terminal_uuid);
for (auto terminal: element->terminals()) { for (auto terminal: element->terminals()) {
if (terminal->uuid() != terminal_uuid) if (terminal->uuid() != terminal_uuid)
continue; continue;
@@ -1137,11 +1138,9 @@ Terminal* findTerminal(int conductor_index,
<< element_uuid << element_uuid
<< "not found"; << "not found";
} else { } else {
// Backward compatibility. Until version 0.7 a generated id is used to link the terminal. // Backward compatibility.
int id_p1 = -1; // Until version 0.7 a generated id is used to link the terminal.
if (QETXML::propertyInteger(conductor, terminal_index, &id_p1) != QETXML::PropertyFlags::Success) { int id_p1 = f.attribute(terminal_index).toInt();
qDebug() << "diagramm.cpp:findTerminal(): Reading Id was not successfull";
}
if (!table_adr_id.contains(id_p1)) { if (!table_adr_id.contains(id_p1)) {
qDebug() << "Diagram::fromXml() : terminal id " qDebug() << "Diagram::fromXml() : terminal id "
<< id_p1 << id_p1
@@ -1149,7 +1148,6 @@ Terminal* findTerminal(int conductor_index,
} else } else
return table_adr_id.value(id_p1); return table_adr_id.value(id_p1);
} }
qDebug() << "Diagram::findTerminal(): No terminal found.";
return nullptr; return nullptr;
} }
@@ -1185,20 +1183,17 @@ Terminal* findTerminal(int conductor_index,
\~French true si l'import a reussi, false sinon \~French true si l'import a reussi, false sinon
*/ */
bool Diagram::fromXml(QDomElement &document, bool Diagram::fromXml(QDomElement &document,
QPointF position, QPointF position,
bool consider_informations, bool consider_informations,
DiagramContent *content_ptr) { DiagramContent *content_ptr) {
const QDomElement& root = document; const QDomElement& root = document;
// The first element must be a diagram // The first element must be a diagram
if (root.tagName() != "diagram") return(false); if (root.tagName() != "diagram") return(false);
qDebug() << "Diagram::fromXml; Diagram: " << root.attribute("title");
// Read attributes of this diagram // Read attributes of this diagram
if (consider_informations) if (consider_informations)
{ {
// Load border and titleblock // Load border and titleblock
border_and_titleblock.titleBlockFromXml(root); border_and_titleblock.titleBlockFromXml(root);
border_and_titleblock.borderFromXml(root); border_and_titleblock.borderFromXml(root);
@@ -1210,7 +1205,6 @@ bool Diagram::fromXml(QDomElement &document,
defaultConductorProperties.fromXml(default_conductor_elmt); defaultConductorProperties.fromXml(default_conductor_elmt);
} }
// Load the autonum // Load the autonum
m_conductors_autonum_name = root.attribute("conductorAutonum"); m_conductors_autonum_name = root.attribute("conductorAutonum");
@@ -1264,7 +1258,7 @@ bool Diagram::fromXml(QDomElement &document,
if (root.hasAttribute("projectId")) { if (root.hasAttribute("projectId")) {
QETProject *other_project = QETApp::project( QETProject *other_project = QETApp::project(
root.attribute("projectId", root.attribute("projectId",
"-1").toInt()); "-1").toInt());
/* We try to paste from another project, /* We try to paste from another project,
* then befor paste elements, * then befor paste elements,
@@ -1276,8 +1270,8 @@ bool Diagram::fromXml(QDomElement &document,
ElementCollectionHandler ech; ElementCollectionHandler ech;
foreach (QDomElement element_xml, foreach (QDomElement element_xml,
QET::findInDomElement(root, QET::findInDomElement(root,
"elements", "elements",
"element")) { "element")) {
if (!Element::valideXml(element_xml)) continue; if (!Element::valideXml(element_xml)) continue;
QString type_id = element_xml.attribute("type"); QString type_id = element_xml.attribute("type");
@@ -1287,7 +1281,7 @@ bool Diagram::fromXml(QDomElement &document,
type_id, type_id,
other_project); other_project);
ech.importFromProject(m_project, ech.importFromProject(m_project,
location); location);
} }
} }
} }
@@ -1333,7 +1327,7 @@ bool Diagram::fromXml(QDomElement &document,
removeItem(nvel_elmt); removeItem(nvel_elmt);
delete nvel_elmt; delete nvel_elmt;
qDebug() << "Diagram::fromXml() : Le chargement des " qDebug() << "Diagram::fromXml() : Le chargement des "
"parametres d'un element a echoue"; "parametres d'un element a echoue";
} else { } else {
added_elements << nvel_elmt; added_elements << nvel_elmt;
} }
@@ -1342,8 +1336,8 @@ bool Diagram::fromXml(QDomElement &document,
// Load text // Load text
QList<IndependentTextItem *> added_texts; QList<IndependentTextItem *> added_texts;
foreach (QDomElement text_xml, QET::findInDomElement(root, foreach (QDomElement text_xml, QET::findInDomElement(root,
"inputs", "inputs",
"input")) { "input")) {
IndependentTextItem *iti = new IndependentTextItem(); IndependentTextItem *iti = new IndependentTextItem();
iti -> fromXml(text_xml); iti -> fromXml(text_xml);
addItem(iti); addItem(iti);
@@ -1353,8 +1347,8 @@ bool Diagram::fromXml(QDomElement &document,
// Load image // Load image
QList<DiagramImageItem *> added_images; QList<DiagramImageItem *> added_images;
foreach (QDomElement image_xml, QET::findInDomElement(root, foreach (QDomElement image_xml, QET::findInDomElement(root,
"images", "images",
"image")) { "image")) {
DiagramImageItem *dii = new DiagramImageItem (); DiagramImageItem *dii = new DiagramImageItem ();
dii -> fromXml(image_xml); dii -> fromXml(image_xml);
addItem(dii); addItem(dii);
@@ -1364,8 +1358,8 @@ bool Diagram::fromXml(QDomElement &document,
// Load shape // Load shape
QList<QetShapeItem *> added_shapes; QList<QetShapeItem *> added_shapes;
foreach (QDomElement shape_xml, QET::findInDomElement(root, foreach (QDomElement shape_xml, QET::findInDomElement(root,
"shapes", "shapes",
"shape")) { "shape")) {
QetShapeItem *dii = new QetShapeItem (QPointF(0,0)); QetShapeItem *dii = new QetShapeItem (QPointF(0,0));
dii -> fromXml(shape_xml); dii -> fromXml(shape_xml);
addItem(dii); addItem(dii);
@@ -1375,8 +1369,8 @@ bool Diagram::fromXml(QDomElement &document,
// Load conductor // Load conductor
QList<Conductor *> added_conductors; QList<Conductor *> added_conductors;
foreach (QDomElement f, QET::findInDomElement(root, foreach (QDomElement f, QET::findInDomElement(root,
"conductors", "conductors",
"conductor")) "conductor"))
{ {
if (!Conductor::valideXml(f)) continue; if (!Conductor::valideXml(f)) continue;
@@ -1385,7 +1379,7 @@ bool Diagram::fromXml(QDomElement &document,
Terminal* p1 = findTerminal(1, f, table_adr_id, added_elements); Terminal* p1 = findTerminal(1, f, table_adr_id, added_elements);
Terminal* p2 = findTerminal(2, f, table_adr_id, added_elements); Terminal* p2 = findTerminal(2, f, table_adr_id, added_elements);
if (p1 && p2 && p1 != p2)// TODO: why the condition for unequal is required? if (p1 && p2 && p1 != p2)
{ {
Conductor *c = new Conductor(p1, p2); Conductor *c = new Conductor(p1, p2);
if (c->isValid()) if (c->isValid())
@@ -1396,15 +1390,13 @@ bool Diagram::fromXml(QDomElement &document,
} }
else else
delete c; delete c;
} else {
qDebug() << "Diagramm::fromXML(): No matching terminals found.";
} }
} }
//Load tables //Load tables
QVector<QetGraphicsTableItem *> added_tables; QVector<QetGraphicsTableItem *> added_tables;
for (auto dom_table for (auto dom_table
: QETXML::subChild(root, : QETXML::subChild(root,
"tables", "tables",
QetGraphicsTableItem::xmlTagName())) QetGraphicsTableItem::xmlTagName()))
{ {
@@ -1419,11 +1411,11 @@ bool Diagram::fromXml(QDomElement &document,
{ {
QVector <QGraphicsItem *> added_items; QVector <QGraphicsItem *> added_items;
for (auto element : added_elements ) added_items << element; for (auto element : added_elements ) added_items << element;
for (auto cond : added_conductors) added_items << cond; for (auto cond : added_conductors) added_items << cond;
for (auto shape : added_shapes ) added_items << shape; for (auto shape : added_shapes ) added_items << shape;
for (auto text : added_texts ) added_items << text; for (auto text : added_texts ) added_items << text;
for (auto image : added_images ) added_items << image; for (auto image : added_images ) added_items << image;
for (auto table : added_tables ) added_items << table; for (auto table : added_tables ) added_items << table;
//Get the top left corner of the rectangle that contain all added items //Get the top left corner of the rectangle that contain all added items
QRectF items_rect; QRectF items_rect;
@@ -1445,12 +1437,12 @@ bool Diagram::fromXml(QDomElement &document,
//Filling of falculatory lists //Filling of falculatory lists
if (content_ptr) { if (content_ptr) {
content_ptr -> m_elements = added_elements; content_ptr -> m_elements = added_elements;
content_ptr -> m_conductors_to_move = added_conductors; content_ptr -> m_conductors_to_move = added_conductors;
#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) // ### Qt 6: remove #if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) // ### Qt 6: remove
content_ptr -> m_text_fields = added_texts.toSet(); content_ptr -> m_text_fields = added_texts.toSet();
content_ptr -> m_images = added_images.toSet(); content_ptr -> m_images = added_images.toSet();
content_ptr -> m_shapes = added_shapes.toSet(); content_ptr -> m_shapes = added_shapes.toSet();
#else #else
#if TODO_LIST #if TODO_LIST
#pragma message("@TODO remove code for QT 5.14 or later") #pragma message("@TODO remove code for QT 5.14 or later")
@@ -1465,7 +1457,7 @@ bool Diagram::fromXml(QDomElement &document,
added_shapes.begin(), added_shapes.begin(),
added_shapes.end()); added_shapes.end());
#endif #endif
content_ptr -> m_tables = added_tables; content_ptr -> m_tables = added_tables;
} }
adjustSceneRect(); adjustSceneRect();
@@ -1483,23 +1475,23 @@ bool Diagram::fromXml(QDomElement &document,
@param autonumFolioSeqType @param autonumFolioSeqType
*/ */
void Diagram::folioSequentialsFromXml(const QDomElement &root, void Diagram::folioSequentialsFromXml(const QDomElement &root,
QHash<QString, QHash<QString,
QStringList>* hash, QStringList>* hash,
const QString& folioSeq, const QString& folioSeq,
const QString& seq, const QString& seq,
const QString& type, const QString& type,
const QString& autonumFolioSeqType) { const QString& autonumFolioSeqType) {
foreach (QDomElement folioSeqAutoNum, foreach (QDomElement folioSeqAutoNum,
QET::findInDomElement(root, autonumFolioSeqType, folioSeq)) { QET::findInDomElement(root, autonumFolioSeqType, folioSeq)) {
for(QDomElement folioseq for(QDomElement folioseq
= folioSeqAutoNum.firstChildElement(type); = folioSeqAutoNum.firstChildElement(type);
!folioseq.isNull(); !folioseq.isNull();
folioseq = folioseq.nextSiblingElement(type)) { folioseq = folioseq.nextSiblingElement(type)) {
QString title = folioseq.attribute("title"); QString title = folioseq.attribute("title");
QStringList list; QStringList list;
int i = 1; int i = 1;
while (folioseq.hasAttribute(seq while (folioseq.hasAttribute(seq
+ QString::number(i))) { + QString::number(i))) {
list << folioseq.attribute( list << folioseq.attribute(
seq + QString::number(i)); seq + QString::number(i));
i++; i++;
@@ -1537,7 +1529,7 @@ void Diagram::refreshContents()
/** /**
@brief Diagram::addItem @brief Diagram::addItem
R??implemented from QGraphicsScene::addItem(QGraphicsItem *item) Réimplemented from QGraphicsScene::addItem(QGraphicsItem *item)
Do some specific operation if item need it (for exemple an element) Do some specific operation if item need it (for exemple an element)
@param item @param item
*/ */
@@ -1773,10 +1765,10 @@ void Diagram::insertFolioSeqHash(QHash<QString,
@param nc : Context to be manipulated @param nc : Context to be manipulated
*/ */
void Diagram::loadFolioSeqHash(QHash<QString, void Diagram::loadFolioSeqHash(QHash<QString,
QStringList> *hash, QStringList> *hash,
const QString& title, const QString& title,
const QString& type, const QString& type,
NumerotationContext *nc) { NumerotationContext *nc) {
int j = 0; int j = 0;
for (int i = 0; i < nc->size(); i++) { for (int i = 0; i < nc->size(); i++) {
if (nc->itemAt(i).at(0) == type) { if (nc->itemAt(i).at(0) == type) {
@@ -1801,9 +1793,9 @@ void Diagram::changeZValue(QET::DepthOption option)
DiagramContent dc(this); DiagramContent dc(this);
QUndoCommand *undo = new QUndoCommand(tr("Modifier la profondeur")); QUndoCommand *undo = new QUndoCommand(tr("Modifier la profondeur"));
QList<QGraphicsItem *> l = dc.items(DiagramContent::SelectedOnly | \ QList<QGraphicsItem *> l = dc.items(DiagramContent::SelectedOnly | \
DiagramContent::Elements | \ DiagramContent::Elements | \
DiagramContent::Shapes | \ DiagramContent::Shapes | \
DiagramContent::Images); DiagramContent::Images);
QList<QGraphicsObject *> list; QList<QGraphicsObject *> list;
for(QGraphicsItem *item : l) for(QGraphicsItem *item : l)
list << item->toGraphicsObject(); list << item->toGraphicsObject();
@@ -2192,7 +2184,7 @@ void Diagram::adjustSceneRect()
{ {
QRectF old_rect = sceneRect(); QRectF old_rect = sceneRect();
setSceneRect(border_and_titleblock.borderAndTitleBlockRect().united( setSceneRect(border_and_titleblock.borderAndTitleBlockRect().united(
itemsBoundingRect())); itemsBoundingRect()));
update(old_rect.united(sceneRect())); update(old_rect.united(sceneRect()));
} }
@@ -2213,20 +2205,20 @@ ExportProperties Diagram::applyProperties(
// exports current rendering options // exports current rendering options
// exporte les options de rendu en cours // exporte les options de rendu en cours
ExportProperties old_properties; ExportProperties old_properties;
old_properties.draw_grid = displayGrid(); old_properties.draw_grid = displayGrid();
old_properties.draw_border = border_and_titleblock.borderIsDisplayed(); old_properties.draw_border = border_and_titleblock.borderIsDisplayed();
old_properties.draw_titleblock = border_and_titleblock.titleBlockIsDisplayed(); old_properties.draw_titleblock = border_and_titleblock.titleBlockIsDisplayed();
old_properties.draw_terminals = drawTerminals(); old_properties.draw_terminals = drawTerminals();
old_properties.draw_colored_conductors = drawColoredConductors(); old_properties.draw_colored_conductors = drawColoredConductors();
old_properties.exported_area = useBorder() ? QET::BorderArea old_properties.exported_area = useBorder() ? QET::BorderArea
: QET::ElementsArea; : QET::ElementsArea;
// apply the new rendering options // apply the new rendering options
// applique les nouvelles options de rendu // applique les nouvelles options de rendu
setUseBorder (new_properties.exported_area == QET::BorderArea); setUseBorder (new_properties.exported_area == QET::BorderArea);
setDrawTerminals (new_properties.draw_terminals); setDrawTerminals (new_properties.draw_terminals);
setDrawColoredConductors (new_properties.draw_colored_conductors); setDrawColoredConductors (new_properties.draw_colored_conductors);
setDisplayGrid (new_properties.draw_grid); setDisplayGrid (new_properties.draw_grid);
border_and_titleblock.displayBorder(new_properties.draw_border); border_and_titleblock.displayBorder(new_properties.draw_border);
border_and_titleblock.displayTitleBlock (new_properties.draw_titleblock); border_and_titleblock.displayTitleBlock (new_properties.draw_titleblock);

View File

@@ -96,7 +96,7 @@ class Diagram : public QGraphicsScene
/// margin around the diagram /// margin around the diagram
static const qreal margin; static const qreal margin;
/// background color of diagram /// background color of diagram
static QColor background_color; // default value set in cpp file static QColor background_color;
/// Hash containing max values for folio sequential autonums in this diagram /// Hash containing max values for folio sequential autonums in this diagram
QHash <QString, QStringList> m_elmt_unitfolio_max; QHash <QString, QStringList> m_elmt_unitfolio_max;
QHash <QString, QStringList> m_elmt_tenfolio_max; QHash <QString, QStringList> m_elmt_tenfolio_max;
@@ -108,10 +108,10 @@ class Diagram : public QGraphicsScene
private: private:
QGraphicsLineItem *conductor_setter_; QGraphicsLineItem *conductor_setter_;
ElementsMover m_elements_mover; ElementsMover m_elements_mover;
ElementTextsMover m_element_texts_mover; ElementTextsMover m_element_texts_mover;
QGIManager *qgi_manager_; QGIManager *qgi_manager_;
QETProject *m_project; QETProject *m_project;
QDomDocument xml_document_; QDomDocument xml_document_;
@@ -156,9 +156,9 @@ class Diagram : public QGraphicsScene
// methods related to parent project // methods related to parent project
QETProject *project() const; QETProject *project() const;
int folioIndex() const; int folioIndex() const;
void showMe() {emit showDiagram(this);} void showMe() {emit showDiagram(this);}
bool isReadOnly() const; bool isReadOnly() const;
// methods related to conductor creation // methods related to conductor creation
void setConductor(bool); void setConductor(bool);
@@ -173,13 +173,13 @@ class Diagram : public QGraphicsScene
bool = true, bool = true,
DiagramContent * = nullptr); DiagramContent * = nullptr);
bool fromXml(QDomDocument &, bool fromXml(QDomDocument &,
QPointF = QPointF(), QPointF = QPointF(),
bool = true, bool = true,
DiagramContent * = nullptr); DiagramContent * = nullptr);
bool fromXml(QDomElement &, bool fromXml(QDomElement &,
QPointF = QPointF(), QPointF = QPointF(),
bool = true, bool = true,
DiagramContent * = nullptr); DiagramContent * = nullptr);
void folioSequentialsToXml(QHash<QString, void folioSequentialsToXml(QHash<QString,
QStringList>*, QStringList>*,
QDomElement *, QDomElement *,
@@ -187,17 +187,17 @@ class Diagram : public QGraphicsScene
const QString&, const QString&,
QDomDocument *); QDomDocument *);
void folioSequentialsFromXml(const QDomElement&, void folioSequentialsFromXml(const QDomElement&,
QHash<QString, QHash<QString,
QStringList>*, QStringList>*,
const QString&, const QString&,
const QString&, const QString&,
const QString&, const QString&,
const QString&); const QString&);
void refreshContents(); void refreshContents();
// methods related to graphics items addition/removal on the diagram // methods related to graphics items addition/removal on the diagram
virtual void addItem (QGraphicsItem *item); virtual void addItem (QGraphicsItem *item);
virtual void removeItem (QGraphicsItem *item); virtual void removeItem (QGraphicsItem *item);
// methods related to graphics options // methods related to graphics options
@@ -253,8 +253,8 @@ class Diagram : public QGraphicsScene
const QString& seq, const QString& seq,
NumerotationContext *nc); NumerotationContext *nc);
void loadFolioSeqHash (QHash<QString, QStringList> *hash, void loadFolioSeqHash (QHash<QString, QStringList> *hash,
const QString& title, const QString& seq, const QString& title, const QString& seq,
NumerotationContext *nc); NumerotationContext *nc);
void changeZValue(QET::DepthOption option); void changeZValue(QET::DepthOption option);
public slots: public slots:
@@ -262,7 +262,7 @@ class Diagram : public QGraphicsScene
void titleChanged(const QString &); void titleChanged(const QString &);
void titleBlockTemplateChanged(const QString &); void titleBlockTemplateChanged(const QString &);
void titleBlockTemplateRemoved(const QString &, void titleBlockTemplateRemoved(const QString &,
const QString & = QString()); const QString & = QString());
void setTitleBlockTemplate(const QString &); void setTitleBlockTemplate(const QString &);
void updateLabels(); void updateLabels();
void loadElmtFolioSeq(); void loadElmtFolioSeq();
@@ -282,8 +282,6 @@ class Diagram : public QGraphicsScene
/// from the diagram within elements collection /// from the diagram within elements collection
void findElementRequired(const ElementsLocation &); void findElementRequired(const ElementsLocation &);
/// Signal emitted when users wish to edit an element from the diagram
void editElementRequired(const ElementsLocation &);
void diagramActivated(); void diagramActivated();
}; };
Q_DECLARE_METATYPE(Diagram *) Q_DECLARE_METATYPE(Diagram *)

View File

@@ -135,7 +135,7 @@ bool DiagramContext::keyMustShow(const QString &key) const
bool DiagramContext::operator==(const DiagramContext &dc) const bool DiagramContext::operator==(const DiagramContext &dc) const
{ {
return(m_content == dc.m_content && return(m_content == dc.m_content &&
m_content_show == dc.m_content_show); m_content_show == dc.m_content_show);
} }

View File

@@ -34,23 +34,23 @@
/** /**
* Key for element : * Key for element :
* label -> label or identification of element * label -> label or identification of element
* formula -> formula used to create the label (formula is make with variable) * formula -> formula used to create the label (formula is make with variable)
* designation -> exhaustive comment used to explain what the element does. * designation -> exhaustive comment used to explain what the element does.
* description -> exhaustive description used to explain what the element does. * description -> exhaustive description used to explain what the element does.
* plant -> the plant assigned to the element * plant -> the plant assigned to the element
* comment -> a little comment wich can be displayed in the folio * comment -> a little comment wich can be displayed in the folio
* manufacturer -> the manufacturer of the element * manufacturer -> the manufacturer of the element
* manufacturer_reference -> the manufacturer reference of the element * manufacturer_reference -> the manufacturer reference of the element
* quantity -> quantity of the element * quantity -> quantity of the element
* unity -> unity of the element * unity -> unity of the element
* auxiliary1 -> auxiliary 1 of element * auxiliary1 -> auxiliary 1 of element
* auxiliary2 -> auxiliary 2 of element * auxiliary2 -> auxiliary 2 of element
* machine_manufacturer_reference -> reference of the machine manufacturer * machine_manufacturer_reference -> reference of the machine manufacturer
* supplier -> the supplier of the element * supplier -> the supplier of the element
* function -> the function of element * function -> the function of element
* location -> the location assigned to the element * location -> the location assigned to the element
* frozenLabel -> label locked at a given time * frozenLabel -> label locked at a given time
* *
*/ */
class DiagramContext class DiagramContext

View File

@@ -210,7 +210,7 @@ void ArcEditor::updateArcA()
@brief ArcEditor::updateForm @brief ArcEditor::updateForm
Update the value of the widgets Update the value of the widgets
*/ */
void ArcEditor::updateFormPriv() void ArcEditor::updateForm()
{ {
if (!m_part) return; if (!m_part) return;
activeConnections(false); activeConnections(false);

View File

@@ -46,6 +46,8 @@ class ArcEditor : public ElementItemEditor
QDoubleSpinBox *x, *y, *h, *v; QDoubleSpinBox *x, *y, *h, *v;
QSpinBox *angle, *start_angle; QSpinBox *angle, *start_angle;
bool m_locked; bool m_locked;
QList <QMetaObject::Connection> m_change_connections;
// methods // methods
public: public:
@@ -57,7 +59,7 @@ class ArcEditor : public ElementItemEditor
public slots: public slots:
void updateArcS(); void updateArcS();
void updateArcA(); void updateArcA();
void updateFormPriv() override; void updateForm() override;
void updateRect(); void updateRect();
private: private:

View File

@@ -42,11 +42,6 @@ ElementScene *ElementItemEditor::elementScene() const
return(element_editor -> elementScene()); return(element_editor -> elementScene());
} }
void ElementItemEditor::updateForm()
{
updateFormPriv();
}
/// @return la QUndoStack a utiliser pour les annulations /// @return la QUndoStack a utiliser pour les annulations
QUndoStack &ElementItemEditor::undoStack() const QUndoStack &ElementItemEditor::undoStack() const
{ {

View File

@@ -55,16 +55,8 @@ class ElementItemEditor : public QWidget
virtual CustomElementPart *currentPart() const = 0; virtual CustomElementPart *currentPart() const = 0;
virtual QList<CustomElementPart*> currentParts() const = 0; virtual QList<CustomElementPart*> currentParts() const = 0;
/*! virtual void updateForm() = 0;
* \brief updateForm
* update the values of the widget
*/
virtual void updateForm();
private:
virtual void updateFormPriv() = 0;
protected:
QList<QMetaObject::Connection> m_change_connections;
// attributes // attributes
private: private:
QETElementEditor *element_editor; QETElementEditor *element_editor;

View File

@@ -79,8 +79,8 @@ class AbstractPartEllipse : public CustomElementGraphicPart
protected: protected:
QList<QPointF> saved_points_; QList<QPointF> saved_points_;
QRectF m_rect; QRectF m_rect;
qreal m_start_angle{0}; qreal m_start_angle;
qreal m_span_angle{-1440}; qreal m_span_angle;
QVector<QetGraphicsHandlerItem *> m_handler_vector; QVector<QetGraphicsHandlerItem *> m_handler_vector;
}; };

View File

@@ -20,8 +20,6 @@
#include "../../QPropertyUndoCommand/qpropertyundocommand.h" #include "../../QPropertyUndoCommand/qpropertyundocommand.h"
#include "../elementscene.h" #include "../elementscene.h"
#include "../../qetxml.h"
#include <QRegularExpression> #include <QRegularExpression>
/** /**
@@ -116,7 +114,7 @@ qreal CustomElementGraphicPart::penWeight() const
if (_lineweight == NoneWeight || _lineweight == ThinWeight) return 0; if (_lineweight == NoneWeight || _lineweight == ThinWeight) return 0;
else if (_lineweight == NormalWeight) return 1; else if (_lineweight == NormalWeight) return 1;
else if (_lineweight == UltraWeight) return 2; else if (_lineweight == UltraWeight) return 2;
else if (_lineweight == BigWeight) return 5; else if (_lineweight == BigWeight) return 5;
return 1; return 1;
} }
@@ -169,21 +167,21 @@ void CustomElementGraphicPart::stylesToXml(QDomElement &qde) const
QString css_like_styles; QString css_like_styles;
css_like_styles += "line-style:"; css_like_styles += "line-style:";
if (_linestyle == DashedStyle) css_like_styles += "dashed"; if (_linestyle == DashedStyle) css_like_styles += "dashed";
else if (_linestyle == DottedStyle) css_like_styles += "dotted"; else if (_linestyle == DottedStyle) css_like_styles += "dotted";
else if (_linestyle == DashdottedStyle) css_like_styles += "dashdotted"; else if (_linestyle == DashdottedStyle) css_like_styles += "dashdotted";
else if (_linestyle == NormalStyle) css_like_styles += "normal"; else if (_linestyle == NormalStyle) css_like_styles += "normal";
css_like_styles += ";line-weight:"; css_like_styles += ";line-weight:";
if (_lineweight == NoneWeight) css_like_styles += "none"; if (_lineweight == NoneWeight) css_like_styles += "none";
else if (_lineweight == ThinWeight) css_like_styles += "thin"; else if (_lineweight == ThinWeight) css_like_styles += "thin";
else if (_lineweight == NormalWeight) css_like_styles += "normal"; else if (_lineweight == NormalWeight) css_like_styles += "normal";
else if (_lineweight == UltraWeight) css_like_styles += "hight"; else if (_lineweight == UltraWeight) css_like_styles += "hight";
else if (_lineweight == BigWeight) css_like_styles += "eleve"; else if (_lineweight == BigWeight) css_like_styles += "eleve";
css_like_styles += ";filling:"; css_like_styles += ";filling:";
if (_filling == NoneFilling) css_like_styles += "none"; if (_filling == NoneFilling) css_like_styles += "none";
else if (_filling == BlackFilling) css_like_styles += "black"; else if (_filling == BlackFilling) css_like_styles += "black";
else if (_filling == WhiteFilling) css_like_styles += "white"; else if (_filling == WhiteFilling) css_like_styles += "white";
else if (_filling == GreenFilling) css_like_styles += "green"; else if (_filling == GreenFilling) css_like_styles += "green";
@@ -344,7 +342,7 @@ void CustomElementGraphicPart::stylesToXml(QDomElement &qde) const
css_like_styles += ";color:"; css_like_styles += ";color:";
if (_color == WhiteColor) css_like_styles += "white"; if (_color == WhiteColor) css_like_styles += "white";
else if (_color == BlackColor) css_like_styles += "black"; else if (_color == BlackColor) css_like_styles += "black";
else if (_color == GreenColor) css_like_styles += "green"; else if (_color == GreenColor) css_like_styles += "green";
else if (_color == RedColor) css_like_styles += "red"; else if (_color == RedColor) css_like_styles += "red";
@@ -499,6 +497,7 @@ void CustomElementGraphicPart::stylesToXml(QDomElement &qde) const
else if (_color == HTMLGrayBlackColor) css_like_styles += "HTMLGrayBlack"; else if (_color == HTMLGrayBlackColor) css_like_styles += "HTMLGrayBlack";
else if (_color == NoneColor) css_like_styles += "none"; else if (_color == NoneColor) css_like_styles += "none";
qde.setAttribute("style", css_like_styles); qde.setAttribute("style", css_like_styles);
qde.setAttribute("antialias", _antialiased ? "true" : "false"); qde.setAttribute("antialias", _antialiased ? "true" : "false");
} }
@@ -513,9 +512,6 @@ void CustomElementGraphicPart::stylesFromXml(const QDomElement &qde)
{ {
resetStyles(); resetStyles();
QString style_string;
QETXML::propertyString(qde, "style", &style_string);
//Get the list of pair style/value //Get the list of pair style/value
#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) // ### Qt 6: remove #if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) // ### Qt 6: remove
QStringList styles = qde.attribute("style").split(";", QString::SkipEmptyParts); QStringList styles = qde.attribute("style").split(";", QString::SkipEmptyParts);
@@ -903,17 +899,17 @@ void CustomElementGraphicPart::applyStylesToQPainter(QPainter &painter) const
QBrush brush = painter.brush(); QBrush brush = painter.brush();
//Apply pen style //Apply pen style
if (_linestyle == DashedStyle) pen.setStyle(Qt::DashLine); if (_linestyle == DashedStyle) pen.setStyle(Qt::DashLine);
else if (_linestyle == DashdottedStyle) pen.setStyle(Qt::DashDotLine); else if (_linestyle == DashdottedStyle) pen.setStyle(Qt::DashDotLine);
else if (_linestyle == DottedStyle) pen.setStyle(Qt::DotLine); else if (_linestyle == DottedStyle) pen.setStyle(Qt::DotLine);
else if (_linestyle == NormalStyle) pen.setStyle(Qt::SolidLine); else if (_linestyle == NormalStyle) pen.setStyle(Qt::SolidLine);
//Apply pen width //Apply pen width
if (_lineweight == NoneWeight) pen.setColor(QColor(0, 0, 0, 0)); if (_lineweight == NoneWeight) pen.setColor(QColor(0, 0, 0, 0));
else if (_lineweight == ThinWeight) pen.setWidth(0); else if (_lineweight == ThinWeight) pen.setWidth(0);
else if (_lineweight == NormalWeight) pen.setWidthF(1.0); else if (_lineweight == NormalWeight) pen.setWidthF(1.0);
else if (_lineweight == UltraWeight) pen.setWidthF(2.0); else if (_lineweight == UltraWeight) pen.setWidthF(2.0);
else if (_lineweight == BigWeight) pen.setWidthF(5.0); else if (_lineweight == BigWeight) pen.setWidthF(5.0);
//Apply brush color //Apply brush color
if (_filling == NoneFilling) brush.setStyle(Qt::NoBrush); if (_filling == NoneFilling) brush.setStyle(Qt::NoBrush);
@@ -924,7 +920,7 @@ void CustomElementGraphicPart::applyStylesToQPainter(QPainter &painter) const
else else
{ {
brush.setStyle(Qt::SolidPattern); brush.setStyle(Qt::SolidPattern);
if (_filling == BlackFilling) brush.setColor(Qt::black); if (_filling == BlackFilling) brush.setColor(Qt::black);
else if (_filling == WhiteFilling) brush.setColor(Qt::white); else if (_filling == WhiteFilling) brush.setColor(Qt::white);
else if (_filling == GreenFilling) brush.setColor(Qt::green); else if (_filling == GreenFilling) brush.setColor(Qt::green);
else if (_filling == RedFilling) brush.setColor(Qt::red); else if (_filling == RedFilling) brush.setColor(Qt::red);
@@ -1080,7 +1076,7 @@ void CustomElementGraphicPart::applyStylesToQPainter(QPainter &painter) const
} }
//Apply pen color //Apply pen color
if (_color == WhiteColor) pen.setColor(QColor(255, 255, 255, pen.color().alpha())); if (_color == WhiteColor) pen.setColor(QColor(255, 255, 255, pen.color().alpha()));
else if (_color == BlackColor) pen.setColor(QColor( 0, 0, 0, pen.color().alpha())); else if (_color == BlackColor) pen.setColor(QColor( 0, 0, 0, pen.color().alpha()));
else if (_color == GreenColor) pen.setColor(QColor(Qt::green)); else if (_color == GreenColor) pen.setColor(QColor(Qt::green));
else if (_color == RedColor) pen.setColor(QColor(Qt::red)); else if (_color == RedColor) pen.setColor(QColor(Qt::red));
@@ -1236,8 +1232,8 @@ void CustomElementGraphicPart::applyStylesToQPainter(QPainter &painter) const
else if (_color == NoneColor) pen.setBrush(Qt::transparent); else if (_color == NoneColor) pen.setBrush(Qt::transparent);
//Apply antialiasing //Apply antialiasing
painter.setRenderHint(QPainter::Antialiasing, _antialiased); painter.setRenderHint(QPainter::Antialiasing, _antialiased);
painter.setRenderHint(QPainter::TextAntialiasing, _antialiased); painter.setRenderHint(QPainter::TextAntialiasing, _antialiased);
painter.setRenderHint(QPainter::SmoothPixmapTransform, _antialiased); painter.setRenderHint(QPainter::SmoothPixmapTransform, _antialiased);
painter.setPen(pen); painter.setPen(pen);
@@ -1316,7 +1312,7 @@ void CustomElementGraphicPart::mouseReleaseEvent(QGraphicsSceneMouseEvent *event
if((event->button() & Qt::LeftButton) && (flags() & QGraphicsItem::ItemIsMovable) && m_origin_pos != pos()) if((event->button() & Qt::LeftButton) && (flags() & QGraphicsItem::ItemIsMovable) && m_origin_pos != pos())
{ {
QPropertyUndoCommand *undo = new QPropertyUndoCommand(this, "pos", QVariant(m_origin_pos), QVariant(pos())); QPropertyUndoCommand *undo = new QPropertyUndoCommand(this, "pos", QVariant(m_origin_pos), QVariant(pos()));
undo->setText(tr("D??placer une primitive")); undo->setText(tr("Déplacer une primitive"));
undo->enableAnimation(); undo->enableAnimation();
elementScene()->undoStack().push(undo); elementScene()->undoStack().push(undo);
} }

View File

@@ -40,9 +40,9 @@ class CustomElementGraphicPart : public QGraphicsObject, public CustomElementPar
Q_PROPERTY(LineStyle line_style READ lineStyle WRITE setLineStyle) Q_PROPERTY(LineStyle line_style READ lineStyle WRITE setLineStyle)
Q_PROPERTY(LineWeight line_weight READ lineWeight WRITE setLineWeight) Q_PROPERTY(LineWeight line_weight READ lineWeight WRITE setLineWeight)
Q_PROPERTY(Filling filling READ filling WRITE setFilling) Q_PROPERTY(Filling filling READ filling WRITE setFilling)
Q_PROPERTY(Color color READ color WRITE setColor) Q_PROPERTY(Color color READ color WRITE setColor)
Q_PROPERTY(bool antialias READ antialiased WRITE setAntialiased) Q_PROPERTY(bool antialias READ antialiased WRITE setAntialiased)
public: public:
//Line style //Line style
@@ -62,122 +62,122 @@ class CustomElementGraphicPart : public QGraphicsObject, public CustomElementPar
//Filling color of the part : NoneFilling -> No filling (i.e. transparent) //Filling color of the part : NoneFilling -> No filling (i.e. transparent)
enum Filling { NoneFilling, BlackFilling, WhiteFilling, enum Filling { NoneFilling, BlackFilling, WhiteFilling,
GreenFilling, RedFilling, BlueFilling, GreenFilling, RedFilling, BlueFilling,
GrayFilling, BrunFilling, YellowFilling, GrayFilling, BrunFilling, YellowFilling,
CyanFilling, MagentaFilling, LightgrayFilling, CyanFilling, MagentaFilling, LightgrayFilling,
OrangeFilling, PurpleFilling, OrangeFilling, PurpleFilling,
HTMLPinkPinkFilling, HTMLPinkLightPinkFilling, HTMLPinkPinkFilling, HTMLPinkLightPinkFilling,
HTMLPinkHotPinkFilling, HTMLPinkDeepPinkFilling, HTMLPinkHotPinkFilling, HTMLPinkDeepPinkFilling,
HTMLPinkPaleVioletRedFilling, HTMLPinkPaleVioletRedFilling,
HTMLPinkMediumVioletRedFilling, HTMLPinkMediumVioletRedFilling,
HTMLRedLightSalmonFilling, HTMLRedSalmonFilling, HTMLRedLightSalmonFilling, HTMLRedSalmonFilling,
HTMLRedDarkSalmonFilling, HTMLRedDarkSalmonFilling,
HTMLRedLightCoralFilling, HTMLRedLightCoralFilling,
HTMLRedIndianRedFilling, HTMLRedCrimsonFilling, HTMLRedIndianRedFilling, HTMLRedCrimsonFilling,
HTMLRedFirebrickFilling, HTMLRedDarkRedFilling, HTMLRedFirebrickFilling, HTMLRedDarkRedFilling,
HTMLRedRedFilling, HTMLOrangeOrangeRedFilling, HTMLRedRedFilling, HTMLOrangeOrangeRedFilling,
HTMLOrangeTomatoFilling, HTMLOrangeCoralFilling, HTMLOrangeTomatoFilling, HTMLOrangeCoralFilling,
HTMLOrangeDarkOrangeFilling, HTMLOrangeDarkOrangeFilling,
HTMLOrangeOrangeFilling, HTMLYellowYellowFilling, HTMLOrangeOrangeFilling, HTMLYellowYellowFilling,
HTMLYellowLightYellowFilling, HTMLYellowLightYellowFilling,
HTMLYellowLemonChiffonFilling, HTMLYellowLemonChiffonFilling,
HTMLYellowLightGoldenrodYellowFilling, HTMLYellowLightGoldenrodYellowFilling,
HTMLYellowPapayaWhipFilling, HTMLYellowPapayaWhipFilling,
HTMLYellowMoccasinFilling, HTMLYellowMoccasinFilling,
HTMLYellowPeachPuffFilling, HTMLYellowPeachPuffFilling,
HTMLYellowPaleGoldenrodFilling, HTMLYellowPaleGoldenrodFilling,
HTMLYellowKhakiFilling, HTMLYellowKhakiFilling,
HTMLYellowDarkKhakiFilling, HTMLYellowDarkKhakiFilling,
HTMLYellowGoldFilling, HTMLBrownCornsilkFilling, HTMLYellowGoldFilling, HTMLBrownCornsilkFilling,
HTMLBrownBlanchedAlmondFilling, HTMLBrownBlanchedAlmondFilling,
HTMLBrownBisqueFilling, HTMLBrownBisqueFilling,
HTMLBrownNavajoWhiteFilling, HTMLBrownNavajoWhiteFilling,
HTMLBrownWheatFilling, HTMLBrownBurlywoodFilling, HTMLBrownWheatFilling, HTMLBrownBurlywoodFilling,
HTMLBrownTanFilling, HTMLBrownRosyBrownFilling, HTMLBrownTanFilling, HTMLBrownRosyBrownFilling,
HTMLBrownSandyBrownFilling, HTMLBrownSandyBrownFilling,
HTMLBrownGoldenrodFilling, HTMLBrownGoldenrodFilling,
HTMLBrownDarkGoldenrodFilling, HTMLBrownDarkGoldenrodFilling,
HTMLBrownPeruFilling, HTMLBrownChocolateFilling, HTMLBrownPeruFilling, HTMLBrownChocolateFilling,
HTMLBrownSaddleBrownFilling, HTMLBrownSaddleBrownFilling,
HTMLBrownSiennaFilling, HTMLBrownBrownFilling, HTMLBrownSiennaFilling, HTMLBrownBrownFilling,
HTMLBrownMaroonFilling, HTMLBrownMaroonFilling,
HTMLGreenDarkOliveGreenFilling, HTMLGreenDarkOliveGreenFilling,
HTMLGreenOliveFilling, HTMLGreenOliveDrabFilling, HTMLGreenOliveFilling, HTMLGreenOliveDrabFilling,
HTMLGreenYellowGreenFilling, HTMLGreenYellowGreenFilling,
HTMLGreenLimeGreenFilling, HTMLGreenLimeFilling, HTMLGreenLimeGreenFilling, HTMLGreenLimeFilling,
HTMLGreenLawnGreenFilling, HTMLGreenLawnGreenFilling,
HTMLGreenChartreuseFilling, HTMLGreenChartreuseFilling,
HTMLGreenGreenYellowFilling, HTMLGreenGreenYellowFilling,
HTMLGreenSpringGreenFilling, HTMLGreenSpringGreenFilling,
HTMLGreenMediumSpringGreenFilling, HTMLGreenMediumSpringGreenFilling,
HTMLGreenLightGreenFilling, HTMLGreenLightGreenFilling,
HTMLGreenPaleGreenFilling, HTMLGreenPaleGreenFilling,
HTMLGreenDarkSeaGreenFilling, HTMLGreenDarkSeaGreenFilling,
HTMLGreenMediumAquamarineFilling, HTMLGreenMediumAquamarineFilling,
HTMLGreenMediumSeaGreenFilling, HTMLGreenMediumSeaGreenFilling,
HTMLGreenSeaGreenFilling, HTMLGreenSeaGreenFilling,
HTMLGreenForestGreenFilling, HTMLGreenForestGreenFilling,
HTMLGreenGreenFilling, HTMLGreenDarkGreenFilling, HTMLGreenGreenFilling, HTMLGreenDarkGreenFilling,
HTMLCyanAquaFilling, HTMLCyanCyanFilling, HTMLCyanAquaFilling, HTMLCyanCyanFilling,
HTMLCyanLightCyanFilling, HTMLCyanLightCyanFilling,
HTMLCyanPaleTurquoiseFilling, HTMLCyanPaleTurquoiseFilling,
HTMLCyanAquamarineFilling, HTMLCyanAquamarineFilling,
HTMLCyanTurquoiseFilling, HTMLCyanTurquoiseFilling,
HTMLCyanMediumTurquoiseFilling, HTMLCyanMediumTurquoiseFilling,
HTMLCyanDarkTurquoiseFilling, HTMLCyanDarkTurquoiseFilling,
HTMLCyanLightSeaGreenFilling, HTMLCyanLightSeaGreenFilling,
HTMLCyanCadetBlueFilling, HTMLCyanCadetBlueFilling,
HTMLCyanDarkCyanFilling, HTMLCyanTealFilling, HTMLCyanDarkCyanFilling, HTMLCyanTealFilling,
HTMLBlueLightSteelBlueFilling, HTMLBlueLightSteelBlueFilling,
HTMLBluePowderBlueFilling, HTMLBluePowderBlueFilling,
HTMLBlueLightBlueFilling, HTMLBlueSkyBlueFilling, HTMLBlueLightBlueFilling, HTMLBlueSkyBlueFilling,
HTMLBlueLightSkyBlueFilling, HTMLBlueLightSkyBlueFilling,
HTMLBlueDeepSkyBlueFilling, HTMLBlueDeepSkyBlueFilling,
HTMLBlueDodgerBlueFilling, HTMLBlueDodgerBlueFilling,
HTMLBlueCornflowerBlueFilling, HTMLBlueCornflowerBlueFilling,
HTMLBlueSteelBlueFilling, HTMLBlueSteelBlueFilling,
HTMLBlueRoyalBlueFilling, HTMLBlueBlueFilling, HTMLBlueRoyalBlueFilling, HTMLBlueBlueFilling,
HTMLBlueMediumBlueFilling, HTMLBlueMediumBlueFilling,
HTMLBlueDarkBlueFilling, HTMLBlueNavyFilling, HTMLBlueDarkBlueFilling, HTMLBlueNavyFilling,
HTMLBlueMidnightBlueFilling, HTMLBlueMidnightBlueFilling,
HTMLPurpleLavenderFilling, HTMLPurpleLavenderFilling,
HTMLPurpleThistleFilling, HTMLPurplePlumFilling, HTMLPurpleThistleFilling, HTMLPurplePlumFilling,
HTMLPurpleVioletFilling, HTMLPurpleOrchidFilling, HTMLPurpleVioletFilling, HTMLPurpleOrchidFilling,
HTMLPurpleFuchsiaFilling, HTMLPurpleFuchsiaFilling,
HTMLPurpleMagentaFilling, HTMLPurpleMagentaFilling,
HTMLPurpleMediumOrchidFilling, HTMLPurpleMediumOrchidFilling,
HTMLPurpleMediumPurpleFilling, HTMLPurpleMediumPurpleFilling,
HTMLPurpleBlueVioletFilling, HTMLPurpleBlueVioletFilling,
HTMLPurpleDarkVioletFilling, HTMLPurpleDarkVioletFilling,
HTMLPurpleDarkOrchidFilling, HTMLPurpleDarkOrchidFilling,
HTMLPurpleDarkMagentaFilling, HTMLPurpleDarkMagentaFilling,
HTMLPurplePurpleFilling, HTMLPurpleIndigoFilling, HTMLPurplePurpleFilling, HTMLPurpleIndigoFilling,
HTMLPurpleDarkSlateBlueFilling, HTMLPurpleDarkSlateBlueFilling,
HTMLPurpleSlateBlueFilling, HTMLPurpleSlateBlueFilling,
HTMLPurpleMediumSlateBlueFilling, HTMLPurpleMediumSlateBlueFilling,
HTMLWhiteWhiteFilling, HTMLWhiteSnowFilling, HTMLWhiteWhiteFilling, HTMLWhiteSnowFilling,
HTMLWhiteHoneydewFilling, HTMLWhiteHoneydewFilling,
HTMLWhiteMintCreamFilling, HTMLWhiteAzureFilling, HTMLWhiteMintCreamFilling, HTMLWhiteAzureFilling,
HTMLWhiteAliceBlueFilling, HTMLWhiteAliceBlueFilling,
HTMLWhiteGhostWhiteFilling, HTMLWhiteGhostWhiteFilling,
HTMLWhiteWhiteSmokeFilling, HTMLWhiteWhiteSmokeFilling,
HTMLWhiteSeashellFilling, HTMLWhiteBeigeFilling, HTMLWhiteSeashellFilling, HTMLWhiteBeigeFilling,
HTMLWhiteOldLaceFilling, HTMLWhiteOldLaceFilling,
HTMLWhiteFloralWhiteFilling, HTMLWhiteFloralWhiteFilling,
HTMLWhiteIvoryFilling, HTMLWhiteIvoryFilling,
HTMLWhiteAntiqueWhiteFilling, HTMLWhiteAntiqueWhiteFilling,
HTMLWhiteLinenFilling, HTMLWhiteLinenFilling,
HTMLWhiteLavenderBlushFilling, HTMLWhiteLavenderBlushFilling,
HTMLWhiteMistyRoseFilling, HTMLWhiteMistyRoseFilling,
HTMLGrayGainsboroFilling, HTMLGrayGainsboroFilling,
HTMLGrayLightGrayFilling, HTMLGraySilverFilling, HTMLGrayLightGrayFilling, HTMLGraySilverFilling,
HTMLGrayDarkGrayFilling, HTMLGrayGrayFilling, HTMLGrayDarkGrayFilling, HTMLGrayGrayFilling,
HTMLGrayDimGrayFilling, HTMLGrayDimGrayFilling,
HTMLGrayLightSlateGrayFilling, HTMLGrayLightSlateGrayFilling,
HTMLGraySlateGrayFilling, HTMLGraySlateGrayFilling,
HTMLGrayDarkSlateGrayFilling, HTMLGrayDarkSlateGrayFilling,
HTMLGrayBlackFilling, HorFilling, VerFilling, HTMLGrayBlackFilling, HorFilling, VerFilling,
BdiagFilling, FdiagFilling}; BdiagFilling, FdiagFilling};
Q_ENUM (Filling) Q_ENUM (Filling)
//Line color //Line color
@@ -269,18 +269,18 @@ class CustomElementGraphicPart : public QGraphicsObject, public CustomElementPar
~CustomElementGraphicPart() override; ~CustomElementGraphicPart() override;
static void drawCross (const QPointF &center, static void drawCross (const QPointF &center,
QPainter *painter); QPainter *painter);
//Getter and setter //Getter and setter
LineStyle lineStyle () const {return _linestyle;} LineStyle lineStyle () const {return _linestyle;}
void setLineStyle (const LineStyle ls); void setLineStyle (const LineStyle ls);
LineWeight lineWeight () const {return _lineweight;} LineWeight lineWeight () const {return _lineweight;}
void setLineWeight (const LineWeight lw); void setLineWeight (const LineWeight lw);
qreal penWeight () const; qreal penWeight () const;
Filling filling () const {return _filling;} Filling filling () const {return _filling;}
void setFilling(const Filling f); void setFilling(const Filling f);
Color color () const {return _color;} Color color () const {return _color;}
void setColor(const Color c); void setColor(const Color c);
@@ -299,11 +299,11 @@ class CustomElementGraphicPart : public QGraphicsObject, public CustomElementPar
virtual QPainterPath shadowShape ()const = 0; virtual QPainterPath shadowShape ()const = 0;
virtual void setHandlerColor(QPointF /*pos*/, virtual void setHandlerColor(QPointF /*pos*/,
const QColor &/*color*/) {} const QColor &/*color*/) {}
virtual void resetAllHandlerColor() {} virtual void resetAllHandlerColor() {}
protected: protected:
void stylesToXml (QDomElement &) const; void stylesToXml (QDomElement &) const;
void stylesFromXml(const QDomElement &); void stylesFromXml(const QDomElement &);
void resetStyles (); void resetStyles ();
void applyStylesToQPainter(QPainter &) const; void applyStylesToQPainter(QPainter &) const;

View File

@@ -19,7 +19,6 @@
#define CUSTOM_ELEMENT_PART_H #define CUSTOM_ELEMENT_PART_H
#include "../../qet.h" #include "../../qet.h"
#include "../../properties/propertiesinterface.h"
class CustomElement; class CustomElement;
class ElementPrimitiveDecorator; class ElementPrimitiveDecorator;
@@ -38,7 +37,7 @@ class QGraphicsSceneMouseEvent;
there is no point for those classes to store their visual representation there is no point for those classes to store their visual representation
with anything more complex than a QImage. with anything more complex than a QImage.
*/ */
class CustomElementPart: public PropertiesInterface { class CustomElementPart {
// constructors, destructor // constructors, destructor
public: public:
/** /**
@@ -62,6 +61,14 @@ class CustomElementPart: public PropertiesInterface {
// methods // methods
public: public:
/**
Load the primitive from an XML element that describes it
*/
virtual void fromXml(const QDomElement &) = 0;
/**
Export the primitive as an XML element
*/
virtual const QDomElement toXml(QDomDocument &) const = 0;
/** /**
Set a specific property of the primitive Set a specific property of the primitive
*/ */
@@ -85,7 +92,7 @@ class CustomElementPart: public PropertiesInterface {
Make this part fit into the provided rectangle. Make this part fit into the provided rectangle.
*/ */
virtual void handleUserTransformation(const QRectF &, virtual void handleUserTransformation(const QRectF &,
const QRectF &) = 0; const QRectF &) = 0;
/// @return a pointer to the parent element editor /// @return a pointer to the parent element editor
virtual QETElementEditor *elementEditor() const; virtual QETElementEditor *elementEditor() const;
/** /**

View File

@@ -22,8 +22,6 @@
#include "../../QetGraphicsItemModeler/qetgraphicshandlerutility.h" #include "../../QetGraphicsItemModeler/qetgraphicshandlerutility.h"
#include "../elementscene.h" #include "../elementscene.h"
#include "../../qetxml.h"
/** /**
@brief PartArc::PartArc @brief PartArc::PartArc
Constructor Constructor
@@ -31,9 +29,10 @@
@param parent : parent item @param parent : parent item
*/ */
PartArc::PartArc(QETElementEditor *editor, QGraphicsItem *parent) : PartArc::PartArc(QETElementEditor *editor, QGraphicsItem *parent) :
AbstractPartEllipse(editor, parent) AbstractPartEllipse(editor, parent)
{ {
setTagName("arc"); m_start_angle = 0;
m_span_angle = -1440;
} }
/** /**
@@ -103,18 +102,19 @@ void PartArc::paint(QPainter *painter, const QStyleOptionGraphicsItem *options,
@param xml_document : Xml document to use for create the xml element. @param xml_document : Xml document to use for create the xml element.
@return : an xml element that describe this arc @return : an xml element that describe this arc
*/ */
void PartArc::toXmlPriv(QDomElement& xml_element) const const QDomElement PartArc::toXml(QDomDocument &xml_document) const
{ {
xml_element.setTagName("arc"); QDomElement xml_element = xml_document.createElement("arc");
QPointF top_left(sceneTopLeft()); QPointF top_left(sceneTopLeft());
xml_element.setAttribute("x", QString("%1").arg(top_left.x())); xml_element.setAttribute("x", QString("%1").arg(top_left.x()));
xml_element.setAttribute("y", QString("%1").arg(top_left.y())); xml_element.setAttribute("y", QString("%1").arg(top_left.y()));
xml_element.setAttribute("width", QString("%1").arg(rect().width())); xml_element.setAttribute("width", QString("%1").arg(rect().width()));
xml_element.setAttribute("height", QString("%1").arg(rect().height())); xml_element.setAttribute("height", QString("%1").arg(rect().height()));
//to maintain compatibility with the previous version, we write the angle in degrees. //to maintain compatibility with the previous version, we write the angle in degrees.
xml_element.setAttribute("start", QString("%1").arg(m_start_angle / 16)); xml_element.setAttribute("start", QString("%1").arg(m_start_angle / 16));
xml_element.setAttribute("angle", QString("%1").arg(m_span_angle / 16)); xml_element.setAttribute("angle", QString("%1").arg(m_span_angle / 16));
stylesToXml(xml_element); stylesToXml(xml_element);
return(xml_element);
} }
/** /**
@@ -122,41 +122,15 @@ void PartArc::toXmlPriv(QDomElement& xml_element) const
Import the properties of this arc from a xml element. Import the properties of this arc from a xml element.
@param qde : Xml document to use. @param qde : Xml document to use.
*/ */
bool PartArc::fromXmlPriv(const QDomElement &qde) { void PartArc::fromXml(const QDomElement &qde) {
stylesFromXml(qde); stylesFromXml(qde);
m_rect = QRectF(mapFromScene(qde.attribute("x", "0").toDouble(),
qde.attribute("y", "0").toDouble()),
QSizeF(qde.attribute("width", "0").toDouble(),
qde.attribute("height", "0").toDouble()) );
double x=0, y=0, w=0, h=0; m_start_angle = qde.attribute("start", "0").toDouble() * 16;
if (QETXML::propertyDouble(qde, "x", &x) == QETXML::PropertyFlags::NoValidConversion || m_span_angle = qde.attribute("angle", "-1440").toDouble() * 16;
QETXML::propertyDouble(qde, "y", &y) == QETXML::PropertyFlags::NoValidConversion ||
QETXML::propertyDouble(qde, "width", &w) == QETXML::PropertyFlags::NoValidConversion ||
QETXML::propertyDouble(qde, "height", &h) == QETXML::PropertyFlags::NoValidConversion)
return false;
m_rect = QRectF(mapFromScene(x, y), QSizeF(w, h) );
m_start_angle = 0;
if (QETXML::propertyDouble(qde, "start", &m_start_angle) == QETXML::PropertyFlags::NoValidConversion)
return false;
m_start_angle *= 16;
m_span_angle = -1440;
if (QETXML::propertyDouble(qde, "angle", &m_span_angle) == QETXML::PropertyFlags::NoValidConversion)
return false;
m_span_angle *= 16;
return true;
}
bool PartArc::valideXml(QDomElement& element) {
if (QETXML::propertyDouble(element, "x") == QETXML::PropertyFlags::NoValidConversion ||
QETXML::propertyDouble(element, "y") == QETXML::PropertyFlags::NoValidConversion ||
QETXML::propertyDouble(element, "width") == QETXML::PropertyFlags::NoValidConversion ||
QETXML::propertyDouble(element, "height") == QETXML::PropertyFlags::NoValidConversion ||
QETXML::propertyDouble(element, "start") == QETXML::PropertyFlags::NoValidConversion ||
QETXML::propertyDouble(element, "angle") == QETXML::PropertyFlags::NoValidConversion)
return false;
return true;
} }
/** /**

View File

@@ -49,13 +49,10 @@ class PartArc : public AbstractPartEllipse
void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget * = nullptr) override; void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget * = nullptr) override;
//Name and XML //Name and XML
QString name() const override { return(QObject::tr("arc", "element part name")); } QString name() const override { return(QObject::tr("arc", "element part name")); }
QString xmlName() const override { return(QString("arc")); } QString xmlName() const override { return(QString("arc")); }
void toXmlPriv(QDomElement&xml_element) const override; const QDomElement toXml (QDomDocument &) const override;
bool fromXmlPriv (const QDomElement &) override; void fromXml (const QDomElement &) override;
static bool valideXml(QDomElement& element);
void toSettings(QSettings &,const QString & = QString()) const override {/*TODO: implement*/}
void fromSettings(QSettings &,const QString & = QString()) override{/*TODO: implement*/}
QPainterPath shape() const override; QPainterPath shape() const override;
QPainterPath shadowShape() const override; QPainterPath shadowShape() const override;
@@ -73,7 +70,7 @@ class PartArc : public AbstractPartEllipse
void switchResizeMode(); void switchResizeMode();
void adjusteHandlerPos(); void adjusteHandlerPos();
void handlerMousePressEvent (QetGraphicsHandlerItem *qghi, QGraphicsSceneMouseEvent *event); void handlerMousePressEvent (QetGraphicsHandlerItem *qghi, QGraphicsSceneMouseEvent *event);
void handlerMouseMoveEvent (QetGraphicsHandlerItem *qghi, QGraphicsSceneMouseEvent *event); void handlerMouseMoveEvent (QetGraphicsHandlerItem *qghi, QGraphicsSceneMouseEvent *event);
void handlerMouseReleaseEvent (QetGraphicsHandlerItem *qghi, QGraphicsSceneMouseEvent *event); void handlerMouseReleaseEvent (QetGraphicsHandlerItem *qghi, QGraphicsSceneMouseEvent *event);
void sceneSelectionChanged (); void sceneSelectionChanged ();

View File

@@ -21,8 +21,6 @@
#include "../../qetapp.h" #include "../../qetapp.h"
#include "../elementscene.h" #include "../elementscene.h"
#include "../../qetxml.h"
#include <QColor> #include <QColor>
#include <QFont> #include <QFont>
#include <QGraphicsSceneMouseEvent> #include <QGraphicsSceneMouseEvent>
@@ -32,7 +30,6 @@ PartDynamicTextField::PartDynamicTextField(QETElementEditor *editor, QGraphicsIt
CustomElementPart(editor), CustomElementPart(editor),
m_uuid(QUuid::createUuid()) m_uuid(QUuid::createUuid())
{ {
setTagName(xmlName());
setDefaultTextColor(Qt::black); setDefaultTextColor(Qt::black);
setFont(QETApp::dynamicTextsItemFont()); setFont(QETApp::dynamicTextsItemFont());
QSettings settings; QSettings settings;
@@ -96,91 +93,88 @@ void PartDynamicTextField::handleUserTransformation(
@param dom_doc @param dom_doc
@return @return
*/ */
void PartDynamicTextField::toXmlPriv(QDomElement& root_element) const const QDomElement PartDynamicTextField::toXml(QDomDocument &dom_doc) const
{ {
QDomElement root_element = dom_doc.createElement(xmlName());
root_element.setAttribute("x", QString::number(pos().x())); root_element.setAttribute("x", QString::number(pos().x()));
root_element.setAttribute("y", QString::number(pos().y())); root_element.setAttribute("y", QString::number(pos().y()));
root_element.setAttribute("z", QString::number(zValue())); root_element.setAttribute("z", QString::number(zValue()));
root_element.setAttribute("rotation", QString::number(QET::correctAngle(rotation()))); root_element.setAttribute("rotation", QString::number(QET::correctAngle(rotation())));
root_element.setAttribute("font", font().toString()); root_element.setAttribute("font", font().toString());
root_element.setAttribute("uuid", m_uuid.toString()); root_element.setAttribute("uuid", m_uuid.toString());
root_element.setAttribute("frame", m_frame? "true" : "false"); root_element.setAttribute("frame", m_frame? "true" : "false");
root_element.setAttribute("text_width", QString::number(m_text_width)); root_element.setAttribute("text_width", QString::number(m_text_width));
QMetaEnum me = DynamicElementTextItem::textFromMetaEnum(); QMetaEnum me = DynamicElementTextItem::textFromMetaEnum();
root_element.setAttribute("text_from", me.valueToKey(m_text_from)); root_element.setAttribute("text_from", me.valueToKey(m_text_from));
me = QMetaEnum::fromType<Qt::Alignment>(); me = QMetaEnum::fromType<Qt::Alignment>();
if(this -> alignment() &Qt::AlignRight) if(this -> alignment() &Qt::AlignRight)
root_element.setAttribute("Halignment", me.valueToKey(Qt::AlignRight)); root_element.setAttribute("Halignment", me.valueToKey(Qt::AlignRight));
else if(this -> alignment() &Qt::AlignLeft) else if(this -> alignment() &Qt::AlignLeft)
root_element.setAttribute("Halignment", me.valueToKey(Qt::AlignLeft)); root_element.setAttribute("Halignment", me.valueToKey(Qt::AlignLeft));
else if(this -> alignment() &Qt::AlignHCenter) else if(this -> alignment() &Qt::AlignHCenter)
root_element.setAttribute("Halignment", me.valueToKey(Qt::AlignHCenter)); root_element.setAttribute("Halignment", me.valueToKey(Qt::AlignHCenter));
if(this -> alignment() &Qt::AlignBottom) if(this -> alignment() &Qt::AlignBottom)
root_element.setAttribute("Valignment", me.valueToKey(Qt::AlignBottom)); root_element.setAttribute("Valignment", me.valueToKey(Qt::AlignBottom));
else if(this -> alignment() & Qt::AlignTop) else if(this -> alignment() & Qt::AlignTop)
root_element.setAttribute("Valignment", me.valueToKey(Qt::AlignTop)); root_element.setAttribute("Valignment", me.valueToKey(Qt::AlignTop));
else if(this -> alignment() &Qt::AlignVCenter) else if(this -> alignment() &Qt::AlignVCenter)
root_element.setAttribute("Valignment", me.valueToKey(Qt::AlignVCenter)); root_element.setAttribute("Valignment", me.valueToKey(Qt::AlignVCenter));
QDomElement dom_text = root_element.ownerDocument().createElement("text"); QDomElement dom_text = dom_doc.createElement("text");
dom_text.appendChild(root_element.ownerDocument().createTextNode(toPlainText())); dom_text.appendChild(dom_doc.createTextNode(toPlainText()));
root_element.appendChild(dom_text); root_element.appendChild(dom_text);
//Info name //Info name
if(!m_info_name.isEmpty()) { if(!m_info_name.isEmpty()) {
QDomElement dom_info_name = root_element.ownerDocument().createElement("info_name"); QDomElement dom_info_name = dom_doc.createElement("info_name");
dom_info_name.appendChild(root_element.ownerDocument().createTextNode(m_info_name)); dom_info_name.appendChild(dom_doc.createTextNode(m_info_name));
root_element.appendChild(dom_info_name); root_element.appendChild(dom_info_name);
} }
//Composite text //Composite text
if(!m_composite_text.isEmpty()) { if(!m_composite_text.isEmpty()) {
QDomElement dom_comp_text = root_element.ownerDocument().createElement("composite_text"); QDomElement dom_comp_text = dom_doc.createElement("composite_text");
dom_comp_text.appendChild(root_element.ownerDocument().createTextNode(m_composite_text)); dom_comp_text.appendChild(dom_doc.createTextNode(m_composite_text));
root_element.appendChild(dom_comp_text); root_element.appendChild(dom_comp_text);
} }
//Color //Color
if(color() != QColor(Qt::black)) { if(color() != QColor(Qt::black)) {
QDomElement dom_color = root_element.ownerDocument().createElement("color"); QDomElement dom_color = dom_doc.createElement("color");
dom_color.appendChild(root_element.ownerDocument().createTextNode(color().name())); dom_color.appendChild(dom_doc.createTextNode(color().name()));
root_element.appendChild(dom_color); root_element.appendChild(dom_color);
} }
return root_element;
} }
/** /**
@brief PartDynamicTextField::fromXml @brief PartDynamicTextField::fromXml
@param dom_elmt @param dom_elmt
*/ */
bool PartDynamicTextField::fromXmlPriv(const QDomElement &dom_elmt) void PartDynamicTextField::fromXml(const QDomElement &dom_elmt) {
{
if (dom_elmt.tagName() != xmlName()) { if (dom_elmt.tagName() != xmlName()) {
qDebug() << "PartDynamicTextField::fromXml : Wrong tagg name"; qDebug() << "PartDynamicTextField::fromXml : Wrong tagg name";
return false; return;
} }
double x=0, y=0, z=0, rot=0; QGraphicsTextItem::setPos(
if (QETXML::propertyDouble(dom_elmt, "x", &x) == QETXML::PropertyFlags::NoValidConversion || dom_elmt.attribute("x", QString::number(0)).toDouble(),
QETXML::propertyDouble(dom_elmt, "y", &y) == QETXML::PropertyFlags::NoValidConversion || dom_elmt.attribute("y", QString::number(0)).toDouble()
QETXML::propertyDouble(dom_elmt, "z", &z) == QETXML::PropertyFlags::NoValidConversion || );
QETXML::propertyDouble(dom_elmt, "rotation", &rot) == QETXML::PropertyFlags::NoValidConversion) setZValue(dom_elmt.attribute("z", QString::number(zValue())).toDouble());
return false; QGraphicsTextItem::setRotation(dom_elmt.attribute("rotation", QString::number(0)).toDouble());
QGraphicsTextItem::setPos(x, y);
setZValue(z);
QGraphicsTextItem::setRotation(rot);
QString font; if (dom_elmt.hasAttribute("font")) {
if (QETXML::propertyString(dom_elmt, "font", &font) == QETXML::PropertyFlags::Success)
{
QFont font_; QFont font_;
font_.fromString(font); font_.fromString(dom_elmt.attribute("font"));
setFont(font_); setFont(font_);
} else { //Keep compatibility TODO remove in futur }
else {
#if TODO_LIST #if TODO_LIST
#pragma message("@TODO remove in futur") #pragma message("@TODO remove in futur")
#endif #endif
@@ -188,24 +182,19 @@ bool PartDynamicTextField::fromXmlPriv(const QDomElement &dom_elmt)
setFont(QETApp::dynamicTextsItemFont(9)); setFont(QETApp::dynamicTextsItemFont(9));
} }
QETXML::propertyUuid(dom_elmt, "uuid", &m_uuid); m_uuid = QUuid(dom_elmt.attribute("uuid", QUuid::createUuid().toString()));
bool frame; setFrame(dom_elmt.attribute("frame", "false") == "true"? true : false);
QETXML::propertyBool(dom_elmt, "frame", &frame); setTextWidth(dom_elmt.attribute("text_width", QString::number(-1)).toDouble());
double text_width=-1;
QETXML::propertyDouble(dom_elmt, "text_width", &text_width);
setTextWidth(text_width);
QMetaEnum me = DynamicElementTextItem::textFromMetaEnum(); QMetaEnum me = DynamicElementTextItem::textFromMetaEnum();
QString text_from; m_text_from = DynamicElementTextItem::TextFrom(
QETXML::propertyString(dom_elmt, "text_from", &text_from); me.keyToValue(dom_elmt.attribute("text_from").toStdString().data()));
m_text_from = DynamicElementTextItem::TextFrom(me.keyToValue(text_from.toStdString().data()));
me = QMetaEnum::fromType<Qt::Alignment>(); me = QMetaEnum::fromType<Qt::Alignment>();
QString alignment; if(dom_elmt.hasAttribute("Halignment"))
if(QETXML::propertyString(dom_elmt, "Halignment", &alignment) != QETXML::PropertyFlags::NotFound) setAlignment(Qt::Alignment(
setAlignment(Qt::Alignment(me.keyToValue(alignment.toStdString().data()))); me.keyToValue(dom_elmt.attribute("Halignment").toStdString().data())));
if(QETXML::propertyString(dom_elmt, "Valignment", &alignment) != QETXML::PropertyFlags::NotFound) if(dom_elmt.hasAttribute(("Valignment")))
setAlignment(Qt::Alignment( setAlignment(Qt::Alignment(
me.keyToValue(dom_elmt.attribute("Valignment").toStdString().data())) | this -> alignment()); me.keyToValue(dom_elmt.attribute("Valignment").toStdString().data())) | this -> alignment());
@@ -232,29 +221,6 @@ bool PartDynamicTextField::fromXmlPriv(const QDomElement &dom_elmt)
QDomElement dom_color = dom_elmt.firstChildElement("color"); QDomElement dom_color = dom_elmt.firstChildElement("color");
if(!dom_color.isNull()) if(!dom_color.isNull())
setColor(QColor(dom_color.text())); setColor(QColor(dom_color.text()));
return true;
}
bool PartDynamicTextField::valideXml(QDomElement& dom_elmt) {
if (QETXML::propertyDouble(dom_elmt, "x") == QETXML::PropertyFlags::NoValidConversion ||
QETXML::propertyDouble(dom_elmt, "y") == QETXML::PropertyFlags::NoValidConversion ||
QETXML::propertyDouble(dom_elmt, "z") == QETXML::PropertyFlags::NoValidConversion ||
QETXML::propertyDouble(dom_elmt, "rotation") == QETXML::PropertyFlags::NoValidConversion)
return false;
if (QETXML::propertyUuid(dom_elmt, "uuid") == QETXML::PropertyFlags::NoValidConversion)
return false;
if (QETXML::propertyString(dom_elmt, "text_from"))
return false;
if(QETXML::propertyString(dom_elmt, "Halignment") == QETXML::PropertyFlags::NotFound)
return false;
if(QETXML::propertyString(dom_elmt, "Valignment") == QETXML::PropertyFlags::NotFound)
return false;
return true;
} }
/** /**
@@ -498,7 +464,7 @@ void PartDynamicTextField::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) {
m_origine_pos != pos()) { m_origine_pos != pos()) {
QPropertyUndoCommand *undo =\ QPropertyUndoCommand *undo =\
new QPropertyUndoCommand(this, "pos", QVariant(m_origine_pos), QVariant(pos())); new QPropertyUndoCommand(this, "pos", QVariant(m_origine_pos), QVariant(pos()));
undo -> setText(tr("D??placer un champ texte")); undo -> setText(tr("Déplacer un champ texte"));
undo -> enableAnimation(); undo -> enableAnimation();
elementScene() -> undoStack().push(undo); elementScene() -> undoStack().push(undo);
} }

View File

@@ -75,12 +75,9 @@ class PartDynamicTextField : public QGraphicsTextItem, public CustomElementPart
void startUserTransformation(const QRectF &initial_selection_rect) override; void startUserTransformation(const QRectF &initial_selection_rect) override;
void handleUserTransformation(const QRectF &initial_selection_rect, const QRectF &new_selection_rect) override; void handleUserTransformation(const QRectF &initial_selection_rect, const QRectF &new_selection_rect) override;
void toXmlPriv(QDomElement&root_element) const override; const QDomElement toXml(QDomDocument &dom_doc) const override;
bool fromXmlPriv(const QDomElement &dom_elmt) override; void fromXml(const QDomElement &dom_elmt) override;
void fromTextFieldXml(const QDomElement &dom_element); void fromTextFieldXml(const QDomElement &dom_element);
static bool valideXml(QDomElement& dom_elmt);
void toSettings(QSettings &,const QString & = QString()) const override {/*TODO: implement*/}
void fromSettings(QSettings &,const QString & = QString()) override{/*TODO: implement*/}
DynamicElementTextItem::TextFrom textFrom() const; DynamicElementTextItem::TextFrom textFrom() const;
void setTextFrom (DynamicElementTextItem::TextFrom text_from); void setTextFrom (DynamicElementTextItem::TextFrom text_from);
@@ -119,7 +116,7 @@ class PartDynamicTextField : public QGraphicsTextItem, public CustomElementPart
m_info_name, m_info_name,
m_composite_text; m_composite_text;
DynamicElementTextItem::TextFrom m_text_from = DynamicElementTextItem::UserText; DynamicElementTextItem::TextFrom m_text_from = DynamicElementTextItem::UserText;
QUuid m_uuid{QUuid::createUuid()}; QUuid m_uuid;
bool m_frame = false, bool m_frame = false,
m_first_add = true, m_first_add = true,
m_block_alignment = false; m_block_alignment = false;

View File

@@ -22,8 +22,6 @@
#include "../../QetGraphicsItemModeler/qetgraphicshandlerutility.h" #include "../../QetGraphicsItemModeler/qetgraphicshandlerutility.h"
#include "../elementscene.h" #include "../elementscene.h"
#include "../../qetxml.h"
/** /**
@brief PartEllipse::PartEllipse @brief PartEllipse::PartEllipse
Constructor Constructor
@@ -81,81 +79,56 @@ void PartEllipse::paint(QPainter *painter, const QStyleOptionGraphicsItem *optio
} }
/** /**
@brief PartEllipse::toXmlPriv @brief PartEllipse::toXml
Export this ellipse in xml Export this ellipse in xml
@param xml_document : Xml document to use for create the xml element.
@return : an xml element that describe this ellipse @return : an xml element that describe this ellipse
*/ */
void PartEllipse::toXmlPriv(QDomElement& xml_element) const const QDomElement PartEllipse::toXml(QDomDocument &xml_document) const
{ {
if (qFuzzyCompare(rect().width(), rect().height())) QDomElement xml_element;
{ if (qFuzzyCompare(rect().width(), rect().height()))
xml_element.setTagName("circle"); {
xml_element.setAttribute("diameter", QString("%1").arg(rect().width())); xml_element = xml_document.createElement("circle");
} xml_element.setAttribute("diameter", QString("%1").arg(rect().width()));
else }
{ else
xml_element.setTagName("ellipse"); {
xml_element.setAttribute("width", QString("%1").arg(rect().width())); xml_element = xml_document.createElement("ellipse");
xml_element.setAttribute("height", QString("%1").arg(rect().height())); xml_element.setAttribute("width", QString("%1").arg(rect().width()));
} xml_element.setAttribute("height", QString("%1").arg(rect().height()));
}
QPointF top_left(sceneTopLeft()); QPointF top_left(sceneTopLeft());
xml_element.setAttribute("x", QString("%1").arg(top_left.x())); xml_element.setAttribute("x", QString("%1").arg(top_left.x()));
xml_element.setAttribute("y", QString("%1").arg(top_left.y())); xml_element.setAttribute("y", QString("%1").arg(top_left.y()));
stylesToXml(xml_element); stylesToXml(xml_element);
return(xml_element);
} }
/** /**
@brief PartEllipse::fromXmlPriv @brief PartEllipse::fromXml
Import the properties of this ellipse from a xml element. Import the properties of this ellipse from a xml element.
@param qde : Xml document to use. @param qde : Xml document to use.
*/ */
bool PartEllipse::fromXmlPriv(const QDomElement &qde) void PartEllipse::fromXml(const QDomElement &qde)
{ {
stylesFromXml(qde); stylesFromXml(qde);
double x=0, y=0, width=0, height=0; qreal width, height;
if (qde.tagName() == "ellipse") if (qde.tagName() == "ellipse")
{ {
if (QETXML::propertyDouble(qde, "width", &width) == QETXML::PropertyFlags::NoValidConversion || width = qde.attribute("width", "0").toDouble();
QETXML::propertyDouble(qde, "height", &height) == QETXML::PropertyFlags::NoValidConversion) height = qde.attribute("height", "0").toDouble();
return false;
}
else {
if (QETXML::propertyDouble(qde, "diameter", &width) == QETXML::PropertyFlags::NoValidConversion)
return false;
height = width;
} }
else
width = height = qde.attribute("diameter", "0").toDouble();
m_rect = QRectF(mapFromScene(qde.attribute("x", "0").toDouble(),
if (QETXML::propertyDouble(qde, "x", &x) == QETXML::PropertyFlags::NoValidConversion || qde.attribute("y", "0").toDouble()),
QETXML::propertyDouble(qde, "y", &y) == QETXML::PropertyFlags::NoValidConversion) QSizeF(width, height));
return false;
m_rect = QRectF(mapFromScene(x, y), QSizeF(width, height));
return true;
}
bool PartEllipse::valideXml(QDomElement& element) {
if (element.tagName() == "ellipse")
{
if (QETXML::propertyDouble(element, "width") & QETXML::PropertyFlags::NoValidConversion ||
QETXML::propertyDouble(element, "height") & QETXML::PropertyFlags::NoValidConversion)
return false;
}
else {
if (QETXML::propertyDouble(element, "diameter") & QETXML::PropertyFlags::NoValidConversion)
return false;
}
if ((QETXML::propertyDouble(element, "x") & QETXML::PropertyFlags::NoValidConversion) ||
(QETXML::propertyDouble(element, "y") & QETXML::PropertyFlags::NoValidConversion))
return false;
return true;
} }
/** /**

View File

@@ -50,13 +50,10 @@ class PartEllipse : public AbstractPartEllipse
void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget * = nullptr) override; void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget * = nullptr) override;
//Name and XML //Name and XML
QString name() const override { return(QObject::tr("ellipse", "element part name")); } QString name() const override { return(QObject::tr("ellipse", "element part name")); }
QString xmlName() const override { return(QString("ellipse")); } QString xmlName() const override { return(QString("ellipse")); }
void toXmlPriv(QDomElement&xml_element) const override; const QDomElement toXml (QDomDocument &) const override;
bool fromXmlPriv(const QDomElement &) override; void fromXml (const QDomElement &) override;
static bool valideXml(QDomElement& element);
void toSettings(QSettings &,const QString & = QString()) const override {/*TODO: implement*/}
void fromSettings(QSettings &,const QString & = QString()) override{/*TODO: implement*/}
QPainterPath shape() const override; QPainterPath shape() const override;
QPainterPath shadowShape() const override; QPainterPath shadowShape() const override;
void setRect(const QRectF &rect) override {AbstractPartEllipse::setRect(rect); adjusteHandlerPos();} void setRect(const QRectF &rect) override {AbstractPartEllipse::setRect(rect); adjusteHandlerPos();}
@@ -70,7 +67,7 @@ class PartEllipse : public AbstractPartEllipse
void switchResizeMode(); void switchResizeMode();
void adjusteHandlerPos(); void adjusteHandlerPos();
void handlerMousePressEvent (QetGraphicsHandlerItem *qghi, QGraphicsSceneMouseEvent *event); void handlerMousePressEvent (QetGraphicsHandlerItem *qghi, QGraphicsSceneMouseEvent *event);
void handlerMouseMoveEvent (QetGraphicsHandlerItem *qghi, QGraphicsSceneMouseEvent *event); void handlerMouseMoveEvent (QetGraphicsHandlerItem *qghi, QGraphicsSceneMouseEvent *event);
void handlerMouseReleaseEvent (QetGraphicsHandlerItem *qghi, QGraphicsSceneMouseEvent *event); void handlerMouseReleaseEvent (QetGraphicsHandlerItem *qghi, QGraphicsSceneMouseEvent *event);
void sceneSelectionChanged (); void sceneSelectionChanged ();

View File

@@ -21,8 +21,6 @@
#include "../../QetGraphicsItemModeler/qetgraphicshandleritem.h" #include "../../QetGraphicsItemModeler/qetgraphicshandleritem.h"
#include "../elementscene.h" #include "../elementscene.h"
#include "../../qetxml.h"
#include <cmath> #include <cmath>
/** /**
@@ -32,10 +30,13 @@
@param parent : parent item @param parent : parent item
*/ */
PartLine::PartLine(QETElementEditor *editor, QGraphicsItem *parent) : PartLine::PartLine(QETElementEditor *editor, QGraphicsItem *parent) :
CustomElementGraphicPart(editor, parent) CustomElementGraphicPart(editor, parent),
{ first_end(Qet::None),
setTagName("line"); first_length(1.5),
} second_end(Qet::None),
second_length(1.5),
m_undo_command(nullptr)
{}
/// Destructeur /// Destructeur
PartLine::~PartLine() PartLine::~PartLine()
@@ -104,26 +105,28 @@ void PartLine::paint(QPainter *painter, const QStyleOptionGraphicsItem *options,
} }
/** /**
@brief PartLine::toXmlPriv @brief PartLine::toXml
Export this line in xml Export this line in xml
@param xml_document : Xml document to use for create the xml element. @param xml_document : Xml document to use for create the xml element.
@return an xml element that describe this line @return an xml element that describe this line
*/ */
void PartLine::toXmlPriv(QDomElement& xml_element) const const QDomElement PartLine::toXml(QDomDocument &xml_document) const
{ {
QPointF p1(sceneP1()); QPointF p1(sceneP1());
QPointF p2(sceneP2()); QPointF p2(sceneP2());
xml_element.setAttribute("x1", QString("%1").arg(p1.x())); QDomElement xml_element = xml_document.createElement("line");
xml_element.setAttribute("y1", QString("%1").arg(p1.y())); xml_element.setAttribute("x1", QString("%1").arg(p1.x()));
xml_element.setAttribute("x2", QString("%1").arg(p2.x())); xml_element.setAttribute("y1", QString("%1").arg(p1.y()));
xml_element.setAttribute("y2", QString("%1").arg(p2.y())); xml_element.setAttribute("x2", QString("%1").arg(p2.x()));
xml_element.setAttribute("end1", Qet::endTypeToString(first_end)); xml_element.setAttribute("y2", QString("%1").arg(p2.y()));
xml_element.setAttribute("length1", QString("%1").arg(first_length)); xml_element.setAttribute("end1", Qet::endTypeToString(first_end));
xml_element.setAttribute("end2", Qet::endTypeToString(second_end)); xml_element.setAttribute("length1", QString("%1").arg(first_length));
xml_element.setAttribute("length2", QString("%1").arg(second_length)); xml_element.setAttribute("end2", Qet::endTypeToString(second_end));
xml_element.setAttribute("length2", QString("%1").arg(second_length));
stylesToXml(xml_element); stylesToXml(xml_element);
return(xml_element);
} }
/** /**
@@ -131,48 +134,17 @@ void PartLine::toXmlPriv(QDomElement& xml_element) const
Import the properties of this line from a xml element. Import the properties of this line from a xml element.
@param qde : Xml document to use @param qde : Xml document to use
*/ */
bool PartLine::fromXmlPriv(const QDomElement &qde) { void PartLine::fromXml(const QDomElement &qde) {
stylesFromXml(qde); stylesFromXml(qde);
m_line = QLineF(mapFromScene(qde.attribute("x1", "0").toDouble(),
qde.attribute("y1", "0").toDouble()),
mapFromScene(qde.attribute("x2", "0").toDouble(),
qde.attribute("y2", "0").toDouble()));
double x1 = 0, y1 = 0, x2 = 0, y2 = 0; first_end = Qet::endTypeFromString(qde.attribute("end1"));
if (QETXML::propertyDouble(qde, "x1", &x1) == QETXML::PropertyFlags::NoValidConversion || first_length = qde.attribute("length1", "1.5").toDouble();
QETXML::propertyDouble(qde, "y1", &y1) == QETXML::PropertyFlags::NoValidConversion || second_end = Qet::endTypeFromString(qde.attribute("end2"));
QETXML::propertyDouble(qde, "x2", &x2) == QETXML::PropertyFlags::NoValidConversion || second_length = qde.attribute("length2", "1.5").toDouble();
QETXML::propertyDouble(qde, "y2", &y2) == QETXML::PropertyFlags::NoValidConversion)
return false;
m_line = QLineF(mapFromScene(x1, y1),
mapFromScene(x2, y2));
QString s;
if (QETXML::propertyString(qde, "end1", &s) != QETXML::PropertyFlags::Success)
return false;
first_end = Qet::endTypeFromString(s);
if (QETXML::propertyString(qde, "end2", &s) != QETXML::PropertyFlags::Success)
return false;
first_end = Qet::endTypeFromString(s);
if (QETXML::propertyDouble(qde, "length1", &first_length) == QETXML::PropertyFlags::NoValidConversion ||
QETXML::propertyDouble(qde, "length2", &second_length) == QETXML::PropertyFlags::NoValidConversion)
return false;
return true;
}
bool PartLine::valideXml(QDomElement& element) const {
if (QETXML::propertyDouble(element, "x1") ||
QETXML::propertyDouble(element, "y1") ||
QETXML::propertyDouble(element, "x2") ||
QETXML::propertyDouble(element, "y2") ||
QETXML::propertyString(element, "end1") ||
QETXML::propertyString(element, "end2") ||
QETXML::propertyDouble(element, "length1") ||
QETXML::propertyDouble(element, "length2") )
return false;
return true;
} }
/** /**

View File

@@ -70,11 +70,8 @@ class PartLine : public CustomElementGraphicPart
void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget * = nullptr) override; void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget * = nullptr) override;
QString name() const override { return(QObject::tr("ligne", "element part name")); } QString name() const override { return(QObject::tr("ligne", "element part name")); }
QString xmlName() const override { return(QString("line")); } QString xmlName() const override { return(QString("line")); }
void toXmlPriv(QDomElement&xml_element) const override; const QDomElement toXml(QDomDocument &) const override;
bool fromXmlPriv(const QDomElement &) override; void fromXml(const QDomElement &) override;
bool valideXml(QDomElement& element) const;
void toSettings(QSettings &,const QString & = QString()) const override {/*TODO: implement*/}
void fromSettings(QSettings &,const QString & = QString()) override{/*TODO: implement*/}
virtual QPointF sceneP1() const; virtual QPointF sceneP1() const;
virtual QPointF sceneP2() const; virtual QPointF sceneP2() const;
QPainterPath shape() const override; QPainterPath shape() const override;
@@ -105,7 +102,7 @@ class PartLine : public CustomElementGraphicPart
private: private:
void adjusteHandlerPos(); void adjusteHandlerPos();
void handlerMousePressEvent (QetGraphicsHandlerItem *qghi, QGraphicsSceneMouseEvent *event); void handlerMousePressEvent (QetGraphicsHandlerItem *qghi, QGraphicsSceneMouseEvent *event);
void handlerMouseMoveEvent (QetGraphicsHandlerItem *qghi, QGraphicsSceneMouseEvent *event); void handlerMouseMoveEvent (QetGraphicsHandlerItem *qghi, QGraphicsSceneMouseEvent *event);
void handlerMouseReleaseEvent (QetGraphicsHandlerItem *qghi, QGraphicsSceneMouseEvent *event); void handlerMouseReleaseEvent (QetGraphicsHandlerItem *qghi, QGraphicsSceneMouseEvent *event);
void sceneSelectionChanged (); void sceneSelectionChanged ();
@@ -117,15 +114,15 @@ class PartLine : public CustomElementGraphicPart
QRectF secondEndCircleRect() const; QRectF secondEndCircleRect() const;
/*****************/ /*****************/
Qet::EndType first_end{Qet::EndType::None}; Qet::EndType first_end;
qreal first_length{1.5}; qreal first_length;
Qet::EndType second_end{Qet::EndType::None}; Qet::EndType second_end;
qreal second_length{1.5}; qreal second_length;
QList<QPointF> saved_points_; QList<QPointF> saved_points_;
QLineF m_line; QLineF m_line;
int m_vector_index = -1; int m_vector_index = -1;
QPropertyUndoCommand *m_undo_command{nullptr}; QPropertyUndoCommand *m_undo_command;
QVector<QetGraphicsHandlerItem *> m_handler_vector; QVector<QetGraphicsHandlerItem *> m_handler_vector;
}; };
#endif #endif

View File

@@ -24,8 +24,6 @@
#include "../elementscene.h" #include "../elementscene.h"
#include "../ui/qetelementeditor.h" #include "../ui/qetelementeditor.h"
#include "../../qetxml.h"
/** /**
@brief PartPolygon::PartPolygon @brief PartPolygon::PartPolygon
Constructor Constructor
@@ -37,7 +35,6 @@ PartPolygon::PartPolygon(QETElementEditor *editor, QGraphicsItem *parent) :
m_closed(false), m_closed(false),
m_undo_command(nullptr) m_undo_command(nullptr)
{ {
setTagName("polygon");
m_insert_point = new QAction(tr("Ajouter un point"), this); m_insert_point = new QAction(tr("Ajouter un point"), this);
m_insert_point->setIcon(QET::Icons::Add); m_insert_point->setIcon(QET::Icons::Add);
connect(m_insert_point, &QAction::triggered, this, &PartPolygon::insertPoint); connect(m_insert_point, &QAction::triggered, this, &PartPolygon::insertPoint);
@@ -92,60 +89,50 @@ void PartPolygon::paint(QPainter *painter, const QStyleOptionGraphicsItem *optio
Import the properties of this polygon from a xml element Import the properties of this polygon from a xml element
@param qde : Xml document to use @param qde : Xml document to use
*/ */
bool PartPolygon::fromXmlPriv(const QDomElement &qde) void PartPolygon::fromXml(const QDomElement &qde)
{ {
stylesFromXml(qde); stylesFromXml(qde);
int error_counter = 0;
int i = 1; int i = 1;
while(true) while(true)
{ {
if (QETXML::propertyDouble(qde, QString("x%1").arg(i)) == QETXML::PropertyFlags::Success && if (QET::attributeIsAReal(qde, QString("x%1").arg(i)) &&\
QETXML::propertyDouble(qde, QString("y%1").arg(i)) == QETXML::PropertyFlags::Success) QET::attributeIsAReal(qde, QString("y%1").arg(i)))
i++; ++ i;
else break; else break;
} }
QPolygonF temp_polygon; QPolygonF temp_polygon;
double x, y;
for (int j = 1 ; j < i ; ++ j) for (int j = 1 ; j < i ; ++ j)
{ {
error_counter += QETXML::propertyDouble(qde, QString("x%1").arg(j), &x); temp_polygon << QPointF(qde.attribute(QString("x%1").arg(j)).toDouble(),
error_counter += QETXML::propertyDouble(qde, QString("y%1").arg(j), &y); qde.attribute(QString("y%1").arg(j)).toDouble());
if (error_counter)
return false;
temp_polygon << QPointF(x, y);
} }
m_polygon = temp_polygon; m_polygon = temp_polygon;
if (QETXML::propertyBool(qde, "closed", &m_closed) != QETXML::PropertyFlags::Success) m_closed = qde.attribute("closed") != "false";
return false;
return true;
} }
/** /**
@brief PartPolygon::toXmlPriv @brief PartPolygon::toXml
Export this polygin in xml Export this polygin in xml
@param e: properties get part of this DomElement @param xml_document : Xml document to use for create the xml element
@return an xml element that describe this polygon
*/ */
void PartPolygon::toXmlPriv(QDomElement& xml_element) const const QDomElement PartPolygon::toXml(QDomDocument &xml_document) const
{ {
int i = 1; QDomElement xml_element = xml_document.createElement("polygon");
foreach(QPointF point, m_polygon) { int i = 1;
point = mapToScene(point); foreach(QPointF point, m_polygon) {
xml_element.setAttribute(QString("x%1").arg(i), QString("%1").arg(point.x())); point = mapToScene(point);
xml_element.setAttribute(QString("y%1").arg(i), QString("%1").arg(point.y())); xml_element.setAttribute(QString("x%1").arg(i), QString("%1").arg(point.x()));
++ i; xml_element.setAttribute(QString("y%1").arg(i), QString("%1").arg(point.y()));
} ++ i;
if (!m_closed) xml_element.setAttribute("closed", "false"); }
stylesToXml(xml_element); if (!m_closed) xml_element.setAttribute("closed", "false");
} stylesToXml(xml_element);
return(xml_element);
bool PartPolygon::valideXml(QDomElement& element) {
// TODO: implement
return true;
} }
/** /**
@@ -538,7 +525,7 @@ void PartPolygon::insertPoint()
if(new_polygon != m_polygon) if(new_polygon != m_polygon)
{ {
//Wrap the undo for avoid to merge the undo commands when user add several points. //Wrap the undo for avoid to merge the undo commands when user add several points.
QUndoCommand *undo = new QUndoCommand(tr("Ajouter un point ?? un polygone")); QUndoCommand *undo = new QUndoCommand(tr("Ajouter un point à un polygone"));
new QPropertyUndoCommand(this, "polygon", m_polygon, new_polygon, undo); new QPropertyUndoCommand(this, "polygon", m_polygon, new_polygon, undo);
elementScene()->undoStack().push(undo); elementScene()->undoStack().push(undo);
} }

View File

@@ -61,12 +61,8 @@ class PartPolygon : public CustomElementGraphicPart
QString name() const override { return(QObject::tr("polygone", "element part name")); } QString name() const override { return(QObject::tr("polygone", "element part name")); }
QString xmlName() const override { return(QString("polygon")); } QString xmlName() const override { return(QString("polygon")); }
bool fromXmlPriv(const QDomElement &) override; void fromXml(const QDomElement &) override;
void toXmlPriv(QDomElement&xml_element) const override; const QDomElement toXml(QDomDocument &) const override;
static bool valideXml(QDomElement& element);
void toSettings(QSettings &,const QString & = QString()) const override {/*TODO: implement*/}
void fromSettings(QSettings &,const QString & = QString()) override{/*TODO: implement*/}
QPainterPath shape () const override; QPainterPath shape () const override;
QPainterPath shadowShape() const override; QPainterPath shadowShape() const override;
@@ -81,8 +77,8 @@ class PartPolygon : public CustomElementGraphicPart
QPolygonF polygon () const; QPolygonF polygon () const;
void setPolygon (const QPolygonF &polygon); void setPolygon (const QPolygonF &polygon);
void addPoint (const QPointF &point); void addPoint (const QPointF &point);
void setLastPoint (const QPointF &point); void setLastPoint (const QPointF &point);
void removeLastPoint (); void removeLastPoint ();
bool isClosed () const {return m_closed;} bool isClosed () const {return m_closed;}
@@ -99,7 +95,7 @@ class PartPolygon : public CustomElementGraphicPart
private: private:
void adjusteHandlerPos(); void adjusteHandlerPos();
void handlerMousePressEvent (QetGraphicsHandlerItem *qghi, QGraphicsSceneMouseEvent *event); void handlerMousePressEvent (QetGraphicsHandlerItem *qghi, QGraphicsSceneMouseEvent *event);
void handlerMouseMoveEvent (QetGraphicsHandlerItem *qghi, QGraphicsSceneMouseEvent *event); void handlerMouseMoveEvent (QetGraphicsHandlerItem *qghi, QGraphicsSceneMouseEvent *event);
void handlerMouseReleaseEvent (QetGraphicsHandlerItem *qghi, QGraphicsSceneMouseEvent *event); void handlerMouseReleaseEvent (QetGraphicsHandlerItem *qghi, QGraphicsSceneMouseEvent *event);
void sceneSelectionChanged (); void sceneSelectionChanged ();
@@ -109,7 +105,7 @@ class PartPolygon : public CustomElementGraphicPart
void removePoint(); void removePoint();
bool m_closed{false}; bool m_closed;
QList<QPointF> saved_points_; QList<QPointF> saved_points_;
QPolygonF m_polygon; QPolygonF m_polygon;
QPropertyUndoCommand *m_undo_command; QPropertyUndoCommand *m_undo_command;

View File

@@ -22,8 +22,6 @@
#include "../../QetGraphicsItemModeler/qetgraphicshandlerutility.h" #include "../../QetGraphicsItemModeler/qetgraphicshandlerutility.h"
#include "../elementscene.h" #include "../elementscene.h"
#include "../../qetxml.h"
/** /**
@brief PartRectangle::PartRectangle @brief PartRectangle::PartRectangle
Constructor Constructor
@@ -32,9 +30,7 @@
*/ */
PartRectangle::PartRectangle(QETElementEditor *editor, QGraphicsItem *parent) : PartRectangle::PartRectangle(QETElementEditor *editor, QGraphicsItem *parent) :
CustomElementGraphicPart(editor, parent) CustomElementGraphicPart(editor, parent)
{ {}
setTagName("rect");
}
/** /**
@brief PartRectangle::~PartRectangle @brief PartRectangle::~PartRectangle
@@ -84,33 +80,35 @@ void PartRectangle::paint(QPainter *painter, const QStyleOptionGraphicsItem *opt
} }
/** /**
@brief PartRectangle::toXmlPriv @brief PartRectangle::toXml
Export this rectangle in xml Export this rectangle in xml
@param xml_document : Xml document to use for create the xml element. @param xml_document : Xml document to use for create the xml element.
@return an xml element that describe this ellipse @return an xml element that describe this ellipse
*/ */
void PartRectangle::toXmlPriv(QDomElement& xml_element) const const QDomElement PartRectangle::toXml(QDomDocument &xml_document) const
{ {
QPointF top_left(sceneTopLeft()); QDomElement xml_element = xml_document.createElement("rect");
xml_element.setAttribute("x", QString("%1").arg(top_left.x())); QPointF top_left(sceneTopLeft());
xml_element.setAttribute("y", QString("%1").arg(top_left.y())); xml_element.setAttribute("x", QString("%1").arg(top_left.x()));
xml_element.setAttribute("width", QString("%1").arg(m_rect.width())); xml_element.setAttribute("y", QString("%1").arg(top_left.y()));
xml_element.setAttribute("height", QString("%1").arg(m_rect.height())); xml_element.setAttribute("width", QString("%1").arg(m_rect.width()));
xml_element.setAttribute("height", QString("%1").arg(m_rect.height()));
QRectF rect = m_rect.normalized(); QRectF rect = m_rect.normalized();
qreal x = m_xRadius; qreal x = m_xRadius;
if (x > rect.width()/2) { if (x > rect.width()/2) {
x = rect.width()/2; x = rect.width()/2;
} }
qreal y = m_yRadius; qreal y = m_yRadius;
if (y > rect.height()/2) { if (y > rect.height()/2) {
y = rect.height()/2; y = rect.height()/2;
} }
xml_element.setAttribute("rx", QString::number(m_xRadius)); xml_element.setAttribute("rx", QString::number(m_xRadius));
xml_element.setAttribute("ry", QString::number(m_yRadius)); xml_element.setAttribute("ry", QString::number(m_yRadius));
stylesToXml(xml_element); stylesToXml(xml_element);
return(xml_element);
} }
/** /**
@@ -118,45 +116,18 @@ void PartRectangle::toXmlPriv(QDomElement& xml_element) const
Import the properties of this rectangle from a xml element. Import the properties of this rectangle from a xml element.
@param qde : Xml document to use. @param qde : Xml document to use.
*/ */
bool PartRectangle::fromXmlPriv(const QDomElement &qde) void PartRectangle::fromXml(const QDomElement &qde)
{ {
stylesFromXml(qde); stylesFromXml(qde);
setPos(mapFromScene(qde.attribute("x", "0").toDouble(),
qde.attribute("y", "0").toDouble()));
double x=0, y=0, w=0, h=0, rx=0, ry=0; QRectF rect(QPointF(0,0), QSizeF(qde.attribute("width", "0").toDouble(),
if (QETXML::propertyDouble(qde, "x", &x) == QETXML::PropertyFlags::NoValidConversion || qde.attribute("height", "0").toDouble()));
QETXML::propertyDouble(qde, "y", &y) == QETXML::PropertyFlags::NoValidConversion)
return false;
setPos(mapFromScene(x, y));
if (QETXML::propertyDouble(qde, "width", &w) == QETXML::PropertyFlags::NoValidConversion ||
QETXML::propertyDouble(qde, "height", &h) == QETXML::PropertyFlags::NoValidConversion)
return false;
QRectF rect(QPointF(0,0), QSizeF(w, h));
setRect(rect.normalized()); setRect(rect.normalized());
setXRadius(qde.attribute("rx", "0").toDouble());
if (QETXML::propertyDouble(qde, "rx", &rx) == QETXML::PropertyFlags::NoValidConversion || setYRadius(qde.attribute("ry", "0").toDouble());
QETXML::propertyDouble(qde, "ry", &ry) == QETXML::PropertyFlags::NoValidConversion)
return false;
setXRadius(rx);
setYRadius(ry);
return true;
}
bool PartRectangle::valideXml(QDomElement& element) {
// parameters have default values so no value is not a non valid xml element
if ((QETXML::propertyDouble(element, "x") & QETXML::PropertyFlags::NoValidConversion) |
(QETXML::propertyDouble(element, "y") & QETXML::PropertyFlags::NoValidConversion) |
(QETXML::propertyDouble(element, "width") & QETXML::PropertyFlags::NoValidConversion) |
(QETXML::propertyDouble(element, "height") & QETXML::PropertyFlags::NoValidConversion) |
(QETXML::propertyDouble(element, "rx") & QETXML::PropertyFlags::NoValidConversion) |
(QETXML::propertyDouble(element, "ry") & QETXML::PropertyFlags::NoValidConversion))
return false;
return true;
} }
/** /**
@@ -566,9 +537,9 @@ void PartRectangle::addHandler()
for (QetGraphicsHandlerItem *handler : m_handler_vector) for (QetGraphicsHandlerItem *handler : m_handler_vector)
{ {
QColor color; QColor color;
if(m_resize_mode == 1) {color = Qt::blue;} if(m_resize_mode == 1) {color = Qt::blue;}
else if (m_resize_mode == 2) {color = Qt::darkGreen;} else if (m_resize_mode == 2) {color = Qt::darkGreen;}
else {color = Qt::magenta;} else {color = Qt::magenta;}
handler->setColor(color); handler->setColor(color);
scene()->addItem(handler); scene()->addItem(handler);

View File

@@ -55,16 +55,13 @@ class PartRectangle : public CustomElementGraphicPart
Enable the use of qgraphicsitem_cast to safely cast a QGraphicsItem into a PartRectangle. Enable the use of qgraphicsitem_cast to safely cast a QGraphicsItem into a PartRectangle.
@return the QGraphicsItem type @return the QGraphicsItem type
*/ */
int type () const override { return Type; } int type () const override { return Type; }
void paint (QPainter *, const QStyleOptionGraphicsItem *, QWidget * = nullptr) override; void paint (QPainter *, const QStyleOptionGraphicsItem *, QWidget * = nullptr) override;
QString name () const override { return(QObject::tr("rectangle", "element part name")); } QString name () const override { return(QObject::tr("rectangle", "element part name")); }
QString xmlName () const override { return(QString("rect")); } QString xmlName () const override { return(QString("rect")); }
void toXmlPriv(QDomElement&xml_element) const override; const QDomElement toXml (QDomDocument &) const override;
bool fromXmlPriv (const QDomElement &) override; void fromXml (const QDomElement &) override;
static bool valideXml(QDomElement& element);
void toSettings(QSettings &,const QString & = QString()) const override {/*TODO: implement*/}
void fromSettings(QSettings &,const QString & = QString()) override{/*TODO: implement*/}
QRectF rect() const; QRectF rect() const;
void setRect(const QRectF &rect); void setRect(const QRectF &rect);
@@ -93,7 +90,7 @@ class PartRectangle : public CustomElementGraphicPart
void switchResizeMode(); void switchResizeMode();
void adjusteHandlerPos(); void adjusteHandlerPos();
void handlerMousePressEvent (QetGraphicsHandlerItem *qghi, QGraphicsSceneMouseEvent *event); void handlerMousePressEvent (QetGraphicsHandlerItem *qghi, QGraphicsSceneMouseEvent *event);
void handlerMouseMoveEvent (QetGraphicsHandlerItem *qghi, QGraphicsSceneMouseEvent *event); void handlerMouseMoveEvent (QetGraphicsHandlerItem *qghi, QGraphicsSceneMouseEvent *event);
void handlerMouseReleaseEvent (QetGraphicsHandlerItem *qghi, QGraphicsSceneMouseEvent *event); void handlerMouseReleaseEvent (QetGraphicsHandlerItem *qghi, QGraphicsSceneMouseEvent *event);
void sceneSelectionChanged (); void sceneSelectionChanged ();

View File

@@ -19,8 +19,6 @@
#include "../../qetgraphicsitem/terminal.h" #include "../../qetgraphicsitem/terminal.h"
#include "../../qetxml.h"
/** /**
@brief PartTerminal::PartTerminal @brief PartTerminal::PartTerminal
@param editor : @param editor :
@@ -31,9 +29,7 @@
PartTerminal::PartTerminal(QETElementEditor *editor, QGraphicsItem *parent) : PartTerminal::PartTerminal(QETElementEditor *editor, QGraphicsItem *parent) :
CustomElementGraphicPart(editor, parent) CustomElementGraphicPart(editor, parent)
{ {
setTagName("terminal");
d = new TerminalData(this); d = new TerminalData(this);
d->m_name = tr("terminal");
d -> m_orientation = Qet::North; d -> m_orientation = Qet::North;
d -> m_uuid = QUuid::createUuid(); // if part is loaded this uuid will be overwritten, but being sure that terminal has a uuid d -> m_uuid = QUuid::createUuid(); // if part is loaded this uuid will be overwritten, but being sure that terminal has a uuid
updateSecondPoint(); updateSecondPoint();
@@ -49,20 +45,10 @@ PartTerminal::~PartTerminal()
Importe les proprietes d'une borne depuis un element XML Importe les proprietes d'une borne depuis un element XML
@param xml_elmt Element XML a lire @param xml_elmt Element XML a lire
*/ */
bool PartTerminal::fromXmlPriv(const QDomElement &xml_elmt) { void PartTerminal::fromXml(const QDomElement &xml_elmt) {
d -> fromXml(xml_elmt);
// update part and add uuid, which is used in the new version to connect terminals together
// if the attribute not exists, means, the element is created with an older version of qet. So use the legacy approach
// to identify terminals
QETXML::propertyUuid(xml_elmt, "uuid", &d->m_uuid);
if (!d->fromXml(xml_elmt))
return false;
setPos(d -> m_pos); setPos(d -> m_pos);
updateSecondPoint(); updateSecondPoint();
return true;
} }
/** /**
@@ -70,19 +56,9 @@ bool PartTerminal::fromXmlPriv(const QDomElement &xml_elmt) {
@param xml_document Document XML a utiliser pour creer l'element XML @param xml_document Document XML a utiliser pour creer l'element XML
@return un element XML decrivant la borne @return un element XML decrivant la borne
*/ */
void PartTerminal::toXmlPriv(QDomElement& e) const { const QDomElement PartTerminal::toXml(QDomDocument &xml_document) const
{
e.setAttribute("uuid", d->m_uuid.toString()); return d -> toXml(xml_document);
d->m_pos = pos();
QDomDocument doc = e.ownerDocument();
e.appendChild(d -> toXml(doc));
}
bool PartTerminal::valideXml(QDomElement& element) {
return TerminalData::valideXml(element);
} }
/** /**
@@ -100,8 +76,8 @@ void PartTerminal::paint(
painter -> save(); painter -> save();
// annulation des renderhints // annulation des renderhints
painter -> setRenderHint(QPainter::Antialiasing, false); painter -> setRenderHint(QPainter::Antialiasing, false);
painter -> setRenderHint(QPainter::TextAntialiasing, false); painter -> setRenderHint(QPainter::TextAntialiasing, false);
painter -> setRenderHint(QPainter::SmoothPixmapTransform, false); painter -> setRenderHint(QPainter::SmoothPixmapTransform, false);
QPen t; QPen t;
@@ -247,7 +223,7 @@ QRectF PartTerminal::sceneGeometricRect() const
*/ */
void PartTerminal::startUserTransformation(const QRectF &initial_selection_rect) { void PartTerminal::startUserTransformation(const QRectF &initial_selection_rect) {
Q_UNUSED(initial_selection_rect) Q_UNUSED(initial_selection_rect)
m_saved_position = scenePos(); saved_position_ = scenePos();
} }
/** /**
@@ -255,6 +231,6 @@ void PartTerminal::startUserTransformation(const QRectF &initial_selection_rect)
*/ */
void PartTerminal::handleUserTransformation(const QRectF &initial_selection_rect, const QRectF &new_selection_rect) { void PartTerminal::handleUserTransformation(const QRectF &initial_selection_rect, const QRectF &new_selection_rect) {
QPointF mapped_point = mapPoints( QPointF mapped_point = mapPoints(
initial_selection_rect, new_selection_rect, QList<QPointF>() << m_saved_position).first(); initial_selection_rect, new_selection_rect, QList<QPointF>() << saved_position_).first();
setPos(mapped_point); setPos(mapped_point);
} }

View File

@@ -56,12 +56,9 @@ class PartTerminal : public CustomElementGraphicPart
*/ */
int type() const override { return Type; } int type() const override { return Type; }
QString xmlName() const override { return(QString("terminal")); } QString xmlName() const override { return(QString("terminal")); }
bool fromXmlPriv(const QDomElement &) override; void fromXml(const QDomElement &) override;
void toXmlPriv(QDomElement&xml_element) const override; const QDomElement toXml(QDomDocument &) const override;
static bool valideXml(QDomElement& element); void paint(
void toSettings(QSettings &,const QString & = QString()) const override {/*TODO: implement*/}
void fromSettings(QSettings &,const QString & = QString()) override{/*TODO: implement*/}
void paint(
QPainter *painter, QPainter *painter,
const QStyleOptionGraphicsItem *, const QStyleOptionGraphicsItem *,
QWidget *) override; QWidget *) override;
@@ -87,9 +84,9 @@ class PartTerminal : public CustomElementGraphicPart
private: private:
void updateSecondPoint(); void updateSecondPoint();
TerminalData* d{nullptr}; // pointer to the terminal data TerminalData* d; // pointer to the terminal data
private: private:
QPointF m_saved_position; QPointF saved_position_;
}; };
#endif #endif

View File

@@ -23,8 +23,6 @@
#include "../elementscene.h" #include "../elementscene.h"
#include "../ui/texteditor.h" #include "../ui/texteditor.h"
#include "../../qetxml.h"
/** /**
Constructeur Constructeur
@param editor L'editeur d'element concerne @param editor L'editeur d'element concerne
@@ -45,8 +43,8 @@ PartText::PartText(QETElementEditor *editor, QGraphicsItem *parent) :
setAcceptHoverEvents(true); setAcceptHoverEvents(true);
setDefaultTextColor(Qt::black); setDefaultTextColor(Qt::black);
setPlainText(QObject::tr( setPlainText(QObject::tr(
"T", "T",
"default text when adding a text in the element editor")); "default text when adding a text in the element editor"));
adjustItemPosition(1); adjustItemPosition(1);
// adjust textfield position after line additions/deletions // adjust textfield position after line additions/deletions
@@ -69,49 +67,29 @@ PartText::~PartText()
Importe les proprietes d'un texte statique depuis un element XML Importe les proprietes d'un texte statique depuis un element XML
@param xml_element Element XML a lire @param xml_element Element XML a lire
*/ */
bool PartText::fromXmlPriv(const QDomElement &xml_element) void PartText::fromXml(const QDomElement &xml_element) {
{ bool ok;
int size;
QString font;
if (QETXML::propertyInteger(xml_element, "size", &size) != QETXML::PropertyFlags::NotFound) if (xml_element.hasAttribute("size")) {
{ int font_size = xml_element.attribute("size").toInt(&ok);
if (size < 1) { if (!ok || font_size < 1) {
size = 20; font_size = 20;
} }
QFont font_ = this -> font(); QFont font_ = this -> font();
font_.setPointSize(size); font_.setPointSize(font_size);
setFont(font_); setFont(font_);
} }
else if (QETXML::propertyString(xml_element, "font", &font) != QETXML::PropertyFlags::NotFound) else if (xml_element.hasAttribute("font")) {
{
QFont font_; QFont font_;
font_.fromString(font); font_.fromString(xml_element.attribute("font"));
setFont(font_); setFont(font_);
} else {
return false;
} }
QColor color; setDefaultTextColor(QColor(xml_element.attribute("color", "#000000")));
QString text; setPlainText(xml_element.attribute("text"));
QETXML::propertyColor(xml_element, "color", &color); setPos(xml_element.attribute("x").toDouble(),
setDefaultTextColor(color); xml_element.attribute("y").toDouble());
setRotation(xml_element.attribute("rotation", QString::number(0)).toDouble());
QETXML::propertyString(xml_element, "text", &text);
setPlainText(text);
double x=0, y=0, rot=0;
if (QETXML::propertyDouble(xml_element, "x", &x) == QETXML::PropertyFlags::NoValidConversion ||
QETXML::propertyDouble(xml_element, "y", &y) == QETXML::PropertyFlags::NoValidConversion)
return false;
setPos(x, y);
if (QETXML::propertyDouble(xml_element, "rotation", &rot) == QETXML::PropertyFlags::NoValidConversion)
return false;
setRotation(rot);
return true;
} }
/** /**
@@ -119,38 +97,18 @@ bool PartText::fromXmlPriv(const QDomElement &xml_element)
@param xml_document Document XML a utiliser pour creer l'element XML @param xml_document Document XML a utiliser pour creer l'element XML
@return un element XML decrivant le texte statique @return un element XML decrivant le texte statique
*/ */
void PartText::toXmlPriv(QDomElement& xml_element) const const QDomElement PartText::toXml(QDomDocument &xml_document) const
{ {
xml_element.setAttribute("x", QString::number(pos().x())); QDomElement xml_element = xml_document.createElement(xmlName());
xml_element.setAttribute("y", QString::number(pos().y()));
xml_element.setAttribute("text", toPlainText());
xml_element.setAttribute("font", font().toString());
xml_element.setAttribute("rotation", QString::number(rotation()));
xml_element.setAttribute("color", defaultTextColor().name());
}
bool PartText::valideXml(QDomElement& element) { xml_element.setAttribute("x", QString::number(pos().x()));
xml_element.setAttribute("y", QString::number(pos().y()));
xml_element.setAttribute("text", toPlainText());
xml_element.setAttribute("font", font().toString());
xml_element.setAttribute("rotation", QString::number(rotation()));
xml_element.setAttribute("color", defaultTextColor().name());
if (QETXML::propertyInteger(element, "size") == QETXML::PropertyFlags::NotFound || return(xml_element);
QETXML::propertyString(element, "font") == QETXML::PropertyFlags::NotFound) {
return false;
}
if (QETXML::propertyString(element, "color") == QETXML::PropertyFlags::NoValidConversion)
return false;
if (QETXML::propertyString(element, "text"))
return false;
if (QETXML::propertyDouble(element, "x") == QETXML::PropertyFlags::NoValidConversion ||
QETXML::propertyDouble(element, "y") == QETXML::PropertyFlags::NoValidConversion)
return false;
if (QETXML::propertyDouble(element, "rotation", 0) == QETXML::PropertyFlags::NoValidConversion)
return false;
return true;
} }
/** /**

View File

@@ -59,11 +59,8 @@ class PartText : public QGraphicsTextItem, public CustomElementPart {
int type() const override { return Type; } int type() const override { return Type; }
QString name() const override { return(QObject::tr("texte", "element part name")); } QString name() const override { return(QObject::tr("texte", "element part name")); }
QString xmlName() const override { return(QString("text")); } QString xmlName() const override { return(QString("text")); }
bool fromXmlPriv(const QDomElement &) override; void fromXml(const QDomElement &) override;
static bool valideXml(QDomElement& element); const QDomElement toXml(QDomDocument &) const override;
void toSettings(QSettings &,const QString & = QString()) const override {/*TODO: implement*/}
void fromSettings(QSettings &,const QString & = QString()) override{/*TODO: implement*/}
void toXmlPriv(QDomElement&xml_element) const override;
void setRotation(qreal angle) {(QGraphicsObject::setRotation(QET::correctAngle(angle)));} void setRotation(qreal angle) {(QGraphicsObject::setRotation(QET::correctAngle(angle)));}
bool isUseless() const override; bool isUseless() const override;
QRectF sceneGeometricRect() const override; QRectF sceneGeometricRect() const override;

View File

@@ -440,10 +440,10 @@ void StyleEditor::updatePartFilling()
} }
/** /**
@brief StyleEditor::updateFormPriv @brief StyleEditor::updateForm
Update the edition form according to the value of edited part(s) Update the edition form according to the value of edited part(s)
*/ */
void StyleEditor::updateFormPriv() void StyleEditor::updateForm()
{ {
if (!part && m_part_list.isEmpty()) return; if (!part && m_part_list.isEmpty()) return;
activeConnections(false); activeConnections(false);

View File

@@ -60,7 +60,7 @@ class StyleEditor : public ElementItemEditor
static bool isStyleEditable (QList <CustomElementPart *> cep_list); static bool isStyleEditable (QList <CustomElementPart *> cep_list);
public slots: public slots:
void updateFormPriv() override; void updateForm() override;
void updatePartAntialiasing(); void updatePartAntialiasing();
void updatePartColor(); void updatePartColor();
void updatePartLineStyle(); void updatePartLineStyle();

View File

@@ -51,8 +51,8 @@ DynamicTextFieldEditor::DynamicTextFieldEditor(QETElementEditor *editor,
DynamicTextFieldEditor::~DynamicTextFieldEditor() DynamicTextFieldEditor::~DynamicTextFieldEditor()
{ {
delete ui; delete ui;
if(!m_change_connections.isEmpty()) { if(!m_connection_list.isEmpty()) {
for(const QMetaObject::Connection& con : m_change_connections) { for(const QMetaObject::Connection& con : m_connection_list) {
disconnect(con); disconnect(con);
} }
} }
@@ -130,7 +130,7 @@ QList<CustomElementPart*> DynamicTextFieldEditor::currentParts() const
return parts; return parts;
} }
void DynamicTextFieldEditor::updateFormPriv() void DynamicTextFieldEditor::updateForm()
{ {
if(m_text_field) { if(m_text_field) {
ui -> m_x_sb -> setValue(m_text_field.data() -> x()); ui -> m_x_sb -> setValue(m_text_field.data() -> x());
@@ -182,38 +182,38 @@ void DynamicTextFieldEditor::setupWidget()
void DynamicTextFieldEditor::setUpConnections() void DynamicTextFieldEditor::setUpConnections()
{ {
assert(m_change_connections.isEmpty()); assert(m_connection_list.isEmpty());
//Setup the connection //Setup the connection
m_change_connections << connect(m_text_field.data(), &PartDynamicTextField::colorChanged, m_connection_list << connect(m_text_field.data(), &PartDynamicTextField::colorChanged,
[this](){this -> updateForm();}); [this](){this -> updateForm();});
m_change_connections << connect(m_text_field.data(), &PartDynamicTextField::fontChanged, m_connection_list << connect(m_text_field.data(), &PartDynamicTextField::fontChanged,
[this](){this -> updateForm();}); [this](){this -> updateForm();});
m_change_connections << connect(m_text_field.data(), &PartDynamicTextField::taggChanged, m_connection_list << connect(m_text_field.data(), &PartDynamicTextField::taggChanged,
[this](){this -> updateForm();}); [this](){this -> updateForm();});
m_change_connections << connect(m_text_field.data(), &PartDynamicTextField::textFromChanged, m_connection_list << connect(m_text_field.data(), &PartDynamicTextField::textFromChanged,
[this](){this -> updateForm();}); [this](){this -> updateForm();});
m_change_connections << connect(m_text_field.data(), &PartDynamicTextField::textChanged, m_connection_list << connect(m_text_field.data(), &PartDynamicTextField::textChanged,
[this](){this -> updateForm();}); [this](){this -> updateForm();});
m_change_connections << connect(m_text_field.data(), &PartDynamicTextField::infoNameChanged, m_connection_list << connect(m_text_field.data(), &PartDynamicTextField::infoNameChanged,
[this](){this -> updateForm();}); [this](){this -> updateForm();});
m_change_connections << connect(m_text_field.data(), &PartDynamicTextField::rotationChanged, m_connection_list << connect(m_text_field.data(), &PartDynamicTextField::rotationChanged,
[this](){this -> updateForm();}); [this](){this -> updateForm();});
m_change_connections << connect(m_text_field.data(), &PartDynamicTextField::frameChanged, m_connection_list << connect(m_text_field.data(), &PartDynamicTextField::frameChanged,
[this](){this -> updateForm();}); [this](){this -> updateForm();});
m_change_connections << connect(m_text_field.data(), &PartDynamicTextField::textWidthChanged, m_connection_list << connect(m_text_field.data(), &PartDynamicTextField::textWidthChanged,
[this](){this -> updateForm();}); [this](){this -> updateForm();});
m_change_connections << connect(m_text_field.data(), &PartDynamicTextField::compositeTextChanged, m_connection_list << connect(m_text_field.data(), &PartDynamicTextField::compositeTextChanged,
[this](){this -> updateForm();}); [this](){this -> updateForm();});
} }
void DynamicTextFieldEditor::disconnectConnections() void DynamicTextFieldEditor::disconnectConnections()
{ {
//Remove previous connection //Remove previous connection
if(!m_change_connections.isEmpty()) if(!m_connection_list.isEmpty())
for(const QMetaObject::Connection& con : m_change_connections) { for(const QMetaObject::Connection& con : m_connection_list) {
disconnect(con); disconnect(con);
} }
m_change_connections.clear(); m_connection_list.clear();
} }
/** /**

View File

@@ -45,7 +45,7 @@ class DynamicTextFieldEditor : public ElementItemEditor {
bool setParts(QList <CustomElementPart *>) override; bool setParts(QList <CustomElementPart *>) override;
CustomElementPart *currentPart() const override; CustomElementPart *currentPart() const override;
QList<CustomElementPart*> currentParts() const override; QList<CustomElementPart*> currentParts() const override;
void updateFormPriv() override; void updateForm() override;
private: private:
void setupWidget(); void setupWidget();
@@ -73,6 +73,7 @@ class DynamicTextFieldEditor : public ElementItemEditor {
Ui::DynamicTextFieldEditor *ui; Ui::DynamicTextFieldEditor *ui;
QPointer<PartDynamicTextField> m_text_field; QPointer<PartDynamicTextField> m_text_field;
QList<PartDynamicTextField*> m_parts; QList<PartDynamicTextField*> m_parts;
QList<QMetaObject::Connection> m_connection_list;
#ifdef BUILD_WITHOUT_KF5 #ifdef BUILD_WITHOUT_KF5
#else #else

View File

@@ -110,9 +110,9 @@ QList<CustomElementPart *> EllipseEditor::currentParts() const {
} }
/** /**
* @brief EllipseEditor::updateFormPriv * @brief EllipseEditor::updateForm
*/ */
void EllipseEditor::updateFormPriv() void EllipseEditor::updateForm()
{ {
if (!m_part) { if (!m_part) {
return; return;

View File

@@ -43,7 +43,7 @@ class EllipseEditor : public ElementItemEditor
bool setParts(QList<CustomElementPart *> parts) override; bool setParts(QList<CustomElementPart *> parts) override;
CustomElementPart *currentPart() const override; CustomElementPart *currentPart() const override;
QList<CustomElementPart*> currentParts() const override; QList<CustomElementPart*> currentParts() const override;
void updateFormPriv() override; void updateForm() override;
private slots: private slots:
void on_m_x_sb_editingFinished(); void on_m_x_sb_editingFinished();
@@ -59,7 +59,8 @@ class EllipseEditor : public ElementItemEditor
private: private:
Ui::EllipseEditor *ui; Ui::EllipseEditor *ui;
PartEllipse *m_part = nullptr; PartEllipse *m_part = nullptr;
StyleEditor *m_style = nullptr; StyleEditor *m_style = nullptr;
QList <QMetaObject::Connection> m_change_connections;
}; };

View File

@@ -176,10 +176,10 @@ QList<CustomElementPart *> LineEditor::currentParts() const {
} }
/** /**
@brief LineEditor::updateFormPriv @brief LineEditor::updateForm
Reimplemented from ElementItemEditor Reimplemented from ElementItemEditor
*/ */
void LineEditor::updateFormPriv() void LineEditor::updateForm()
{ {
if (!m_part) { if (!m_part) {
return; return;

View File

@@ -43,7 +43,7 @@ class LineEditor : public ElementItemEditor
bool setParts(QList <CustomElementPart *> parts) override; bool setParts(QList <CustomElementPart *> parts) override;
CustomElementPart *currentPart() const override; CustomElementPart *currentPart() const override;
QList<CustomElementPart *> currentParts() const override; QList<CustomElementPart *> currentParts() const override;
void updateFormPriv() override; void updateForm() override;
private: private:
void setUpChangeConnections(); void setUpChangeConnections();
@@ -59,7 +59,8 @@ class LineEditor : public ElementItemEditor
private: private:
PartLine *m_part = nullptr; PartLine *m_part = nullptr;
Ui::LineEditor *ui; Ui::LineEditor *ui;
StyleEditor *m_style = nullptr; StyleEditor *m_style = nullptr;
QList <QMetaObject::Connection> m_change_connections;
bool m_locked = false; bool m_locked = false;
}; };

View File

@@ -130,10 +130,10 @@ QList<CustomElementPart*> PolygonEditor::currentParts() const
} }
/** /**
@brief PolygonEditor::updateFormPriv @brief PolygonEditor::updateForm
Update the widget Update the widget
*/ */
void PolygonEditor::updateFormPriv() void PolygonEditor::updateForm()
{ {
if (!m_part) { if (!m_part) {
return; return;

View File

@@ -39,7 +39,7 @@ class PolygonEditor : public ElementItemEditor
bool setPart(CustomElementPart *part) override; bool setPart(CustomElementPart *part) override;
CustomElementPart *currentPart() const override; CustomElementPart *currentPart() const override;
QList<CustomElementPart*> currentParts() const override; QList<CustomElementPart*> currentParts() const override;
void updateFormPriv() override; void updateForm() override;
QVector<QPointF> pointsFromTree(); QVector<QPointF> pointsFromTree();
bool eventFilter(QObject *watched, QEvent *event) override; bool eventFilter(QObject *watched, QEvent *event) override;
@@ -63,6 +63,7 @@ class PolygonEditor : public ElementItemEditor
Ui::PolygonEditor *ui; Ui::PolygonEditor *ui;
StyleEditor *m_style = nullptr; StyleEditor *m_style = nullptr;
PartPolygon *m_part = nullptr; PartPolygon *m_part = nullptr;
QList <QMetaObject::Connection> m_change_connections;
}; };
#endif // POLYGONEDITOR_H #endif // POLYGONEDITOR_H

View File

@@ -136,7 +136,7 @@ QPointF RectangleEditor::editedTopLeft() const
/** /**
@brief RectangleEditor::updateForm @brief RectangleEditor::updateForm
*/ */
void RectangleEditor::updateFormPriv() void RectangleEditor::updateForm()
{ {
if (!m_part) { if (!m_part) {
return; return;

View File

@@ -48,7 +48,7 @@ class RectangleEditor : public ElementItemEditor
QPointF editedTopLeft () const; QPointF editedTopLeft () const;
public slots: public slots:
void updateFormPriv() override; void updateForm() override;
private: private:
void editingFinished(); void editingFinished();
void activeConnections(bool active); void activeConnections(bool active);
@@ -70,6 +70,7 @@ class RectangleEditor : public ElementItemEditor
StyleEditor *m_style; StyleEditor *m_style;
PartRectangle *m_part; PartRectangle *m_part;
Ui::RectangleEditor *ui; Ui::RectangleEditor *ui;
QList <QMetaObject::Connection> m_change_connections;
}; };
#endif // RECTANGLEEDITOR_H #endif // RECTANGLEEDITOR_H

View File

@@ -46,11 +46,11 @@ TerminalEditor::~TerminalEditor()
} }
/** /**
* @brief TerminalEditor::updateFormPriv * @brief TerminalEditor::updateForm
* Reimplemented from ElementItemEditor * Reimplemented from ElementItemEditor
* Update the content of this widget * Update the content of this widget
*/ */
void TerminalEditor::updateFormPriv() void TerminalEditor::updateForm()
{ {
if (!m_part) { if (!m_part) {
return; return;

View File

@@ -39,7 +39,7 @@ class TerminalEditor : public ElementItemEditor
TerminalEditor(QETElementEditor *editor, QWidget *parent = nullptr); TerminalEditor(QETElementEditor *editor, QWidget *parent = nullptr);
~TerminalEditor() override; ~TerminalEditor() override;
void updateFormPriv() override; void updateForm() override;
bool setPart(CustomElementPart *new_part) override; bool setPart(CustomElementPart *new_part) override;
CustomElementPart *currentPart() const override; CustomElementPart *currentPart() const override;
QList<CustomElementPart *> currentParts() const override {return QList<CustomElementPart *>();} QList<CustomElementPart *> currentParts() const override {return QList<CustomElementPart *>();}
@@ -55,7 +55,8 @@ class TerminalEditor : public ElementItemEditor
private: private:
Ui::TerminalEditor *ui; Ui::TerminalEditor *ui;
QVector<QMetaObject::Connection> m_editor_connections; QVector<QMetaObject::Connection> m_editor_connections,
m_change_connections;
PartTerminal *m_part = nullptr; PartTerminal *m_part = nullptr;
bool m_locked = false; bool m_locked = false;
}; };

View File

@@ -48,7 +48,7 @@ TextEditor::~TextEditor() {}
@brief TextEditor::updateForm @brief TextEditor::updateForm
Update the gui Update the gui
*/ */
void TextEditor::updateFormPriv() void TextEditor::updateForm()
{ {
if (m_text.isNull()) { if (m_text.isNull()) {
return; return;

View File

@@ -38,7 +38,7 @@ class TextEditor : public ElementItemEditor {
explicit TextEditor(QETElementEditor *editor, PartText *text = nullptr, QWidget *parent = nullptr); explicit TextEditor(QETElementEditor *editor, PartText *text = nullptr, QWidget *parent = nullptr);
~TextEditor() override; ~TextEditor() override;
void updateFormPriv() override; void updateForm() override;
bool setPart(CustomElementPart *part) override; bool setPart(CustomElementPart *part) override;
bool setParts(QList <CustomElementPart *>) override; bool setParts(QList <CustomElementPart *>) override;
CustomElementPart *currentPart() const override; CustomElementPart *currentPart() const override;

View File

@@ -109,7 +109,8 @@ QDomDocument ExportElementTextPattern::xmlConf() const
root.setAttribute("name", m_name); root.setAttribute("name", m_name);
doc.appendChild(root); doc.appendChild(root);
QDomElement elmt = m_element->toXml(doc); QHash<Terminal *, int> H;
QDomElement elmt = m_element->toXml(doc, H);
QDomElement texts = elmt.firstChildElement("dynamic_texts"); QDomElement texts = elmt.firstChildElement("dynamic_texts");
QDomElement groups = elmt.firstChildElement("texts_groups"); QDomElement groups = elmt.firstChildElement("texts_groups");

View File

@@ -147,15 +147,7 @@ void Machine_info::send_info_to_debug()
+ " x " + " x "
+ QString::number(pc.screen.height[ii]) + QString::number(pc.screen.height[ii])
+ " )"; + " )";
} }
}
/**
@brief Machine_info::~Machine_info
destructor
*/
Machine_info::~Machine_info()
{
} }
/** /**

View File

@@ -34,7 +34,6 @@ public:
int32_t i_max_screen_height(); int32_t i_max_screen_height();
QString compilation_info(); QString compilation_info();
void send_info_to_debug(); void send_info_to_debug();
~Machine_info();
signals: signals:

View File

@@ -19,18 +19,19 @@
#include "../qetxml.h" #include "../qetxml.h"
#include <QDebug> #include <QDebug>
void ElementData::toSettings(QSettings &settings, const QString& prefix) const { void ElementData::toSettings(QSettings &settings, const QString prefix) const {
Q_UNUSED(settings) Q_UNUSED(settings)
Q_UNUSED(prefix) Q_UNUSED(prefix)
} }
void ElementData::fromSettings(QSettings &settings, const QString& prefix) { void ElementData::fromSettings(const QSettings &settings, const QString prefix) {
Q_UNUSED(settings) Q_UNUSED(settings)
Q_UNUSED(prefix) Q_UNUSED(prefix)
} }
void ElementData::toXmlPriv(QDomElement& e) const { QDomElement ElementData::toXml(QDomDocument &xml_element) const {
Q_UNUSED(e) Q_UNUSED(xml_element)
return QDomElement();
} }
/** /**
@@ -41,7 +42,7 @@ void ElementData::toXmlPriv(QDomElement& e) const {
* @param xml_element : tagName must be 'definition' * @param xml_element : tagName must be 'definition'
* @return true is successfuly loaded * @return true is successfuly loaded
*/ */
bool ElementData::fromXmlPriv(const QDomElement &xml_element) bool ElementData::fromXml(const QDomElement &xml_element)
{ {
if(xml_element.tagName() != "definition" || if(xml_element.tagName() != "definition" ||
xml_element.attribute("type") != "element") { xml_element.attribute("type") != "element") {

View File

@@ -18,7 +18,7 @@
#ifndef ELEMENTDATA_H #ifndef ELEMENTDATA_H
#define ELEMENTDATA_H #define ELEMENTDATA_H
#include "../properties/propertiesinterface.h" #include "propertiesinterface.h"
#include "../diagramcontext.h" #include "../diagramcontext.h"
#include "../NameList/nameslist.h" #include "../NameList/nameslist.h"
@@ -85,10 +85,10 @@ class ElementData : public PropertiesInterface
ElementData() {} ElementData() {}
~ElementData() override {} ~ElementData() override {}
void toSettings(QSettings &settings, const QString& prefix = QString()) const override; void toSettings(QSettings &settings, const QString prefix = QString()) const override;
void fromSettings(QSettings &settings, const QString& prefix = QString()) override; void fromSettings(const QSettings &settings, const QString prefix = QString()) override;
void toXmlPriv(QDomElement &) const override; QDomElement toXml(QDomDocument &xml_element) const override;
bool fromXmlPriv(const QDomElement &xml_element) override; bool fromXml(const QDomElement &xml_element) override;
QDomElement kindInfoToXml(QDomDocument &document); QDomElement kindInfoToXml(QDomDocument &document);
bool operator==(const ElementData &data) const; bool operator==(const ElementData &data) const;

View File

@@ -16,230 +16,17 @@
along with QElectroTech. If not, see <http://www.gnu.org/licenses/>. along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "propertiesinterface.h" #include "propertiesinterface.h"
#include <QDebug>
#include "../qetxml.h"
/*!
* Available property types
*/
namespace {
const QString userPropertiesS = "userProperties";
}
/** /**
@brief PropertiesInterface::PropertiesInterface @brief PropertiesInterface::PropertiesInterface
*/ */
PropertiesInterface::PropertiesInterface(const QString &tagname): PropertiesInterface::PropertiesInterface()
mTagName(tagname)
{ {
} }
/** /**
@brief PropertiesInterface::~PropertiesInterface @brief PropertiesInterface::~PropertiesInterface
*/ */
PropertiesInterface::~PropertiesInterface() PropertiesInterface::~PropertiesInterface()
{ {
}
void PropertiesInterface::setTagName(const QString& tagname)
{
mTagName = tagname;
}
QString PropertiesInterface::tagName() const
{
return mTagName;
}
QDomElement PropertiesInterface::toXml (QDomDocument &xml_document) const
{
QDomElement element = xml_document.createElement(mTagName);
toXmlPriv(element);
propertiesToXml(element);
return element;
}
bool PropertiesInterface::fromXml (const QDomElement &xml_element)
{
if (!fromXmlPriv(xml_element))
return false;
if (!propertiesFromXml(xml_element))
return false;
return true;
}
bool PropertiesInterface::valideXml(QDomElement& element) {
qDebug(QString("ValideXml() is not implemented. File: %1, Line: %2").arg(__FILE__).arg(__LINE__).toStdString().data());
return false;
}
/**
Permet de convertir une chaine de caracteres ("n", "s", "e" ou "w")
en orientation. Si la chaine fait plusieurs caracteres, seul le
premier est pris en compte. En cas d'incoherence, Qet::North est
retourne.
@param s Chaine de caractere cense representer une orientation
@return l'orientation designee par la chaine de caractere
*/
Qet::Orientation PropertiesInterface::orientationFromString(const QString &s) {
QChar c = s[0];
// in some cases/ old projects? (affuteuse_250h.qet) numbers instead of characters are
// used for the orientation
if (c == 'e' || c == '1') return(Qet::East);
else if (c == 's' || c == '2') return(Qet::South);
else if (c == 'w' || c == '3') return (Qet::West);
else return(Qet::North); // c == '0'
}
/**
@param o une orientation
@return une chaine de caractere representant l'orientation
*/
QString PropertiesInterface::orientationToString(Qet::Orientation o) {
QString ret;
switch(o) {
case Qet::North: ret = "n"; break;
case Qet::East : ret = "e"; break;
case Qet::South: ret = "s"; break;
case Qet::West : ret = "w"; break;
}
return(ret);
}
void PropertiesInterface::deleteUserProperties()
{
properties.clear();
}
int PropertiesInterface::userPropertiesCount() const
{
return properties.count();
}
void PropertiesInterface::setUserProperty(const QString& key, const QVariant& value)
{
properties[key] = value;
}
bool PropertiesInterface::existUserProperty(const QString& key) const
{
return properties.contains(key);
}
QVariant PropertiesInterface::userPropertyValue(const QString& key)
{
if (!existUserProperty(key))
return QVariant();
return properties[key];
}
void PropertiesInterface::propertiesToXml(QDomElement& e) const
{
if (properties.count() == 0)
return;
QDomDocument doc = e.ownerDocument();
auto up = doc.createElement(userPropertiesS);
for (auto i = properties.begin(); i != properties.end(); ++i)
{
auto type = i.value().type();
switch(type) {
case QVariant::Type::String:
up.appendChild(QETXML::createXmlProperty(i.key(), i.value().toString())); break;
case QVariant::Type::Int:
up.appendChild(QETXML::createXmlProperty(i.key(), i.value().toInt())); break;
case QVariant::Type::Double:
up.appendChild(QETXML::createXmlProperty(i.key(), i.value().toDouble())); break;
case QVariant::Type::Bool:
up.appendChild(QETXML::createXmlProperty(i.key(), i.value().toBool())); break;
case QVariant::Type::Color:
up.appendChild(QETXML::createXmlProperty(i.key(), QColor(i.value().value<QColor>()))); break;
default:
break;
}
}
e.appendChild(up);
}
/*!
* \brief PropertiesInterface::propertiesFromXml
* Read all user properties from the DomElement& e
* \param e
* \return
*/
bool PropertiesInterface::propertiesFromXml(const QDomElement& e)
{
QDomNodeList l = e.childNodes();
for (int i=0; i < l.count(); i++)
{
QDomElement userProperties = l.at(i).toElement();
if (userProperties.tagName() != userPropertiesS)
continue;
QDomElement userProperty;
for (int up_index = 0; up_index < userProperties.childNodes().length(); up_index++)
{
userProperty = userProperties.childNodes().at(up_index).toElement();
QString name = userProperty.attribute("name");
QString type = userProperty.attribute("type");
QString value = userProperty.attribute("value");
if (type == QETXML::integerS)
{
int i;
if (QETXML::propertyInteger(value, &i) == QETXML::PropertyFlags::Success)
properties[name] = QVariant(i);
else
return false;
}
else if (type == QETXML::doubleS)
{
double d;
if (QETXML::propertyDouble(value, &d) == QETXML::PropertyFlags::Success)
properties[name] = QVariant(d);
else
return false;
}
else if (type == QETXML::boolS)
{
bool b;
if (QETXML::propertyBool(value, &b) == QETXML::PropertyFlags::Success)
properties[name] = QVariant(b);
else
return false;
}
else if (type == QETXML::uuidS)
{
QUuid u;
if (QETXML::propertyUuid(value, &u) == QETXML::PropertyFlags::Success)
properties[name] = QVariant(u);
else
return false;
}
else if (type == QETXML::colorS)
{
QColor c;
if (QETXML::propertyColor(value, &c) == QETXML::PropertyFlags::Success)
properties[name] = QVariant(c);
else
return false;
}
else if (type == QETXML::stringS)
{
properties[name] = QVariant(value);
}
else
{
qDebug() << "Not a valid property type!";
}
}
}
return true;
} }

View File

@@ -20,11 +20,7 @@
#include <QString> #include <QString>
#include <QSettings> #include <QSettings>
#include <QColor>
#include <QDomElement> #include <QDomElement>
#include <limits>
#include "sources/qet.h"
#include <QUuid>
/** /**
@brief The PropertiesInterface class @brief The PropertiesInterface class
@@ -34,7 +30,7 @@
class PropertiesInterface class PropertiesInterface
{ {
public: public:
PropertiesInterface(const QString& tagname = "Properties"); PropertiesInterface();
virtual ~PropertiesInterface(); virtual ~PropertiesInterface();
/** /**
@brief toSettings @brief toSettings
@@ -43,8 +39,8 @@ class PropertiesInterface
befor the name of each paramètre befor the name of each paramètre
@param QString @param QString
*/ */
virtual void toSettings(QSettings &, virtual void toSettings (QSettings &settings,
const QString & = QString()) const =0; const QString = QString()) const =0;
/** /**
@brief fromSettings @brief fromSettings
load properties to setting file. load properties to setting file.
@@ -52,98 +48,22 @@ class PropertiesInterface
befor the name of each paramètre befor the name of each paramètre
@param QString @param QString
*/ */
virtual void fromSettings(QSettings &, virtual void fromSettings (const QSettings &settings,
const QString & = QString()) = 0; const QString = QString()) =0;
/** /**
@brief toXml @brief toXml
Save properties to xml element Save properties to xml element
@param xml_document @param xml_document
@return QDomElement @return QDomElement
*/ */
virtual QDomElement toXml (QDomDocument &xml_document) const; virtual QDomElement toXml (QDomDocument &xml_document) const =0;
/** /**
@brief fromXml @brief fromXml
load properties to xml element load properties to xml element
@param xml_element @param xml_element
@return true / false @return true / false
*/ */
virtual bool fromXml (const QDomElement &xml_element); virtual bool fromXml (const QDomElement &xml_element) =0;
/*!
* \brief deleteUserProperties
* Delete all userproperties
*/
void deleteUserProperties();
/*!
* \brief userPropertiesCount
* Returns the number of user properties
* \return
*/
int userPropertiesCount() const;
/*!
* \brief setUserProperty
* Adds a new property if \p key does not exist in the \p properties member,
* otherwise overwrite the value
* \param key
* \param value
*/
void setUserProperty(const QString& key, const QVariant& value);
/*!
* \brief existUserProperty
* Checks if a user property with key \p key is available or not
* \param key
* \return
*/
bool existUserProperty(const QString& key) const;
/*!
* \brief userProperty
* Returns the value of a user property with key \p key
* If \p key is not found, an invalid QVariant is returned.
* Use QVariant::type() to get the type of the vale
* \param key
* \return
*/
QVariant userPropertyValue(const QString& key);
static bool valideXml(QDomElement& element);
void setTagName(const QString& tagname);
QString tagName() const;
/**
Permet de convertir une chaine de caracteres ("n", "s", "e" ou "w")
en orientation. Si la chaine fait plusieurs caracteres, seul le
premier est pris en compte. En cas d'incoherence, Qet::North est
retourne.
@param s Chaine de caractere cense representer une orientation
@return l'orientation designee par la chaine de caractere
*/
static Qet::Orientation orientationFromString(const QString &s);
/**
@param o une orientation
@return une chaine de caractere representant l'orientation
*/
static QString orientationToString(Qet::Orientation o);
private:
virtual void toXmlPriv (QDomElement &e) const =0;
virtual bool fromXmlPriv (const QDomElement &e) =0;
/*!
* \brief PropertiesInterface::propertiesToXml
* Write all user properties to the DomElement \p e
* \param e
*/
void propertiesToXml(QDomElement& e) const;
bool propertiesFromXml (const QDomElement &e);
QHash<QString, QVariant> properties;
QString mTagName{""};
}; };
#endif // PROPERTIESINTERFACE_H #endif // PROPERTIESINTERFACE_H

View File

@@ -20,16 +20,14 @@
#include <QGraphicsObject> #include <QGraphicsObject>
#include <QDebug> #include <QDebug>
#include "../qetxml.h"
TerminalData::TerminalData(): TerminalData::TerminalData():
PropertiesInterface("terminaldata") PropertiesInterface()
{ {
init(); init();
} }
TerminalData::TerminalData(QGraphicsObject *parent): TerminalData::TerminalData(QGraphicsObject *parent):
PropertiesInterface("terminaldata"), PropertiesInterface(),
q(parent) q(parent)
{ {
init(); init();
@@ -61,7 +59,7 @@ void TerminalData::setParent(QGraphicsObject* parent)
@param settings UNUSED @param settings UNUSED
@param prefix UNUSED @param prefix UNUSED
*/ */
void TerminalData::toSettings(QSettings &settings, const QString &prefix) const void TerminalData::toSettings(QSettings &settings, const QString prefix) const
{ {
Q_UNUSED(settings) Q_UNUSED(settings)
@@ -76,39 +74,44 @@ void TerminalData::toSettings(QSettings &settings, const QString &prefix) const
@param settings UNUSED @param settings UNUSED
@param prefix UNUSED @param prefix UNUSED
*/ */
void TerminalData::fromSettings(QSettings &settings, const QString& prefix) void TerminalData::fromSettings(const QSettings &settings, const QString prefix)
{ {
Q_UNUSED(settings) Q_UNUSED(settings)
Q_UNUSED(prefix) Q_UNUSED(prefix)
} }
/** /**
@brief TerminalData::toXmlPriv @brief TerminalData::toXml
Save properties to xml element Save properties to xml element
write the name, number, position and orientation of the terminal write the name, number, position and orientation of the terminal
to xml_element to xml_element
@note This method is only called from the PartTerminal @note This method is only called from the PartTerminal
and should never called from the Terminal class and should never called from the Terminal class
@param e: element to store the properties @param xml_document
@return xml_element : DomElement with
the name, number, position and orientation of the terminal the name, number, position and orientation of the terminal
*/ */
void TerminalData::toXmlPriv(QDomElement& xml_element) const QDomElement TerminalData::toXml(QDomDocument &xml_document) const
{ {
xml_element.setAttribute("x", QString("%1").arg(q->scenePos().x())); QDomElement xml_element = xml_document.createElement("terminal");
xml_element.setAttribute("y", QString("%1").arg(q->scenePos().y()));
xml_element.setAttribute("uuid", m_uuid.toString()); xml_element.setAttribute("x", QString("%1").arg(q->scenePos().x()));
xml_element.setAttribute("name", m_name); xml_element.setAttribute("y", QString("%1").arg(q->scenePos().y()));
xml_element.setAttribute("orientation", xml_element.setAttribute("uuid", m_uuid.toString());
orientationToString(m_orientation)); xml_element.setAttribute("name", m_name);
xml_element.setAttribute("type", typeToString(m_type)); xml_element.setAttribute("orientation",
Qet::orientationToString(m_orientation));
xml_element.setAttribute("type", typeToString(m_type));
return(xml_element);
} }
/* /**
@brief TerminalData::fromXmlPriv @brief TerminalData::fromXml
load properties to xml element load properties to xml element
@note This method is only called from the PartTerminal @note This method is only called from the PartTerminal
@@ -116,67 +119,41 @@ void TerminalData::toXmlPriv(QDomElement& xml_element) const
@param xml_element @param xml_element
@return true if succeeded / false if the attribute is not real @return true if succeeded / false if the attribute is not real
*/ */
bool TerminalData::fromXmlPriv(const QDomElement &xml_element) bool TerminalData::fromXml (const QDomElement &xml_element)
{ {
qreal term_x = 0.0; qreal term_x = 0.0;
qreal term_y = 0.0; qreal term_y = 0.0;
// reads the position of the terminal // reads the position of the terminal
// lit la position de la borne // lit la position de la borne
if (!QET::attributeIsAReal(xml_element, "x", &term_x))
if (QETXML::propertyDouble(xml_element, "x", &term_x))
return false; return false;
if (QETXML::propertyDouble(xml_element, "y", &term_y)) if (!QET::attributeIsAReal(xml_element, "y", &term_y))
return false; return false;
m_pos = QPointF(term_x, term_y); m_pos = QPointF(term_x, term_y);
// emit posFromXML(QPointF(term_x, term_y)); //emit posFromXML(QPointF(term_x, term_y));
// do not write uuid from this class, because only PartTerminal::fromXml need QString uuid = xml_element.attribute("uuid");
// to write it to xml file. Terminal::fromXml does not need. // update part and add uuid, which is used in the new version
// to connect terminals together
// if the attribute not exists, means, the element is created with an // if the attribute not exists, means, the element is created with an
// older version of qet. So use the legacy approach // older version of qet. So use the legacy approach
// to identify terminals
if (!uuid.isEmpty())
m_uuid = QUuid(uuid);
m_name = xml_element.attribute("name");
//if (QETXML::propertyString(xml_element, "name", &m_name))
// return false;
QETXML::propertyString(xml_element, "name", &m_name); // some parts do not have a name. Example: affuteuse_250h.qet, Terminal at x="0" y="-20"
QString o;
if (QETXML::propertyString(xml_element, "orientation", &o))
return false;
// read the orientation of the terminal // read the orientation of the terminal
// lit l'orientation de la borne // lit l'orientation de la borne
m_orientation = orientationFromString(o); m_orientation = Qet::orientationFromString(
xml_element.attribute("orientation"));
QString type;
if (QETXML::propertyString(xml_element, "type", &type) == QETXML::PropertyFlags::Success)
m_type = typeFromString(type);
return true; m_type = typeFromString(xml_element.attribute("type"));
}
bool TerminalData::valideXml(const QDomElement& xml_element) {
if (QETXML::propertyDouble(xml_element, "x"))
return false;
// Old projects do not have this property.
// if (QETXML::propertyString(xml_element, "type"))
// return false;
// legacy elements do not have an uuid
// if (QETXML::propertyUuid(xml_element, "uuid"))
// return false;
//if (QETXML::propertyString(xml_element, "name")) // some parts do not have a name. Example: affuteuse_250h.qet, Terminal at x="0" y="-20"
// return false;
if (QETXML::propertyString(xml_element, "orientation"))
return false;
return true; return true;
} }

View File

@@ -19,7 +19,7 @@
#define TERMINALDATA_H #define TERMINALDATA_H
#include "../qet.h" #include "../qet.h"
#include "../properties/propertiesinterface.h" #include "propertiesinterface.h"
#include <QPointF> #include <QPointF>
#include <QUuid> #include <QUuid>
@@ -53,13 +53,11 @@ class TerminalData : public PropertiesInterface
void setParent(QGraphicsObject* parent); void setParent(QGraphicsObject* parent);
void toSettings(QSettings &settings, void toSettings(QSettings &settings,
const QString& prefix = QString()) const override; const QString prefix = QString()) const override;
void fromSettings(QSettings &settings, void fromSettings(const QSettings &settings,
const QString& = QString()) override; const QString prefix = QString()) override;
void toXmlPriv(QDomElement &xml_element) const override; QDomElement toXml(QDomDocument &xml_element) const override;
bool fromXmlPriv(const QDomElement &xml_element) override; bool fromXml(const QDomElement &xml_element) override;
static bool valideXml(const QDomElement &xml_element);
static QString typeToString(TerminalData::Type type); static QString typeToString(TerminalData::Type type);
static TerminalData::Type typeFromString(const QString &string); static TerminalData::Type typeFromString(const QString &string);
@@ -71,13 +69,13 @@ class TerminalData : public PropertiesInterface
@brief m_orientation @brief m_orientation
Orientation of the terminal Orientation of the terminal
*/ */
Qet::Orientation m_orientation{Qet::Orientation::North}; Qet::Orientation m_orientation;
/** /**
@brief m_second_point @brief second_point
Position of the second point of the terminal Position of the second point of the terminal
in scene coordinates in scene coordinates
*/ */
QPointF m_second_point{0,0}; QPointF m_second_point;
/** /**
@brief m_uuid @brief m_uuid
Uuid of the terminal. Uuid of the terminal.
@@ -92,7 +90,7 @@ class TerminalData : public PropertiesInterface
valid. So if in the loaded document a uuid exists, valid. So if in the loaded document a uuid exists,
use this one and don't create a new one. use this one and don't create a new one.
*/ */
QUuid m_uuid; // default is an invalid uuid. QUuid m_uuid;
/** /**
@brief m_name @brief m_name
Name of the element. Name of the element.
@@ -110,8 +108,10 @@ class TerminalData : public PropertiesInterface
It is used to store the initial position so that It is used to store the initial position so that
PartTerminal and Terminal have access to it. PartTerminal and Terminal have access to it.
*/ */
QPointF m_pos{0,0}; QPointF m_pos;
TerminalData::Type m_type = TerminalData::Generic; TerminalData::Type m_type = TerminalData::Generic;
private: private:
QGraphicsObject* q{nullptr}; QGraphicsObject* q{nullptr};
}; };

View File

@@ -22,15 +22,20 @@
#include <QHash> #include <QHash>
#include <QMetaEnum> #include <QMetaEnum>
#include "../qetxml.h"
/** /**
@brief XRefProperties::XRefProperties @brief XRefProperties::XRefProperties
Default Constructor Default Constructor
*/ */
XRefProperties::XRefProperties() XRefProperties::XRefProperties()
{ {
setTagName("xref"); m_show_power_ctc = true;
m_display = Cross;
m_snap_to = Bottom;
m_prefix_keys << "power" << "delay" << "switch";
m_master_label = "%f-%l%c";
m_slave_label = "(%f-%l%c)";
m_offset = 0;
m_xref_pos = Qt::AlignBottom;
} }
/** /**
@@ -40,7 +45,7 @@ XRefProperties::XRefProperties()
@param prefix: prefix before properties name @param prefix: prefix before properties name
*/ */
void XRefProperties::toSettings(QSettings &settings, void XRefProperties::toSettings(QSettings &settings,
const QString &prefix) const const QString prefix) const
{ {
settings.setValue(prefix + "showpowerctc", m_show_power_ctc); settings.setValue(prefix + "showpowerctc", m_show_power_ctc);
QString display = m_display == Cross? "cross" : "contacts"; QString display = m_display == Cross? "cross" : "contacts";
@@ -69,8 +74,8 @@ void XRefProperties::toSettings(QSettings &settings,
@param settings: QSettings to use @param settings: QSettings to use
@param prefix: prefix before properties name @param prefix: prefix before properties name
*/ */
void XRefProperties::fromSettings(QSettings &settings, void XRefProperties::fromSettings(const QSettings &settings,
const QString &prefix) const QString prefix)
{ {
m_show_power_ctc = settings.value(prefix + "showpowerctc", true).toBool(); m_show_power_ctc = settings.value(prefix + "showpowerctc", true).toBool();
QString display = settings.value(prefix + "displayhas", "cross").toString(); QString display = settings.value(prefix + "displayhas", "cross").toString();
@@ -95,66 +100,62 @@ void XRefProperties::fromSettings(QSettings &settings,
@param xml_document : QDomElement to use for saving @param xml_document : QDomElement to use for saving
@return QDomElement @return QDomElement
*/ */
void XRefProperties::toXmlPriv(QDomElement& xml_element) const QDomElement XRefProperties::toXml(QDomDocument &xml_document) const
{ {
xml_element.setAttribute("type", m_key);
xml_element.setAttribute("showpowerctc", m_show_power_ctc? "true" : "false"); QDomElement xml_element = xml_document.createElement("xref");
QString display = m_display == Cross? "cross" : "contacts"; xml_element.setAttribute("type", m_key);
xml_element.setAttribute("displayhas", display);
QString snap = m_snap_to == Bottom? "bottom" : "label";
xml_element.setAttribute("snapto", snap);
QString xrefpos; xml_element.setAttribute("showpowerctc", m_show_power_ctc? "true" : "false");
QString display = m_display == Cross? "cross" : "contacts";
xml_element.setAttribute("displayhas", display);
QString snap = m_snap_to == Bottom? "bottom" : "label";
xml_element.setAttribute("snapto", snap);
QMetaEnum var = QMetaEnum::fromType<Qt::Alignment>(); QString xrefpos;
xml_element.setAttribute("xrefpos", var.valueToKey(m_xref_pos));
int offset = m_offset; QMetaEnum var = QMetaEnum::fromType<Qt::Alignment>();
xml_element.setAttribute("offset", QString::number(offset)); xml_element.setAttribute("xrefpos", var.valueToKey(m_xref_pos));
QString master_label = m_master_label;
xml_element.setAttribute("master_label", master_label); int offset = m_offset;
QString slave_label = m_slave_label; xml_element.setAttribute("offset", QString::number(offset));
xml_element.setAttribute("slave_label", slave_label); QString master_label = m_master_label;
foreach (QString key, m_prefix.keys()) { xml_element.setAttribute("master_label", master_label);
xml_element.setAttribute(key + "prefix", m_prefix.value(key)); QString slave_label = m_slave_label;
} xml_element.setAttribute("slave_label", slave_label);
foreach (QString key, m_prefix.keys()) {
xml_element.setAttribute(key + "prefix", m_prefix.value(key));
}
return xml_element;
} }
/** RETURNS True /**
@brief XRefProperties::fromXmlPriv @brief XRefProperties::fromXml
Load from xml Load from xml
@param xml_element: QDomElement to use for load @param xml_element: QDomElement to use for load
*/ */
bool XRefProperties::fromXmlPriv(const QDomElement &xml_element) { bool XRefProperties::fromXml(const QDomElement &xml_element) {
m_show_power_ctc = xml_element.attribute("showpowerctc") == "true";
QString display = xml_element.attribute("displayhas", "cross");
display == "cross"? m_display = Cross : m_display = Contacts;
QString snap = xml_element.attribute("snapto", "label");
snap == "bottom"? m_snap_to = Bottom : m_snap_to = Label;
if (QETXML::propertyBool(xml_element, "showpowerctc", &m_show_power_ctc)) QString xrefpos = xml_element.attribute("xrefpos","Left");
return false;
QString display; QMetaEnum var = QMetaEnum::fromType<Qt::Alignment>();
if (QETXML::propertyString(xml_element, "displayhas", &display) != QETXML::PropertyFlags::NotFound) {
display == "cross"? m_display = Cross : m_display = Contacts;
}
if(xml_element.hasAttribute("xrefpos"))
m_xref_pos = Qt::AlignmentFlag(var.keyToValue(xml_element.attribute("xrefpos").toStdString().data()));
else
m_xref_pos = Qt::AlignBottom;
QString snap; m_offset = xml_element.attribute("offset", "0").toInt();
if (QETXML::propertyString(xml_element, "snapto", &snap) != QETXML::PropertyFlags::NotFound) { m_master_label = xml_element.attribute("master_label", "%f-%l%c");
snap == "bottom"? m_snap_to = Bottom : m_snap_to = Label; m_slave_label = xml_element.attribute("slave_label","(%f-%l%c)");
}
QString xrefpos;
if (QETXML::propertyString(xml_element, "xrefpos", &xrefpos) != QETXML::PropertyFlags::NotFound) {
QMetaEnum var = QMetaEnum::fromType<Qt::Alignment>();
m_xref_pos = Qt::AlignmentFlag(var.keyToValue(xrefpos.toStdString().data()));
}
// TODO: why it compiles without this true??
QETXML::propertyInteger(xml_element, "offset", &m_offset);
QETXML::propertyString(xml_element, "master_label", &m_master_label);
QETXML::propertyString(xml_element, "slave_label", &m_slave_label);
QString value;
foreach (QString key, m_prefix_keys) { foreach (QString key, m_prefix_keys) {
if (!QETXML::propertyString(xml_element, key + "prefix", &value)) m_prefix.insert(key, xml_element.attribute(key + "prefix"));
m_prefix.insert(key, value);
} }
return true; return true;
} }

View File

@@ -42,11 +42,12 @@ class XRefProperties : public PropertiesInterface
Label Label
}; };
void toSettings (QSettings &settings, const QString& = QString()) const override; void toSettings (QSettings &settings,
void fromSettings (QSettings &settings, const QString = QString()) const override;
const QString& = QString()) override; void fromSettings (const QSettings &settings,
void toXmlPriv(QDomElement&xml_element) const override; const QString = QString()) override;
bool fromXmlPriv(const QDomElement &xml_element) override; QDomElement toXml (QDomDocument &xml_document) const override;
bool fromXml(const QDomElement &xml_element) override;
static QHash<QString, XRefProperties> defaultProperties(); static QHash<QString, XRefProperties> defaultProperties();
@@ -79,15 +80,15 @@ class XRefProperties : public PropertiesInterface
void setKey(QString& key) {m_key = key;} void setKey(QString& key) {m_key = key;}
private: private:
bool m_show_power_ctc{true}; bool m_show_power_ctc;
DisplayHas m_display{Cross}; DisplayHas m_display;
SnapTo m_snap_to{Bottom}; SnapTo m_snap_to;
Qt::AlignmentFlag m_xref_pos{Qt::AlignBottom}; Qt::AlignmentFlag m_xref_pos;
QHash <QString, QString> m_prefix; QHash <QString, QString> m_prefix;
QStringList m_prefix_keys{"power","delay","switch"}; QStringList m_prefix_keys;
QString m_master_label{"%f-%l%c"}; QString m_master_label;
QString m_slave_label{"(%f-%l%c)"}; QString m_slave_label;
int m_offset{0}; int m_offset;
QString m_key; QString m_key;
}; };

View File

@@ -34,6 +34,31 @@
retourne. retourne.
@param s Chaine de caractere cense representer une orientation @param s Chaine de caractere cense representer une orientation
@return l'orientation designee par la chaine de caractere @return l'orientation designee par la chaine de caractere
*/
Qet::Orientation Qet::orientationFromString(const QString &s) {
QChar c = s[0];
if (c == 'e') return(Qet::East);
else if (c == 's') return(Qet::South);
else if (c == 'w') return (Qet::West);
else return(Qet::North);
}
/**
@param o une orientation
@return une chaine de caractere representant l'orientation
*/
QString Qet::orientationToString(Qet::Orientation o) {
QString ret;
switch(o) {
case Qet::North: ret = "n"; break;
case Qet::East : ret = "e"; break;
case Qet::South: ret = "s"; break;
case Qet::West : ret = "w"; break;
}
return(ret);
}
/**
Indique si deux orientations de Borne sont sur le meme axe (Vertical / Horizontal). Indique si deux orientations de Borne sont sur le meme axe (Vertical / Horizontal).
@param a La premiere orientation de Borne @param a La premiere orientation de Borne
@param b La seconde orientation de Borne @param b La seconde orientation de Borne
@@ -507,7 +532,7 @@ QString Qet::endTypeToString(const Qet::EndType &end_type) {
QET::None est retourne. QET::None est retourne.
*/ */
Qet::EndType Qet::endTypeFromString(const QString &string) { Qet::EndType Qet::endTypeFromString(const QString &string) {
if (string == "simple") return(Qet::Simple); if (string == "simple") return(Qet::Simple);
else if (string == "triangle") return(Qet::Triangle); else if (string == "triangle") return(Qet::Triangle);
else if (string == "circle") return(Qet::Circle); else if (string == "circle") return(Qet::Circle);
else if (string == "diamond") return(Qet::Diamond); else if (string == "diamond") return(Qet::Diamond);
@@ -691,9 +716,9 @@ QActionGroup *QET::depthActionGroup(QObject *parent)
QActionGroup *action_group = new QActionGroup(parent); QActionGroup *action_group = new QActionGroup(parent);
QAction *edit_forward = new QAction(QET::Icons::BringForward, QObject::tr("Amener au premier plan"), action_group); QAction *edit_forward = new QAction(QET::Icons::BringForward, QObject::tr("Amener au premier plan"), action_group);
QAction *edit_raise = new QAction(QET::Icons::Raise, QObject::tr("Rapprocher"), action_group); QAction *edit_raise = new QAction(QET::Icons::Raise, QObject::tr("Rapprocher"), action_group);
QAction *edit_lower = new QAction(QET::Icons::Lower, QObject::tr("Éloigner"), action_group); QAction *edit_lower = new QAction(QET::Icons::Lower, QObject::tr("Éloigner"), action_group);
QAction *edit_backward = new QAction(QET::Icons::SendBackward, QObject::tr("Envoyer au fond"), action_group); QAction *edit_backward = new QAction(QET::Icons::SendBackward, QObject::tr("Envoyer au fond"), action_group);
edit_forward ->setStatusTip(QObject::tr("Ramène la ou les sélections au premier plan")); edit_forward ->setStatusTip(QObject::tr("Ramène la ou les sélections au premier plan"));
edit_raise ->setStatusTip(QObject::tr("Rapproche la ou les sélections")); edit_raise ->setStatusTip(QObject::tr("Rapproche la ou les sélections"));

View File

@@ -31,8 +31,6 @@
#include "element.h" #include "element.h"
#include "../QetGraphicsItemModeler/qetgraphicshandleritem.h" #include "../QetGraphicsItemModeler/qetgraphicshandleritem.h"
#include "../qetxml.h"
#include <QMultiHash> #include <QMultiHash>
#include <QtDebug> #include <QtDebug>
@@ -80,9 +78,15 @@ class ConductorXmlRetroCompatibility
*/ */
Conductor::Conductor(Terminal *p1, Terminal* p2) : Conductor::Conductor(Terminal *p1, Terminal* p2) :
terminal1(p1), terminal1(p1),
terminal2(p2) terminal2(p2),
m_mouse_over(false),
m_text_item(nullptr),
segments(nullptr),
m_moving_segment(false),
modified_path(false),
has_to_save_profile(false),
must_highlight_(Conductor::None)
{ {
setTagName("conductor");
//set Zvalue at 11 to be upper than the DiagramImageItem and element //set Zvalue at 11 to be upper than the DiagramImageItem and element
setZValue(11); setZValue(11);
m_previous_z_value = zValue(); m_previous_z_value = zValue();
@@ -107,8 +111,8 @@ Conductor::Conductor(Terminal *p1, Terminal* p2) :
} }
//By default, the 4 profils are nuls -> we must to use priv_calculeConductor //By default, the 4 profils are nuls -> we must to use priv_calculeConductor
conductor_profiles.insert(Qt::TopLeftCorner, ConductorProfile()); conductor_profiles.insert(Qt::TopLeftCorner, ConductorProfile());
conductor_profiles.insert(Qt::TopRightCorner, ConductorProfile()); conductor_profiles.insert(Qt::TopRightCorner, ConductorProfile());
conductor_profiles.insert(Qt::BottomLeftCorner, ConductorProfile()); conductor_profiles.insert(Qt::BottomLeftCorner, ConductorProfile());
conductor_profiles.insert(Qt::BottomRightCorner, ConductorProfile()); conductor_profiles.insert(Qt::BottomRightCorner, ConductorProfile());
@@ -221,7 +225,7 @@ void Conductor::updateConductorPath(const QPointF &p1, Qet::Orientation o1, cons
ConductorProfile &conductor_profile = conductor_profiles[currentPathType()]; ConductorProfile &conductor_profile = conductor_profiles[currentPathType()];
Q_ASSERT_X(conductor_profile.segmentsCount(QET::Both) > 1, "Conductor::priv_modifieConductor", "pas de points a modifier"); Q_ASSERT_X(conductor_profile.segmentsCount(QET::Both) > 1, "Conductor::priv_modifieConductor", "pas de points a modifier");
Q_ASSERT_X(!conductor_profile.isNull(), "Conductor::priv_modifieConductor", "pas de profil utilisable"); Q_ASSERT_X(!conductor_profile.isNull(), "Conductor::priv_modifieConductor", "pas de profil utilisable");
// recupere les coordonnees fournies des bornes // recupere les coordonnees fournies des bornes
QPointF new_p1 = mapFromScene(p1); QPointF new_p1 = mapFromScene(p1);
@@ -325,10 +329,10 @@ QHash<ConductorSegmentProfile *, qreal> Conductor::shareOffsetBetweenSegments(
// on remet le trop-plein dans la reserve d'offset // on remet le trop-plein dans la reserve d'offset
remaining_offset += qAbs(segments_hash[csp]) * getSign(local_offset); remaining_offset += qAbs(segments_hash[csp]) * getSign(local_offset);
//qDebug() << " trop-plein de" << qAbs(segments_hash[csp]) * getSign(local_offset) << "remaining_offset =" << remaining_offset; //qDebug() << " trop-plein de" << qAbs(segments_hash[csp]) * getSign(local_offset) << "remaining_offset =" << remaining_offset;
segments_hash[csp] = 0.0; segments_hash[csp] = 0.0;
} else { } else {
//qDebug() << " offset local de" << local_offset << "accepte"; //qDebug() << " offset local de" << local_offset << "accepte";
} }
} }
} }
@@ -360,17 +364,17 @@ void Conductor::generateConductorPath(const QPointF &p1, Qet::Orientation o1, co
// distingue le depart de l'arrivee : le trajet se fait toujours de gauche a droite (apres prolongation) // distingue le depart de l'arrivee : le trajet se fait toujours de gauche a droite (apres prolongation)
if (newp1.x() <= newp2.x()) { if (newp1.x() <= newp2.x()) {
depart = newp1; depart = newp1;
arrivee = newp2; arrivee = newp2;
depart0 = sp1; depart0 = sp1;
arrivee0 = sp2; arrivee0 = sp2;
ori_depart = o1; ori_depart = o1;
ori_arrivee = o2; ori_arrivee = o2;
} else { } else {
depart = newp2; depart = newp2;
arrivee = newp1; arrivee = newp1;
depart0 = sp2; depart0 = sp2;
arrivee0 = sp1; arrivee0 = sp1;
ori_depart = o2; ori_depart = o2;
ori_arrivee = o1; ori_arrivee = o1;
} }
@@ -583,16 +587,36 @@ ConductorTextItem *Conductor::textItem() const
@return true si l'element XML represente bien un Conducteur ; false sinon @return true si l'element XML represente bien un Conducteur ; false sinon
*/ */
bool Conductor::valideXml(QDomElement &e){ bool Conductor::valideXml(QDomElement &e){
// verifie le nom du tag
if (e.tagName() != "conductor") return(false);
// // TODO: seems to short! (see fromXML) // verifie la presence des attributs minimaux
// if (QETXML::propertyDouble(e, "x") || if (!e.hasAttribute("terminal1")) return(false);
// QETXML::propertyDouble(e, "y")) if (!e.hasAttribute("terminal2")) return(false);
// return false;
// if (QETXML::propertyBool(e, "freezeLabel")) bool conv_ok;
// return false; // parse l'abscisse
if (e.hasAttribute("element1")) {
if (QUuid(e.attribute("element1")).isNull())
return false;
if (QUuid(e.attribute("terminal1")).isNull())
return false;
} else {
e.attribute("terminal1").toInt(&conv_ok);
if (!conv_ok) return(false);
}
return true; // parse l'ordonnee
if (e.hasAttribute("element2")) {
if (QUuid(e.attribute("element2")).isNull())
return false;
if (QUuid(e.attribute("terminal2")).isNull())
return false;
} else {
e.attribute("terminal2").toInt(&conv_ok);
if (!conv_ok) return(false);
}
return(true);
} }
/** /**
@@ -965,26 +989,16 @@ void Conductor::pointsToSegments(const QList<QPointF>& points_list) {
@param dom_element @param dom_element
@return true is loading success else return false @return true is loading success else return false
*/ */
bool Conductor::fromXmlPriv(const QDomElement &dom_element) bool Conductor::fromXml(QDomElement &dom_element)
{ {
double x=0, y=0; setPos(dom_element.attribute("x", nullptr).toDouble(),
QETXML::propertyDouble(dom_element, "x", &x); dom_element.attribute("y", nullptr).toDouble());
QETXML::propertyDouble(dom_element, "y", &y);
setPos(x, y);
bool return_ = pathFromXml(dom_element); bool return_ = pathFromXml(dom_element);
m_text_item -> fromXml(dom_element); m_text_item -> fromXml(dom_element);
ConductorProperties pr;
auto prs = QETXML::findInDomElement(dom_element, ConductorProperties::xmlTagName()); pr.fromXml(dom_element);
ConductorProperties pr;
if (!prs.isEmpty()) {
pr.fromXml(prs.first());
} else {
// legacy
// added in 0.9 remove in later version!
pr.fromXml(dom_element);
}
//Load Sequential Values //Load Sequential Values
if (dom_element.hasAttribute("sequ_1") || dom_element.hasAttribute("sequf_1") || dom_element.hasAttribute("seqt_1") || dom_element.hasAttribute("seqtf_1") || dom_element.hasAttribute("seqh_1") || dom_element.hasAttribute("sequf_1")) if (dom_element.hasAttribute("sequ_1") || dom_element.hasAttribute("sequf_1") || dom_element.hasAttribute("seqt_1") || dom_element.hasAttribute("seqtf_1") || dom_element.hasAttribute("seqh_1") || dom_element.hasAttribute("sequf_1"))
@@ -992,15 +1006,15 @@ bool Conductor::fromXmlPriv(const QDomElement &dom_element)
else else
m_autoNum_seq.fromXml(dom_element.firstChildElement("sequentialNumbers")); m_autoNum_seq.fromXml(dom_element.firstChildElement("sequentialNumbers"));
QETXML::propertyBool(dom_element, "freezeLabel", &m_freeze_label); m_freeze_label = dom_element.attribute("freezeLabel") == "true"? true : false;
setProperties(pr); setProperties(pr);
return return_; return return_;
} }
// does not support legacy method /**
/*! @brief Conductor::toXml
@brief Conductor::toXmlPriv
Exporte les caracteristiques du conducteur sous forme d'une element XML. Exporte les caracteristiques du conducteur sous forme d'une element XML.
@param dom_document : @param dom_document :
Le document XML a utiliser pour creer l'element XML Le document XML a utiliser pour creer l'element XML
@@ -1009,122 +1023,70 @@ bool Conductor::fromXmlPriv(const QDomElement &dom_element)
bornes dans le document XML et leur adresse en memoire bornes dans le document XML et leur adresse en memoire
@return Un element XML representant le conducteur @return Un element XML representant le conducteur
*/ */
void Conductor::toXmlPriv(QDomElement& dom_element) const { QDomElement Conductor::toXml(QDomDocument &dom_document,
QHash<Terminal *,
int> &table_adr_id) const
{
QDomElement dom_element = dom_document.createElement("conductor");
dom_element.setAttribute("x", QString::number(pos().x())); dom_element.setAttribute("x", QString::number(pos().x()));
dom_element.setAttribute("y", QString::number(pos().y())); dom_element.setAttribute("y", QString::number(pos().y()));
// Terminal is uniquely identified by the uuid of the terminal and the element // Terminal is uniquely identified by the uuid of the terminal and the element
if (terminal1->uuid().isNull()) { if (terminal1->uuid().isNull()) {
// legacy method to identify the terminal // legacy method to identify the terminal
dom_element.setAttribute("terminal1", terminal1->ID()); // for backward compability dom_element.setAttribute("terminal1", table_adr_id.value(terminal1)); // for backward compability
} else { } else {
dom_element.setAttribute("element1", terminal1->parentElement()->uuid().toString()); dom_element.setAttribute("element1", terminal1->parentElement()->uuid().toString());
dom_element.setAttribute("terminal1", terminal1->uuid().toString()); dom_element.setAttribute("terminal1", terminal1->uuid().toString());
} }
if (terminal2->uuid().isNull()) { if (terminal2->uuid().isNull()) {
// legacy method to identify the terminal // legacy method to identify the terminal
dom_element.setAttribute("terminal2", terminal2->ID()); // for backward compability dom_element.setAttribute("terminal2", table_adr_id.value(terminal2)); // for backward compability
} else { } else {
dom_element.setAttribute("element2", terminal2->parentElement()->uuid().toString()); dom_element.setAttribute("element2", terminal2->parentElement()->uuid().toString());
dom_element.setAttribute("terminal2", terminal2->uuid().toString()); dom_element.setAttribute("terminal2", terminal2->uuid().toString());
} }
dom_element.setAttribute("freezeLabel", m_freeze_label? "true" : "false"); dom_element.setAttribute("freezeLabel", m_freeze_label? "true" : "false");
// on n'exporte les segments du conducteur que si ceux-ci ont // on n'exporte les segments du conducteur que si ceux-ci ont
// ete modifies par l'utilisateur // ete modifies par l'utilisateur
if (modified_path) if (modified_path)
{ {
// parcours et export des segments // parcours et export des segments
QDomElement current_segment; QDomElement current_segment;
foreach(ConductorSegment *segment, segmentsList()) foreach(ConductorSegment *segment, segmentsList())
{ {
current_segment = dom_element.ownerDocument().createElement("segment"); current_segment = dom_document.createElement("segment");
current_segment.setAttribute("orientation", segment -> isHorizontal() ? "horizontal" : "vertical"); current_segment.setAttribute("orientation", segment -> isHorizontal() ? "horizontal" : "vertical");
current_segment.setAttribute("length", QString("%1").arg(segment -> length())); current_segment.setAttribute("length", QString("%1").arg(segment -> length()));
dom_element.appendChild(current_segment); dom_element.appendChild(current_segment);
} }
} }
QDomDocument doc = dom_element.ownerDocument();
QDomElement dom_seq = m_autoNum_seq.toXml(doc);
dom_element.appendChild(dom_seq);
// Export the properties and text QDomElement dom_seq = m_autoNum_seq.toXml(dom_document);
dom_element.appendChild(m_properties. toXml(doc)); dom_element.appendChild(dom_seq);
if(m_text_item->wasMovedByUser())
{ // Export the properties and text
dom_element.setAttribute("userx", QString::number(m_text_item->pos().x())); m_properties. toXml(dom_element);
dom_element.setAttribute("usery", QString::number(m_text_item->pos().y())); if(m_text_item->wasMovedByUser())
} {
if(m_text_item->wasRotateByUser()) dom_element.setAttribute("userx", QString::number(m_text_item->pos().x()));
dom_element.setAttribute("rotation", QString::number(m_text_item->rotation())); dom_element.setAttribute("usery", QString::number(m_text_item->pos().y()));
}
if(m_text_item->wasRotateByUser())
dom_element.setAttribute("rotation", QString::number(m_text_item->rotation()));
return(dom_element);
} }
/** /**
Exporte les caracteristiques du conducteur sous forme d'une element XML. @brief Conductor::pathFromXml
@param d Le document XML a utiliser pour creer l'element XML Generate the path (of the line) from xml file by checking the segments in the xml
@param table_adr_id Hash stockant les correspondances entre les ids des file
bornes dans le document XML et leur adresse en memoire @param e
@return Un element XML representant le conducteur @return true if generate path success else return false
*/
//QDomElement Conductor::toXml(QDomDocument &dom_document, QHash<Terminal *, int> &table_adr_id) const
//{
// QDomElement dom_element = dom_document.createElement("conductor");
// dom_element.setAttribute("x", QString::number(pos().x()));
// dom_element.setAttribute("y", QString::number(pos().y()));
// // Terminal is uniquely identified by the uuid of the terminal and the element
// if (terminal1->uuid().isNull()) {
// // legacy method to identify the terminal
// dom_element.setAttribute("terminal1", table_adr_id.value(terminal1)); // for backward compability
// } else {
// dom_element.setAttribute("element1", terminal1->parentElement()->uuid().toString());
// dom_element.setAttribute("terminal1", terminal1->uuid().toString());
// }
// if (terminal2->uuid().isNull()) {
// // legacy method to identify the terminal
// dom_element.setAttribute("terminal2", table_adr_id.value(terminal2)); // for backward compability
// } else {
// dom_element.setAttribute("element2", terminal2->parentElement()->uuid().toString());
// dom_element.setAttribute("terminal2", terminal2->uuid().toString());
// }
// dom_element.setAttribute("freezeLabel", m_freeze_label? "true" : "false");
// // on n'exporte les segments du conducteur que si ceux-ci ont
// // ete modifies par l'utilisateur
// if (modified_path)
// {
// // parcours et export des segments
// QDomElement current_segment;
// foreach(ConductorSegment *segment, segmentsList())
// {
// current_segment = dom_document.createElement("segment");
// current_segment.setAttribute("orientation", segment -> isHorizontal() ? "horizontal" : "vertical");
// current_segment.setAttribute("length", QString("%1").arg(segment -> length()));
// dom_element.appendChild(current_segment);
// }
// }
// QDomElement dom_seq = m_autoNum_seq.toXml(dom_document);
// dom_element.appendChild(dom_seq);
// // Export the properties and text
// m_properties.toXml(dom_document);
// if(m_text_item->wasMovedByUser())
// {
// dom_element.setAttribute("userx", QString::number(m_text_item->pos().x()));
// dom_element.setAttribute("usery", QString::number(m_text_item->pos().y()));
// }
// if(m_text_item->wasRotateByUser())
// dom_element.setAttribute("rotation", QString::number(m_text_item->rotation()));
// return(dom_element);
//}
/**
*/ */
bool Conductor::pathFromXml(const QDomElement &e) { bool Conductor::pathFromXml(const QDomElement &e) {
// parcourt les elements XML "segment" et en extrait deux listes de longueurs // parcourt les elements XML "segment" et en extrait deux listes de longueurs
@@ -1136,21 +1098,14 @@ bool Conductor::pathFromXml(const QDomElement &e) {
if (current_segment.isNull() || current_segment.tagName() != "segment") continue; if (current_segment.isNull() || current_segment.tagName() != "segment") continue;
// le segment doit avoir une longueur // le segment doit avoir une longueur
qreal segment_length; if (!current_segment.hasAttribute("length")) continue;
if (QETXML::propertyDouble(current_segment, "length", & segment_length))
continue;
bool isHorizontal = false; // cette longueur doit etre un reel
QString orientation; bool ok;
if (QETXML::propertyString(current_segment, "orientation", &orientation) == QETXML::PropertyFlags::Success) { qreal segment_length = current_segment.attribute("length").toDouble(&ok);
if (orientation == "horizontal") if (!ok) continue;
isHorizontal = true;
} else {
qDebug() << "PathFromXML failed";
return false;
}
if (isHorizontal) { if (current_segment.attribute("orientation") == "horizontal") {
segments_x << segment_length; segments_x << segment_length;
segments_y << 0.0; segments_y << 0.0;
} else { } else {
@@ -1282,7 +1237,7 @@ ConductorSegment *Conductor::middleSegment()
QPointF Conductor::posForText(Qt::Orientations &flag) QPointF Conductor::posForText(Qt::Orientations &flag)
{ {
ConductorSegment *segment = segments; ConductorSegment *segment = segments;
bool all_segment_is_vertical = true; bool all_segment_is_vertical = true;
bool all_segment_is_horizontal = true; bool all_segment_is_horizontal = true;
@@ -1401,7 +1356,7 @@ void Conductor::calculateTextItemPosition()
} }
//Adjust the position of text if his rotation //Adjust the position of text if his rotation
//is 0?? or 270??, to be exactly centered to the conductor //is 0° or 270°, to be exactly centered to the conductor
if (m_text_item -> rotation() == 0) if (m_text_item -> rotation() == 0)
{ {
text_pos.rx() -= m_text_item -> boundingRect().width()/2; text_pos.rx() -= m_text_item -> boundingRect().width()/2;
@@ -1678,12 +1633,12 @@ void Conductor::displayedTextChanged()
new_value.setValue(new_properties); new_value.setValue(new_properties);
QUndoCommand *undo = new QUndoCommand(tr("Modifier les propri??t??s d'un conducteur", "undo caption")); QUndoCommand *undo = new QUndoCommand(tr("Modifier les propriétés d'un conducteur", "undo caption"));
new QPropertyUndoCommand(this, "properties", old_value, new_value, undo); new QPropertyUndoCommand(this, "properties", old_value, new_value, undo);
if (!relatedPotentialConductors().isEmpty()) if (!relatedPotentialConductors().isEmpty())
{ {
undo->setText(tr("Modifier les propri??t??s de plusieurs conducteurs", "undo caption")); undo->setText(tr("Modifier les propriétés de plusieurs conducteurs", "undo caption"));
foreach (Conductor *potential_conductor, relatedPotentialConductors()) foreach (Conductor *potential_conductor, relatedPotentialConductors())
{ {
@@ -1769,7 +1724,7 @@ QSet<Conductor *> Conductor::relatedPotentialConductors(const bool all_diagram,
*/ */
QETDiagramEditor* Conductor::diagramEditor() const QETDiagramEditor* Conductor::diagramEditor() const
{ {
if (!diagram()) return nullptr; if (!diagram()) return nullptr;
if (diagram() -> views().isEmpty()) return nullptr; if (diagram() -> views().isEmpty()) return nullptr;
QWidget *w = const_cast<QGraphicsView *>(diagram() -> views().at(0)); QWidget *w = const_cast<QGraphicsView *>(diagram() -> views().at(0));

View File

@@ -20,8 +20,6 @@
#include "../autoNum/assignvariables.h" #include "../autoNum/assignvariables.h"
#include "../conductorproperties.h" #include "../conductorproperties.h"
#include "../conductorproperties.h"
#include "../properties/propertiesinterface.h"
#include <QGraphicsPathItem> #include <QGraphicsPathItem>
class ConductorProfile; class ConductorProfile;
@@ -41,7 +39,7 @@ typedef QHash<Qt::Corner, ConductorProfile> ConductorProfilesGroup;
This class represents a conductor, i.e. a wire between two element This class represents a conductor, i.e. a wire between two element
terminals. terminals.
*/ */
class Conductor : public QGraphicsObject, public PropertiesInterface class Conductor : public QGraphicsObject
{ {
Q_OBJECT Q_OBJECT
@@ -102,10 +100,11 @@ class Conductor : public QGraphicsObject, public PropertiesInterface
public: public:
static bool valideXml (QDomElement &); static bool valideXml (QDomElement &);
bool fromXmlPriv(const QDomElement &) override; bool fromXml (QDomElement &);
void toXmlPriv(QDomElement&dom_element) const override; QDomElement toXml (
void toSettings(QSettings &, const QString & = QString()) const override {} QDomDocument &,
void fromSettings(QSettings &, const QString & = QString()) override {} QHash<Terminal *,
int> &) const;
private: private:
bool pathFromXml(const QDomElement &); bool pathFromXml(const QDomElement &);
@@ -138,7 +137,7 @@ class Conductor : public QGraphicsObject, public PropertiesInterface
{return m_autoNum_seq;} {return m_autoNum_seq;}
void setSequenceNum(const autonum::sequentialNumbers& sn); void setSequenceNum(const autonum::sequentialNumbers& sn);
QList<QPointF> junctions() const; QList<QPointF> junctions() const;
private: private:
void setUpConnectionForFormula( void setUpConnectionForFormula(
@@ -182,28 +181,28 @@ class Conductor : public QGraphicsObject, public PropertiesInterface
QVector<QetGraphicsHandlerItem *> m_handler_vector; QVector<QetGraphicsHandlerItem *> m_handler_vector;
int m_vector_index = -1; int m_vector_index = -1;
bool m_mouse_over{false}; bool m_mouse_over;
/// Functional properties /// Functional properties
ConductorProperties m_properties; ConductorProperties m_properties;
/// Text input for non simple, non-singleline conductors /// Text input for non simple, non-singleline conductors
ConductorTextItem *m_text_item{nullptr}; ConductorTextItem *m_text_item;
/// Segments composing the conductor /// Segments composing the conductor
ConductorSegment *segments{nullptr}; ConductorSegment *segments;
/// Attributs related to mouse interaction /// Attributs related to mouse interaction
bool m_moving_segment{false}; bool m_moving_segment;
int moved_point; int moved_point;
qreal m_previous_z_value; qreal m_previous_z_value;
ConductorSegment *m_moved_segment; ConductorSegment *m_moved_segment;
QPointF before_mov_text_pos_; QPointF before_mov_text_pos_;
/// Whether the conductor was manually modified by users /// Whether the conductor was manually modified by users
bool modified_path{false}; bool modified_path;
/// Whether the current profile should be saved as soon as possible /// Whether the current profile should be saved as soon as possible
bool has_to_save_profile{false}; bool has_to_save_profile;
/// conductor profile: "photography" of what the conductor is supposed to look /// conductor profile: "photography" of what the conductor is supposed to look
/// like - there is one profile per kind of traject /// like - there is one profile per kind of traject
ConductorProfilesGroup conductor_profiles; ConductorProfilesGroup conductor_profiles;
/// Define whether and how the conductor should be highlighted /// Define whether and how the conductor should be highlighted
Highlight must_highlight_{Conductor::None}; Highlight must_highlight_;
bool m_valid; bool m_valid;
bool m_freeze_label = false; bool m_freeze_label = false;

View File

@@ -21,15 +21,15 @@
#include "../diagramcommands.h" #include "../diagramcommands.h"
#include "../qetgraphicsitem/conductor.h" #include "../qetgraphicsitem/conductor.h"
#include "../qetxml.h"
/** /**
Constructeur Constructeur
@param parent_conductor Conducteur auquel ce texte est rattache @param parent_conductor Conducteur auquel ce texte est rattache
*/ */
ConductorTextItem::ConductorTextItem(Conductor *parent_conductor) : ConductorTextItem::ConductorTextItem(Conductor *parent_conductor) :
DiagramTextItem(parent_conductor), DiagramTextItem(parent_conductor),
parent_conductor_(parent_conductor) parent_conductor_(parent_conductor),
moved_by_user_(false),
rotate_by_user_(false)
{ {
setAcceptHoverEvents(true); setAcceptHoverEvents(true);
} }
@@ -69,17 +69,13 @@ Conductor *ConductorTextItem::parentConductor() const
@param e @param e
*/ */
void ConductorTextItem::fromXml(const QDomElement &e) { void ConductorTextItem::fromXml(const QDomElement &e) {
if (e.hasAttribute("userx")) {
double userx=0, usery=0; setPos(e.attribute("userx").toDouble(),
if (QETXML::propertyDouble(e, "userx", &userx) == QETXML::PropertyFlags::Success && e.attribute("usery").toDouble());
QETXML::propertyDouble(e, "usery", &usery) == QETXML::PropertyFlags::Success) {
setPos(userx, usery);
moved_by_user_ = true; moved_by_user_ = true;
} }
if (e.hasAttribute("rotation")) {
double rotation; setRotation(e.attribute("rotation").toDouble());
if (QETXML::propertyDouble(e, "rotation", &rotation) == QETXML::PropertyFlags::Success) {
setRotation(rotation);
rotate_by_user_ = true; rotate_by_user_ = true;
} }
} }

View File

@@ -52,7 +52,7 @@ class ConductorTextItem : public DiagramTextItem
protected: protected:
void mousePressEvent (QGraphicsSceneMouseEvent *event) override; void mousePressEvent (QGraphicsSceneMouseEvent *event) override;
void mouseMoveEvent (QGraphicsSceneMouseEvent *event) override; void mouseMoveEvent (QGraphicsSceneMouseEvent *event) override;
void mouseReleaseEvent (QGraphicsSceneMouseEvent *event) override; void mouseReleaseEvent (QGraphicsSceneMouseEvent *event) override;
void hoverEnterEvent(QGraphicsSceneHoverEvent *) override; void hoverEnterEvent(QGraphicsSceneHoverEvent *) override;
void hoverLeaveEvent(QGraphicsSceneHoverEvent *) override; void hoverLeaveEvent(QGraphicsSceneHoverEvent *) override;
@@ -61,8 +61,8 @@ class ConductorTextItem : public DiagramTextItem
// attributes // attributes
private: private:
Conductor *parent_conductor_; Conductor *parent_conductor_;
bool moved_by_user_{false}; bool moved_by_user_;
bool rotate_by_user_{false}; bool rotate_by_user_;
QPointF before_mov_pos_; QPointF before_mov_pos_;
}; };
#endif #endif

View File

@@ -86,36 +86,36 @@ DynamicElementTextItem::DynamicElementTextItem()
@param dom_doc @param dom_doc
@return @return
*/ */
QDomElement DynamicElementTextItem::toXml(QDomDocument& dom_doc) const QDomElement DynamicElementTextItem::toXml(QDomDocument &dom_doc) const
{ {
QDomElement root_element = dom_doc.createElement(xmlTagName()); QDomElement root_element = dom_doc.createElement(xmlTagName());
root_element.setAttribute("x", QString::number(pos().x())); root_element.setAttribute("x", QString::number(pos().x()));
root_element.setAttribute("y", QString::number(pos().y())); root_element.setAttribute("y", QString::number(pos().y()));
root_element.setAttribute("rotation", QString::number(QET::correctAngle(rotation()))); root_element.setAttribute("rotation", QString::number(QET::correctAngle(rotation())));
root_element.setAttribute("uuid", m_uuid.toString()); root_element.setAttribute("uuid", m_uuid.toString());
root_element.setAttribute("frame", m_frame? "true" : "false"); root_element.setAttribute("frame", m_frame? "true" : "false");
root_element.setAttribute("text_width", QString::number(m_text_width)); root_element.setAttribute("text_width", QString::number(m_text_width));
root_element.setAttribute("font", font().toString()); root_element.setAttribute("font", font().toString());
root_element.setAttribute("keep_visual_rotation", m_keep_visual_rotation ? "true" : "false"); root_element.setAttribute("keep_visual_rotation", m_keep_visual_rotation ? "true" : "false");
QMetaEnum me = textFromMetaEnum(); QMetaEnum me = textFromMetaEnum();
root_element.setAttribute("text_from", me.valueToKey(m_text_from)); root_element.setAttribute("text_from", me.valueToKey(m_text_from));
me = QMetaEnum::fromType<Qt::Alignment>(); me = QMetaEnum::fromType<Qt::Alignment>();
if(this->alignment() &Qt::AlignRight) if(this->alignment() &Qt::AlignRight)
root_element.setAttribute("Halignment", me.valueToKey(Qt::AlignRight)); root_element.setAttribute("Halignment", me.valueToKey(Qt::AlignRight));
else if(this->alignment() &Qt::AlignLeft) else if(this->alignment() &Qt::AlignLeft)
root_element.setAttribute("Halignment", me.valueToKey(Qt::AlignLeft)); root_element.setAttribute("Halignment", me.valueToKey(Qt::AlignLeft));
else if(this->alignment() &Qt::AlignHCenter) else if(this->alignment() &Qt::AlignHCenter)
root_element.setAttribute("Halignment", me.valueToKey(Qt::AlignHCenter)); root_element.setAttribute("Halignment", me.valueToKey(Qt::AlignHCenter));
if(this->alignment() &Qt::AlignBottom) if(this->alignment() &Qt::AlignBottom)
root_element.setAttribute("Valignment", me.valueToKey(Qt::AlignBottom)); root_element.setAttribute("Valignment", me.valueToKey(Qt::AlignBottom));
else if(this->alignment() & Qt::AlignTop) else if(this->alignment() & Qt::AlignTop)
root_element.setAttribute("Valignment", me.valueToKey(Qt::AlignTop)); root_element.setAttribute("Valignment", me.valueToKey(Qt::AlignTop));
else if(this->alignment() &Qt::AlignVCenter) else if(this->alignment() &Qt::AlignVCenter)
root_element.setAttribute("Valignment", me.valueToKey(Qt::AlignVCenter)); root_element.setAttribute("Valignment", me.valueToKey(Qt::AlignVCenter));
QDomElement dom_text = dom_doc.createElement("text"); QDomElement dom_text = dom_doc.createElement("text");
@@ -216,7 +216,7 @@ void DynamicElementTextItem::fromXml(const QDomElement &dom_elmt)
setColor(QColor(dom_color.text())); setColor(QColor(dom_color.text()));
//Force the update of the displayed text //Force the update of the displayed text
setTextFrom(m_text_from); // TODO: does not update because there is a retrun inside if the textfrom argument is the same as m_text_from setTextFrom(m_text_from);
QGraphicsTextItem::setPos(dom_elmt.attribute("x", QString::number(0)).toDouble(), QGraphicsTextItem::setPos(dom_elmt.attribute("x", QString::number(0)).toDouble(),
dom_elmt.attribute("y", QString::number(0)).toDouble()); dom_elmt.attribute("y", QString::number(0)).toDouble());
@@ -1323,12 +1323,12 @@ void DynamicElementTextItem::updateXref()
m_slave_Xref_item->setFont(QETApp::diagramTextsFont(5)); m_slave_Xref_item->setFont(QETApp::diagramTextsFont(5));
m_slave_Xref_item->installSceneEventFilter(this); m_slave_Xref_item->installSceneEventFilter(this);
m_update_slave_Xref_connection << connect(m_master_element.data(), &Element::xChanged, this, &DynamicElementTextItem::updateXref); m_update_slave_Xref_connection << connect(m_master_element.data(), &Element::xChanged, this, &DynamicElementTextItem::updateXref);
m_update_slave_Xref_connection << connect(m_master_element.data(), &Element::yChanged, this, &DynamicElementTextItem::updateXref); m_update_slave_Xref_connection << connect(m_master_element.data(), &Element::yChanged, this, &DynamicElementTextItem::updateXref);
m_update_slave_Xref_connection << connect(m_master_element.data(), &Element::elementInfoChange, this, &DynamicElementTextItem::updateXref); m_update_slave_Xref_connection << connect(m_master_element.data(), &Element::elementInfoChange, this, &DynamicElementTextItem::updateXref);
m_update_slave_Xref_connection << connect(diagram()->project(), &QETProject::projectDiagramsOrderChanged, this, &DynamicElementTextItem::updateXref); m_update_slave_Xref_connection << connect(diagram()->project(), &QETProject::projectDiagramsOrderChanged, this, &DynamicElementTextItem::updateXref);
m_update_slave_Xref_connection << connect(diagram()->project(), &QETProject::diagramRemoved, this, &DynamicElementTextItem::updateXref); m_update_slave_Xref_connection << connect(diagram()->project(), &QETProject::diagramRemoved, this, &DynamicElementTextItem::updateXref);
m_update_slave_Xref_connection << connect(diagram()->project(), &QETProject::XRefPropertiesChanged, this, &DynamicElementTextItem::updateXref); m_update_slave_Xref_connection << connect(diagram()->project(), &QETProject::XRefPropertiesChanged, this, &DynamicElementTextItem::updateXref);
} }
else else
m_slave_Xref_item->setPlainText(xref_label); m_slave_Xref_item->setPlainText(xref_label);

View File

@@ -82,7 +82,7 @@ class DynamicElementTextItem : public DiagramTextItem
DynamicElementTextItem(const DynamicElementTextItem &); DynamicElementTextItem(const DynamicElementTextItem &);
public: public:
QDomElement toXml(QDomDocument&) const override; QDomElement toXml(QDomDocument &dom_doc) const override;
void fromXml(const QDomElement &dom_elmt) override; void fromXml(const QDomElement &dom_elmt) override;
Element *parentElement() const; Element *parentElement() const;
@@ -160,7 +160,7 @@ class DynamicElementTextItem : public DiagramTextItem
QList<QMetaObject::Connection> QList<QMetaObject::Connection>
m_formula_connection, m_formula_connection,
m_update_slave_Xref_connection; m_update_slave_Xref_connection;
QColor m_user_color{QColor()}; QColor m_user_color;
bool bool
m_frame = false, m_frame = false,
m_first_scene_change = true; m_first_scene_change = true;

View File

@@ -98,8 +98,7 @@ Element::Element(
} }
} }
int elmt_state; int elmt_state;
qDebug() << "\tCollection Path: " << location.collectionPath(); buildFromXml(location.xml(), &elmt_state);
buildFromXml(location.xml(), &elmt_state); // build from the collection definition
if (state) { if (state) {
*state = elmt_state; *state = elmt_state;
} }
@@ -352,8 +351,8 @@ void Element::drawSelection(
Q_UNUSED(options); Q_UNUSED(options);
painter -> save(); painter -> save();
// Annulation des renderhints // Annulation des renderhints
painter -> setRenderHint(QPainter::Antialiasing, false); painter -> setRenderHint(QPainter::Antialiasing, false);
painter -> setRenderHint(QPainter::TextAntialiasing, false); painter -> setRenderHint(QPainter::TextAntialiasing, false);
painter -> setRenderHint(QPainter::SmoothPixmapTransform, false); painter -> setRenderHint(QPainter::SmoothPixmapTransform, false);
// Dessin du cadre de selection en gris // Dessin du cadre de selection en gris
QPen t; QPen t;
@@ -402,7 +401,7 @@ void Element::drawHighlight(
/** /**
@brief Element::buildFromXml @brief Element::buildFromXml
Build this element from an xml description (from the collection) Build this element from an xml description
@param xml_def_elmt @param xml_def_elmt
@param state @param state
Optional pointer which define the status of build Optional pointer which define the status of build
@@ -435,9 +434,9 @@ bool Element::buildFromXml(const QDomElement &xml_def_elmt, int *state)
if (conv_ok && QET::version.toDouble() < element_version) if (conv_ok && QET::version.toDouble() < element_version)
{ {
std::cerr << qPrintable( std::cerr << qPrintable(
QObject::tr("Avertissement : l'??l??ment " QObject::tr("Avertissement : l'élément "
" a ??t?? enregistr?? avec une version" " a été enregistré avec une version"
" ult??rieure de QElectroTech.") " ultérieure de QElectroTech.")
) << std::endl; ) << std::endl;
} }
} }
@@ -519,15 +518,11 @@ bool Element::buildFromXml(const QDomElement &xml_def_elmt, int *state)
if (qde.isNull()) if (qde.isNull())
continue; continue;
qDebug() << "\t\tElement.cpp:buildFromXml;parseElement: " << qde.tagName(); if (parseElement(qde)) {
if (parseElement(qde)) { // TODO: why lines are not parsed here?
qDebug() << "\t\t\tParsing Element success";
++ parsed_elements_count; ++ parsed_elements_count;
} }
else else
{ {
qDebug() << "\t\t\tParsing Element no success";
if (state) if (state)
*state = 7; *state = 7;
m_state = QET::GIOK; m_state = QET::GIOK;
@@ -553,11 +548,13 @@ bool Element::buildFromXml(const QDomElement &xml_def_elmt, int *state)
m_state = QET::GIOK; m_state = QET::GIOK;
return(false); return(false);
} }
else
if (state) {
*state = 0; if (state)
m_state = QET::GIOK; *state = 0;
return(true); m_state = QET::GIOK;
return(true);
}
} }
/** /**
@@ -568,8 +565,8 @@ bool Element::buildFromXml(const QDomElement &xml_def_elmt, int *state)
*/ */
bool Element::parseElement(const QDomElement &dom) bool Element::parseElement(const QDomElement &dom)
{ {
if (dom.tagName() == "terminal") return(parseTerminal(dom)); if (dom.tagName() == "terminal") return(parseTerminal(dom));
else if (dom.tagName() == "input") return(parseInput(dom)); else if (dom.tagName() == "input") return(parseInput(dom));
else if (dom.tagName() == "dynamic_text") return(parseDynamicText(dom)); else if (dom.tagName() == "dynamic_text") return(parseDynamicText(dom));
else return(true); else return(true);
} }
@@ -661,11 +658,13 @@ DynamicElementTextItem *Element::parseDynamicText(
*/ */
Terminal *Element::parseTerminal(const QDomElement &dom_element) Terminal *Element::parseTerminal(const QDomElement &dom_element)
{ {
if (!Terminal::valideXml(dom_element)) TerminalData* data = new TerminalData();
if (!data->fromXml(dom_element)) {
delete data;
return nullptr; return nullptr;
}
Terminal *new_terminal = new Terminal(0, 0, Qet::Orientation::North, this); // does not matter which values are typed in here, because they get overwritten by the fromXML() function Terminal *new_terminal = new Terminal(data, this);
new_terminal->fromXml(dom_element);
m_terminals << new_terminal; m_terminals << new_terminal;
//Sort from top to bottom and left to rigth //Sort from top to bottom and left to rigth
@@ -680,7 +679,7 @@ Terminal *Element::parseTerminal(const QDomElement &dom_element)
return (a->dockConductor().y() < b->dockConductor().y()); return (a->dockConductor().y() < b->dockConductor().y());
}); });
return(new_terminal); // TODO: makes no sense return(new_terminal);
} }
/** /**
@@ -694,8 +693,8 @@ bool Element::valideXml(QDomElement &e) {
// verifie la presence des attributs minimaux // verifie la presence des attributs minimaux
if (!e.hasAttribute("type")) return(false); if (!e.hasAttribute("type")) return(false);
if (!e.hasAttribute("x")) return(false); if (!e.hasAttribute("x")) return(false);
if (!e.hasAttribute("y")) return(false); if (!e.hasAttribute("y")) return(false);
bool conv_ok; bool conv_ok;
// parse l'abscisse // parse l'abscisse
@@ -722,14 +721,15 @@ bool Element::valideXml(QDomElement &e) {
*/ */
bool Element::fromXml( bool Element::fromXml(
QDomElement &e, QDomElement &e,
QHash<int, Terminal *> &table_id_adr) QHash<int,
Terminal *> &table_id_adr)
{ {
m_state = QET::GILoadingFromXml; m_state = QET::GILoadingFromXml;
/* /*
les bornes vont maintenant etre recensees pour associer leurs id a leur adresse reelle les bornes vont maintenant etre recensees pour associer leurs id a leur adresse reelle
ce recensement servira lors de la mise en place des fils ce recensement servira lors de la mise en place des fils
*/ */
QList<QDomElement> liste_terminals; // terminals in the element in the diagram QList<QDomElement> liste_terminals;
foreach(QDomElement qde, foreach(QDomElement qde,
QET::findInDomElement(e, "terminals", "terminal")) { QET::findInDomElement(e, "terminals", "terminal")) {
if (Terminal::valideXml(qde)) liste_terminals << qde; if (Terminal::valideXml(qde)) liste_terminals << qde;
@@ -737,29 +737,15 @@ bool Element::fromXml(
QHash<int, Terminal *> priv_id_adr; QHash<int, Terminal *> priv_id_adr;
int terminals_non_trouvees = 0; int terminals_non_trouvees = 0;
// The added childs from the collection now must match with the terminals from the diagram. Iterate through foreach(QGraphicsItem *qgi, childItems()) {
// all Terminals in the collection and in the diagram to link them together
for(QGraphicsItem *qgi: childItems()) { // TODO: Where the Terminals are added as childs?
if (Terminal *p = qgraphicsitem_cast<Terminal *>(qgi)) { if (Terminal *p = qgraphicsitem_cast<Terminal *>(qgi)) {
bool terminal_trouvee = false; bool terminal_trouvee = false;
for(QDomElement qde: liste_terminals) { foreach(QDomElement qde, liste_terminals) {
// The position in the collection element definition is the origin position (originPos). if (p -> fromXml(qde)) {
// The position in the diagram element definition is the position where the conductor is connected (dock position) priv_id_adr.insert(
// Therefore a simple operator overloading is not possible. qde.attribute(
Terminal diagramTerminal(0,0, Qet::Orientation::East); "id").toInt(),
diagramTerminal.fromXml(qde); p);
QPointF dockPos1 = diagramTerminal.originPos(); // position here is directly the dock_elmt_ position (stored in the diagram)
QPointF dockPos2 = p->dockPos();
if (qFuzzyCompare(dockPos1.x(), dockPos2.x()) &&
qFuzzyCompare(dockPos1.y(), dockPos2.y()) &&
p->orientation() == diagramTerminal.orientation()) { // check if the part in the collection is the same as in the diagram stored
qDebug() << "Matching Terminal found.";
// store id for legacy purpose, because when opening a old project in the collection the terminal does not have an uuid. Therefore the id must be used
if (p->uuid().isNull()) {
p->setID(qde.attribute("id").toInt());
}
priv_id_adr.insert(qde.attribute("id").toInt(), p);
terminal_trouvee = true; terminal_trouvee = true;
// We used to break here, because we did not expect // We used to break here, because we did not expect
// several terminals to share the same position. // several terminals to share the same position.
@@ -772,7 +758,6 @@ bool Element::fromXml(
if (terminals_non_trouvees > 0) if (terminals_non_trouvees > 0)
{ {
qDebug() << "element.cpp: Element::fromXML; Elements not found: " << terminals_non_trouvees;
m_state = QET::GIOK; m_state = QET::GIOK;
return(false); return(false);
} }
@@ -790,15 +775,15 @@ bool Element::fromXml(
} }
// copie des associations id / adr // copie des associations id / adr
foreach(int id_trouve, priv_id_adr.keys()) { foreach(int id_trouve, priv_id_adr.keys()) {
table_id_adr.insert(id_trouve, table_id_adr.insert(id_trouve,
priv_id_adr.value(id_trouve)); priv_id_adr.value(id_trouve));
} }
} }
//load uuid of connected elements //load uuid of connected elements
QList <QDomElement> uuid_list = QET::findInDomElement(e, "links_uuids", "link_uuid"); QList <QDomElement> uuid_list = QET::findInDomElement(e,
foreach (QDomElement qdo, uuid_list) tmp_uuids_link << qdo.attribute("uuid"); "links_uuids",
"link_uuid");
foreach (QDomElement qdo, uuid_list) foreach (QDomElement qdo, uuid_list)
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) // ### Qt 6: remove #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) // ### Qt 6: remove
tmp_uuids_link << qdo.attribute("uuid"); tmp_uuids_link << qdo.attribute("uuid");
@@ -852,7 +837,7 @@ bool Element::fromXml(
//************************// //************************//
//***Dynamic texts item***// //***Dynamic texts item***//
//************************// read from the diagram section //************************//
for (const QDomElement& qde : QET::findInDomElement( for (const QDomElement& qde : QET::findInDomElement(
e, e,
"dynamic_texts", "dynamic_texts",
@@ -907,7 +892,9 @@ bool Element::fromXml(
\~French L'element XML representant cet element electrique \~French L'element XML representant cet element electrique
*/ */
QDomElement Element::toXml( QDomElement Element::toXml(
QDomDocument &document) const QDomDocument &document,
QHash<Terminal *,
int> &table_adr_id) const
{ {
QDomElement element = document.createElement("element"); QDomElement element = document.createElement("element");
@@ -934,6 +921,18 @@ QDomElement Element::toXml(
element.setAttribute("z", QString::number(this->zValue())); element.setAttribute("z", QString::number(this->zValue()));
element.setAttribute("orientation", QString::number(orientation())); element.setAttribute("orientation", QString::number(orientation()));
/* get the first id to use for the bounds of this element
* recupere le premier id a utiliser pour les bornes de cet element */
int id_terminal = 0;
if (!table_adr_id.isEmpty()) {
// trouve le plus grand id
int max_id_t = -1;
foreach (int id_t, table_adr_id.values()) {
if (id_t > max_id_t) max_id_t = id_t;
}
id_terminal = max_id_t + 1;
}
// registration of device terminals // registration of device terminals
// enregistrement des bornes de l'appareil // enregistrement des bornes de l'appareil
QDomElement xml_terminals = document.createElement("terminals"); QDomElement xml_terminals = document.createElement("terminals");
@@ -942,10 +941,8 @@ QDomElement Element::toXml(
foreach(Terminal *t, terminals()) { foreach(Terminal *t, terminals()) {
// alors on enregistre la borne // alors on enregistre la borne
QDomElement terminal = t -> toXml(document); QDomElement terminal = t -> toXml(document);
if (t->ID() > 0) { terminal.setAttribute("id", id_terminal); // for backward compatibility
// for backward compatibility table_adr_id.insert(t, id_terminal ++);
terminal.setAttribute("id", t->ID()); // for backward compatibility
}
xml_terminals.appendChild(terminal); xml_terminals.appendChild(terminal);
} }
element.appendChild(xml_terminals); element.appendChild(xml_terminals);

View File

@@ -1,4 +1,4 @@
/* /*
Copyright 2006-2021 The QElectroTech Team Copyright 2006-2021 The QElectroTech Team
This file is part of QElectroTech. This file is part of QElectroTech.
@@ -39,7 +39,7 @@ class ElementTextItemGroup;
/** /**
This is the base class for electrical elements. This is the base class for electrical elements.
*/ */
class Element : public QetGraphicsItem // TODO: derive from propertiesInterface! class Element : public QetGraphicsItem
{ {
friend class DiagramEventAddElement; friend class DiagramEventAddElement;
@@ -140,8 +140,14 @@ class Element : public QetGraphicsItem // TODO: derive from propertiesInterface!
QPoint hotspot() const; QPoint hotspot() const;
void editProperty() override; void editProperty() override;
static bool valideXml(QDomElement &); static bool valideXml(QDomElement &);
virtual bool fromXml(QDomElement &, QHash<int, Terminal *> &); virtual bool fromXml(
virtual QDomElement toXml(QDomDocument &) const; QDomElement &,
QHash<int,
Terminal *> &);
virtual QDomElement toXml(
QDomDocument &,
QHash<Terminal *,
int> &) const;
QUuid uuid() const; QUuid uuid() const;
int orientation() const; int orientation() const;
@@ -182,7 +188,7 @@ class Element : public QetGraphicsItem // TODO: derive from propertiesInterface!
*/ */
QString linkTypeToString() const; QString linkTypeToString() const;
void newUuid() {m_uuid = QUuid::createUuid();} //create new uuid for this element void newUuid() {m_uuid = QUuid::createUuid();} //create new uuid for this element
protected: protected:
void drawAxes(QPainter *, const QStyleOptionGraphicsItem *); void drawAxes(QPainter *, const QStyleOptionGraphicsItem *);
@@ -219,9 +225,9 @@ class Element : public QetGraphicsItem // TODO: derive from propertiesInterface!
protected: protected:
//ATTRIBUTES related to linked element //ATTRIBUTES related to linked element
QList <Element *> connected_elements; QList <Element *> connected_elements;
QList <QUuid> tmp_uuids_link; QList <QUuid> tmp_uuids_link;
QUuid m_uuid; QUuid m_uuid;
kind m_link_type = Element::Simple; kind m_link_type = Element::Simple;
//ATTRIBUTES related to informations //ATTRIBUTES related to informations
DiagramContext m_kind_informations; DiagramContext m_kind_informations;

View File

@@ -317,8 +317,8 @@ void ElementTextItemGroup::setHoldToBottomPage(bool hold)
&Element::linkedElementChanged, &Element::linkedElementChanged,
[this]() [this]()
{QTimer::singleShot(200, {QTimer::singleShot(200,
this, this,
&ElementTextItemGroup::autoPos);} &ElementTextItemGroup::autoPos);}
); );
if(m_parent_element->diagram()) if(m_parent_element->diagram())
m_XrefChanged_timer = connect( m_XrefChanged_timer = connect(
@@ -326,8 +326,8 @@ void ElementTextItemGroup::setHoldToBottomPage(bool hold)
&QETProject::XRefPropertiesChanged, &QETProject::XRefPropertiesChanged,
[this]() [this]()
{QTimer::singleShot(200, {QTimer::singleShot(200,
this, this,
&ElementTextItemGroup::autoPos);} &ElementTextItemGroup::autoPos);}
); );
} }
autoPos(); autoPos();
@@ -438,7 +438,6 @@ QDomElement ElementTextItemGroup::toXml(QDomDocument &dom_document) const
return dom_element; return dom_element;
} }
// TOOD: inherit from propertiesinterface
/** /**
@brief ElementTextItemGroup::fromXml @brief ElementTextItemGroup::fromXml
Import data of this group from xml Import data of this group from xml
@@ -624,7 +623,7 @@ void ElementTextItemGroup::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{ {
if(diagram() && m_first_move) if(diagram() && m_first_move)
diagram()->elementTextsMover().beginMovement(diagram(), diagram()->elementTextsMover().beginMovement(diagram(),
this); this);
if(m_first_move) if(m_first_move)
{ {
@@ -707,7 +706,7 @@ void ElementTextItemGroup::mouseDoubleClickEvent(
*/ */
void ElementTextItemGroup::keyPressEvent(QKeyEvent *event) void ElementTextItemGroup::keyPressEvent(QKeyEvent *event)
{ {
if(event->modifiers() == Qt::ControlModifier) if(event->modifiers() == Qt::ControlModifier)
{ {
if(event->key() == Qt::Key_Left && m_alignment != Qt::AlignLeft) if(event->key() == Qt::Key_Left && m_alignment != Qt::AlignLeft)
{ {
@@ -801,12 +800,12 @@ void ElementTextItemGroup::updateXref()
m_slave_Xref_item = new QGraphicsTextItem(xref_label, this); m_slave_Xref_item = new QGraphicsTextItem(xref_label, this);
m_slave_Xref_item->setFont(QETApp::diagramTextsFont(5)); m_slave_Xref_item->setFont(QETApp::diagramTextsFont(5));
m_update_slave_Xref_connection << connect(master_elmt, &Element::xChanged, this, &ElementTextItemGroup::updateXref); m_update_slave_Xref_connection << connect(master_elmt, &Element::xChanged, this, &ElementTextItemGroup::updateXref);
m_update_slave_Xref_connection << connect(master_elmt, &Element::yChanged, this, &ElementTextItemGroup::updateXref); m_update_slave_Xref_connection << connect(master_elmt, &Element::yChanged, this, &ElementTextItemGroup::updateXref);
m_update_slave_Xref_connection << connect(master_elmt, &Element::elementInfoChange, this, &ElementTextItemGroup::updateXref); m_update_slave_Xref_connection << connect(master_elmt, &Element::elementInfoChange, this, &ElementTextItemGroup::updateXref);
m_update_slave_Xref_connection << connect(project, &QETProject::projectDiagramsOrderChanged, this, &ElementTextItemGroup::updateXref); m_update_slave_Xref_connection << connect(project, &QETProject::projectDiagramsOrderChanged, this, &ElementTextItemGroup::updateXref);
m_update_slave_Xref_connection << connect(project, &QETProject::diagramRemoved, this, &ElementTextItemGroup::updateXref); m_update_slave_Xref_connection << connect(project, &QETProject::diagramRemoved, this, &ElementTextItemGroup::updateXref);
m_update_slave_Xref_connection << connect(project, &QETProject::XRefPropertiesChanged, this, &ElementTextItemGroup::updateXref); m_update_slave_Xref_connection << connect(project, &QETProject::XRefPropertiesChanged, this, &ElementTextItemGroup::updateXref);
} }
else else
m_slave_Xref_item->setPlainText(xref_label); m_slave_Xref_item->setPlainText(xref_label);

View File

@@ -32,7 +32,7 @@ class CrossRefItem;
This class represent a group of element text This class represent a group of element text
Texts in the group can be aligned left / center /right Texts in the group can be aligned left / center /right
*/ */
class ElementTextItemGroup : public QObject, public QGraphicsItemGroup // TODO: derive from PropertiesInterface class ElementTextItemGroup : public QObject, public QGraphicsItemGroup
{ {
Q_OBJECT Q_OBJECT
@@ -112,7 +112,7 @@ class ElementTextItemGroup : public QObject, public QGraphicsItemGroup // TODO:
m_hold_to_bottom_of_page = false, m_hold_to_bottom_of_page = false,
m_block_alignment_update = false, m_block_alignment_update = false,
m_frame = false; m_frame = false;
QPointF m_initial_position{QPointF(0,0)}; QPointF m_initial_position;
int m_vertical_adjustment = 0; int m_vertical_adjustment = 0;
CrossRefItem *m_Xref_item = nullptr; CrossRefItem *m_Xref_item = nullptr;
Element *m_parent_element = nullptr; Element *m_parent_element = nullptr;

View File

@@ -51,7 +51,6 @@ IndependentTextItem::~IndependentTextItem()
{ {
} }
// TODO: inherit from PropertiesInterface
/** /**
Permet de lire le texte a mettre dans le champ a partir d'un element XML. Permet de lire le texte a mettre dans le champ a partir d'un element XML.
Cette methode se base sur la position du champ pour assigner ou non la Cette methode se base sur la position du champ pour assigner ou non la

View File

@@ -40,7 +40,7 @@ class IndependentTextItem : public DiagramTextItem
int type() const override { return Type; } int type() const override { return Type; }
void fromXml(const QDomElement &) override; void fromXml(const QDomElement &) override;
QDomElement toXml(QDomDocument&) const override; QDomElement toXml(QDomDocument &) const override;
protected: protected:
void focusOutEvent(QFocusEvent *event) override; void focusOutEvent(QFocusEvent *event) override;

View File

@@ -25,7 +25,10 @@
@param parent : Parent Item @param parent : Parent Item
*/ */
QetGraphicsItem::QetGraphicsItem(QGraphicsItem *parent): QetGraphicsItem::QetGraphicsItem(QGraphicsItem *parent):
QGraphicsObject(parent) QGraphicsObject(parent),
is_movable_(true),
m_first_move(true),
snap_to_grid_(true)
{} {}
QetGraphicsItem::~QetGraphicsItem() QetGraphicsItem::~QetGraphicsItem()

View File

@@ -56,10 +56,10 @@ class QetGraphicsItem : public QGraphicsObject
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override; void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override;
protected: protected:
bool is_movable_{true}; bool is_movable_;
bool m_first_move{true}; bool m_first_move;
bool snap_to_grid_{true}; bool snap_to_grid_;
QPointF m_mouse_to_origin_movement{QPointF(0,0)}; QPointF m_mouse_to_origin_movement;
QET::GraphicsItemState m_state = QET:: GIOK; QET::GraphicsItemState m_state = QET:: GIOK;
}; };

View File

@@ -326,7 +326,7 @@ void QetShapeItem::paint(
switch (m_shapeType) switch (m_shapeType)
{ {
case Line: painter->drawLine(QLineF(m_P1, m_P2)); break; case Line: painter->drawLine(QLineF(m_P1, m_P2)); break;
case Rectangle: painter->drawRoundedRect(QRectF(m_P1, m_P2), case Rectangle: painter->drawRoundedRect(QRectF(m_P1, m_P2),
m_xRadius, m_xRadius,
m_yRadius); break; m_yRadius); break;
@@ -663,7 +663,7 @@ void QetShapeItem::insertPoint()
if(new_polygon != m_polygon) if(new_polygon != m_polygon)
{ {
//Wrap the undo for avoid to merge the undo commands when user add several points. //Wrap the undo for avoid to merge the undo commands when user add several points.
QUndoCommand *undo = new QUndoCommand(tr("Ajouter un point ?? un polygone")); QUndoCommand *undo = new QUndoCommand(tr("Ajouter un point à un polygone"));
new QPropertyUndoCommand(this, "polygon", m_polygon, new_polygon, undo); new QPropertyUndoCommand(this, "polygon", m_polygon, new_polygon, undo);
diagram()->undoStack().push(undo); diagram()->undoStack().push(undo);
} }
@@ -836,7 +836,6 @@ void QetShapeItem::handlerMouseReleaseEvent()
} }
} }
// TODO: inherit from Propertiesinterface!
/** /**
@brief QetShapeItem::fromXml @brief QetShapeItem::fromXml
Build this item from the xml description Build this item from the xml description
@@ -952,28 +951,28 @@ bool QetShapeItem::toDXF(const QString &filepath,const QPen &pen)
switch (m_shapeType) switch (m_shapeType)
{ {
case Line: case Line:
Createdxf::drawLine(filepath, Createdxf::drawLine(filepath,
QLineF( mapToScene(m_P1), QLineF( mapToScene(m_P1),
mapToScene(m_P2)), mapToScene(m_P2)),
Createdxf::dxfColor(pen)); Createdxf::dxfColor(pen));
return true; return true;
case Rectangle: case Rectangle:
Createdxf::drawRectangle(filepath, Createdxf::drawRectangle(filepath,
QRectF(mapToScene(m_P1), QRectF(mapToScene(m_P1),
mapToScene(m_P2)).normalized(), mapToScene(m_P2)).normalized(),
Createdxf::dxfColor(pen)); Createdxf::dxfColor(pen));
return true; return true;
case Ellipse: case Ellipse:
Createdxf::drawEllipse(filepath, Createdxf::drawEllipse(filepath,
QRectF(mapToScene(m_P1), QRectF(mapToScene(m_P1),
mapToScene(m_P2)).normalized(), mapToScene(m_P2)).normalized(),
Createdxf::dxfColor(pen)); Createdxf::dxfColor(pen));
return true; return true;
case Polygon: case Polygon:
Createdxf::drawPolygon(filepath,m_polygon,Createdxf::dxfColor(pen)); Createdxf::drawPolygon(filepath,m_polygon,Createdxf::dxfColor(pen));
return true; return true;
default: default:
return false; return false;
} }
} }
@@ -996,10 +995,10 @@ void QetShapeItem::editProperty()
QString QetShapeItem::name() const QString QetShapeItem::name() const
{ {
switch (m_shapeType) { switch (m_shapeType) {
case Line: return tr("une ligne"); case Line: return tr("une ligne");
case Rectangle: return tr("un rectangle"); case Rectangle: return tr("un rectangle");
case Ellipse: return tr("une ??llipse"); case Ellipse: return tr("une éllipse");
case Polygon: return tr("une polyligne"); case Polygon: return tr("une polyligne");
default: return tr("une shape"); default: return tr("une shape");
} }
} }

View File

@@ -35,7 +35,7 @@ class SlaveElement : public Element
void unlinkElement(Element *elmt) override; void unlinkElement(Element *elmt) override;
private: private:
QGraphicsTextItem *m_xref_item{nullptr}; QGraphicsTextItem *m_xref_item;
}; };
#endif // SLAVEELEMENT_H #endif // SLAVEELEMENT_H

View File

@@ -25,8 +25,6 @@
#include "../qetgraphicsitem/element.h" #include "../qetgraphicsitem/element.h"
#include "conductortextitem.h" #include "conductortextitem.h"
#include "../qetxml.h"
#include <utility> #include <utility>
QColor Terminal::neutralColor = QColor(Qt::blue); QColor Terminal::neutralColor = QColor(Qt::blue);
@@ -43,7 +41,7 @@ const qreal Terminal::Z = 1000;
@param name of terminal @param name of terminal
@param hiddenName @param hiddenName
*/ */
void Terminal::init(QString number, QString name, bool hiddenName) void Terminal::init()
{ {
//Calcul the docking point of the element //Calcul the docking point of the element
//m_pos of d is the docking point of conductor //m_pos of d is the docking point of conductor
@@ -64,13 +62,7 @@ void Terminal::init(QString number, QString name, bool hiddenName)
origin += QPointF(-3.0, -3.0); origin += QPointF(-3.0, -3.0);
qreal w = qAbs(dcx - dex) + 7; qreal w = qAbs(dcx - dex) + 7;
qreal h = qAbs(dcy - dey) + 7; qreal h = qAbs(dcy - dey) + 7;
m_br = QRectF(origin, QSizeF(w, h)); m_br = QRectF(origin, QSizeF(w, h));
// Number of terminal
number_terminal_ = std::move(number);
// Name of terminal
d->m_name = std::move(name);
name_terminal_hidden = hiddenName;
setAcceptHoverEvents(true); setAcceptHoverEvents(true);
setAcceptedMouseButtons(Qt::LeftButton); setAcceptedMouseButtons(Qt::LeftButton);
@@ -78,92 +70,13 @@ void Terminal::init(QString number, QString name, bool hiddenName)
setZValue(Z); setZValue(Z);
} }
/*!
\brief Terminal::init
Additionaly to the init above, this method stores position and orientation into the data class
\param pf
\param o
\param number
\param name
\param hiddenName
*/
void Terminal::init(
QPointF pf,
Qet::Orientation o,
QString number,
QString name,
bool hiddenName)
{
setTagName("terminal");
// definition du pount d'amarrage pour un conducteur
d->m_pos = pf;
// definition de l'orientation de la borne (par defaut : sud)
if (o < Qet::North || o > Qet::West) d->m_orientation = Qet::South;
else d->m_orientation = o;
init(number, name, hiddenName);
}
/**
initialise une borne
@param pf position du point d'amarrage pour un conducteur
@param o orientation de la borne : Qt::Horizontal ou Qt::Vertical
@param e Element auquel cette borne appartient
*/
Terminal::Terminal(QPointF pf, Qet::Orientation o, Element *e) :
QGraphicsObject(e),
d(new TerminalData(this)),
parent_element_ (e)
{
init(pf, o, "_", "_", false);
}
/**
initialise une borne
@param pf_x Abscisse du point d'amarrage pour un conducteur
@param pf_y Ordonnee du point d'amarrage pour un conducteur
@param o orientation de la borne : Qt::Horizontal ou Qt::Vertical
@param e Element auquel cette borne appartient
*/
Terminal::Terminal(qreal pf_x, qreal pf_y, Qet::Orientation o, Element *e) :
QGraphicsObject(e),
d(new TerminalData(this)),
parent_element_ (e)
{
init(QPointF(pf_x, pf_y), o, "_", "_", false);
}
/**
initialise une borne
@param pf position du point d'amarrage pour un conducteur
@param o orientation de la borne : Qt::Horizontal ou Qt::Vertical
@param num number of terminal (ex 3 - 4 for NO)
@param name of terminal
@param hiddenName hide or show the name
@param e Element auquel cette borne appartient
*/
Terminal::Terminal(
QPointF pf,
Qet::Orientation o,
QString num,
QString name,
bool hiddenName,
Element *e) :
QGraphicsObject (e),
d(new TerminalData(this)),
parent_element_ (e)
{
init(pf, o, std::move(num), std::move(name), hiddenName);
}
Terminal::Terminal(TerminalData* data, Element* e) : Terminal::Terminal(TerminalData* data, Element* e) :
QGraphicsObject(e), QGraphicsObject(e),
d(data), d(data),
parent_element_(e) parent_element_(e)
{ {
d->setParent(this); d->setParent(this);
init("_", "_", false); init();
} }
/** /**
@@ -171,7 +84,7 @@ Terminal::Terminal(TerminalData* data, Element* e) :
* Destruction of the terminal, and also docked conductor * Destruction of the terminal, and also docked conductor
*/ */
Terminal::~Terminal() { Terminal::~Terminal() {
qDeleteAll(m_conductors_list); qDeleteAll(m_conductors_list);
} }
/** /**
@@ -197,34 +110,6 @@ Qet::Orientation Terminal::orientation() const
} else return(d->m_orientation); } else return(d->m_orientation);
} }
/**
@brief Terminal::setNumber
@param number
*/
void Terminal::setNumber(QString number)
{
number_terminal_ = std::move(number);
}
/**
@brief Terminal::setName
@param name : QString
@param hiddenName : bool
*/
void Terminal::setName(QString name, bool hiddenName)
{
d->m_name = std::move(name);
name_terminal_hidden = hiddenName;
}
/**
@brief Terminal::name
@return the name of terminal.
*/
inline QString Terminal::name() const {
return(d->m_name);
}
/** /**
@brief Terminal::addConductor @brief Terminal::addConductor
Add a conductor to this terminal Add a conductor to this terminal
@@ -290,8 +175,8 @@ void Terminal::paint(
painter -> save(); painter -> save();
//annulation des renderhints //annulation des renderhints
painter -> setRenderHint(QPainter::Antialiasing, false); painter -> setRenderHint(QPainter::Antialiasing, false);
painter -> setRenderHint(QPainter::TextAntialiasing, false); painter -> setRenderHint(QPainter::TextAntialiasing, false);
painter -> setRenderHint(QPainter::SmoothPixmapTransform, false); painter -> setRenderHint(QPainter::SmoothPixmapTransform, false);
// on travaille avec les coordonnees de l'element parent // on travaille avec les coordonnees de l'element parent
@@ -425,7 +310,7 @@ void Terminal::drawHelpLine(bool draw)
QLineF Terminal::HelpLine() const QLineF Terminal::HelpLine() const
{ {
QPointF scene_dock = dockConductor(); QPointF scene_dock = dockConductor();
QRectF rect = diagram() -> border_and_titleblock.insideBorderRect(); QRectF rect = diagram() -> border_and_titleblock.insideBorderRect();
QLineF line(scene_dock , QPointF()); QLineF line(scene_dock , QPointF());
@@ -503,7 +388,7 @@ Terminal* Terminal::alignedWithTerminal() const
//Available_terminals have several terminals, we get the nearest terminal //Available_terminals have several terminals, we get the nearest terminal
line.setP2(available_terminals.first() -> dockConductor()); line.setP2(available_terminals.first() -> dockConductor());
qreal current_lenght = line.length(); qreal current_lenght = line.length();
Terminal *nearest_terminal = available_terminals.takeFirst(); Terminal *nearest_terminal = available_terminals.takeFirst();
//Search the nearest terminal to this one //Search the nearest terminal to this one
@@ -572,7 +457,7 @@ void Terminal::mouseMoveEvent(QGraphicsSceneMouseEvent *e)
//setCursor(Qt::CrossCursor); //setCursor(Qt::CrossCursor);
// d'un mouvement a l'autre, il faut retirer l'effet hover de la borne precedente // d'un mouvement a l'autre, il faut retirer l'effet hover de la borne precedente
if (m_previous_terminal) { if (m_previous_terminal) {
if (m_previous_terminal == this) m_hovered = true; if (m_previous_terminal == this) m_hovered = true;
else m_previous_terminal -> m_hovered = false; else m_previous_terminal -> m_hovered = false;
m_previous_terminal -> m_hovered_color = m_previous_terminal -> neutralColor; m_previous_terminal -> m_hovered_color = m_previous_terminal -> neutralColor;
@@ -739,10 +624,6 @@ bool Terminal::canBeLinkedTo(Terminal *other_terminal)
return true; return true;
} }
void Terminal::setID(int id) {
m_id = id;
}
/** /**
@brief Terminal::conductors @brief Terminal::conductors
@return La liste des conducteurs lies a cette borne @return La liste des conducteurs lies a cette borne
@@ -753,19 +634,22 @@ QList<Conductor *> Terminal::conductors() const
} }
/** /**
@brief Terminal::toXmlPriv @brief Terminal::toXml
Methode d'export en XML Methode d'export en XML
@param doc Le Document XML a utiliser pour creer l'element XML @param doc Le Document XML a utiliser pour creer l'element XML
@return un QDomElement representant cette borne @return un QDomElement representant cette borne
*/ */
void Terminal::toXmlPriv(QDomElement &qdo) const QDomElement Terminal::toXml(QDomDocument &doc) const
{ {
// for backward compatibility QDomElement qdo = doc.createElement("terminal");
qdo.setAttribute("x", QString("%1").arg(dock_elmt_.x()));
qdo.setAttribute("y", QString("%1").arg(dock_elmt_.y()));
// end for backward compatibility
qdo.setAttribute("orientation", d->m_orientation); // for backward compatibility
qdo.setAttribute("x", QString("%1").arg(dock_elmt_.x()));
qdo.setAttribute("y", QString("%1").arg(dock_elmt_.y()));
// end for backward compatibility
qdo.setAttribute("orientation", d->m_orientation);
return(qdo);
} }
/** /**
@@ -774,25 +658,42 @@ void Terminal::toXmlPriv(QDomElement &qdo) const
@param terminal Le QDomElement a analyser @param terminal Le QDomElement a analyser
@return true si le QDomElement passe en parametre est une borne, false sinon @return true si le QDomElement passe en parametre est une borne, false sinon
*/ */
bool Terminal::valideXml(const QDomElement &terminal) bool Terminal::valideXml(QDomElement &terminal)
{ {
// verifie le nom du tag
if (terminal.tagName() != "terminal") return(false); if (terminal.tagName() != "terminal") return(false);
// affuteuse_250h.qet contains in line 8398 terminals which do not have this // verifie la presence des attributs minimaux
// if (QETXML::propertyString(terminal, "number")) if (!terminal.hasAttribute("x")) return(false);
// return false; if (!terminal.hasAttribute("y")) return(false);
// affuteuse_250h.qet contains in line 8398 terminals which do not have this if (!terminal.hasAttribute("orientation")) return(false);
// if (QETXML::propertyBool(terminal, "nameHidden"))
// return false;
if (!TerminalData::valideXml(terminal)) bool conv_ok;
return false; // parse l'abscisse
terminal.attribute("x").toDouble(&conv_ok);
if (!conv_ok) return(false);
// parse l'ordonnee
terminal.attribute("y").toDouble(&conv_ok);
if (!conv_ok) return(false);
// parse l'id
terminal.attribute("id").toInt(&conv_ok);
if (!conv_ok) return(false);
// parse l'orientation
int terminal_or = terminal.attribute("orientation").toInt(&conv_ok);
if (!conv_ok) return(false);
if (terminal_or != Qet::North
&& terminal_or != Qet::South
&& terminal_or != Qet::East
&& terminal_or != Qet::West) return(false);
// a ce stade, la borne est syntaxiquement correcte // a ce stade, la borne est syntaxiquement correcte
return true; return(true);
} }
/** RETURNS True /**
@brief Terminal::fromXml @brief Terminal::fromXml
Permet de savoir si un element XML represente cette borne. Attention, Permet de savoir si un element XML represente cette borne. Attention,
l'element XML n'est pas verifie l'element XML n'est pas verifie
@@ -800,17 +701,13 @@ bool Terminal::valideXml(const QDomElement &terminal)
@return true si la borne "se reconnait" @return true si la borne "se reconnait"
(memes coordonnes, meme orientation), false sinon (memes coordonnes, meme orientation), false sinon
*/ */
bool Terminal::fromXmlPriv(const QDomElement &terminal) { bool Terminal::fromXml(QDomElement &terminal)
QETXML::propertyString(terminal, "number", &number_terminal_); {
return (
QETXML::propertyBool(terminal, "nameHidden", &name_terminal_hidden); qFuzzyCompare(terminal.attribute("x").toDouble(), dock_elmt_.x()) &&
qFuzzyCompare(terminal.attribute("y").toDouble(), dock_elmt_.y()) &&
if(!d->fromXml(terminal)) (terminal.attribute("orientation").toInt() == d->m_orientation)
return false; );
init(number_terminal_, d->m_name, name_terminal_hidden); // initialize dock_elmt_. This must be done after Terminal data is initialized
return true;
} }
/** /**
@@ -847,18 +744,6 @@ QUuid Terminal::uuid() const
return d->m_uuid; return d->m_uuid;
} }
int Terminal::ID() const {
return m_id;
}
QPointF Terminal::dockPos() {
return dock_elmt_;
}
QPointF Terminal::originPos() {
return d->m_pos;
}
/** /**
@brief Conductor::relatedPotentialTerminal @brief Conductor::relatedPotentialTerminal
Return terminal at the same potential from the same Return terminal at the same potential from the same

View File

@@ -21,9 +21,6 @@
#include <QtWidgets> #include <QtWidgets>
#include <QtXml> #include <QtXml>
#include "../qet.h"
#include "../properties/propertiesinterface.h"
class Conductor; class Conductor;
class Diagram; class Diagram;
class Element; class Element;
@@ -35,7 +32,7 @@ class TerminalData;
plug point for conductors. plug point for conductors.
This class handles all mouse events for connecting conductors This class handles all mouse events for connecting conductors
*/ */
class Terminal : public QGraphicsObject, public PropertiesInterface class Terminal : public QGraphicsObject
{ {
Q_OBJECT Q_OBJECT
@@ -45,11 +42,7 @@ class Terminal : public QGraphicsObject, public PropertiesInterface
// constructors, destructor // constructors, destructor
public: public:
Terminal(QPointF, Qet::Orientation, Element * = nullptr);
Terminal(qreal, qreal, Qet::Orientation, Element * = nullptr);
Terminal(TerminalData* data, Element *e = nullptr); Terminal(TerminalData* data, Element *e = nullptr);
Terminal(QPointF, Qet::Orientation, QString number,
QString name, bool hiddenName, Element * = nullptr);
~Terminal() override; ~Terminal() override;
private: private:
@@ -70,25 +63,17 @@ class Terminal : public QGraphicsObject, public PropertiesInterface
const QStyleOptionGraphicsItem *, const QStyleOptionGraphicsItem *,
QWidget *) override; QWidget *) override;
void drawHelpLine (bool draw = true); void drawHelpLine (bool draw = true);
QLineF HelpLine () const; QLineF HelpLine () const;
QRectF boundingRect () const override; QRectF boundingRect () const override;
// methods to manage conductors attached to the terminal // methods to manage conductors attached to the terminal
Terminal* alignedWithTerminal () const; Terminal* alignedWithTerminal () const;
bool addConductor (Conductor *conductor); bool addConductor (Conductor *conductor);
void removeConductor (Conductor *conductor); void removeConductor (Conductor *conductor);
int conductorsCount () const; int conductorsCount () const;
Diagram *diagram () const; Diagram *diagram () const;
Element *parentElement () const; Element *parentElement () const;
QUuid uuid () const; QUuid uuid () const;
int ID() const;
QPointF dockPos();
QPointF originPos();
QString number() const;
void setNumber(QString number);
void setName(QString name, bool hiddenName);
QString name() const;
QList<Conductor *> conductors() const; QList<Conductor *> conductors() const;
Qet::Orientation orientation() const; Qet::Orientation orientation() const;
@@ -96,15 +81,11 @@ class Terminal : public QGraphicsObject, public PropertiesInterface
void updateConductor(); void updateConductor();
bool isLinkedTo(Terminal *); bool isLinkedTo(Terminal *);
bool canBeLinkedTo(Terminal *); bool canBeLinkedTo(Terminal *);
void setID(int id);
// methods related to XML import/export // methods related to XML import/export
static bool valideXml(const QDomElement &); static bool valideXml(QDomElement &);
bool fromXmlPriv (const QDomElement &) override; bool fromXml (QDomElement &);
void toXmlPriv(QDomElement &) const override; QDomElement toXml (QDomDocument &) const;
void toSettings(QSettings &,const QString & = QString()) const override {/*TODO: implement*/}
void fromSettings(QSettings &,const QString & = QString()) override{/*TODO: implement*/}
protected: protected:
// methods related to events management // methods related to events management
@@ -122,7 +103,6 @@ class Terminal : public QGraphicsObject, public PropertiesInterface
static const qreal terminalSize; static const qreal terminalSize;
static const qreal Z; static const qreal Z;
// Various static colors used for hover effects // Various static colors used for hover effects
// The assignement is in the cpp file
/// default color /// default color
static QColor neutralColor; static QColor neutralColor;
/// color for legal actions /// color for legal actions
@@ -133,12 +113,12 @@ class Terminal : public QGraphicsObject, public PropertiesInterface
static QColor forbiddenColor; static QColor forbiddenColor;
private: private:
bool m_draw_help_line{false}; bool m_draw_help_line{false};
QGraphicsLineItem *m_help_line{nullptr}; QGraphicsLineItem *m_help_line{nullptr};
QGraphicsLineItem *m_help_line_a{nullptr}; QGraphicsLineItem *m_help_line_a{nullptr};
TerminalData* d{nullptr}; TerminalData* d;
/// Parent electrical element /// Parent electrical element
Element *parent_element_{nullptr}; Element *parent_element_{nullptr};
@@ -147,29 +127,18 @@ class Terminal : public QGraphicsObject, public PropertiesInterface
QPointF dock_elmt_; QPointF dock_elmt_;
private: private:
/// List of conductors attached to the terminal /// List of conductors attached to the terminal
QList<Conductor *> m_conductors_list; QList<Conductor *> m_conductors_list;
/** QRectF m_br;
Pointer to a rectangle representing the terminal bounding rect; /// Last terminal seen through an attached conductor
used to calculate the bounding rect once only; Terminal *m_previous_terminal = nullptr;
used a pointer because boundingRect() is supposed to be const. /// Whether the mouse pointer is hovering the terminal
*/ bool m_hovered = false;
QRectF m_br; /// Color used for the hover effect
/// Last terminal seen through an attached conductor QColor m_hovered_color = Terminal::neutralColor;
Terminal *m_previous_terminal{nullptr};
/// Whether the mouse pointer is hovering the terminal
bool m_hovered{false};
/// Color used for the hover effect
QColor m_hovered_color{Terminal::neutralColor};
/// Number of Terminal
QString number_terminal_;
bool name_terminal_hidden{true};
/// legacy id used by the conductor to find the terminal. From 0.8x on the uuid is used instead.
int m_id{-1};
private: private:
void init(QString number, QString name, bool hiddenName); void init();
void init(QPointF pf, Qet::Orientation o,QString number, QString name, bool hiddenName); void init(QPointF pf, Qet::Orientation o);
}; };
/** /**
@@ -178,19 +147,9 @@ class Terminal : public QGraphicsObject, public PropertiesInterface
*/ */
inline int Terminal::conductorsCount() const inline int Terminal::conductorsCount() const
{ {
return(m_conductors_list.size()); return(m_conductors_list.size());
} }
/**
@brief Terminal::number
@return the number of terminal.
*/
inline QString Terminal::number() const
{
return(number_terminal_);
}
QList<Terminal *> relatedPotentialTerminal (const Terminal *terminal, QList<Terminal *> relatedPotentialTerminal (const Terminal *terminal,
const bool all_diagram = true); const bool all_diagram = true);

View File

@@ -39,8 +39,6 @@
#include <QtDebug> #include <QtDebug>
#include <utility> #include <utility>
#include "qetxml.h"
static int BACKUP_INTERVAL = 120000; //interval in ms of backup = 2min static int BACKUP_INTERVAL = 120000; //interval in ms of backup = 2min
/** /**
@@ -49,7 +47,7 @@ static int BACKUP_INTERVAL = 120000; //interval in ms of backup = 2min
@param parent @param parent
*/ */
QETProject::QETProject(QObject *parent) : QETProject::QETProject(QObject *parent) :
QObject (parent), QObject (parent),
m_titleblocks_collection(this), m_titleblocks_collection(this),
m_data_base(this, this) m_data_base(this, this)
{ {
@@ -66,7 +64,7 @@ QETProject::QETProject(QObject *parent) :
@param parent : parent QObject @param parent : parent QObject
*/ */
QETProject::QETProject(const QString &path, QObject *parent) : QETProject::QETProject(const QString &path, QObject *parent) :
QObject (parent), QObject (parent),
m_titleblocks_collection(this), m_titleblocks_collection(this),
m_data_base(this, this) m_data_base(this, this)
{ {
@@ -87,7 +85,7 @@ QETProject::QETProject(const QString &path, QObject *parent) :
@param parent : parent QObject @param parent : parent QObject
*/ */
QETProject::QETProject(KAutoSaveFile *backup, QObject *parent) : QETProject::QETProject(KAutoSaveFile *backup, QObject *parent) :
QObject (parent), QObject (parent),
m_titleblocks_collection(this), m_titleblocks_collection(this),
m_data_base(this, this) m_data_base(this, this)
{ {
@@ -1491,11 +1489,11 @@ void QETProject::readDefaultPropertiesXml(QDomDocument &xml_project)
QDomElement newdiagrams_elmt = newdiagrams_nodes.at(0).toElement(); QDomElement newdiagrams_elmt = newdiagrams_nodes.at(0).toElement();
// By default, use value find in the global conf of QElectroTech // By default, use value find in the global conf of QElectroTech
default_border_properties_ = BorderProperties:: defaultProperties(); default_border_properties_ = BorderProperties:: defaultProperties();
default_titleblock_properties_ = TitleBlockProperties::defaultProperties(); default_titleblock_properties_ = TitleBlockProperties::defaultProperties();
default_conductor_properties_ = ConductorProperties:: defaultProperties(); default_conductor_properties_ = ConductorProperties:: defaultProperties();
m_default_report_properties = ReportProperties:: defaultProperties(); m_default_report_properties = ReportProperties:: defaultProperties();
m_default_xref_properties = XRefProperties:: defaultProperties(); m_default_xref_properties = XRefProperties:: defaultProperties();
//Read values indicate in project //Read values indicate in project
QDomElement border_elmt, titleblock_elmt, conductors_elmt, report_elmt, xref_elmt, conds_autonums, folio_autonums, element_autonums; QDomElement border_elmt, titleblock_elmt, conductors_elmt, report_elmt, xref_elmt, conds_autonums, folio_autonums, element_autonums;
@@ -1534,11 +1532,7 @@ void QETProject::readDefaultPropertiesXml(QDomDocument &xml_project)
{ {
XRefProperties xrp; XRefProperties xrp;
xrp.fromXml(elmt); xrp.fromXml(elmt);
QString type; m_default_xref_properties.insert(elmt.attribute("type"), xrp);
if (QETXML::propertyString(elmt, "type", &type) == QETXML::PropertyFlags::Success)
m_default_xref_properties.insert(type, xrp);
else
qDebug() << "xref Property was not added to m_default_xref_properties.";
} }
} }
if (!conds_autonums.isNull()) if (!conds_autonums.isNull())
@@ -1596,13 +1590,19 @@ void QETProject::writeDefaultPropertiesXml(QDomElement &xml_element)
QDomDocument xml_document = xml_element.ownerDocument(); QDomDocument xml_document = xml_element.ownerDocument();
// export size of border // export size of border
xml_element.appendChild(default_border_properties_.toXml(xml_document)); QDomElement border_elmt = xml_document.createElement("border");
default_border_properties_.toXml(border_elmt);
xml_element.appendChild(border_elmt);
// export content of titleblock // export content of titleblock
xml_element.appendChild(default_titleblock_properties_.toXml(xml_document)); QDomElement titleblock_elmt = xml_document.createElement("inset");
default_titleblock_properties_.toXml(titleblock_elmt);
xml_element.appendChild(titleblock_elmt);
// exporte default conductor // exporte default conductor
xml_element.appendChild(default_conductor_properties_.toXml(xml_document)); QDomElement conductor_elmt = xml_document.createElement("conductors");
default_conductor_properties_.toXml(conductor_elmt);
xml_element.appendChild(conductor_elmt);
// export default report properties // export default report properties
QDomElement report_elmt = xml_document.createElement("report"); QDomElement report_elmt = xml_document.createElement("report");
@@ -1828,8 +1828,8 @@ void QETProject::setProjectProperties(const DiagramContext &context) {
bool QETProject::projectWasModified() bool QETProject::projectWasModified()
{ {
if ( projectOptionsWereModified() || if ( projectOptionsWereModified() ||
!m_undo_stack -> isClean() || !m_undo_stack -> isClean() ||
m_titleblocks_collection.templates().count() ) m_titleblocks_collection.templates().count() )
return(true); return(true);

View File

@@ -581,299 +581,3 @@ QVector<QDomElement> QETXML::findInDomElement(const QDomElement &dom_elmt, const
} }
return(return_list); return(return_list);
} }
namespace QETXML {
PropertyFlags debugReadXml(PropertyFlags flag, const QDomElement &e, const QString& attribute_name, const QString& attr, const QString& type)
{
if (flag == QETXML::PropertyFlags::NoValidConversion)
qDebug() << "\t\t\t" << "Tagname: " << e.tagName() << ". " << "No valid Conversion: " << attribute_name << ". type: " << type << ". value: " << attr;
return flag;
}
QDomElement createXmlProperty(const QString& name, const QString value) {
QDomDocument doc;
QDomElement p = doc.createElement("property");
p.setAttribute("name", name);
p.setAttribute("type", stringS);
p.setAttribute("value", value);
return p;
}
QDomElement createXmlProperty(const QString& name, const char* value) {
QDomDocument doc;
QDomElement p = doc.createElement("property");
p.setAttribute("name", name);
p.setAttribute("type", stringS);
p.setAttribute("value", value);
return p;
}
/*!
* \brief propertyInteger
* Reads an interger from the XML element.
* \param e DomElement which contains the property attribute
* \param attribute_name Name of the attribute
* \param entier Return value if success
* \return True if reading an integer was successful, else False. If the attribute was not found,
* \p entier is not valid and the return value is False
*/
QDomElement createXmlProperty(const QString& name, const int value) {
QDomDocument doc;
QDomElement p = doc.createElement("property");
p.setAttribute("name", name);
p.setAttribute("type", integerS);
p.setAttribute("value", QString::number(value));
return p;
}
QDomElement createXmlProperty(const QString& name, const double value) {
QDomDocument doc;
QDomElement p = doc.createElement("property");
p.setAttribute("name", name);
p.setAttribute("type", doubleS);
p.setAttribute("value", QString::number(value));
return p;
}
QDomElement createXmlProperty(const QString& name, const bool value) {
QDomDocument doc;
QDomElement p = doc.createElement("property");
p.setAttribute("name", name);
p.setAttribute("type", boolS);
p.setAttribute("value", QString::number(value));
return p;
}
QDomElement createXmlProperty(const QString& name, const QUuid value) {
QDomDocument doc;
QDomElement p = doc.createElement("property");
p.setAttribute("name", name);
p.setAttribute("type", uuidS);
p.setAttribute("value", value.toString());
return p;
}
QDomElement createXmlProperty(const QString& name, const QColor value) {
QDomDocument doc;
QDomElement p = doc.createElement("property");
p.setAttribute("name", name);
p.setAttribute("type", colorS);
p.setAttribute("value", value.name());
return p;
}
/*!
* \brief PropertiesInterface::propertyInteger
* Reads an interger from the XML element.
* \param e DomElement which contains the property attribute
* \param attribute_name Name of the attribute
* \param entier Return value if success
* \return True if reading an integer was successful, else False. If the attribute was not found,
* \p entier is not valid and the return value is False
*/
PropertyFlags propertyInteger(const QDomElement &e, const QString& attribute_name, int* entier) {
QString attr;
if (!attribute(e, attribute_name, integerS, &attr)) {
return PropertyFlags::NotFound;
}
return debugReadXml(propertyInteger(attr, entier), e, attribute_name, attr, integerS);
}
PropertyFlags propertyInteger(const QString& value, int* entier) {
// verifie la validite de l'attribut
bool ok;
int tmp = value.toInt(&ok);
if (!ok) {
return QETXML::PropertyFlags::NoValidConversion;
}
if (entier != nullptr)
*entier = tmp;
return PropertyFlags::Success;
}
PropertyFlags propertyDouble(const QDomElement &e, const QString& attribute_name, double* reel) {
QString attr;
if (!attribute(e, attribute_name, doubleS, &attr)) {
return PropertyFlags::NotFound;
}
return debugReadXml(propertyDouble(attr, reel), e, attribute_name, attr, doubleS);
}
PropertyFlags propertyDouble(const QString& value, double* reel)
{
// verifie la validite de l'attribut
bool ok;
double tmp = value.toDouble(&ok);
if (!ok) {
return QETXML::PropertyFlags::NoValidConversion;
}
if (reel != nullptr)
*reel = tmp;
return PropertyFlags::Success;
}
PropertyFlags propertyBool(const QDomElement &e, const QString& attribute_name, bool* boolean) {
QString attr;
if (!attribute(e, attribute_name, boolS, &attr)) {
return PropertyFlags::NotFound;
}
return debugReadXml(propertyBool(attr, boolean), e, attribute_name, attr, boolS);
}
PropertyFlags propertyBool(const QString& value, bool* boolean)
{
// verifie la validite de l'attribut
bool ok;
bool tmp = value.toInt(&ok);
if (!ok) {
if (value == "true" || value == "1")
tmp = true;
else if (value == "false" || value == "0")
tmp = false;
else {
return QETXML::PropertyFlags::NoValidConversion;
}
}
if (boolean != nullptr)
*boolean = tmp;
return PropertyFlags::Success;
}
PropertyFlags propertyColor(const QDomElement &e, const QString& attribute_name, QColor* color) {
QString attr;
if (!attribute(e, attribute_name, colorS, &attr)) {
return PropertyFlags::NotFound;
}
return debugReadXml(propertyColor(attr, color), e, attribute_name, attr, colorS);
}
PropertyFlags propertyColor(const QString& value, QColor* color)
{
// verifie la validite de l'attribut
QColor tmp = QColor(value);
if (!tmp.isValid()) {
return QETXML::PropertyFlags::NoValidConversion;
}
if (color != nullptr)
*color = tmp;
return PropertyFlags::Success;
}
PropertyFlags propertyUuid(const QDomElement &e, const QString& attribute_name, QUuid* uuid) {
QString attr;
if (!attribute(e, attribute_name, uuidS, &attr)) {
return PropertyFlags::NotFound;
}
return debugReadXml(propertyUuid(attr, uuid), e, attribute_name, attr, uuidS);
}
PropertyFlags propertyUuid(const QString& value, QUuid* uuid)
{
if (QUuid(value).isNull()){
return QETXML::PropertyFlags::NoValidConversion;
}
if (uuid != nullptr)
*uuid = QUuid(value);
return PropertyFlags::Success;
}
PropertyFlags propertyString(const QDomElement& e, const QString& attribute_name, QString* string) {
QString attr;
if (!attribute(e, attribute_name, stringS, &attr)) {
return PropertyFlags::NotFound;
}
// verifie la validite de l'attribut
if (string != nullptr)
*string = attr;
return PropertyFlags::Success;
}
QDomElement property(const QDomElement& e, const QString& name) {
for (int i=0; i < e.childNodes().count(); i++) {
QDomElement child = e.childNodes().at(i).toElement();
if (!validXmlProperty(child))
continue; // there might also non property childs
if (child.attribute("name") == name)
return child;
}
return QDomElement();
}
/*!
* \brief PropertiesInterface::attribute
* Returns the property with the name \p attribute_name and type \p type
* \param e Xml element which contains the property
* \param attribute_name
* \param type Type of the property
* \param attr
* \return
*/
bool attribute(const QDomElement& e, const QString& attribute_name, const QString& type, QString* attr) {
QDomElement p = property(e, attribute_name);
if (p.isNull()) {
// check if legacy property is available,
// where the property is inside the element as attribute
if (!e.hasAttribute(attribute_name)) {
qDebug() << "\t\t\t" << "Tagname: " << e.tagName() << ". " << "Property " << attribute_name << "is not available";
return false;
}
*attr = e.attribute(attribute_name);
} else {
if (p.attribute("type") != type) {
qDebug() << "\t\t\t" << "Tagname: " << e.tagName() << ", Property: " << attribute_name << "(" << p.attribute("type") << ") has not type: " << type;
return false;
}
*attr = p.attribute("value");
}
return true;
}
bool validXmlProperty(const QDomElement& e) {
if (!e.hasAttribute("name"))
return false;
if (!e.hasAttribute("type"))
return false;
if (!e.hasAttribute("value"))
return false;
return true;
}
}

View File

@@ -89,54 +89,6 @@ namespace QETXML
QVector<QDomElement> findInDomElement(const QDomElement &dom_elmt, QVector<QDomElement> findInDomElement(const QDomElement &dom_elmt,
const QString &tag_name); const QString &tag_name);
const QString integerS = "int";
const QString doubleS = "double";
const QString boolS = "bool";
const QString stringS = "string";
const QString uuidS = "uuid";
const QString colorS = "color";
enum PropertyFlags {
Success = 0,
NotFound = 1,
NoValidConversion = 2,
// = 4
};
/*!
* Use this functions to add properties to the xml document
*/
QDomElement createXmlProperty(const QString& name, const QString value);
QDomElement createXmlProperty(const QString& name, const char* value);
QDomElement createXmlProperty(const QString& name, const int value);
QDomElement createXmlProperty(const QString& name, const double value);
QDomElement createXmlProperty(const QString& name, const bool value);
QDomElement createXmlProperty(const QString& name, const QUuid value);
QDomElement createXmlProperty(const QString& name, const QColor value);
PropertyFlags propertyInteger(const QString& value, int* entry = nullptr);
PropertyFlags propertyInteger(const QDomElement &e, const QString& attribute_name, int *entier = nullptr);
PropertyFlags propertyDouble(const QString& value, double* entry = nullptr);
PropertyFlags propertyDouble(const QDomElement &e, const QString& attribute_name, double *reel = nullptr);
PropertyFlags propertyString(const QDomElement& e, const QString& attribute_name, QString* string = nullptr);
PropertyFlags propertyBool(const QString& value, bool* entry = nullptr);
PropertyFlags propertyBool(const QDomElement &e, const QString& attribute_name, bool* boolean = nullptr);
PropertyFlags propertyUuid(const QString& value, QUuid* entry = nullptr);
PropertyFlags propertyUuid(const QDomElement &e, const QString& attribute_name, QUuid* uuid = nullptr);
PropertyFlags propertyColor(const QString& value, QColor* entry = nullptr);
PropertyFlags propertyColor(const QDomElement &e, const QString& attribute_name, QColor* color = nullptr);
QDomElement property(const QDomElement& e, const QString& name);
bool attribute(const QDomElement& e, const QString& attribute_name, const QString& type, QString* attr);
/*!
* \brief PropertiesInterface::validXmlProperty
* Check if the Xml element contains the needed fields
* \param e Xml Property
* \return True if name, type, value attribute are available, else false
*/
bool validXmlProperty(const QDomElement& e);
} }
#endif // QETXML_H #endif // QETXML_H

View File

@@ -38,11 +38,11 @@ class HelperCell : public QGraphicsObject, public QGraphicsLayoutItem {
// attributes // attributes
public: public:
QColor background_color{Qt::white}; ///< Background color when rendering this cell QColor background_color; ///< Background color when rendering this cell
QColor foreground_color{Qt::black}; ///< Text color when rendering this cell QColor foreground_color; ///< Text color when rendering this cell
QString label; ///< Label displayed in this cell QString label; ///< Label displayed in this cell
Qt::Orientation orientation{Qt::Horizontal}; ///< Orientation of this cell Qt::Orientation orientation; ///< Orientation of this cell
int index{-1}; ///< Index of this cell int index; ///< Index of this cell
// methods // methods
public: public:

View File

@@ -36,11 +36,10 @@ class SplittedHelperCell : public HelperCell {
void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget * = nullptr) override; void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget * = nullptr) override;
// attributes // attributes
// colors are set in the constructor
QColor split_background_color; ///< Background color on the split side QColor split_background_color; ///< Background color on the split side
QColor split_foreground_color; ///< Text color on the split side QColor split_foreground_color; ///< Text color on the split side
QString split_label; ///< Text displayed on the split side QString split_label; ///< Text displayed on the split side
int split_size; ///< Length of the split side int split_size; ///< Length of the split side
}; };
#endif #endif

View File

@@ -19,15 +19,16 @@
#include "qet.h" #include "qet.h"
#include "qetapp.h" #include "qetapp.h"
#include "qetxml.h"
/** /**
Constructeur. Initialise un objet TitleBlockProperties avec tous les champs Constructeur. Initialise un objet TitleBlockProperties avec tous les champs
vides (date vide + useDate a UseDateValue). vides (date vide + useDate a UseDateValue).
*/ */
TitleBlockProperties::TitleBlockProperties() TitleBlockProperties::TitleBlockProperties() :
date(),
useDate(UseDateValue),
display_at(Qt::BottomEdge),
collection (QET::QetCollection::Common)
{ {
setTagName("titleblock");
} }
/** /**
@@ -68,65 +69,60 @@ bool TitleBlockProperties::operator!=(const TitleBlockProperties &ip) {
return(!(*this == ip)); return(!(*this == ip));
} }
/**
Exporte le cartouche sous formes d'attributs XML ajoutes a l'element e.
@param e Element XML auquel seront ajoutes des attributs
*/
void TitleBlockProperties::toXmlPriv(QDomElement& e) const {
e.setAttribute("author", author);
e.setAttribute("title", title);
e.setAttribute("filename", filename);
e.setAttribute("plant", plant);
e.setAttribute("locmach", locmach);
e.setAttribute("indexrev",indexrev);
e.setAttribute("version", version);
e.setAttribute("folio", folio);
e.setAttribute("auto_page_num", auto_page_num);
e.setAttribute("date", exportDate());
e.setAttribute("displayAt", (display_at == Qt::BottomEdge? "bottom" : "right"));
if (!template_name.isEmpty())
{
e.setAttribute("titleblocktemplate", template_name);
e.setAttribute("titleblocktemplateCollection", QET::qetCollectionToString(collection));
}
if (context.keys().count()) { /**
QDomElement properties = e.ownerDocument().createElement("properties"); Exporte le cartouche sous formes d'attributs XML ajoutes a l'element e.
context.toXml(properties); @param e Element XML auquel seront ajoutes des attributs
e.appendChild(properties); */
} void TitleBlockProperties::toXml(QDomElement &e) const
{
e.setAttribute("author", author);
e.setAttribute("title", title);
e.setAttribute("filename", filename);
e.setAttribute("plant", plant);
e.setAttribute("locmach", locmach);
e.setAttribute("indexrev",indexrev);
e.setAttribute("version", version);
e.setAttribute("folio", folio);
e.setAttribute("auto_page_num", auto_page_num);
e.setAttribute("date", exportDate());
e.setAttribute("displayAt", (display_at == Qt::BottomEdge? "bottom" : "right"));
if (!template_name.isEmpty())
{
e.setAttribute("titleblocktemplate", template_name);
e.setAttribute("titleblocktemplateCollection", QET::qetCollectionToString(collection));
}
if (context.keys().count()) {
QDomElement properties = e.ownerDocument().createElement("properties");
context.toXml(properties);
e.appendChild(properties);
}
} }
/** RETURNS True /**
Importe le cartouche a partir des attributs XML de l'element e Importe le cartouche a partir des attributs XML de l'element e
@param e Element XML dont les attributs seront lus @param e Element XML dont les attributs seront lus
*/ */
bool TitleBlockProperties::fromXmlPriv(const QDomElement &e) { void TitleBlockProperties::fromXml(const QDomElement &e) {
// reads the historical fields // reads the historical fields
QETXML::propertyString(e, "author", &author); if (e.hasAttribute("author")) author = e.attribute("author");
QETXML::propertyString(e, "title", &title); if (e.hasAttribute("title")) title = e.attribute("title");
QETXML::propertyString(e, "filename", &filename); if (e.hasAttribute("filename")) filename = e.attribute("filename");
QETXML::propertyString(e, "plant", &plant); if (e.hasAttribute("plant")) plant = e.attribute("plant");
QETXML::propertyString(e, "locmach", &locmach); if (e.hasAttribute("locmach")) locmach = e.attribute("locmach");
QETXML::propertyString(e, "indexrev", &indexrev); if (e.hasAttribute("indexrev")) indexrev = e.attribute("indexrev");
QETXML::propertyString(e, "version", &version); if (e.hasAttribute("version")) version = e.attribute("version");
QETXML::propertyString(e, "folio", &folio); if (e.hasAttribute("folio")) folio = e.attribute("folio");
QETXML::propertyString(e, "auto_page_num", &auto_page_num); if (e.hasAttribute("auto_page_num")) auto_page_num = e.attribute("auto_page_num");
QString date; if (e.hasAttribute("date")) setDateFromString(e.attribute("date"));
QETXML::propertyString(e, "date", &date); if (e.hasAttribute("displayAt")) display_at = (e.attribute("displayAt") == "bottom" ? Qt::BottomEdge : Qt::RightEdge);
setDateFromString(date);
QString display_at_temp;
if (QETXML::propertyString(e, "displayAt", &display_at_temp) == QETXML::PropertyFlags::Success)
display_at = (display_at_temp == "bottom" ? Qt::BottomEdge : Qt::RightEdge); // otherwise it gets default in header file
// reads the template used to render the title block // reads the template used to render the title block
if (QETXML::propertyString(e, "titleblocktemplate", &template_name) == QETXML::PropertyFlags::Success) { if (e.hasAttribute("titleblocktemplate"))
QString tbc; {
if (QETXML::propertyString(e, "titleblocktemplateCollection", &tbc) == QETXML::PropertyFlags::Success) template_name = e.attribute("titleblocktemplate");
collection = QET::qetCollectionFromString(tbc); collection = QET::qetCollectionFromString(e.attribute("titleblocktemplateCollection"));
} }
// reads the additional fields used to fill the title block // reads the additional fields used to fill the title block
@@ -134,7 +130,6 @@ bool TitleBlockProperties::fromXmlPriv(const QDomElement &e) {
foreach (QDomElement e, QET::findInDomElement(e, "properties")) { foreach (QDomElement e, QET::findInDomElement(e, "properties")) {
context.fromXml(e); context.fromXml(e);
} }
return true;
} }
/** /**
@@ -145,16 +140,16 @@ bool TitleBlockProperties::fromXmlPriv(const QDomElement &e) {
*/ */
void TitleBlockProperties::toSettings(QSettings &settings, const QString &prefix) const void TitleBlockProperties::toSettings(QSettings &settings, const QString &prefix) const
{ {
settings.setValue(prefix + "title", title); settings.setValue(prefix + "title", title);
settings.setValue(prefix + "author", author); settings.setValue(prefix + "author", author);
settings.setValue(prefix + "filename", filename); settings.setValue(prefix + "filename", filename);
settings.setValue(prefix + "plant", plant); settings.setValue(prefix + "plant", plant);
settings.setValue(prefix + "locmach", locmach); settings.setValue(prefix + "locmach", locmach);
settings.setValue(prefix + "indexrev", indexrev); settings.setValue(prefix + "indexrev", indexrev);
settings.setValue(prefix + "version", version); settings.setValue(prefix + "version", version);
settings.setValue(prefix + "folio", folio); settings.setValue(prefix + "folio", folio);
settings.setValue(prefix + "auto_page_num", auto_page_num); settings.setValue(prefix + "auto_page_num", auto_page_num);
settings.setValue(prefix + "date", exportDate()); settings.setValue(prefix + "date", exportDate());
settings.setValue(prefix + "displayAt", (display_at == Qt::BottomEdge? "bottom" : "right")); settings.setValue(prefix + "displayAt", (display_at == Qt::BottomEdge? "bottom" : "right"));
settings.setValue(prefix + "titleblocktemplate", template_name.isEmpty()? QString() : template_name); settings.setValue(prefix + "titleblocktemplate", template_name.isEmpty()? QString() : template_name);
settings.setValue(prefix + "titleblocktemplateCollection", QET::qetCollectionToString(collection)); settings.setValue(prefix + "titleblocktemplateCollection", QET::qetCollectionToString(collection));
@@ -167,14 +162,14 @@ void TitleBlockProperties::toSettings(QSettings &settings, const QString &prefix
@param prefix prefixe a ajouter devant les noms des parametres @param prefix prefixe a ajouter devant les noms des parametres
*/ */
void TitleBlockProperties::fromSettings(QSettings &settings, const QString &prefix) { void TitleBlockProperties::fromSettings(QSettings &settings, const QString &prefix) {
title = settings.value(prefix + "title").toString(); title = settings.value(prefix + "title").toString();
author = settings.value(prefix + "author").toString(); author = settings.value(prefix + "author").toString();
filename = settings.value(prefix + "filename").toString(); filename = settings.value(prefix + "filename").toString();
plant = settings.value(prefix + "plant").toString(); plant = settings.value(prefix + "plant").toString();
locmach = settings.value(prefix + "locmach").toString(); locmach = settings.value(prefix + "locmach").toString();
indexrev = settings.value(prefix + "indexrev").toString(); indexrev = settings.value(prefix + "indexrev").toString();
version = settings.value(prefix + "version").toString(); version = settings.value(prefix + "version").toString();
folio = settings.value(prefix + "folio", "%id/%total").toString(); folio = settings.value(prefix + "folio", "%id/%total").toString();
auto_page_num = settings.value(prefix + "auto_page_num").toString(); auto_page_num = settings.value(prefix + "auto_page_num").toString();
setDateFromString(settings.value(prefix + "date").toString()); setDateFromString(settings.value(prefix + "date").toString());
display_at = (settings.value(prefix + "displayAt", QVariant("bottom")).toString() == "bottom" ? Qt::BottomEdge : Qt::RightEdge); display_at = (settings.value(prefix + "displayAt", QVariant("bottom")).toString() == "bottom" ? Qt::BottomEdge : Qt::RightEdge);

View File

@@ -21,14 +21,12 @@
#include "diagramcontext.h" #include "diagramcontext.h"
#include "qet.h" #include "qet.h"
#include "properties/propertiesinterface.h"
/** /**
This class provides a container for the properties of a particular title This class provides a container for the properties of a particular title
block, i.e. title, author, date, filename, folio, template, custom block, i.e. title, author, date, filename, folio, template, custom
properties, ... properties, ...
*/ */
class TitleBlockProperties: public PropertiesInterface { class TitleBlockProperties {
public: public:
TitleBlockProperties(); TitleBlockProperties();
virtual ~TitleBlockProperties(); virtual ~TitleBlockProperties();
@@ -41,10 +39,10 @@ class TitleBlockProperties: public PropertiesInterface {
bool operator==(const TitleBlockProperties &); bool operator==(const TitleBlockProperties &);
bool operator!=(const TitleBlockProperties &); bool operator!=(const TitleBlockProperties &);
void toXmlPriv(QDomElement &e) const override; void toXml(QDomElement &) const;
bool fromXmlPriv(const QDomElement &) override; void fromXml(const QDomElement &);
void toSettings(QSettings &, const QString & = QString()) const override; void toSettings(QSettings &, const QString & = QString()) const;
void fromSettings(QSettings &, const QString & = QString()) override; void fromSettings(QSettings &, const QString & = QString());
void setAutoPageNum(QString autonum) {auto_page_num = autonum;} void setAutoPageNum(QString autonum) {auto_page_num = autonum;}
@@ -53,21 +51,21 @@ class TitleBlockProperties: public PropertiesInterface {
QDate finalDate() const ; QDate finalDate() const ;
// attributes // attributes
QString title; ///< Folio title (displayed by the default template) QString title; ///< Folio title (displayed by the default template)
QString author; ///< Author of the diagram/folio (displayed by the default template) QString author; ///< Author of the diagram/folio (displayed by the default template)
QDate date; ///< Date (displayed by the default template) QDate date; ///< Date (displayed by the default template)
QString filename; ///< Filename (displayed by the default template) QString filename; ///< Filename (displayed by the default template)
QString plant; ///< Plant (displayed by the default template) QString plant; ///< Plant (displayed by the default template)
QString locmach; ///< Location(displayed by the default template) QString locmach; ///< Location(displayed by the default template)
QString indexrev; ///< Revision Index (displayed by the default template) QString indexrev; ///< Revision Index (displayed by the default template)
QString version; ///< Version (displayed by the default template) QString version; ///< Version (displayed by the default template)
QString folio; ///< Folio information (displayed by the default template) QString folio; ///< Folio information (displayed by the default template)
QString auto_page_num; QString auto_page_num;
DateManagement useDate{UseDateValue}; ///< Wheter to use the date attribute DateManagement useDate; ///< Wheter to use the date attribute
QString template_name; ///< Name of the template used to render the title block - an empty string means "the default template provided by the application" QString template_name; ///< Name of the template used to render the title block - an empty string means "the default template provided by the application"
DiagramContext context; ///< Container for the additional, user-defined fields DiagramContext context; ///< Container for the additional, user-defined fields
Qt::Edge display_at{Qt::Edge::BottomEdge}; ///< Edge to display the titleblock Qt::Edge display_at; ///< Edge to display the titleblock
QET::QetCollection collection{QET::QetCollection::Common}; ///<Specify the location of the title block QET::QetCollection collection; ///<Specify the location of the title block
private: private:
QString exportDate() const; QString exportDate() const;