Amelioration de la purge des parties non pertinentes a l'enregistrement dans l'editeur d'element.

Il n'est desormais plus possible d'ajouter plusieurs fois le meme objet Part* sur la scene.


git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@233 bfdf4180-ca20-0410-9c96-a3a8aa849046
This commit is contained in:
xavierqet 2007-12-15 21:57:00 +00:00
parent 675b7a53f9
commit 4fbac85316
20 changed files with 110 additions and 6 deletions

View File

@ -51,6 +51,7 @@ class CustomElementPart {
virtual QWidget *elementInformations() = 0;
virtual void setProperty(const QString &, const QVariant &) = 0;
virtual QVariant property(const QString &) = 0;
virtual bool isUseless() const = 0;
virtual QETElementEditor *elementEditor() const;
virtual ElementScene *elementScene() const;
virtual QUndoStack &undoStack() const;

View File

@ -232,20 +232,24 @@ void ElementScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) {
if (e -> button() & Qt::LeftButton) {
switch(behavior) {
case Line:
if (qgiManager().manages(current_line)) break;
undo_stack.push(new AddPartCommand(tr("ligne"), this, current_line));
emit(partsAdded());
break;
case Ellipse:
if (qgiManager().manages(current_ellipse)) break;
current_ellipse -> setRect(current_ellipse -> rect().normalized());
undo_stack.push(new AddPartCommand(tr("ellipse"), this, current_ellipse));
emit(partsAdded());
break;
case Arc:
if (qgiManager().manages(current_arc)) break;
current_arc-> setRect(current_arc -> rect().normalized());
undo_stack.push(new AddPartCommand(tr("arc"), this, current_arc));
emit(partsAdded());
break;
case Circle:
if (qgiManager().manages(current_circle)) break;
current_circle -> setRect(current_circle -> rect().normalized());
undo_stack.push(new AddPartCommand(tr("cercle"), this, current_circle));
emit(partsAdded());
@ -381,6 +385,7 @@ const QDomDocument ElementScene::toXml() const {
// description de l'element
foreach(QGraphicsItem *qgi, zItems(true)) {
if (CustomElementPart *ce = dynamic_cast<CustomElementPart *>(qgi)) {
if (ce -> isUseless()) continue;
description.appendChild(ce -> toXml(xml_document));
}
}

View File

@ -241,3 +241,13 @@ int PartArc::angle() const {
int PartArc::startAngle() const {
return(start_angle);
}
/**
@return true si cette partie n'est pas pertinente et ne merite pas d'etre
conservee / enregistree.
Un arc est pertinent des lors que ses dimensions et son etendue ne sont
pas nulles.
*/
bool PartArc::isUseless() const {
return(rect().isNull() || !angle());
}

View File

@ -54,6 +54,7 @@ class PartArc : public QGraphicsEllipseItem, public CustomElementGraphicPart {
virtual int startAngle() const;
virtual void setProperty(const QString &, const QVariant &);
virtual QVariant property(const QString &);
virtual bool isUseless() const;
protected:
QVariant itemChange(GraphicsItemChange, const QVariant &);

View File

@ -188,3 +188,12 @@ QRectF PartCircle::boundingRect() const {
r.adjust(-adjust, -adjust, adjust, adjust);
return(r);
}
/**
@return true si cette partie n'est pas pertinente et ne merite pas d'etre
conservee / enregistree.
Un cercle est pertinent des lors que son rayon n'est pas nul
*/
bool PartCircle::isUseless() const {
return(rect().isNull());
}

View File

@ -50,6 +50,7 @@ class PartCircle : public QGraphicsEllipseItem, public CustomElementGraphicPart
QPointF sceneCenter() const;
virtual void setProperty(const QString &, const QVariant &);
virtual QVariant property(const QString &);
virtual bool isUseless() const;
protected:
QVariant itemChange(GraphicsItemChange, const QVariant &);

View File

@ -178,3 +178,12 @@ QVariant PartEllipse::itemChange(GraphicsItemChange change, const QVariant &valu
QPointF PartEllipse::sceneTopLeft() const {
return(mapToScene(rect().topLeft()));
}
/**
@return true si cette partie n'est pas pertinente et ne merite pas d'etre
conservee / enregistree.
Une ellipse est pertinente des lors que ses dimensions ne sont pas nulles
*/
bool PartEllipse::isUseless() const {
return(rect().isNull());
}

View File

@ -48,6 +48,7 @@ class PartEllipse : public QGraphicsEllipseItem, public CustomElementGraphicPart
virtual QPointF sceneTopLeft() const;
virtual void setProperty(const QString &, const QVariant &);
virtual QVariant property(const QString &);
virtual bool isUseless() const;
protected:
QVariant itemChange(GraphicsItemChange, const QVariant &);

View File

@ -65,12 +65,6 @@ const QDomElement PartLine::toXml(QDomDocument &xml_document) const {
QPointF p1(sceneP1());
QPointF p2(sceneP2());
// cas particulier : on n'enregistre pas les lignes equivalentes a un point
if (p1 == p2) {
QDomElement *null_qdom_elmt = new QDomElement();
return(*null_qdom_elmt);
}
QDomElement xml_element = xml_document.createElement("line");
xml_element.setAttribute("x1", p1.x());
xml_element.setAttribute("y1", p1.y());
@ -248,3 +242,13 @@ QRectF PartLine::boundingRect() const {
r.adjust(-adjust, -adjust, adjust, adjust);
return(r);
}
/**
@return true si cette partie n'est pas pertinente et ne merite pas d'etre
conservee / enregistree.
Une ligne est pertinente des lors que ses deux points sont differents
*/
bool PartLine::isUseless() const {
return(sceneP1() == sceneP2());
}

View File

@ -51,6 +51,7 @@ class PartLine : public QGraphicsLineItem, public CustomElementGraphicPart {
virtual QRectF boundingRect() const;
virtual void setProperty(const QString &, const QVariant &);
virtual QVariant property(const QString &);
virtual bool isUseless() const;
protected:
QVariant itemChange(GraphicsItemChange, const QVariant &);

View File

@ -144,3 +144,22 @@ QVariant PartPolygon::itemChange(GraphicsItemChange change, const QVariant &valu
}
return(QGraphicsPolygonItem::itemChange(change, value));
}
/**
@return true si cette partie n'est pas pertinente et ne merite pas d'etre
conservee / enregistree.
Un polygone est pertinent des lors qu'il possede deux points differents.
*/
bool PartPolygon::isUseless() const {
QPolygonF poly(polygon());
if (polygon().count() < 2) return(true);
QPointF previous_point;
for (int i = 1 ; i < poly.count() ; ++ i) {
if (poly[i] != poly[i-1]) return(false);
}
return(true);
}

View File

@ -62,6 +62,7 @@ class PartPolygon : public QGraphicsPolygonItem, public CustomElementGraphicPart
bool isClosed() const;
void setProperty(const QString &, const QVariant &);
virtual QVariant property(const QString &);
virtual bool isUseless() const;
protected:
QVariant itemChange(GraphicsItemChange, const QVariant &);

View File

@ -216,3 +216,13 @@ void PartTerminal::updateSecondPoint() {
case QET::West : second_point = QPointF(ts, 0.0); break;
}
}
/**
@return true si cette partie n'est pas pertinente et ne merite pas d'etre
conservee / enregistree.
Une borne est toujours pertinente ; cette fonction renvoie donc
toujours false
*/
bool PartTerminal::isUseless() const {
return(false);
}

View File

@ -54,6 +54,7 @@ class PartTerminal : public CustomElementPart, public QGraphicsItem {
void setOrientation(QET::Orientation);
virtual void setProperty(const QString &, const QVariant &);
virtual QVariant property(const QString &);
virtual bool isUseless() const;
protected:
QVariant itemChange(GraphicsItemChange, const QVariant &);

View File

@ -207,3 +207,12 @@ QRectF PartText::boundingRect() const {
r.adjust(0.0, -2.0, 0.0, 0.0);
return(r);
}
/**
@return true si cette partie n'est pas pertinente et ne merite pas d'etre
conservee / enregistree.
Un texte statique n'est pas pertinent lorsque son texte est vide.
*/
bool PartText::isUseless() const {
return(toPlainText().isEmpty());
}

View File

@ -49,6 +49,7 @@ class PartText : public QGraphicsTextItem, public CustomElementPart {
void setPos(qreal, qreal);
virtual void setProperty(const QString &, const QVariant &);
virtual QVariant property(const QString &);
virtual bool isUseless() const;
protected:
virtual void focusOutEvent(QFocusEvent *);

View File

@ -231,3 +231,13 @@ QRectF PartTextField::boundingRect() const {
r.adjust(0.0, -2.0, 0.0, 0.0);
return(r);
}
/**
@return true si cette partie n'est pas pertinente et ne merite pas d'etre
conservee / enregistree.
Un champ de texte est toujours pertinent ; cette fonction renvoie donc
toujours false
*/
bool PartTextField::isUseless() const {
return(false);
}

View File

@ -55,6 +55,7 @@ class PartTextField : public QGraphicsTextItem, public CustomElementPart {
void setFollowParentRotations(bool);
virtual void setProperty(const QString &, const QVariant &);
virtual QVariant property(const QString &);
virtual bool isUseless() const;
protected:
virtual void focusOutEvent(QFocusEvent *);

View File

@ -91,3 +91,12 @@ void QGIManager::release(const QList<QGraphicsItem *> &qgis) {
void QGIManager::setDestroyQGIOnDelete(bool b) {
destroy_qgi_on_delete = b;
}
/**
Permet de savoir si ce QGIManager gere ou non un item donne
@param qgi QGraphicsItem dont il faut verifier la presence
@return true si l'item est gere, false sinon
*/
bool QGIManager::manages(QGraphicsItem *qgi) const {
return(qgi_manager.contains(qgi));
}

View File

@ -46,5 +46,6 @@ class QGIManager {
void manage(const QList<QGraphicsItem *> &);
void release(const QList<QGraphicsItem *> &);
void setDestroyQGIOnDelete(bool);
bool manages(QGraphicsItem *) const;
};
#endif