From 04222b3f8933a072acda1d5d92eff212dec40ca2 Mon Sep 17 00:00:00 2001 From: xavier Date: Thu, 18 Feb 2010 00:17:34 +0000 Subject: [PATCH] Optimisation de l'editeur d'element. L'organisation interne de l'editeur d'element a ete completement revue. Auparavant, chaque primitive instanciait son propre widget d'edition et le gardait durant toute sa duree de vie, entrainant ainsi une consommation memoire et un temps de chargement importants. Desormais, l'editeur instancie des son demarrage 9 widgets d'edition qu'il conserve durant toute sa duree de vie. Il choisit alors lequel afficher en fonction des primitives selectionnees. git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@855 bfdf4180-ca20-0410-9c96-a3a8aa849046 --- sources/editor/arceditor.cpp | 63 ++++++++++++--- sources/editor/arceditor.h | 10 ++- sources/editor/circleeditor.cpp | 49 +++++++++++- sources/editor/circleeditor.h | 8 +- sources/editor/customelementgraphicpart.cpp | 13 --- sources/editor/customelementgraphicpart.h | 8 -- sources/editor/customelementpart.cpp | 10 +++ sources/editor/customelementpart.h | 9 ++- sources/editor/elementitemeditor.cpp | 19 ++++- sources/editor/elementitemeditor.h | 4 + sources/editor/ellipseeditor.cpp | 49 +++++++++++- sources/editor/ellipseeditor.h | 10 ++- sources/editor/lineeditor.cpp | 43 +++++++++- sources/editor/lineeditor.h | 10 ++- sources/editor/partarc.cpp | 9 +-- sources/editor/partarc.h | 3 +- sources/editor/partcircle.cpp | 9 +-- sources/editor/partcircle.h | 6 +- sources/editor/partellipse.cpp | 9 +-- sources/editor/partellipse.h | 6 +- sources/editor/partline.cpp | 9 +-- sources/editor/partline.h | 3 +- sources/editor/partpolygon.cpp | 9 +-- sources/editor/partpolygon.h | 15 +--- sources/editor/partrectangle.cpp | 9 +-- sources/editor/partrectangle.h | 6 +- sources/editor/partterminal.cpp | 19 +---- sources/editor/partterminal.h | 5 +- sources/editor/parttext.cpp | 13 +-- sources/editor/parttext.h | 5 +- sources/editor/parttextfield.cpp | 13 +-- sources/editor/parttextfield.h | 3 +- sources/editor/polygoneditor.cpp | 40 +++++++++- sources/editor/polygoneditor.h | 8 +- sources/editor/qetelementeditor.cpp | 88 ++++++++++++++++----- sources/editor/qetelementeditor.h | 4 + sources/editor/rectangleeditor.cpp | 48 ++++++++++- sources/editor/rectangleeditor.h | 10 ++- sources/editor/styleeditor.cpp | 38 +++++++-- sources/editor/styleeditor.h | 7 +- sources/editor/terminaleditor.cpp | 38 ++++++++- sources/editor/terminaleditor.h | 6 +- sources/editor/texteditor.cpp | 38 ++++++++- sources/editor/texteditor.h | 6 +- sources/editor/textfieldeditor.cpp | 38 ++++++++- sources/editor/textfieldeditor.h | 6 +- 46 files changed, 605 insertions(+), 226 deletions(-) diff --git a/sources/editor/arceditor.cpp b/sources/editor/arceditor.cpp index b4c63f009..2b86a0830 100644 --- a/sources/editor/arceditor.cpp +++ b/sources/editor/arceditor.cpp @@ -16,6 +16,7 @@ along with QElectroTech. If not, see . */ #include "arceditor.h" +#include "styleeditor.h" #include "partarc.h" /** @@ -24,10 +25,11 @@ @param arc L'arc a editer @param parent le Widget parent */ -ArcEditor::ArcEditor(QETElementEditor *editor, PartArc *arc, QWidget *parent) : ElementItemEditor(editor, parent) { - - part = arc; - +ArcEditor::ArcEditor(QETElementEditor *editor, PartArc *arc, QWidget *parent) : + ElementItemEditor(editor, parent), + part(arc) +{ + style_ = new StyleEditor(editor); x = new QLineEdit(); y = new QLineEdit(); h = new QLineEdit(); @@ -42,7 +44,9 @@ ArcEditor::ArcEditor(QETElementEditor *editor, PartArc *arc, QWidget *parent) : h -> setValidator(new QDoubleValidator(h)); v -> setValidator(new QDoubleValidator(v)); - QGridLayout *grid = new QGridLayout(this); + QVBoxLayout *v_layout = new QVBoxLayout(this); + + QGridLayout *grid = new QGridLayout(); grid -> addWidget(new QLabel(tr("Centre : ")), 0, 0); grid -> addWidget(new QLabel("x"), 1, 0); grid -> addWidget(x, 1, 1); @@ -57,6 +61,10 @@ ArcEditor::ArcEditor(QETElementEditor *editor, PartArc *arc, QWidget *parent) : grid -> addWidget(start_angle, 5, 1); grid -> addWidget(new QLabel(tr("Angle :")), 6, 0); grid -> addWidget(angle, 6, 1); + + v_layout -> addWidget(style_); + v_layout -> addLayout(grid); + updateForm(); activeConnections(true); @@ -66,16 +74,48 @@ ArcEditor::ArcEditor(QETElementEditor *editor, PartArc *arc, QWidget *parent) : ArcEditor::~ArcEditor() { } +/** + Permet de specifier a cet editeur quelle primitive il doit editer. A noter + qu'un editeur peut accepter ou refuser d'editer une primitive. + L'editeur d'arc acceptera d'editer la primitive new_part s'il s'agit d'un + objet de la classe PartArc. + @param new_part Nouvelle primitive a editer + @return true si l'editeur a accepter d'editer la primitive, false sinon +*/ +bool ArcEditor::setPart(CustomElementPart *new_part) { + if (!new_part) { + part = 0; + style_ -> setPart(0); + return(true); + } + if (PartArc *part_arc = dynamic_cast(new_part)) { + part = part_arc; + style_ -> setPart(part); + updateForm(); + return(true); + } else { + return(false); + } +} + +/** + @return la primitive actuellement editee, ou 0 si ce widget n'en edite pas +*/ +CustomElementPart *ArcEditor::currentPart() const { + return(part); +} + /** Met a jour l'arc a partir a partir des donnees du formulaire */ void ArcEditor::updateArc() { - part -> setProperty("x", x -> text().toDouble()); - part -> setProperty("y", y -> text().toDouble()); - part -> setProperty("diameter_h", h -> text().toDouble()); - part -> setProperty("diameter_v", v -> text().toDouble()); - part -> setStartAngle(-start_angle -> value() + 90); - part -> setAngle(-angle -> value()); + if (!part) return; + part -> setProperty("x", x -> text().toDouble()); + part -> setProperty("y", y -> text().toDouble()); + part -> setProperty("diameter_h", h -> text().toDouble()); + part -> setProperty("diameter_v", v -> text().toDouble()); + part -> setProperty("start_angle", -start_angle -> value() + 90); + part -> setProperty("angle", -angle -> value()); } /// Met a jour l'abscisse du centre de l'arc et cree un objet d'annulation @@ -95,6 +135,7 @@ void ArcEditor::updateArcA() { addChangePartCommand(tr("angle"), Met a jour le formulaire d'edition */ void ArcEditor::updateForm() { + if (!part) return; activeConnections(false); x -> setText(part -> property("x").toString()); y -> setText(part -> property("y").toString()); diff --git a/sources/editor/arceditor.h b/sources/editor/arceditor.h index 51c4793e4..3f041decf 100644 --- a/sources/editor/arceditor.h +++ b/sources/editor/arceditor.h @@ -20,6 +20,7 @@ #include #include "elementitemeditor.h" class PartArc; +class StyleEditor; /** Cette classe represente le widget d'edition d'un arc dans l'editeur d'element. @@ -28,18 +29,23 @@ class ArcEditor : public ElementItemEditor { Q_OBJECT //constructeurs, destructeur public: - ArcEditor(QETElementEditor *, PartArc *, QWidget * = 0); - ~ArcEditor(); + ArcEditor(QETElementEditor *, PartArc * = 0, QWidget * = 0); + virtual ~ArcEditor(); private: ArcEditor(const ArcEditor &); // attributs private: PartArc *part; + StyleEditor *style_; QLineEdit *x, *y, *h, *v; QSpinBox *angle, *start_angle; // methodes + public: + virtual bool setPart(CustomElementPart *); + virtual CustomElementPart *currentPart() const; + public slots: void updateArc(); void updateArcX(); diff --git a/sources/editor/circleeditor.cpp b/sources/editor/circleeditor.cpp index 37ea72038..481da39f2 100644 --- a/sources/editor/circleeditor.cpp +++ b/sources/editor/circleeditor.cpp @@ -16,6 +16,7 @@ along with QElectroTech. If not, see . */ #include "circleeditor.h" +#include "styleeditor.h" #include "partcircle.h" /** @@ -24,9 +25,11 @@ @param circle Le cercle a editer @param parent le Widget parent */ -CircleEditor::CircleEditor(QETElementEditor *editor, PartCircle *circle, QWidget *parent) : ElementItemEditor(editor, parent) { - - part = circle; +CircleEditor::CircleEditor(QETElementEditor *editor, PartCircle *circle, QWidget *parent) : + ElementItemEditor(editor, parent), + part(circle) +{ + style_ = new StyleEditor(editor); x = new QLineEdit(); y = new QLineEdit(); @@ -36,7 +39,9 @@ CircleEditor::CircleEditor(QETElementEditor *editor, PartCircle *circle, QWidget y -> setValidator(new QDoubleValidator(y)); r -> setValidator(new QDoubleValidator(r)); - QGridLayout *grid = new QGridLayout(this); + QVBoxLayout *v_layout = new QVBoxLayout(this); + + QGridLayout *grid = new QGridLayout(); grid -> addWidget(new QLabel(tr("Centre : ")), 0, 0); grid -> addWidget(new QLabel("x"), 1, 0); grid -> addWidget(x, 1, 1); @@ -45,6 +50,9 @@ CircleEditor::CircleEditor(QETElementEditor *editor, PartCircle *circle, QWidget grid -> addWidget(new QLabel(tr("Diam\350tre : ")), 2, 0); grid -> addWidget(r, 2, 1); + v_layout -> addWidget(style_); + v_layout -> addLayout(grid); + activeConnections(true); updateForm(); } @@ -53,10 +61,42 @@ CircleEditor::CircleEditor(QETElementEditor *editor, PartCircle *circle, QWidget CircleEditor::~CircleEditor() { } +/** + Permet de specifier a cet editeur quelle primitive il doit editer. A noter + qu'un editeur peut accepter ou refuser d'editer une primitive. + L'editeur de cercle acceptera d'editer la primitive new_part s'il s'agit + d'un objet de la classe PartCircle. + @param new_part Nouvelle primitive a editer + @return true si l'editeur a accepter d'editer la primitive, false sinon +*/ +bool CircleEditor::setPart(CustomElementPart *new_part) { + if (!new_part) { + part = 0; + style_ -> setPart(0); + return(true); + } + if (PartCircle *part_circle = dynamic_cast(new_part)) { + part = part_circle; + style_ -> setPart(part); + updateForm(); + return(true); + } else { + return(false); + } +} + +/** + @return la primitive actuellement editee, ou 0 si ce widget n'en edite pas +*/ +CustomElementPart *CircleEditor::currentPart() const { + return(part); +} + /** met a jour le cercle a partir des donnees du formulaire */ void CircleEditor::updateCircle() { + if (!part) return; part -> setProperty("x", x -> text().toDouble()); part -> setProperty("y", y -> text().toDouble()); part -> setProperty("diameter", r -> text().toDouble()); @@ -75,6 +115,7 @@ void CircleEditor::updateCircleD() { addChangePartCommand(tr("diam\350tre"), par Met a jour le formulaire d'edition */ void CircleEditor::updateForm() { + if (!part) return; activeConnections(false); x -> setText(part -> property("x").toString()); y -> setText(part -> property("y").toString()); diff --git a/sources/editor/circleeditor.h b/sources/editor/circleeditor.h index c229339bb..9a7f8d329 100644 --- a/sources/editor/circleeditor.h +++ b/sources/editor/circleeditor.h @@ -20,6 +20,7 @@ #include #include "elementitemeditor.h" class PartCircle; +class StyleEditor; /** Cette classe represente un editeur de cercle. Elle permet d'editer a travers une interface graphique les @@ -29,7 +30,7 @@ class CircleEditor : public ElementItemEditor { Q_OBJECT // Constructeurs, destructeur public: - CircleEditor(QETElementEditor *, PartCircle *, QWidget * = 0); + CircleEditor(QETElementEditor *, PartCircle * = 0, QWidget * = 0); virtual ~CircleEditor(); private: CircleEditor(const CircleEditor &); @@ -37,9 +38,14 @@ class CircleEditor : public ElementItemEditor { // attributs private: PartCircle *part; + StyleEditor *style_; QLineEdit *x, *y, *r; // methodes + public: + virtual bool setPart(CustomElementPart *); + virtual CustomElementPart *currentPart() const; + public slots: void updateCircle(); void updateCircleX(); diff --git a/sources/editor/customelementgraphicpart.cpp b/sources/editor/customelementgraphicpart.cpp index a26e3a6a3..f912b4e1a 100644 --- a/sources/editor/customelementgraphicpart.cpp +++ b/sources/editor/customelementgraphicpart.cpp @@ -83,9 +83,6 @@ void CustomElementGraphicPart::stylesFromXml(const QDomElement &qde) { // recupere l'antialiasing _antialiased = qde.attribute("antialias") == "true"; - - // met a jour l'editeur de style - style_editor -> updateForm(); } /** @@ -142,13 +139,6 @@ void CustomElementGraphicPart::applyStylesToQPainter(QPainter &painter) const { painter.setBrush(brush); } -/** - @return Le widget permettant d'editer les styles -*/ -QWidget *CustomElementGraphicPart::elementInformations() { - return(style_editor); -} - /** Specifie la valeur d'une propriete de style donnee. @param property propriete a modifier. Valeurs acceptees : @@ -177,9 +167,6 @@ void CustomElementGraphicPart::setProperty(const QString &property, const QVaria setAntialiased(value.toBool()); change_made = true; } - if (change_made) { - style_editor -> updateForm(); - } } /** diff --git a/sources/editor/customelementgraphicpart.h b/sources/editor/customelementgraphicpart.h index 05dd1e19e..7935bb988 100644 --- a/sources/editor/customelementgraphicpart.h +++ b/sources/editor/customelementgraphicpart.h @@ -69,13 +69,10 @@ class CustomElementGraphicPart : public CustomElementPart { _color(BlackColor), _antialiased(false) { - style_editor = new StyleEditor(elementEditor(), this); }; /// Destructeur virtual ~CustomElementGraphicPart() { - if (style_editor -> parentWidget()) return; // l'editeur de style sera supprime par son parent - delete style_editor; }; // attributs @@ -86,10 +83,6 @@ class CustomElementGraphicPart : public CustomElementPart { Color _color; bool _antialiased; - protected: - /// Widget d'edition des styles de cette partie graphique - StyleEditor *style_editor; - //methodes public: void setLineStyle(LineStyle); @@ -104,7 +97,6 @@ class CustomElementGraphicPart : public CustomElementPart { Color color() const; bool antialiased() const; - QWidget *elementInformations(); void setProperty(const QString &, const QVariant &); QVariant property(const QString &); diff --git a/sources/editor/customelementpart.cpp b/sources/editor/customelementpart.cpp index 2c393ba5b..f07c9347f 100644 --- a/sources/editor/customelementpart.cpp +++ b/sources/editor/customelementpart.cpp @@ -24,6 +24,16 @@ QETElementEditor *CustomElementPart::elementEditor() const { return(element_editor); } +/** + Appelle le slot updateCurrentPartEditor de l'editeur + @see QETElementEditor::updateCurrentPartEditor() +*/ +void CustomElementPart::updateCurrentPartEditor() const { + if (element_editor) { + element_editor -> updateCurrentPartEditor(); + } +} + /// @return l'ElementScene contenant les parties editees par cet editeur ElementScene *CustomElementPart::elementScene() const { return(element_editor -> elementScene()); diff --git a/sources/editor/customelementpart.h b/sources/editor/customelementpart.h index 9f9e09ad5..00ac395a1 100644 --- a/sources/editor/customelementpart.h +++ b/sources/editor/customelementpart.h @@ -59,8 +59,6 @@ class CustomElementPart { Enregistre la partie dans un document XML */ virtual const QDomElement toXml(QDomDocument &) const = 0; - /// @return un widget suppose decrire et/ou permettre de modifier la partie - virtual QWidget *elementInformations() = 0; /** Permet de modifier une des proprietes de la partie */ @@ -77,11 +75,18 @@ class CustomElementPart { virtual bool isUseless() const = 0; /// @return un pointeur vers l'editeur d'element parent virtual QETElementEditor *elementEditor() const; + /** + Appelle le slot updateCurrentPartEditor de l'editeur + @see QETElementEditor::updateCurrentPartEditor() + */ + virtual void updateCurrentPartEditor() const; /// @return un pointeur vers la scene d'edition parente virtual ElementScene *elementScene() const; /// @return la pile d'annulations a utiliser virtual QUndoStack &undoStack() const; /// @return le nom de la partie virtual QString name() const = 0; + /// @return le nom qui sera utilise pour nommer l'element XML lors de l'export + virtual QString xmlName() const = 0; }; #endif diff --git a/sources/editor/elementitemeditor.cpp b/sources/editor/elementitemeditor.cpp index 1f3aa623a..0675928dc 100644 --- a/sources/editor/elementitemeditor.cpp +++ b/sources/editor/elementitemeditor.cpp @@ -47,15 +47,23 @@ QUndoStack &ElementItemEditor::undoStack() const { /** Ajoute une ChangePartCommand a l'UndoStack. L'ancienne valeur sera - automatiquement recuperee. + automatiquement recuperee. A noter que cette methode ne fait rien si + l'ancienne valeur et la nouvelle sont egales ou encore si part vaut 0 @param desc nom de la propriete modifiee @param part partie modifiee @param prop propriete modifiee @param new_v nouvelle valeur */ void ElementItemEditor::addChangePartCommand(const QString &desc, CustomElementPart *part, const QString &prop, const QVariant &new_v) { + // ne fait rien si part vaut 0 + if (!part) return; + + // recupere l'ancienne valeur QVariant old_v = part -> property(prop); + + // ne fait rien si l'ancienne valeur et la nouvelle sont egales if (old_v == new_v) return; + undoStack().push( new ChangePartCommand( desc + " " + element_type_name, @@ -76,3 +84,12 @@ QString ElementItemEditor::elementTypeName() const { void ElementItemEditor::setElementTypeName(const QString &name) { element_type_name = name; } + +/** + Detache l'editeur de la primitive qu'il edite. + Equivaut a setPart(0) + @see setPart +*/ +void ElementItemEditor::detach() { + setPart(0); +} diff --git a/sources/editor/elementitemeditor.h b/sources/editor/elementitemeditor.h index 6d7bb4ac2..c77cada0f 100644 --- a/sources/editor/elementitemeditor.h +++ b/sources/editor/elementitemeditor.h @@ -44,6 +44,10 @@ class ElementItemEditor : public QWidget { virtual void addChangePartCommand(const QString &, CustomElementPart *, const QString &, const QVariant &); virtual QString elementTypeName() const; virtual void setElementTypeName(const QString &); + virtual void detach(); + virtual bool setPart(CustomElementPart *) = 0; + virtual CustomElementPart *currentPart() const = 0; + virtual void updateForm() = 0; // attributs private: diff --git a/sources/editor/ellipseeditor.cpp b/sources/editor/ellipseeditor.cpp index 6c77a43de..e6c8d401e 100644 --- a/sources/editor/ellipseeditor.cpp +++ b/sources/editor/ellipseeditor.cpp @@ -16,6 +16,7 @@ along with QElectroTech. If not, see . */ #include "ellipseeditor.h" +#include "styleeditor.h" #include "partellipse.h" /** @@ -24,9 +25,11 @@ @param ellipse L'ellipse a editer @param parent le Widget parent */ -EllipseEditor::EllipseEditor(QETElementEditor *editor, PartEllipse *ellipse, QWidget *parent) : ElementItemEditor(editor, parent) { - - part = ellipse; +EllipseEditor::EllipseEditor(QETElementEditor *editor, PartEllipse *ellipse, QWidget *parent) : + ElementItemEditor(editor, parent), + part(ellipse) +{ + style_ = new StyleEditor(editor); x = new QLineEdit(); y = new QLineEdit(); @@ -38,7 +41,9 @@ EllipseEditor::EllipseEditor(QETElementEditor *editor, PartEllipse *ellipse, QWi h -> setValidator(new QDoubleValidator(h)); v -> setValidator(new QDoubleValidator(v)); - QGridLayout *grid = new QGridLayout(this); + QVBoxLayout *v_layout = new QVBoxLayout(this); + + QGridLayout *grid = new QGridLayout(); grid -> addWidget(new QLabel(tr("Centre : ")), 0, 0); grid -> addWidget(new QLabel("x"), 1, 0); grid -> addWidget(x, 1, 1); @@ -50,6 +55,9 @@ EllipseEditor::EllipseEditor(QETElementEditor *editor, PartEllipse *ellipse, QWi grid -> addWidget(new QLabel(tr("vertical :")), 4, 0); grid -> addWidget(v, 4, 1); + v_layout -> addWidget(style_); + v_layout -> addLayout(grid); + activeConnections(true); updateForm(); } @@ -58,10 +66,42 @@ EllipseEditor::EllipseEditor(QETElementEditor *editor, PartEllipse *ellipse, QWi EllipseEditor::~EllipseEditor() { } +/** + Permet de specifier a cet editeur quelle primitive il doit editer. A noter + qu'un editeur peut accepter ou refuser d'editer une primitive. + L'editeur d'ellipse acceptera d'editer la primitive new_part s'il s'agit + d'un objet de la classe PartEllipse. + @param new_part Nouvelle primitive a editer + @return true si l'editeur a accepter d'editer la primitive, false sinon +*/ +bool EllipseEditor::setPart(CustomElementPart *new_part) { + if (!new_part) { + part = 0; + style_ -> setPart(0); + return(true); + } + if (PartEllipse *part_ellipse = dynamic_cast(new_part)) { + part = part_ellipse; + style_ -> setPart(part); + updateForm(); + return(true); + } else { + return(false); + } +} + +/** + @return la primitive actuellement editee, ou 0 si ce widget n'en edite pas +*/ +CustomElementPart *EllipseEditor::currentPart() const { + return(part); +} + /** Met a jour l'ellipse a partir des donnees du formulaire */ void EllipseEditor::updateEllipse() { + if (!part) return; part -> setProperty("x", x -> text().toDouble()); part -> setProperty("y", y -> text().toDouble()); part -> setProperty("diameter_h", h -> text().toDouble()); @@ -81,6 +121,7 @@ void EllipseEditor::updateEllipseV() { addChangePartCommand(tr("diam\350tre vert Met a jour le formulaire d'edition */ void EllipseEditor::updateForm() { + if (!part) return; activeConnections(false); x -> setText(part -> property("x").toString()); y -> setText(part -> property("y").toString()); diff --git a/sources/editor/ellipseeditor.h b/sources/editor/ellipseeditor.h index fac4d3fea..db3fe967f 100644 --- a/sources/editor/ellipseeditor.h +++ b/sources/editor/ellipseeditor.h @@ -20,6 +20,7 @@ #include #include "elementitemeditor.h" class PartEllipse; +class StyleEditor; /** Cette classe represente le widget d'edition d'une ellipse dans l'editeur d'element. @@ -28,17 +29,22 @@ class EllipseEditor : public ElementItemEditor { Q_OBJECT //constructeurs, destructeur public: - EllipseEditor(QETElementEditor *, PartEllipse *, QWidget * = 0); - ~EllipseEditor(); + EllipseEditor(QETElementEditor *, PartEllipse * = 0, QWidget * = 0); + virtual ~EllipseEditor(); private: EllipseEditor(const EllipseEditor &); // attributs private: PartEllipse *part; + StyleEditor *style_; QLineEdit *x, *y, *h, *v; // methodes + public: + virtual bool setPart(CustomElementPart *); + virtual CustomElementPart *currentPart() const; + public slots: void updateEllipse(); void updateEllipseX(); diff --git a/sources/editor/lineeditor.cpp b/sources/editor/lineeditor.cpp index 566ded692..6e95105f4 100644 --- a/sources/editor/lineeditor.cpp +++ b/sources/editor/lineeditor.cpp @@ -16,6 +16,7 @@ along with QElectroTech. If not, see . */ #include "lineeditor.h" +#include "styleeditor.h" #include "partline.h" #include "qet.h" #include "qeticons.h" @@ -26,9 +27,11 @@ @param line La ligne a editer @param parent le Widget parent */ -LineEditor::LineEditor(QETElementEditor *editor, PartLine *line, QWidget *parent) : ElementItemEditor(editor, parent) { - - part = line; +LineEditor::LineEditor(QETElementEditor *editor, PartLine *line, QWidget *parent) : + ElementItemEditor(editor, parent), + part(line) +{ + style_ = new StyleEditor(editor); x1 = new QLineEdit(); y1 = new QLineEdit(); @@ -78,6 +81,7 @@ LineEditor::LineEditor(QETElementEditor *editor, PartLine *line, QWidget *parent grid2 -> addWidget(end2_length, 1, 2); QVBoxLayout *v_layout = new QVBoxLayout(this); + v_layout -> addWidget(style_); v_layout -> addLayout(grid); v_layout -> addLayout(grid2); updateForm(); @@ -87,10 +91,42 @@ LineEditor::LineEditor(QETElementEditor *editor, PartLine *line, QWidget *parent LineEditor::~LineEditor() { } +/** + Permet de specifier a cet editeur quelle primitive il doit editer. A noter + qu'un editeur peut accepter ou refuser d'editer une primitive. + L'editeur de ligne acceptera d'editer la primitive new_part s'il s'agit d'un + objet de la classe PartLine. + @param new_part Nouvelle primitive a editer + @return true si l'editeur a accepter d'editer la primitive, false sinon +*/ +bool LineEditor::setPart(CustomElementPart *new_part) { + if (!new_part) { + part = 0; + style_ -> setPart(0); + return(true); + } + if (PartLine *part_line = dynamic_cast(new_part)) { + part = part_line; + style_ -> setPart(part); + updateForm(); + return(true); + } else { + return(false); + } +} + +/** + @return la primitive actuellement editee, ou 0 si ce widget n'en edite pas +*/ +CustomElementPart *LineEditor::currentPart() const { + return(part); +} + /** Met a jour la ligne a partir des donnees du formulaire */ void LineEditor::updateLine() { + if (!part) return; part -> setFirstEndType(static_cast(end1_type -> currentIndex())); part -> setFirstEndLength(end1_length -> text().toDouble()); part -> setSecondEndType(static_cast(end2_type -> currentIndex())); @@ -130,6 +166,7 @@ void LineEditor::updateLineEndLength2() { addChangePartCommand(tr("longueur fin Met a jour le formulaire d'edition */ void LineEditor::updateForm() { + if (!part) return; activeConnections(false); QPointF p1(part -> sceneP1()); QPointF p2(part -> sceneP2()); diff --git a/sources/editor/lineeditor.h b/sources/editor/lineeditor.h index 81cc31897..aa7d87859 100644 --- a/sources/editor/lineeditor.h +++ b/sources/editor/lineeditor.h @@ -20,6 +20,7 @@ #include #include "elementitemeditor.h" class PartLine; +class StyleEditor; /** Cette classe represente le widget d'edition d'une ligne dans l'editeur d'element. @@ -28,19 +29,24 @@ class LineEditor : public ElementItemEditor { Q_OBJECT //constructeurs, destructeur public: - LineEditor(QETElementEditor *, PartLine *, QWidget * = 0); - ~LineEditor(); + LineEditor(QETElementEditor *, PartLine * = 0, QWidget * = 0); + virtual ~LineEditor(); private: LineEditor(const LineEditor &); // attributs private: PartLine *part; + StyleEditor *style_; QLineEdit *x1, *y1, *x2, *y2; QComboBox *end1_type, *end2_type; QLineEdit *end1_length, *end2_length; // methodes + public: + virtual bool setPart(CustomElementPart *); + virtual CustomElementPart *currentPart() const; + public slots: void updateLine(); void updateLineX1(); diff --git a/sources/editor/partarc.cpp b/sources/editor/partarc.cpp index 1b39fe3d3..4ff53ba1d 100644 --- a/sources/editor/partarc.cpp +++ b/sources/editor/partarc.cpp @@ -16,7 +16,6 @@ along with QElectroTech. If not, see . */ #include "partarc.h" -#include "arceditor.h" /** Constructeur @@ -35,10 +34,6 @@ PartArc::PartArc(QETElementEditor *editor, QGraphicsItem *parent, QGraphicsScene setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); #endif setAcceptedMouseButtons(Qt::LeftButton); - informations = new ArcEditor(elementEditor(), this); - informations -> setElementTypeName(name()); - style_editor -> appendWidget(informations); - style_editor -> setElementTypeName(name()); } /// Destructeur @@ -209,8 +204,8 @@ QVariant PartArc::property(const QString &property) { */ QVariant PartArc::itemChange(GraphicsItemChange change, const QVariant &value) { if (scene()) { - if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemSelectedChange) { - informations -> updateForm(); + if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemPositionHasChanged) { + updateCurrentPartEditor(); } } return(QGraphicsEllipseItem::itemChange(change, value)); diff --git a/sources/editor/partarc.h b/sources/editor/partarc.h index 71343a10f..20385cd7b 100644 --- a/sources/editor/partarc.h +++ b/sources/editor/partarc.h @@ -19,7 +19,6 @@ #define PART_ARC_H #include #include "customelementgraphicpart.h" -class ArcEditor; /** Cette classe represente un arc pouvant etre utilise pour composer le dessin d'un element dans l'editeur d'element. @@ -35,7 +34,6 @@ class PartArc : public QGraphicsEllipseItem, public CustomElementGraphicPart { // attributs private: - ArcEditor *informations; int _angle; int start_angle; @@ -49,6 +47,7 @@ class PartArc : public QGraphicsEllipseItem, public CustomElementGraphicPart { virtual int type() const { return Type; } virtual void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget * = 0); virtual QString name() const { return(QObject::tr("arc", "element part name")); } + virtual QString xmlName() const { return(QString("arc")); } virtual const QDomElement toXml(QDomDocument &) const; virtual void fromXml(const QDomElement &); virtual QPointF sceneTopLeft() const; diff --git a/sources/editor/partcircle.cpp b/sources/editor/partcircle.cpp index b8831b8a0..c25a9c30c 100644 --- a/sources/editor/partcircle.cpp +++ b/sources/editor/partcircle.cpp @@ -16,7 +16,6 @@ along with QElectroTech. If not, see . */ #include "partcircle.h" -#include "circleeditor.h" /** Constructeur @@ -30,10 +29,6 @@ PartCircle::PartCircle(QETElementEditor *editor, QGraphicsItem *parent, QGraphic setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); #endif setAcceptedMouseButtons(Qt::LeftButton); - informations = new CircleEditor(elementEditor(), this); - informations -> setElementTypeName(name()); - style_editor -> appendWidget(informations); - style_editor -> setElementTypeName(name()); } /// Destructeur @@ -163,8 +158,8 @@ QVariant PartCircle::property(const QString &property) { */ QVariant PartCircle::itemChange(GraphicsItemChange change, const QVariant &value) { if (scene()) { - if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemSelectedChange) { - informations -> updateForm(); + if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemPositionHasChanged) { + updateCurrentPartEditor(); } } return(QGraphicsEllipseItem::itemChange(change, value)); diff --git a/sources/editor/partcircle.h b/sources/editor/partcircle.h index 8e6cb97aa..6f8e54186 100644 --- a/sources/editor/partcircle.h +++ b/sources/editor/partcircle.h @@ -19,7 +19,6 @@ #define PART_CIRCLE_H #include #include "customelementgraphicpart.h" -class CircleEditor; /** Cette classe represente un cercle pouvant etre utilise pour composer le dessin d'un element dans l'editeur d'element. @@ -33,10 +32,6 @@ class PartCircle : public QGraphicsEllipseItem, public CustomElementGraphicPart private: PartCircle(const PartCircle &); - // attributs - private: - CircleEditor *informations; - // methodes public: enum { Type = UserType + 1102 }; @@ -47,6 +42,7 @@ class PartCircle : public QGraphicsEllipseItem, public CustomElementGraphicPart virtual int type() const { return Type; } virtual void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget * = 0); virtual QString name() const { return(QObject::tr("cercle", "element part name")); } + virtual QString xmlName() const { return(QString("circle")); } virtual const QDomElement toXml(QDomDocument &) const; virtual void fromXml(const QDomElement &); virtual QPointF sceneTopLeft() const; diff --git a/sources/editor/partellipse.cpp b/sources/editor/partellipse.cpp index 5e535437e..fa380cecd 100644 --- a/sources/editor/partellipse.cpp +++ b/sources/editor/partellipse.cpp @@ -16,7 +16,6 @@ along with QElectroTech. If not, see . */ #include "partellipse.h" -#include "ellipseeditor.h" /** Constructeur @@ -30,10 +29,6 @@ PartEllipse::PartEllipse(QETElementEditor *editor, QGraphicsItem *parent, QGraph setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); #endif setAcceptedMouseButtons(Qt::LeftButton); - informations = new EllipseEditor(elementEditor(), this); - informations -> setElementTypeName(name()); - style_editor -> appendWidget(informations); - style_editor -> setElementTypeName(name()); } /// Destructeur @@ -170,8 +165,8 @@ QVariant PartEllipse::property(const QString &property) { */ QVariant PartEllipse::itemChange(GraphicsItemChange change, const QVariant &value) { if (scene()) { - if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemSelectedChange) { - informations -> updateForm(); + if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemPositionHasChanged) { + updateCurrentPartEditor(); } } return(QGraphicsEllipseItem::itemChange(change, value)); diff --git a/sources/editor/partellipse.h b/sources/editor/partellipse.h index b3a1958c1..c7251b5ed 100644 --- a/sources/editor/partellipse.h +++ b/sources/editor/partellipse.h @@ -19,7 +19,6 @@ #define PART_ELLIPSE_H #include #include "customelementgraphicpart.h" -class EllipseEditor; /** Cette classe represente une ellipse pouvant etre utilisee pour composer le dessin d'un element dans l'editeur d'element. @@ -33,10 +32,6 @@ class PartEllipse : public QGraphicsEllipseItem, public CustomElementGraphicPart private: PartEllipse(const PartEllipse &); - // attributs - private: - EllipseEditor *informations; - // methodes public: enum { Type = UserType + 1103 }; @@ -47,6 +42,7 @@ class PartEllipse : public QGraphicsEllipseItem, public CustomElementGraphicPart virtual int type() const { return Type; } virtual void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget * = 0); virtual QString name() const { return(QObject::tr("ellipse", "element part name")); } + virtual QString xmlName() const { return(QString("ellipse")); } virtual const QDomElement toXml(QDomDocument &) const; virtual void fromXml(const QDomElement &); virtual QPointF sceneTopLeft() const; diff --git a/sources/editor/partline.cpp b/sources/editor/partline.cpp index 966b51db3..0e9bf696a 100644 --- a/sources/editor/partline.cpp +++ b/sources/editor/partline.cpp @@ -16,7 +16,6 @@ along with QElectroTech. If not, see . */ #include "partline.h" -#include "lineeditor.h" #include /** @@ -38,10 +37,6 @@ PartLine::PartLine(QETElementEditor *editor, QGraphicsItem *parent, QGraphicsSce setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); #endif setAcceptedMouseButtons(Qt::LeftButton); - informations = new LineEditor(elementEditor(), this); - informations -> setElementTypeName(name()); - style_editor -> appendWidget(informations); - style_editor -> setElementTypeName(name()); } /// Destructeur @@ -287,8 +282,8 @@ QVariant PartLine::property(const QString &property) { */ QVariant PartLine::itemChange(GraphicsItemChange change, const QVariant &value) { if (scene()) { - if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemSelectedChange) { - informations -> updateForm(); + if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemPositionHasChanged) { + updateCurrentPartEditor(); } } return(QGraphicsLineItem::itemChange(change, value)); diff --git a/sources/editor/partline.h b/sources/editor/partline.h index e220fa033..22d41a86e 100644 --- a/sources/editor/partline.h +++ b/sources/editor/partline.h @@ -20,7 +20,6 @@ #include #include "customelementgraphicpart.h" #include "qet.h" -class LineEditor; /** Cette classe represente une ligne pouvant etre utilisee pour composer le dessin d'un element dans l'editeur d'element. @@ -43,7 +42,6 @@ class PartLine : public QGraphicsLineItem, public CustomElementGraphicPart { // attributs private: - LineEditor *informations; QET::EndType first_end; qreal first_length; QET::EndType second_end; @@ -60,6 +58,7 @@ class PartLine : public QGraphicsLineItem, public CustomElementGraphicPart { virtual int type() const { return Type; } virtual void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget * = 0); virtual QString name() const { return(QObject::tr("ligne", "element part name")); } + virtual QString xmlName() const { return(QString("line")); } virtual const QDomElement toXml(QDomDocument &) const; virtual void fromXml(const QDomElement &); virtual QPointF sceneP1() const; diff --git a/sources/editor/partpolygon.cpp b/sources/editor/partpolygon.cpp index 01eea254e..c1f8bebae 100644 --- a/sources/editor/partpolygon.cpp +++ b/sources/editor/partpolygon.cpp @@ -17,7 +17,6 @@ */ #include "partpolygon.h" #include "qet.h" -#include "polygoneditor.h" /** Constructeur @@ -35,10 +34,6 @@ PartPolygon::PartPolygon(QETElementEditor *editor, QGraphicsItem *parent, QGraph setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); #endif setAcceptedMouseButtons(Qt::LeftButton); - informations = new PolygonEditor(elementEditor(), this); - informations -> setElementTypeName(name()); - style_editor -> appendWidget(informations); - style_editor -> setElementTypeName(name()); } /// Destructeur @@ -142,8 +137,8 @@ QVariant PartPolygon::property(const QString &property) { */ QVariant PartPolygon::itemChange(GraphicsItemChange change, const QVariant &value) { if (scene()) { - if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemSelectedChange) { - informations -> updateForm(); + if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemPositionHasChanged) { + updateCurrentPartEditor(); } } return(QGraphicsPolygonItem::itemChange(change, value)); diff --git a/sources/editor/partpolygon.h b/sources/editor/partpolygon.h index 3804d1cb2..2a2b37714 100644 --- a/sources/editor/partpolygon.h +++ b/sources/editor/partpolygon.h @@ -19,7 +19,6 @@ #define PART_POLYGON_H #include #include "customelementgraphicpart.h" -class PolygonEditor; /** Cette classe represente un polygone pouvant etre utilise pour composer le dessin d'un element dans l'editeur d'element. @@ -36,20 +35,7 @@ class PartPolygon : public QGraphicsPolygonItem, public CustomElementGraphicPart // attributs private: bool closed; - PolygonEditor *informations; - /** - constructeur - paint() - widget bidon pour l'edition - methode pour poser le polygone : - -mousePressEvent = pose un nouveau point - -mouseMoveEvent = deplace ce point - -mouveReleaseEvent = finalise ce point - utiliser QPolygonF ; memoriser le point en cours (tout comme le - partploygon en cours) et ne l'ajouter au qpolygonf que lors du - mouseReleaseEvent - */ // methodes public: enum { Type = UserType + 1105 }; @@ -59,6 +45,7 @@ class PartPolygon : public QGraphicsPolygonItem, public CustomElementGraphicPart */ virtual int type() const { return Type; } virtual QString name() const { return(QObject::tr("polygone", "element part name")); } + virtual QString xmlName() const { return(QString("polygon")); } void fromXml(const QDomElement &); const QDomElement toXml(QDomDocument &) const; virtual QRectF boundingRect() const; diff --git a/sources/editor/partrectangle.cpp b/sources/editor/partrectangle.cpp index 63e418ff7..a4f178466 100644 --- a/sources/editor/partrectangle.cpp +++ b/sources/editor/partrectangle.cpp @@ -16,7 +16,6 @@ along with QElectroTech. If not, see . */ #include "partrectangle.h" -#include "rectangleeditor.h" /** Constructeur @@ -30,10 +29,6 @@ PartRectangle::PartRectangle(QETElementEditor *editor, QGraphicsItem *parent, QG setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); #endif setAcceptedMouseButtons(Qt::LeftButton); - informations = new RectangleEditor(elementEditor(), this); - informations -> setElementTypeName(name()); - style_editor -> appendWidget(informations); - style_editor -> setElementTypeName(name()); } /// Destructeur @@ -177,8 +172,8 @@ QVariant PartRectangle::property(const QString &property) { */ QVariant PartRectangle::itemChange(GraphicsItemChange change, const QVariant &value) { if (scene()) { - if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemSelectedChange) { - informations -> updateForm(); + if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemPositionHasChanged) { + updateCurrentPartEditor(); } } return(QGraphicsRectItem::itemChange(change, value)); diff --git a/sources/editor/partrectangle.h b/sources/editor/partrectangle.h index f972a120a..0cb5a3426 100644 --- a/sources/editor/partrectangle.h +++ b/sources/editor/partrectangle.h @@ -19,7 +19,6 @@ #define PART_RECTANGLE_H #include #include "customelementgraphicpart.h" -class RectangleEditor; /** Cette classe represente un rectangle pouvant etre utilise pour composer le dessin d'un element dans l'editeur d'element. @@ -33,10 +32,6 @@ class PartRectangle : public QGraphicsRectItem, public CustomElementGraphicPart private: PartRectangle(const PartRectangle &); - // attributs - private: - RectangleEditor *informations; - // methodes public: enum { Type = UserType + 1109 }; @@ -47,6 +42,7 @@ class PartRectangle : public QGraphicsRectItem, public CustomElementGraphicPart virtual int type() const { return Type; } virtual void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget * = 0); virtual QString name() const { return(QObject::tr("rectangle", "element part name")); } + virtual QString xmlName() const { return(QString("rect")); } virtual const QDomElement toXml(QDomDocument &) const; virtual void fromXml(const QDomElement &); virtual QPointF sceneTopLeft() const; diff --git a/sources/editor/partterminal.cpp b/sources/editor/partterminal.cpp index 8ca9df8f9..84219e01d 100644 --- a/sources/editor/partterminal.cpp +++ b/sources/editor/partterminal.cpp @@ -17,7 +17,6 @@ */ #include "partterminal.h" #include "terminal.h" -#include "terminaleditor.h" /** Constructeur @@ -30,8 +29,6 @@ PartTerminal::PartTerminal(QETElementEditor *editor, QGraphicsItem *parent, QGra QGraphicsItem(parent, scene), _orientation(QET::North) { - informations = new TerminalEditor(elementEditor(), this); - informations -> setElementTypeName(name()); updateSecondPoint(); setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); #if QT_VERSION >= 0x040600 @@ -42,9 +39,7 @@ PartTerminal::PartTerminal(QETElementEditor *editor, QGraphicsItem *parent, QGra /// Destructeur PartTerminal::~PartTerminal() { - if (informations -> parentWidget()) return; // le widget sera supprime par son parent - delete informations; -}; +} /** Importe les proprietes d'une borne depuis un element XML @@ -80,13 +75,6 @@ const QDomElement PartTerminal::toXml(QDomDocument &xml_document) const { return(xml_element); } -/** - @return Le widget permettant d'editer cette borne -*/ -QWidget *PartTerminal::elementInformations() { - return(informations); -} - /** Dessine la borne @param p QPainter a utiliser pour rendre le dessin @@ -152,7 +140,6 @@ void PartTerminal::setOrientation(QET::Orientation ori) { prepareGeometryChange(); _orientation = ori; updateSecondPoint(); - informations -> updateForm(); } /** @@ -202,8 +189,8 @@ QVariant PartTerminal::property(const QString &property) { */ QVariant PartTerminal::itemChange(GraphicsItemChange change, const QVariant &value) { if (scene()) { - if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemSelectedChange) { - informations -> updateForm(); + if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemPositionHasChanged) { + updateCurrentPartEditor(); } } return(QGraphicsItem::itemChange(change, value)); diff --git a/sources/editor/partterminal.h b/sources/editor/partterminal.h index 1cad14e1b..46f0a1c29 100644 --- a/sources/editor/partterminal.h +++ b/sources/editor/partterminal.h @@ -20,8 +20,6 @@ #include "customelementpart.h" #include "qet.h" #include -class TerminalEditor; -class QETElementEditor; /** Cette classe represente une borne pouvant etre utilisee pour composer le dessin d'un element dans l'editeur d'element. @@ -38,7 +36,6 @@ class PartTerminal : public CustomElementPart, public QGraphicsItem { private: QET::Orientation _orientation; QPointF second_point; - TerminalEditor *informations; // methodes public: @@ -49,9 +46,9 @@ class PartTerminal : public CustomElementPart, public QGraphicsItem { */ virtual int type() const { return Type; } virtual QString name() const { return(QObject::tr("borne", "element part name")); } + virtual QString xmlName() const { return(QString("terminal")); } virtual void fromXml(const QDomElement &); virtual const QDomElement toXml(QDomDocument &) const; - virtual QWidget *elementInformations(); virtual void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *); virtual QRectF boundingRect() const; QET::Orientation orientation() const; diff --git a/sources/editor/parttext.cpp b/sources/editor/parttext.cpp index e80529015..5a76d01d7 100644 --- a/sources/editor/parttext.cpp +++ b/sources/editor/parttext.cpp @@ -38,14 +38,10 @@ PartText::PartText(QETElementEditor *editor, QGraphicsItem *parent, ElementScene setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); #endif setPlainText(QObject::tr("T", "default text when adding a text in the element editor")); - infos = new TextEditor(elementEditor(), this); - infos -> setElementTypeName(name()); } /// Destructeur PartText::~PartText() { - if (infos -> parentWidget()) return; // le widget sera supprime par son parent - delete infos; } /** @@ -79,13 +75,6 @@ const QDomElement PartText::toXml(QDomDocument &xml_document) const { return(xml_element); } -/** - @return Le widget permettant d'editer ce texte statique -*/ -QWidget *PartText::elementInformations() { - return(infos); -} - /** Retourne la position du texte, l'origine etant le point en bas a gauche du texte (et pas du cadre) @@ -220,7 +209,7 @@ QVariant PartText::property(const QString &property) { QVariant PartText::itemChange(GraphicsItemChange change, const QVariant &value) { if (scene()) { if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemSelectedChange) { - infos -> updateForm(); + updateCurrentPartEditor(); } } return(QGraphicsTextItem::itemChange(change, value)); diff --git a/sources/editor/parttext.h b/sources/editor/parttext.h index 30cfe9650..d925f13cf 100644 --- a/sources/editor/parttext.h +++ b/sources/editor/parttext.h @@ -33,9 +33,6 @@ class PartText : public QGraphicsTextItem, public CustomElementPart { private: PartText(const PartText &); - // attributs - TextEditor *infos; - // methodes public: enum { Type = UserType + 1107 }; @@ -45,9 +42,9 @@ class PartText : public QGraphicsTextItem, public CustomElementPart { */ virtual int type() const { return Type; } virtual QString name() const { return(QObject::tr("texte", "element part name")); } + virtual QString xmlName() const { return(QString("text")); } void fromXml(const QDomElement &); const QDomElement toXml(QDomDocument &) const; - QWidget *elementInformations(); QPointF pos() const; void setPos(const QPointF &); void setPos(qreal, qreal); diff --git a/sources/editor/parttextfield.cpp b/sources/editor/parttextfield.cpp index ffcee2e85..07a1a7b3a 100644 --- a/sources/editor/parttextfield.cpp +++ b/sources/editor/parttextfield.cpp @@ -38,14 +38,10 @@ PartTextField::PartTextField(QETElementEditor *editor, QGraphicsItem *parent, QG setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); #endif setPlainText(QObject::tr("_", "default text when adding a textfield in the element editor")); - infos = new TextFieldEditor(elementEditor(), this); - infos -> setElementTypeName(name()); } /// Destructeur PartTextField::~PartTextField() { - if (infos -> parentWidget()) return; // le widget sera supprime par son parent - delete infos; } /** @@ -82,13 +78,6 @@ const QDomElement PartTextField::toXml(QDomDocument &xml_document) const { return(xml_element); } -/** - @return Le widget permettant d'editer ce champ de texte -*/ -QWidget *PartTextField::elementInformations() { - return(infos); -} - /** Retourne la position du texte, l'origine etant le point en bas a gauche du texte (et pas du cadre) @@ -245,7 +234,7 @@ QVariant PartTextField::property(const QString &property) { QVariant PartTextField::itemChange(GraphicsItemChange change, const QVariant &value) { if (scene()) { if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemSelectedChange) { - infos -> updateForm(); + updateCurrentPartEditor(); } } return(QGraphicsTextItem::itemChange(change, value)); diff --git a/sources/editor/parttextfield.h b/sources/editor/parttextfield.h index 39d5d2230..577ccd8ad 100644 --- a/sources/editor/parttextfield.h +++ b/sources/editor/parttextfield.h @@ -37,7 +37,6 @@ class PartTextField : public QGraphicsTextItem, public CustomElementPart { PartTextField(const PartTextField &); // attributs - TextFieldEditor *infos; bool follow_parent_rotations; // methodes @@ -49,9 +48,9 @@ class PartTextField : public QGraphicsTextItem, public CustomElementPart { */ virtual int type() const { return Type; } virtual QString name() const { return(QObject::tr("champ de texte", "element part name")); } + virtual QString xmlName() const { return(QString("input")); } void fromXml(const QDomElement &); const QDomElement toXml(QDomDocument &) const; - QWidget *elementInformations(); QPointF pos() const; void setPos(const QPointF &); void setPos(qreal, qreal); diff --git a/sources/editor/polygoneditor.cpp b/sources/editor/polygoneditor.cpp index 16d8cfd44..40e235cf8 100644 --- a/sources/editor/polygoneditor.cpp +++ b/sources/editor/polygoneditor.cpp @@ -29,10 +29,12 @@ */ PolygonEditor::PolygonEditor(QETElementEditor *editor, PartPolygon *p, QWidget *parent) : ElementItemEditor(editor, parent), + part(p), points_list(this), close_polygon(tr("Polygone ferm\351"), this) { - part = p; + style_ = new StyleEditor(editor); + // prepare la liste de points points_list.setColumnCount(2); QStringList headers; @@ -43,6 +45,7 @@ PolygonEditor::PolygonEditor(QETElementEditor *editor, PartPolygon *p, QWidget * // layout QVBoxLayout *layout = new QVBoxLayout(this); + layout -> addWidget(style_); layout -> addWidget(new QLabel(tr("Points du polygone :"))); layout -> addWidget(&points_list); layout -> addWidget(&close_polygon); @@ -66,6 +69,7 @@ void PolygonEditor::updatePolygon() { Met a jour les points du polygone et cree un objet d'annulation */ void PolygonEditor::updatePolygonPoints() { + if (!part) return; QVector points = getPointsFromTree(); if (points.count() < 2) { QET::MessageBox::warning( @@ -82,6 +86,7 @@ void PolygonEditor::updatePolygonPoints() { Met a jour l'etat ferme ou non du polygone */ void PolygonEditor::updatePolygonClosedState() { + if (!part) return; undoStack().push( new ChangePartCommand( tr("fermeture du polygone"), @@ -97,6 +102,7 @@ void PolygonEditor::updatePolygonClosedState() { Met a jour le formulaire d'edition */ void PolygonEditor::updateForm() { + if (!part) return; activeConnections(false); while(points_list.takeTopLevelItem(0)) {} foreach(QPointF point, part -> polygon()) { @@ -111,11 +117,43 @@ void PolygonEditor::updateForm() { activeConnections(true); } +/** + Permet de specifier a cet editeur quelle primitive il doit editer. A noter + qu'un editeur peut accepter ou refuser d'editer une primitive. + L'editeur de polygone acceptera d'editer la primitive new_part s'il s'agit + d'un objet de la classe PartPolygon. + @param new_part Nouvelle primitive a editer + @return true si l'editeur a accepter d'editer la primitive, false sinon +*/ +bool PolygonEditor::setPart(CustomElementPart *new_part) { + if (!new_part) { + part = 0; + style_ -> setPart(0); + return(true); + } + if (PartPolygon *part_polygon = dynamic_cast(new_part)) { + part = part_polygon; + style_ -> setPart(part); + updateForm(); + return(true); + } else { + return(false); + } +} + +/** + @return la primitive actuellement editee, ou 0 si ce widget n'en edite pas +*/ +CustomElementPart *PolygonEditor::currentPart() const { + return(part); +} + /** @return Un vecteur contenant les points composant le polygone a partir du formulaire d'edition */ QVector PolygonEditor::getPointsFromTree() { + if (!part) return(QVector()); QVector points; for(int i = 0 ; i < points_list.topLevelItemCount() ; ++ i) { QTreeWidgetItem *qtwi = points_list.topLevelItem(i); diff --git a/sources/editor/polygoneditor.h b/sources/editor/polygoneditor.h index 81f423c63..f5b3b1091 100644 --- a/sources/editor/polygoneditor.h +++ b/sources/editor/polygoneditor.h @@ -19,6 +19,7 @@ #define POLYGON_EDITOR_H #include "elementitemeditor.h" class PartPolygon; +class StyleEditor; /** Cette classe represente le widget d'edition d'un polygone dans l'editeur d'element. @@ -29,7 +30,7 @@ class PolygonEditor : public ElementItemEditor { // constructeurs, destructeur public: - PolygonEditor(QETElementEditor *, PartPolygon *, QWidget * = 0); + PolygonEditor(QETElementEditor *, PartPolygon * = 0, QWidget * = 0); virtual ~PolygonEditor(); private: @@ -38,10 +39,15 @@ class PolygonEditor : public ElementItemEditor { // attributs private: PartPolygon *part; + StyleEditor *style_; QTreeWidget points_list; QCheckBox close_polygon; // methodes + public: + virtual bool setPart(CustomElementPart *); + virtual CustomElementPart *currentPart() const; + private: QVector getPointsFromTree(); diff --git a/sources/editor/qetelementeditor.cpp b/sources/editor/qetelementeditor.cpp index 1d1ee0564..03d38c603 100644 --- a/sources/editor/qetelementeditor.cpp +++ b/sources/editor/qetelementeditor.cpp @@ -28,6 +28,17 @@ #include "qeticons.h" #include "qetmessagebox.h" +// editeurs de primitives +#include "arceditor.h" +#include "circleeditor.h" +#include "ellipseeditor.h" +#include "lineeditor.h" +#include "polygoneditor.h" +#include "rectangleeditor.h" +#include "terminaleditor.h" +#include "texteditor.h" +#include "textfieldeditor.h" + /** Constructeur @param parent QWidget parent @@ -60,11 +71,14 @@ QETElementEditor::QETElementEditor(QWidget *parent) : /// Destructeur QETElementEditor::~QETElementEditor() { /* - retire le widget d'edition de partie affiche par le dock - cela evite qu'il ne soit supprime avant que la partie a laquelle il est - rattache ne le supprime une fois de trop + retire le widget d'edition de primitives affiche par le dock + cela evite qu'il ne soit supprime par son widget parent */ clearToolsDock(); + + // supprime les editeurs de primitives + qDeleteAll(editors_.begin(), editors_.end()); + editors_.clear(); } /** @@ -314,7 +328,14 @@ void QETElementEditor::setupActions() { connect(QApplication::clipboard(), SIGNAL(dataChanged()), this, SLOT(slot_updateMenus())); connect(&(ce_scene -> undoStack()), SIGNAL(cleanChanged(bool)), this, SLOT(slot_updateMenus())); connect(&(ce_scene -> undoStack()), SIGNAL(cleanChanged(bool)), this, SLOT(slot_updateTitle())); + + // Annuler ou refaire une action met a jour la liste des primitives ; cela sert notamment pour les + // ajouts et suppressions de primitives ainsi que pour les actions entrainant un change connect(&(ce_scene -> undoStack()), SIGNAL(indexChanged(int)), this, SLOT(slot_updatePartsList())); + + // Annuler ou refaire une action met a jour les informations affichees sur les primitives selectionnees, + // celles-ci etant potentiellement impactees + connect(&(ce_scene -> undoStack()), SIGNAL(indexChanged(int)), this, SLOT(slot_updateInformations())); } /** @@ -496,6 +517,17 @@ void QETElementEditor::setupInterface() { tools_dock_stack_ -> insertWidget(0, default_informations); tools_dock_stack_ -> insertWidget(1, tools_dock_scroll_area_); + // widgets d'editions pour les parties + editors_["arc"] = new ArcEditor(this); + editors_["circle"] = new CircleEditor(this); + editors_["ellipse"] = new EllipseEditor(this); + editors_["line"] = new LineEditor(this); + editors_["polygon"] = new PolygonEditor(this); + editors_["rect"] = new RectangleEditor(this); + editors_["terminal"] = new TerminalEditor(this); + editors_["text"] = new TextEditor(this); + editors_["input"] = new TextFieldEditor(this); + // panel sur le cote pour editer les parties tools_dock = new QDockWidget(tr("Informations", "dock title"), this); tools_dock -> setObjectName("informations"); @@ -564,33 +596,37 @@ void QETElementEditor::slot_setNormalMode() { } /** - Met a jour la zone d'information et d'edition. - Si plusieurs parties sont selectionnees, seul leur nombre est affiche. - Sinon, le widget d'edition de la partie est insere. - @see CustomElementPart::elementInformations() + Met a jour la zone d'information et d'edition des primitives. + Si plusieurs primitives sont selectionnees, seule leur quantite est + affichee. Sinon, un widget d'edition approprie est mis en place. */ void QETElementEditor::slot_updateInformations() { QList selected_qgis = ce_scene -> selectedItems(); - QList selected_parts; - foreach(QGraphicsItem *qgi, selected_qgis) { - if (CustomElementPart *cep = dynamic_cast(qgi)) { - selected_parts.append(cep); - } - } clearToolsDock(); - if (selected_parts.size() == 1) { - // recupere le premier CustomElementPart et en ajoute le widget d'edition - QWidget *edit_widget = selected_parts.first() -> elementInformations(); - tools_dock_scroll_area_ -> setWidget(edit_widget); - tools_dock_stack_ -> setCurrentIndex(1); + // s'il n'y a qu'une seule primitive selectionnee + if (selected_qgis.size() == 1) { + QGraphicsItem *qgi = selected_qgis.first(); + if (CustomElementPart *selection = dynamic_cast(qgi)) { + // on en ajoute le widget d'edition + QString selection_xml_name = selection -> xmlName(); + ElementItemEditor *selection_editor = editors_[selection_xml_name]; + if (selection_editor) { + if (selection_editor -> setPart(selection)) { + tools_dock_scroll_area_ -> setWidget(selection_editor); + tools_dock_stack_ -> setCurrentIndex(1); + } else { + qDebug() << "Editor refused part."; + } + } + } } else { default_informations -> setText( tr( "%n partie(s) s\351lectionn\351e(s).", "", - selected_parts.size() + selected_qgis.size() ) ); default_informations -> setAlignment(Qt::AlignHCenter | Qt::AlignTop); @@ -1326,3 +1362,17 @@ void QETElementEditor::pasteFromElement() { copyAndPasteXml(document_xml); } + +/** + Met a jour l'editeur de primitive actuellement visible. + Si aucun editeur de primitive n'est visible, ce slot ne fait rien. +*/ +void QETElementEditor::updateCurrentPartEditor() { + // si aucun widget d'edition n'est affiche, on ne fait rien + if (!tools_dock_stack_ -> currentIndex()) return; + + // s'il y a un widget d'edition affiche, on le met a jour + if (ElementItemEditor *current_editor = dynamic_cast(tools_dock_scroll_area_ -> widget())) { + current_editor -> updateForm(); + } +} diff --git a/sources/editor/qetelementeditor.h b/sources/editor/qetelementeditor.h index 01150c3a5..4ec140c19 100644 --- a/sources/editor/qetelementeditor.h +++ b/sources/editor/qetelementeditor.h @@ -22,6 +22,7 @@ #include "elementscene.h" #include "orientationset.h" #include "elementslocation.h" +class ElementItemEditor; class ElementView; /** Cette classe represente un editeur d'element. Elle permet a l'utilisateur @@ -54,6 +55,8 @@ class QETElementEditor : public QMainWindow { QStackedWidget *tools_dock_stack_; /// label affiche lors de la selection de plusieurs elements QLabel *default_informations; + /// Hash permettant d'acceder aux widgets d'editions disponibles + QHash editors_; /// ScrollArea pour le DockWidget affichant des infos sur la partie selectionnee QScrollArea *tools_dock_scroll_area_; /// container pour la liste des annulations @@ -156,6 +159,7 @@ class QETElementEditor : public QMainWindow { bool checkElement(); void pasteFromFile(); void pasteFromElement(); + void updateCurrentPartEditor(); }; /** diff --git a/sources/editor/rectangleeditor.cpp b/sources/editor/rectangleeditor.cpp index c451c603c..1dc7c5272 100644 --- a/sources/editor/rectangleeditor.cpp +++ b/sources/editor/rectangleeditor.cpp @@ -24,9 +24,11 @@ @param rect Le rectangle a editer @param parent le Widget parent */ -RectangleEditor::RectangleEditor(QETElementEditor *editor, PartRectangle *rect, QWidget *parent) : ElementItemEditor(editor, parent) { - - part = rect; +RectangleEditor::RectangleEditor(QETElementEditor *editor, PartRectangle *rect, QWidget *parent) : + ElementItemEditor(editor, parent), + part(rect) +{ + style_ = new StyleEditor(editor); x = new QLineEdit(); y = new QLineEdit(); @@ -38,7 +40,9 @@ RectangleEditor::RectangleEditor(QETElementEditor *editor, PartRectangle *rect, w -> setValidator(new QDoubleValidator(w)); h -> setValidator(new QDoubleValidator(h)); - QGridLayout *grid = new QGridLayout(this); + QVBoxLayout *v_layout = new QVBoxLayout(this); + + QGridLayout *grid = new QGridLayout(); grid -> addWidget(new QLabel(tr("Coin sup\351rieur gauche\240: ")), 0, 0); grid -> addWidget(new QLabel("x"), 1, 0); grid -> addWidget(x, 1, 1); @@ -50,6 +54,9 @@ RectangleEditor::RectangleEditor(QETElementEditor *editor, PartRectangle *rect, grid -> addWidget(new QLabel(tr("Hauteur\240:")), 4, 0); grid -> addWidget(h, 4, 1); + v_layout -> addWidget(style_); + v_layout -> addLayout(grid); + activeConnections(true); updateForm(); } @@ -58,10 +65,42 @@ RectangleEditor::RectangleEditor(QETElementEditor *editor, PartRectangle *rect, RectangleEditor::~RectangleEditor() { } +/** + Permet de specifier a cet editeur quelle primitive il doit editer. A noter + qu'un editeur peut accepter ou refuser d'editer une primitive. + L'editeur de rectangle acceptera d'editer la primitive new_part s'il s'agit + d'un objet de la classe PartRectangle. + @param new_part Nouvelle primitive a editer + @return true si l'editeur a accepter d'editer la primitive, false sinon +*/ +bool RectangleEditor::setPart(CustomElementPart *new_part) { + if (!new_part) { + part = 0; + style_ -> setPart(0); + return(true); + } + if (PartRectangle *part_rectangle = dynamic_cast(new_part)) { + part = part_rectangle; + style_ -> setPart(part); + updateForm(); + return(true); + } else { + return(false); + } +} + +/** + @return la primitive actuellement editee, ou 0 si ce widget n'en edite pas +*/ +CustomElementPart *RectangleEditor::currentPart() const { + return(part); +} + /** Met a jour le rectangle a partir des donnees du formulaire */ void RectangleEditor::updateRectangle() { + if (!part) return; part -> setProperty("x", x -> text().toDouble()); part -> setProperty("y", y -> text().toDouble()); part -> setProperty("width", w -> text().toDouble()); @@ -81,6 +120,7 @@ void RectangleEditor::updateRectangleH() { addChangePartCommand(tr("hauteur"), Met a jour le formulaire d'edition */ void RectangleEditor::updateForm() { + if (!part) return; activeConnections(false); x -> setText(part -> property("x").toString()); y -> setText(part -> property("y").toString()); diff --git a/sources/editor/rectangleeditor.h b/sources/editor/rectangleeditor.h index afa1523f6..364059c25 100644 --- a/sources/editor/rectangleeditor.h +++ b/sources/editor/rectangleeditor.h @@ -20,6 +20,7 @@ #include #include "elementitemeditor.h" class PartRectangle; +class StyleEditor; /** Cette classe represente le widget d'edition d'un rectangle dans l'editeur d'element. @@ -28,17 +29,22 @@ class RectangleEditor : public ElementItemEditor { Q_OBJECT //constructeurs, destructeur public: - RectangleEditor(QETElementEditor *, PartRectangle *, QWidget * = 0); - ~RectangleEditor(); + RectangleEditor(QETElementEditor *, PartRectangle * = 0, QWidget * = 0); + virtual ~RectangleEditor(); private: RectangleEditor(const RectangleEditor &); // attributs private: PartRectangle *part; + StyleEditor *style_; QLineEdit *x, *y, *w, *h; // methodes + public: + virtual bool setPart(CustomElementPart *); + virtual CustomElementPart *currentPart() const; + public slots: void updateRectangle(); void updateRectangleX(); diff --git a/sources/editor/styleeditor.cpp b/sources/editor/styleeditor.cpp index 17ce694ba..9d0fc9501 100644 --- a/sources/editor/styleeditor.cpp +++ b/sources/editor/styleeditor.cpp @@ -24,7 +24,10 @@ @param p La partie a editer @param parent le Widget parent */ -StyleEditor::StyleEditor(QETElementEditor *editor, CustomElementGraphicPart *p, QWidget *parent) : ElementItemEditor(editor, parent), part(p) { +StyleEditor::StyleEditor(QETElementEditor *editor, CustomElementGraphicPart *p, QWidget *parent) : + ElementItemEditor(editor, parent), + part(p) +{ // couleur color = new QButtonGroup(this); color -> addButton(black_color = new QRadioButton(tr("Noir", "element part color")), CustomElementGraphicPart::BlackColor); @@ -34,7 +37,7 @@ StyleEditor::StyleEditor(QETElementEditor *editor, CustomElementGraphicPart *p, style = new QButtonGroup(this); style -> addButton(normal_style = new QRadioButton(tr("Normal", "element part line style")), CustomElementGraphicPart::NormalStyle); style -> addButton(dashed_style = new QRadioButton(tr("Pointill\351", "element part line style")), CustomElementGraphicPart::DashedStyle); - style -> button(part -> lineStyle()) -> setChecked(true); + normal_style -> setChecked(true); // epaisseur weight = new QButtonGroup(this); @@ -102,6 +105,7 @@ StyleEditor::~StyleEditor() { Met a jour le style de la partie a partir des donnees du formulaire */ void StyleEditor::updatePart() { + if (!part) return; // applique l'antialiasing part -> setAntialiased(antialiasing -> isChecked()); @@ -133,6 +137,7 @@ void StyleEditor::updatePartFilling() { addChangePartCommand("style rempl Met a jour le formulaire d'edition */ void StyleEditor::updateForm() { + if (!part) return; activeConnections(false); // lit l'antialiasing antialiasing -> setChecked(part -> antialiased()); @@ -152,11 +157,32 @@ void StyleEditor::updateForm() { } /** - Ajoute un widget en bas de l'editeur de style - @param w Widget a inserer + Permet de specifier a cet editeur quelle primitive il doit editer. A noter + qu'un editeur peut accepter ou refuser d'editer une primitive. + L'editeur de ligne acceptera d'editer la primitive new_part s'il s'agit d'un + objet de la classe CustomElementGraphicPart. + @param new_part Nouvelle primitive a editer + @return true si l'editeur a accepter d'editer la primitive, false sinon */ -void StyleEditor::appendWidget(QWidget *w) { - main_layout -> insertWidget(7, w); +bool StyleEditor::setPart(CustomElementPart *new_part) { + if (!new_part) { + part = 0; + return(true); + } + if (CustomElementGraphicPart *part_graphic = dynamic_cast(new_part)) { + part = part_graphic; + updateForm(); + return(true); + } else { + return(false); + } +} + +/** + @return la primitive actuellement editee, ou 0 si ce widget n'en edite pas +*/ +CustomElementPart *StyleEditor::currentPart() const { + return(part); } /** diff --git a/sources/editor/styleeditor.h b/sources/editor/styleeditor.h index 45a75bb42..2968de572 100644 --- a/sources/editor/styleeditor.h +++ b/sources/editor/styleeditor.h @@ -30,7 +30,7 @@ class StyleEditor : public ElementItemEditor { Q_OBJECT // constructeurs, destructeur public: - StyleEditor(QETElementEditor *, CustomElementGraphicPart *, QWidget * = 0); + StyleEditor(QETElementEditor *, CustomElementGraphicPart * = 0, QWidget * = 0); virtual ~StyleEditor(); private: @@ -46,9 +46,10 @@ class StyleEditor : public ElementItemEditor { QRadioButton *black_filling, *white_filling; QCheckBox *antialiasing; - //methodes + // methodes public: - void appendWidget(QWidget *w); + virtual bool setPart(CustomElementPart *); + virtual CustomElementPart *currentPart() const; public slots: void updatePart(); diff --git a/sources/editor/terminaleditor.cpp b/sources/editor/terminaleditor.cpp index 1ffbbc668..bf96d7478 100644 --- a/sources/editor/terminaleditor.cpp +++ b/sources/editor/terminaleditor.cpp @@ -25,9 +25,10 @@ @param term La borne a editer @param parent QWidget parent de ce widget */ -TerminalEditor::TerminalEditor(QETElementEditor *editor, PartTerminal *term, QWidget *parent) : ElementItemEditor(editor, parent) { - part = term; - +TerminalEditor::TerminalEditor(QETElementEditor *editor, PartTerminal *term, QWidget *parent) : + ElementItemEditor(editor, parent), + part(term) +{ qle_x = new QLineEdit(); qle_y = new QLineEdit(); @@ -65,10 +66,40 @@ TerminalEditor::TerminalEditor(QETElementEditor *editor, PartTerminal *term, QWi TerminalEditor::~TerminalEditor() { }; +/** + Permet de specifier a cet editeur quelle primitive il doit editer. A noter + qu'un editeur peut accepter ou refuser d'editer une primitive. + L'editeur de borne acceptera d'editer la primitive new_part s'il s'agit d'un + objet de la classe PartTerminal. + @param new_part Nouvelle primitive a editer + @return true si l'editeur a accepter d'editer la primitive, false sinon +*/ +bool TerminalEditor::setPart(CustomElementPart *new_part) { + if (!new_part) { + part = 0; + return(true); + } + if (PartTerminal *part_terminal = dynamic_cast(new_part)) { + part = part_terminal; + updateForm(); + return(true); + } else { + return(false); + } +} + +/** + @return la primitive actuellement editee, ou 0 si ce widget n'en edite pas +*/ +CustomElementPart *TerminalEditor::currentPart() const { + return(part); +} + /** Met a jour la borne a partir des donnees du formulaire */ void TerminalEditor::updateTerminal() { + if (!part) return; part -> setPos(qle_x -> text().toDouble(), qle_y -> text().toDouble()); part -> setOrientation( static_cast( @@ -90,6 +121,7 @@ void TerminalEditor::updateTerminalO() { addChangePartCommand(tr("orientation"), Met a jour le formulaire d'edition */ void TerminalEditor::updateForm() { + if (!part) return; activeConnections(false); qle_x -> setText(part -> property("x").toString()); qle_y -> setText(part -> property("y").toString()); diff --git a/sources/editor/terminaleditor.h b/sources/editor/terminaleditor.h index f0bfb0ca5..6f1a29f0f 100644 --- a/sources/editor/terminaleditor.h +++ b/sources/editor/terminaleditor.h @@ -29,7 +29,7 @@ class TerminalEditor : public ElementItemEditor { Q_OBJECT // Constructeurs, destructeur public: - TerminalEditor(QETElementEditor *, PartTerminal *, QWidget * = 0); + TerminalEditor(QETElementEditor *, PartTerminal * = 0, QWidget * = 0); virtual ~TerminalEditor(); private: TerminalEditor(const TerminalEditor &); @@ -41,6 +41,10 @@ class TerminalEditor : public ElementItemEditor { QComboBox *orientation; // methodes + public: + virtual bool setPart(CustomElementPart *); + virtual CustomElementPart *currentPart() const; + public slots: void updateTerminal(); void updateTerminalX(); diff --git a/sources/editor/texteditor.cpp b/sources/editor/texteditor.cpp index 90a5a5555..6669f8d6f 100644 --- a/sources/editor/texteditor.cpp +++ b/sources/editor/texteditor.cpp @@ -24,9 +24,10 @@ @param text Champ de texte a editer @param parent QWidget parent de ce widget */ -TextEditor::TextEditor(QETElementEditor *editor, PartText *text, QWidget *parent) : ElementItemEditor(editor, parent) { - part = text; - +TextEditor::TextEditor(QETElementEditor *editor, PartText *text, QWidget *parent) : + ElementItemEditor(editor, parent), + part(text) +{ qle_x = new QLineEdit(); qle_y = new QLineEdit(); qle_text = new QLineEdit(); @@ -67,10 +68,40 @@ TextEditor::TextEditor(QETElementEditor *editor, PartText *text, QWidget *parent TextEditor::~TextEditor() { } +/** + Permet de specifier a cet editeur quelle primitive il doit editer. A noter + qu'un editeur peut accepter ou refuser d'editer une primitive. + L'editeur de texte statique acceptera d'editer la primitive new_part s'il + s'agit d'un objet de la classe PartText. + @param new_part Nouvelle primitive a editer + @return true si l'editeur a accepter d'editer la primitive, false sinon +*/ +bool TextEditor::setPart(CustomElementPart *new_part) { + if (!new_part) { + part = 0; + return(true); + } + if (PartText *part_text = dynamic_cast(new_part)) { + part = part_text; + updateForm(); + return(true); + } else { + return(false); + } +} + +/** + @return la primitive actuellement editee, ou 0 si ce widget n'en edite pas +*/ +CustomElementPart *TextEditor::currentPart() const { + return(part); +} + /** Met a jour le champ de texte a partir des donnees du formulaire */ void TextEditor::updateText() { + if (!part) return; part -> setProperty("size", font_size -> value()); part -> setPlainText(qle_text -> text()); part -> setPos(qle_x -> text().toDouble(), qle_y -> text().toDouble()); @@ -89,6 +120,7 @@ void TextEditor::updateTextS() { addChangePartCommand(tr("taille"), part, " Met a jour le formulaire a partir du champ de texte */ void TextEditor::updateForm() { + if (!part) return; activeConnections(false); qle_x -> setText(part -> property("x").toString()); qle_y -> setText(part -> property("y").toString()); diff --git a/sources/editor/texteditor.h b/sources/editor/texteditor.h index f981cc96b..a3387fd56 100644 --- a/sources/editor/texteditor.h +++ b/sources/editor/texteditor.h @@ -29,7 +29,7 @@ class TextEditor : public ElementItemEditor { Q_OBJECT // Constructeurs, destructeur public: - TextEditor(QETElementEditor *, PartText *, QWidget * = 0); + TextEditor(QETElementEditor *, PartText * = 0, QWidget * = 0); virtual ~TextEditor(); private: TextEditor(const TextEditor &); @@ -41,6 +41,10 @@ class TextEditor : public ElementItemEditor { QSpinBox *font_size; // methodes + public: + virtual bool setPart(CustomElementPart *); + virtual CustomElementPart *currentPart() const; + public slots: void updateText(); void updateTextX(); diff --git a/sources/editor/textfieldeditor.cpp b/sources/editor/textfieldeditor.cpp index f2d4ba9d6..e08918f5c 100644 --- a/sources/editor/textfieldeditor.cpp +++ b/sources/editor/textfieldeditor.cpp @@ -24,9 +24,10 @@ @param textfield Le champ de texte a editer @param parent QWidget parent */ -TextFieldEditor::TextFieldEditor(QETElementEditor *editor, PartTextField *textfield, QWidget *parent) : ElementItemEditor(editor, parent) { - part = textfield; - +TextFieldEditor::TextFieldEditor(QETElementEditor *editor, PartTextField *textfield, QWidget *parent) : + ElementItemEditor(editor, parent), + part(textfield) +{ qle_x = new QLineEdit(); qle_y = new QLineEdit(); qle_text = new QLineEdit(); @@ -71,10 +72,40 @@ TextFieldEditor::TextFieldEditor(QETElementEditor *editor, PartTextField *textfi TextFieldEditor::~TextFieldEditor() { } +/** + Permet de specifier a cet editeur quelle primitive il doit editer. A noter + qu'un editeur peut accepter ou refuser d'editer une primitive. + L'editeur de texte dynamique acceptera d'editer la primitive new_part s'il + s'agit d'un objet de la classe PartTextField. + @param new_part Nouvelle primitive a editer + @return true si l'editeur a accepter d'editer la primitive, false sinon +*/ +bool TextFieldEditor::setPart(CustomElementPart *new_part) { + if (!new_part) { + part = 0; + return(true); + } + if (PartTextField *part_textfield = dynamic_cast(new_part)) { + part = part_textfield; + updateForm(); + return(true); + } else { + return(false); + } +} + +/** + @return la primitive actuellement editee, ou 0 si ce widget n'en edite pas +*/ +CustomElementPart *TextFieldEditor::currentPart() const { + return(part); +} + /** Met a jour le champ de texte a partir des donnees du formulaire */ void TextFieldEditor::updateTextField() { + if (!part) return; part -> setProperty("size", font_size -> value()); part -> setPlainText(qle_text -> text()); part -> setPos(qle_x -> text().toDouble(), qle_y -> text().toDouble()); @@ -96,6 +127,7 @@ void TextFieldEditor::updateTextFieldR() { addChangePartCommand(tr("propri\351t\ Met a jour le formulaire d'edition */ void TextFieldEditor::updateForm() { + if (!part) return; activeConnections(false); qle_x -> setText(part -> property("x").toString()); qle_y -> setText(part -> property("y").toString()); diff --git a/sources/editor/textfieldeditor.h b/sources/editor/textfieldeditor.h index 2f620105f..41318264b 100644 --- a/sources/editor/textfieldeditor.h +++ b/sources/editor/textfieldeditor.h @@ -30,7 +30,7 @@ class TextFieldEditor : public ElementItemEditor { Q_OBJECT // Constructeurs, destructeur public: - TextFieldEditor(QETElementEditor *, PartTextField *, QWidget * = 0); + TextFieldEditor(QETElementEditor *, PartTextField * = 0, QWidget * = 0); virtual ~TextFieldEditor(); private: TextFieldEditor(const TextFieldEditor &); @@ -43,6 +43,10 @@ class TextFieldEditor : public ElementItemEditor { QCheckBox *rotate; // methodes + public: + virtual bool setPart(CustomElementPart *); + virtual CustomElementPart *currentPart() const; + public slots: void updateTextField(); void updateTextFieldX();