diff --git a/conducer.cpp b/conducer.cpp index 5ce36fd6c..b78aca825 100644 --- a/conducer.cpp +++ b/conducer.cpp @@ -42,6 +42,12 @@ Conducer::Conducer(Terminal *p1, Terminal* p2, Element *parent, QGraphicsScene * setFlags(QGraphicsItem::ItemIsSelectable); setAcceptsHoverEvents(true); previous_z_value = zValue(); + + // ajout du champ de texte editable + text_item = new QGraphicsTextItem(this, scene); + text_item -> setPlainText("_"); + text_item -> setTextInteractionFlags(Qt::TextEditorInteraction); + calculateTextItemPosition(); } /** @@ -58,6 +64,7 @@ void Conducer::update(const QRectF &rect) { terminal1 -> amarrageConducer(), terminal1 -> orientation(), terminal2 -> amarrageConducer(), terminal2 -> orientation() ); + calculateTextItemPosition(); QGraphicsPathItem::update(rect); } @@ -84,6 +91,7 @@ void Conducer::updateWithNewPos(const QRectF &rect, const Terminal *b, const QPo priv_modifieConducer(p1, terminal1 -> orientation(), p2, terminal2 -> orientation()); else priv_calculeConducer(p1, terminal1 -> orientation(), p2, terminal2 -> orientation()); + calculateTextItemPosition(); QGraphicsPathItem::update(rect); } @@ -480,6 +488,7 @@ void Conducer::mouseMoveEvent(QGraphicsSceneMouseEvent *e) { modified_path = true; updatePoints(); segmentsToPath(); + calculateTextItemPosition(); } } QGraphicsPathItem::mouseMoveEvent(e); @@ -495,6 +504,7 @@ void Conducer::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) { moving_segment = false; setZValue(previous_z_value); QGraphicsPathItem::mouseReleaseEvent(e); + calculateTextItemPosition(); } void Conducer::hoverMoveEvent(QGraphicsSceneHoverEvent *e) { @@ -671,6 +681,8 @@ bool Conducer::hasClickedOn(QPointF press_point, QPointF point) { } bool Conducer::fromXml(QDomElement &e) { + text_item -> setPlainText(e.attribute("num")); + // parcourt les elements XML "segment" et en extrait deux listes de longueurs // les segments non valides sont ignores QList segments_x, segments_y; @@ -743,6 +755,7 @@ QDomElement Conducer::toXml(QDomDocument &d, QHash &table_adr_i QDomElement e = d.createElement("conducteur"); e.setAttribute("borne1", table_adr_id.value(terminal1)); e.setAttribute("borne2", table_adr_id.value(terminal2)); + e.setAttribute("num", text_item -> toPlainText()); // on n'exporte les segments du conducteur que si ceux-ci ont // ete modifies par l'utilisateur @@ -764,3 +777,42 @@ QDomElement Conducer::toXml(QDomDocument &d, QHash &table_adr_i e.appendChild(current_segment); return(e); } + +/** + @return La longueur totale du conducteur +*/ +qreal Conducer::length() { + qreal length = 0.0; + + ConducerSegment *s = segments; + while (s -> hasNextSegment()) { + length += qAbs(s -> length()); + s = s -> nextSegment(); + } + + return(length); +} + +/** + @return Le segment qui contient le point au milieu du conducteur +*/ +ConducerSegment *Conducer::middleSegment() { + if (segments == NULL) return(NULL); + + qreal half_length = length() / 2.0; + + ConducerSegment *s = segments; + qreal l = 0; + + while (s -> hasNextSegment()) { + l += qAbs(s -> length()); + if (l >= half_length) break; + s = s -> nextSegment(); + } + // s est le segment qui contient le point au milieu du conducteur + return(s); +} + +void Conducer::calculateTextItemPosition() { + text_item -> setPos(middleSegment() -> middle()); +} diff --git a/conducer.h b/conducer.h index 0c85f14b5..1c113e935 100644 --- a/conducer.h +++ b/conducer.h @@ -21,6 +21,8 @@ void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *); QRectF boundingRect() const; virtual QPainterPath shape() const; + qreal length(); + ConducerSegment *middleSegment(); static bool valideXml(QDomElement &); bool fromXml(QDomElement &); QDomElement toXml(QDomDocument &, QHash &) const; @@ -39,6 +41,7 @@ private: /// booleen indiquant si le fil est encore valide bool destroyed; + QGraphicsTextItem *text_item; ConducerSegment *segments; QList moves_x; QList moves_y; @@ -65,6 +68,7 @@ QList segmentsToPoints() const; void pointsToSegments(QList); bool hasClickedOn(QPointF, QPointF); + void calculateTextItemPosition(); static QPointF extendTerminal(const QPointF &, Terminal::Orientation, qreal = 12.0); static bool surLeMemeAxe(Terminal::Orientation, Terminal::Orientation); static bool estHorizontale(Terminal::Orientation a);