Conductor and conductor text item : minor change about how the text is save to xml

git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@3485 bfdf4180-ca20-0410-9c96-a3a8aa849046
This commit is contained in:
blacksun
2014-11-14 13:06:24 +00:00
parent 5f9251a22e
commit 78b57e56e8
6 changed files with 137 additions and 128 deletions

View File

@@ -951,100 +951,22 @@ bool Conductor::hasClickedOn(QPointF press_point, QPointF point) const {
} }
/** /**
Charge les caracteristiques du conducteur depuis un element XML. * @brief Conductor::fromXml
@param e Un element XML * Load the conductor and her information from xml element
@return true si le chargement a reussi, false sinon * @param e
*/ * @return true is loading success else return false
*/
bool Conductor::fromXml(QDomElement &e) { bool Conductor::fromXml(QDomElement &e) {
//Get the "configuration" of conductor
properties_.fromXml(e);
readProperties();
setPos(e.attribute("x", 0).toDouble(), setPos(e.attribute("x", 0).toDouble(),
e.attribute("y", 0).toDouble()); e.attribute("y", 0).toDouble());
//Get the pos of text item bool return_ = pathFromXml(e);
qreal user_pos_x, user_pos_y;
if (
QET::attributeIsAReal(e, "userx", &user_pos_x) &&
QET::attributeIsAReal(e, "usery", &user_pos_y)
) {
text_item -> forceMovedByUser(true);
text_item -> setPos(user_pos_x, user_pos_y);
}
if (e.hasAttribute("rotation")) {
text_item -> setRotationAngle(e.attribute("rotation").toDouble());
text_item -> forceRotateByUser(true);
}
// parcourt les elements XML "segment" et en extrait deux listes de longueurs
// les segments non valides sont ignores
QList<qreal> segments_x, segments_y;
for (QDomNode node = e.firstChild() ; !node.isNull() ; node = node.nextSibling()) {
// on s'interesse aux elements XML "segment"
QDomElement current_segment = node.toElement();
if (current_segment.isNull() || current_segment.tagName() != "segment") continue;
// le segment doit avoir une longueur
if (!current_segment.hasAttribute("length")) continue;
// cette longueur doit etre un reel
bool ok;
qreal segment_length = current_segment.attribute("length").toDouble(&ok);
if (!ok) continue;
if (current_segment.attribute("orientation") == "horizontal") {
segments_x << segment_length;
segments_y << 0.0;
} else {
segments_x << 0.0;
segments_y << segment_length;
}
}
//If there isn't segment we generate automatic path and return true text_item -> fromXml(e);
if (!segments_x.size()) { properties_. fromXml(e);
generateConductorPath(terminal1 -> dockConductor(), terminal1 -> orientation(), terminal2 -> dockConductor(), terminal2 -> orientation()); readProperties();
return(true);
}
// les longueurs recueillies doivent etre coherentes avec les positions des bornes return return_;
qreal width = 0.0, height = 0.0;
foreach (qreal t, segments_x) width += t;
foreach (qreal t, segments_y) height += t;
QPointF t1 = terminal1 -> dockConductor();
QPointF t2 = terminal2 -> dockConductor();
qreal expected_width = t2.x() - t1.x();
qreal expected_height = t2.y() - t1.y();
// on considere que le trajet est incoherent a partir d'une unite de difference avec l'espacement entre les bornes
if (
qAbs(expected_width - width) > 1.0 ||
qAbs(expected_height - height) > 1.0
) {
qDebug() << "Conductor::fromXml : les segments du conducteur ne semblent pas coherents - utilisation d'un trajet automatique";
return(false);
}
/* on recree les segments a partir des donnes XML */
// cree la liste de points
QList<QPointF> points_list;
points_list << mapFromScene(t1);
for (int i = 0 ; i < segments_x.size() ; ++ i) {
points_list << QPointF(
points_list.last().x() + segments_x.at(i),
points_list.last().y() + segments_y.at(i)
);
}
pointsToSegments(points_list);
// initialise divers parametres lies a la modification des conducteurs
modified_path = true;
saveProfile(false);
segmentsToPath();
return(true);
} }
/** /**
@@ -1075,18 +997,90 @@ QDomElement Conductor::toXml(QDomDocument &d, QHash<Terminal *, int> &table_adr_
} }
} }
// exporte la "configuration" du conducteur // Export the properties and text
properties_.toXml(e); properties_. toXml(e);
if (text_item -> wasRotateByUser()) { text_item -> toXml(e);
e.setAttribute("rotation", QString("%1").arg(text_item -> rotationAngle()));
}
if (text_item -> wasMovedByUser()) {
e.setAttribute("userx", QString("%1").arg(text_item -> pos().x()));
e.setAttribute("usery", QString("%1").arg(text_item -> pos().y()));
}
return(e); return(e);
} }
/**
* @brief Conductor::pathFromXml
* Generate the path from xml file
* @param e
* @return true if generate path success else return false
*/
bool Conductor::pathFromXml(const QDomElement &e) {
// parcourt les elements XML "segment" et en extrait deux listes de longueurs
// les segments non valides sont ignores
QList<qreal> segments_x, segments_y;
for (QDomNode node = e.firstChild() ; !node.isNull() ; node = node.nextSibling()) {
// on s'interesse aux elements XML "segment"
QDomElement current_segment = node.toElement();
if (current_segment.isNull() || current_segment.tagName() != "segment") continue;
// le segment doit avoir une longueur
if (!current_segment.hasAttribute("length")) continue;
// cette longueur doit etre un reel
bool ok;
qreal segment_length = current_segment.attribute("length").toDouble(&ok);
if (!ok) continue;
if (current_segment.attribute("orientation") == "horizontal") {
segments_x << segment_length;
segments_y << 0.0;
} else {
segments_x << 0.0;
segments_y << segment_length;
}
}
//If there isn't segment we generate automatic path and return true
if (!segments_x.size()) {
generateConductorPath(terminal1 -> dockConductor(), terminal1 -> orientation(), terminal2 -> dockConductor(), terminal2 -> orientation());
return(true);
}
// les longueurs recueillies doivent etre coherentes avec les positions des bornes
qreal width = 0.0, height = 0.0;
foreach (qreal t, segments_x) width += t;
foreach (qreal t, segments_y) height += t;
QPointF t1 = terminal1 -> dockConductor();
QPointF t2 = terminal2 -> dockConductor();
qreal expected_width = t2.x() - t1.x();
qreal expected_height = t2.y() - t1.y();
// on considere que le trajet est incoherent a partir d'une unite de difference avec l'espacement entre les bornes
if (
qAbs(expected_width - width) > 1.0 ||
qAbs(expected_height - height) > 1.0
) {
qDebug() << "Conductor::fromXml : les segments du conducteur ne semblent pas coherents - utilisation d'un trajet automatique";
return(false);
}
/* on recree les segments a partir des donnes XML */
// cree la liste de points
QList<QPointF> points_list;
points_list << mapFromScene(t1);
for (int i = 0 ; i < segments_x.size() ; ++ i) {
points_list << QPointF(
points_list.last().x() + segments_x.at(i),
points_list.last().y() + segments_y.at(i)
);
}
pointsToSegments(points_list);
// initialise divers parametres lies a la modification des conducteurs
modified_path = true;
saveProfile(false);
segmentsToPath();
return(true);
}
/// @return les segments de ce conducteur /// @return les segments de ce conducteur
const QList<ConductorSegment *> Conductor::segmentsList() const { const QList<ConductorSegment *> Conductor::segmentsList() const {
if (segments == NULL) return(QList<ConductorSegment *>()); if (segments == NULL) return(QList<ConductorSegment *>());
@@ -1231,6 +1225,7 @@ void Conductor::calculateTextItemPosition() {
QPointF text_item_pos = text_item -> pos(); QPointF text_item_pos = text_item -> pos();
QPainterPath near_shape = nearShape(); QPainterPath near_shape = nearShape();
if (!near_shape.contains(text_item_pos)) { if (!near_shape.contains(text_item_pos)) {
qDebug() << "trop loin";
text_item -> setPos(movePointIntoPolygon(text_item_pos, near_shape)); text_item -> setPos(movePointIntoPolygon(text_item_pos, near_shape));
} }
} else { } else {

View File

@@ -92,9 +92,15 @@ class Conductor : public QObject, public QGraphicsPathItem {
bool containsPoint(const QPointF &) const; bool containsPoint(const QPointF &) const;
QString text() const; QString text() const;
void setText(const QString &); void setText(const QString &);
static bool valideXml(QDomElement &);
bool fromXml(QDomElement &); public:
QDomElement toXml(QDomDocument &, QHash<Terminal *, int> &) const; static bool valideXml (QDomElement &);
bool fromXml (QDomElement &);
QDomElement toXml (QDomDocument &, QHash<Terminal *, int> &) const;
private:
bool pathFromXml(const QDomElement &);
public:
const QList<ConductorSegment *> segmentsList() const; const QList<ConductorSegment *> segmentsList() const;
void setProperties(const ConductorProperties &); void setProperties(const ConductorProperties &);
ConductorProperties properties() const; ConductorProperties properties() const;

View File

@@ -60,38 +60,36 @@ Conductor *ConductorTextItem::parentConductor() const {
} }
/** /**
Permet de lire le texte a mettre dans le champ a partir d'un element XML. * @brief ConductorTextItem::fromXml
Cette methode se base sur la position du champ pour assigner ou non la * Read the properties stored in the xml element given in parameter
valeur a ce champ. * @param e
@param e L'element XML representant le champ de texte */
*/
void ConductorTextItem::fromXml(const QDomElement &e) { void ConductorTextItem::fromXml(const QDomElement &e) {
setPlainText(e.attribute("text")); if (e.hasAttribute("userx")) {
setPos(e.attribute("userx").toDouble(),
qreal user_pos_x, user_pos_y; e.attribute("usery").toDouble());
if ( moved_by_user_ = true;
QET::attributeIsAReal(e, "userx", &user_pos_x) && }
QET::attributeIsAReal(e, "usery", &user_pos_y) if (e.hasAttribute("rotation")) {
) { setRotation(e.attribute("rotation").toDouble());
setPos(user_pos_x, user_pos_y); rotate_by_user_ = true;
} }
setRotationAngle(e.attribute("rotation").toDouble());
} }
/** /**
@param document Le document XML a utiliser * @brief ConductorTextItem::toXml
@return L'element XML representant ce champ de texte * Export the properties of this text in the attribute of the xml element given in parameter
*/ * The properties exported are position and rotation (only if moved or rotate by user)
QDomElement ConductorTextItem::toXml(QDomDocument &document) const { * @param xml
QDomElement result = document.createElement("input"); */
result.setAttribute("userx", QString("%1").arg(pos().x())); void ConductorTextItem::toXml(QDomElement &xml) const {
result.setAttribute("usery", QString("%1").arg(pos().y())); if (moved_by_user_) {
result.setAttribute("text", toPlainText()); xml.setAttribute("userx", QString("%1").arg(pos().x()));
if (rotationAngle()) { xml.setAttribute("usery", QString("%1").arg(pos().y()));
result.setAttribute("rotation", QString("%1").arg(rotationAngle())); }
if (rotate_by_user_) {
xml.setAttribute("rotation", QString("%1").arg(rotation()));
} }
return(result);
} }
/** /**

View File

@@ -42,7 +42,7 @@ class ConductorTextItem : public DiagramTextItem {
enum { Type = UserType + 1006 }; enum { Type = UserType + 1006 };
Conductor *parentConductor() const; Conductor *parentConductor() const;
virtual void fromXml(const QDomElement &); virtual void fromXml(const QDomElement &);
virtual QDomElement toXml(QDomDocument &) const; virtual void toXml (QDomElement &xml) const;
// methods // methods
public: public:

View File

@@ -79,6 +79,16 @@ Diagram *DiagramTextItem::diagram() const {
return(qobject_cast<Diagram *>(scene())); return(qobject_cast<Diagram *>(scene()));
} }
/**
* @brief DiagramTextItem::toXml
* This method do nothing and return an empty DomElement
* This is used to be inherited by child class
* @return
*/
QDomElement DiagramTextItem::toXml(QDomDocument &) const {
return QDomElement();
}
/** /**
@return l'angle de rotation actuel de ce texte @return l'angle de rotation actuel de ce texte
*/ */

View File

@@ -54,7 +54,7 @@ class DiagramTextItem : public QGraphicsTextItem {
virtual int type() const { return Type; } virtual int type() const { return Type; }
Diagram *diagram() const; Diagram *diagram() const;
virtual void fromXml(const QDomElement &) = 0; virtual void fromXml(const QDomElement &) = 0;
virtual QDomElement toXml(QDomDocument &) const = 0; virtual QDomElement toXml(QDomDocument &) const;
qreal rotationAngle() const; qreal rotationAngle() const;
void setRotationAngle(const qreal &); void setRotationAngle(const qreal &);
void rotateBy(const qreal &); void rotateBy(const qreal &);