diff --git a/editor/arceditor.cpp b/editor/arceditor.cpp new file mode 100644 index 000000000..758442975 --- /dev/null +++ b/editor/arceditor.cpp @@ -0,0 +1,76 @@ +#include "arceditor.h" +#include "partarc.h" + +ArcEditor::ArcEditor(PartArc *arc, QWidget *parent) : QWidget(parent) { + + part = arc; + + x = new QLineEdit(); + y = new QLineEdit(); + h = new QLineEdit(); + v = new QLineEdit(); + start_angle = new QSpinBox(); + angle = new QSpinBox(); + start_angle -> setRange(-360, 360); + angle -> setRange(-360, 360); + + QGridLayout *grid = new QGridLayout(this); + grid -> addWidget(new QLabel(tr("Centre : ")), 0, 0); + grid -> addWidget(new QLabel("x"), 1, 0); + grid -> addWidget(x, 1, 1); + grid -> addWidget(new QLabel("y"), 1, 2); + grid -> addWidget(y, 1, 3); + grid -> addWidget(new QLabel(tr("Diam\350tres : ")), 2, 0); + grid -> addWidget(new QLabel(tr("horizontal :")), 3, 0); + grid -> addWidget(h, 3, 1); + grid -> addWidget(new QLabel(tr("vertical :")), 4, 0); + grid -> addWidget(v, 4, 1); + grid -> addWidget(new QLabel(tr("Angle de d\351part :")), 5, 0); + grid -> addWidget(start_angle, 5, 1); + grid -> addWidget(new QLabel(tr("Angle :")), 6, 0); + grid -> addWidget(angle, 6, 1); + updateForm(); + + connect(x, SIGNAL(editingFinished()), this, SLOT(updateArc())); + connect(y, SIGNAL(editingFinished()), this, SLOT(updateArc())); + connect(h, SIGNAL(editingFinished()), this, SLOT(updateArc())); + connect(v, SIGNAL(editingFinished()), this, SLOT(updateArc())); + connect(start_angle, SIGNAL(valueChanged(int)), this, SLOT(updateArc())); + connect(angle, SIGNAL(valueChanged(int)), this, SLOT(updateArc())); +} + +ArcEditor::~ArcEditor() { + qDebug() << "~ArcEditor()"; +} + +void ArcEditor::updateArc() { + qreal _x = x -> text().toDouble(); + qreal _y = y -> text().toDouble(); + qreal _h = h -> text().toDouble(); + qreal _v = v -> text().toDouble(); + _v = _v < 0 ? -_v : _v; + part -> setRect( + QRectF( + part -> mapFromScene(QPointF(_x - (_h / 2.0), _y - (_v / 2.0))), + QSizeF(_h, _v) + ) + ); + part -> setStartAngle(-start_angle -> value() + 90); + part -> setAngle(-angle -> value()); +} + +void ArcEditor::updateForm() { + qreal _h = part -> rect().width(); + qreal _v = part -> rect().height(); + QPointF top_left(part -> sceneTopLeft()); + x -> setText(QString("%1").arg(top_left.x() + (_h / 2.0))); + y -> setText(QString("%1").arg(top_left.y() + (_v / 2.0))); + h -> setText(QString("%1").arg(_h)); + v -> setText(QString("%1").arg(_v)); + disconnect(start_angle, SIGNAL(valueChanged(int)), this, SLOT(updateArc())); + disconnect(angle, SIGNAL(valueChanged(int)), this, SLOT(updateArc())); + start_angle -> setValue(-part -> startAngle() + 90); + angle -> setValue(-part -> angle()); + connect(start_angle, SIGNAL(valueChanged(int)), this, SLOT(updateArc())); + connect(angle, SIGNAL(valueChanged(int)), this, SLOT(updateArc())); +} diff --git a/editor/arceditor.h b/editor/arceditor.h new file mode 100644 index 000000000..1e9974ded --- /dev/null +++ b/editor/arceditor.h @@ -0,0 +1,25 @@ +#ifndef ARC_EDITOR_H +#define ARC_EDITOR_H +#include +class PartArc; +class ArcEditor : public QWidget { + Q_OBJECT + //constructeurs, destructeur + public: + ArcEditor(PartArc *, QWidget * = 0); + ~ArcEditor(); + private: + ArcEditor(const ArcEditor &); + + // attributs + private: + PartArc *part; + QLineEdit *x, *y, *h, *v; + QSpinBox *angle, *start_angle; + + // methodes + public slots: + void updateArc(); + void updateForm(); +}; +#endif diff --git a/editor/customelementeditor.cpp b/editor/customelementeditor.cpp index 19fc50beb..04c59ed0c 100644 --- a/editor/customelementeditor.cpp +++ b/editor/customelementeditor.cpp @@ -22,19 +22,6 @@ CustomElementEditor::CustomElementEditor(QWidget *parent) : CustomElementEditor::~CustomElementEditor() { qDebug() << "~CustomElementEditor()"; - // recupere le layout -// QLayout *layout = tools_dock -> widget() -> layout(); -// -// // enleve les widgets deja presents -// QLayoutItem *qli; -// while ((qli = layout -> takeAt(0)) != 0) { -// if (qli -> widget()) { -// layout -> removeWidget(qli -> widget()); -// qli -> widget() -> setParent(0); -// } -// } - - } void CustomElementEditor::setupActions() { diff --git a/editor/editorscene.cpp b/editor/editorscene.cpp index 8400b863c..258ee8091 100644 --- a/editor/editorscene.cpp +++ b/editor/editorscene.cpp @@ -6,6 +6,7 @@ #include "partpolygon.h" #include "partterminal.h" #include "parttext.h" +#include "partarc.h" #define GRILLE_X 10 #define GRILLE_Y 10 @@ -78,6 +79,11 @@ void EditorScene::mouseMoveEvent(QGraphicsSceneMouseEvent *e) { temp_rect.setBottomRight(e -> scenePos()); current_ellipse -> setRect(temp_rect); break; + case Arc: + temp_rect = current_arc -> rect(); + temp_rect.setBottomRight(e -> scenePos()); + current_arc -> setRect(temp_rect); + break; case Circle: temp_rect = current_circle -> rect(); temp_point = e -> scenePos() - current_circle -> mapToScene(temp_rect.center()); @@ -122,6 +128,10 @@ void EditorScene::mousePressEvent(QGraphicsSceneMouseEvent *e) { current_ellipse = new PartEllipse(0, this); current_ellipse -> setRect(QRectF(e -> scenePos(), QSizeF(0.0, 0.0))); break; + case Arc: + current_arc = new PartArc(0, this); + current_arc -> setRect(QRectF(e -> scenePos(), QSizeF(0.0, 0.0))); + break; case Circle: current_circle = new PartCircle(0, this); current_circle -> setRect(QRectF(e -> scenePos(), QSizeF(0.0, 0.0))); @@ -156,6 +166,9 @@ void EditorScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) { case Ellipse: current_ellipse -> setRect(current_ellipse -> rect().normalized()); break; + case Arc: + current_arc-> setRect(current_arc -> rect().normalized()); + break; case Circle: current_circle -> setRect(current_circle -> rect().normalized()); break; @@ -336,6 +349,7 @@ void EditorScene::fromXml(const QDomDocument &xml_document) { else if (qde.tagName() == "polygon") cep = new PartPolygon (0, this); else if (qde.tagName() == "terminal") cep = new PartTerminal(0, this); else if (qde.tagName() == "text") cep = new PartText (0, this); + else if (qde.tagName() == "arc") cep = new PartArc (0, this); else continue; if (QGraphicsItem *qgi = dynamic_cast(cep)) qgi -> setZValue(z++); cep -> fromXml(qde); diff --git a/editor/editorscene.h b/editor/editorscene.h index a5405d2d0..2a20db8fb 100644 --- a/editor/editorscene.h +++ b/editor/editorscene.h @@ -8,6 +8,7 @@ class PartLine; class PartEllipse; class PartCircle; class PartPolygon; +class PartArc; class EditorScene : public QGraphicsScene { Q_OBJECT @@ -41,6 +42,7 @@ class EditorScene : public QGraphicsScene { PartEllipse *current_ellipse; PartCircle *current_circle; PartPolygon *current_polygon; + PartArc *current_arc; // methodes public: diff --git a/editor/partarc.cpp b/editor/partarc.cpp new file mode 100644 index 000000000..6af4c130b --- /dev/null +++ b/editor/partarc.cpp @@ -0,0 +1,98 @@ +#include "partarc.h" +#include "arceditor.h" + +PartArc::PartArc(QGraphicsItem *parent, QGraphicsScene *scene) : + QGraphicsEllipseItem(parent, scene), + CustomElementGraphicPart(), + _angle(-90), + start_angle(0) +{ + setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); + setAcceptedMouseButtons(Qt::LeftButton); + informations = new ArcEditor(this); + style_editor -> appendWidget(informations); +} + +void PartArc::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) { + applyStylesToQPainter(*painter); + // enleve systematiquement la couleur de fond + painter -> setBrush(Qt::NoBrush); + QPen t = painter -> pen(); + if (isSelected()) { + // dessine l'ellipse en noir + painter -> drawEllipse(rect()); + + // dessine l'arc en rouge + t.setColor(Qt::red); + painter -> setPen(t); + } + painter -> drawArc(rect(), start_angle * 16, _angle * 16); + if (isSelected()) { + // dessine la croix au centre de l'ellipse + painter -> setRenderHint(QPainter::Antialiasing, false); + painter -> setPen((painter -> brush().color() == QColor(Qt::black) && painter -> brush().isOpaque()) ? Qt::yellow : Qt::blue); + QPointF center = rect().center(); + painter -> drawLine(QLineF(center.x() - 2.0, center.y(), center.x() + 2.0, center.y())); + painter -> drawLine(QLineF(center.x(), center.y() - 2.0, center.x(), center.y() + 2.0)); + } +} + +const QDomElement PartArc::toXml(QDomDocument &xml_document) const { + QDomElement xml_element = xml_document.createElement("arc"); + QPointF top_left(sceneTopLeft()); + xml_element.setAttribute("x", top_left.x()); + xml_element.setAttribute("y", top_left.y()); + xml_element.setAttribute("width", rect().width()); + xml_element.setAttribute("height", rect().height()); + xml_element.setAttribute("start", start_angle); + xml_element.setAttribute("angle", _angle); + stylesToXml(xml_element); + return(xml_element); +} + +void PartArc::fromXml(const QDomElement &qde) { + stylesFromXml(qde); + setRect( + QRectF( + mapFromScene( + qde.attribute("x", "0").toDouble(), + qde.attribute("y", "0").toDouble() + ), + QSizeF( + qde.attribute("width", "0").toDouble(), + qde.attribute("height", "0").toDouble() + ) + ) + ); + setStartAngle(qde.attribute("start", "0").toInt()); + setAngle(qde.attribute("angle", "-90").toInt()); +} + +QPointF PartArc::sceneTopLeft() const { + return(mapToScene(rect().topLeft())); +} + +QVariant PartArc::itemChange(GraphicsItemChange change, const QVariant &value) { + if (scene()) { + if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemSelectedChange) { + informations -> updateForm(); + } + } + return(QGraphicsEllipseItem::itemChange(change, value)); +} + +void PartArc::setAngle(int a) { + _angle = a; +} + +void PartArc::setStartAngle(int a) { + start_angle = a; +} + +int PartArc::angle() const { + return(_angle); +} + +int PartArc::startAngle() const { + return(start_angle); +} diff --git a/editor/partarc.h b/editor/partarc.h new file mode 100644 index 000000000..df1fb2aa3 --- /dev/null +++ b/editor/partarc.h @@ -0,0 +1,37 @@ +#ifndef PART_ARC_H +#define PART_ARC_H +#include +#include "customelementgraphicpart.h" +class ArcEditor; +class PartArc : public QGraphicsEllipseItem, public CustomElementGraphicPart { + // constructeurs, destructeur + public: + PartArc(QGraphicsItem * = 0, QGraphicsScene * = 0); + virtual ~PartArc() { + qDebug() << "~PartArc()"; + } + + private: + PartArc(const PartArc &); + + // attributs + private: + ArcEditor *informations; + int _angle; + int start_angle; + + // methodes + public: + virtual void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget * = 0); + virtual const QDomElement toXml(QDomDocument &) const; + virtual void fromXml(const QDomElement &); + virtual QPointF sceneTopLeft() const; + virtual void setAngle(int); + virtual void setStartAngle(int); + virtual int angle() const; + virtual int startAngle() const; + + protected: + QVariant itemChange(GraphicsItemChange, const QVariant &); +}; +#endif diff --git a/editor/partpolygon.cpp b/editor/partpolygon.cpp index f26bab61b..e8670ddda 100644 --- a/editor/partpolygon.cpp +++ b/editor/partpolygon.cpp @@ -39,6 +39,7 @@ const QDomElement PartPolygon::toXml(QDomDocument &xml_document) const { QDomElement xml_element = xml_document.createElement("polygon"); int i = 1; foreach(QPointF point, polygon()) { + point = mapToScene(point); xml_element.setAttribute(QString("x%1").arg(i), point.x()); xml_element.setAttribute(QString("y%1").arg(i), point.y()); ++ i; diff --git a/qelectrotech.pro b/qelectrotech.pro index df9740a8c..4e33e5079 100644 --- a/qelectrotech.pro +++ b/qelectrotech.pro @@ -49,7 +49,9 @@ HEADERS += aboutqet.h \ editor/partterminal.h \ editor/terminaleditor.h \ editor/parttext.h \ - editor/texteditor.h + editor/texteditor.h \ + editor/partarc.h \ + editor/arceditor.h SOURCES += aboutqet.cpp \ borderinset.cpp \ conducer.cpp \ @@ -92,7 +94,9 @@ SOURCES += aboutqet.cpp \ editor/partterminal.cpp \ editor/terminaleditor.cpp \ editor/parttext.cpp \ - editor/texteditor.cpp + editor/texteditor.cpp \ + editor/partarc.cpp \ + editor/arceditor.cpp RESOURCES += qelectrotech.qrc TRANSLATIONS += lang/qet_en.ts lang/qt_fr.ts QT += xml