diff --git a/sources/editor/ellipseeditor.cpp b/sources/editor/ellipseeditor.cpp deleted file mode 100644 index 02c6d7a01..000000000 --- a/sources/editor/ellipseeditor.cpp +++ /dev/null @@ -1,271 +0,0 @@ -/* - Copyright 2006-2020 The QElectroTech Team - This file is part of QElectroTech. - - QElectroTech is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. - - QElectroTech is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with QElectroTech. If not, see . -*/ -#include "ellipseeditor.h" -#include "styleeditor.h" -#include "partellipse.h" -#include "QPropertyUndoCommand/qpropertyundocommand.h" -#include "elementscene.h" - -/** - Constructeur - @param editor L'editeur d'element concerne - @param ellipse L'ellipse a editer - @param parent le Widget parent -*/ -EllipseEditor::EllipseEditor(QETElementEditor *editor, PartEllipse *ellipse, QWidget *parent) : - ElementItemEditor(editor, parent), - part(ellipse), - m_locked(false) -{ - style_ = new StyleEditor(editor); - - x = new QDoubleSpinBox(); - y = new QDoubleSpinBox(); - h = new QDoubleSpinBox(); - v = new QDoubleSpinBox(); - - x->setRange(-5000, 5000); - y->setRange(-5000, 5000); - h->setRange(-5000, 5000); - v->setRange(-5000, 5000); - - 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, Qt::AlignRight); - grid -> addWidget(x, 1, 1); - grid -> addWidget(new QLabel("y"), 1, 2); - grid -> addWidget(y, 1, 3); - grid -> addWidget(new QLabel(tr("Diamètres : ")), 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); - - v_layout -> addWidget(style_); - v_layout -> addLayout(grid); - v_layout->addStretch(); - - activeConnections(true); - updateForm(); -} - -/// Destructeur -EllipseEditor::~EllipseEditor() -{ -} - -void EllipseEditor::setUpChangeConnections() -{ - m_change_connections << connect(part, &PartEllipse::rectChanged, this, &EllipseEditor::updateForm); -} - -void EllipseEditor::disconnectChangeConnections() -{ - for (QMetaObject::Connection c : m_change_connections) { - disconnect(c); - } - m_change_connections.clear(); -} - -/** - 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) - { - if (part) - disconnectChangeConnections(); - part = nullptr; - return(true); - } - if (PartEllipse *part_ellipse = dynamic_cast(new_part)) - { - if (part == part_ellipse) return true; - if (part) - disconnectChangeConnections(); - part = part_ellipse; - updateForm(); - setUpChangeConnections(); - return(true); - } - return(false); -} - -bool EllipseEditor::setParts(QList parts) -{ - if (parts.isEmpty()) - return false; - - if (!setPart(parts.first())) - return false; - return style_->setParts(parts); -} - -/** - @return la primitive actuellement editee, ou 0 si ce widget n'en edite pas -*/ -CustomElementPart *EllipseEditor::currentPart() const -{ - return(part); -} - -QList EllipseEditor::currentParts() const -{ - return style_->currentParts(); -} - -void EllipseEditor::editingFinishedX() -{ - if (m_locked) return; - m_locked = true; - - for (auto part: style_->currentParts()) { - - PartEllipse* ell = static_cast(part); - QRectF rect = ell->property("rect").toRectF(); - QPointF point = ell->mapFromScene(x->value() - h->value()/2, y->value() - v->value()/2); // does not matter which value y is, because only the x value is used - rect.setX(point.x()); // change only the x value - - if (rect != part->property("rect")) - { - QPropertyUndoCommand *undo= new QPropertyUndoCommand(ell, "rect", ell->property("rect"), rect); - undo->setText("Modifier un arc"); - undo->enableAnimation(); - elementScene()->undoStack().push(undo); - } - } - - m_locked = false; -} - -void EllipseEditor::editingFinishedY() -{ - if (m_locked) return; - m_locked = true; - - for (auto part: style_->currentParts()) { - - PartEllipse* ell = static_cast(part); - QRectF rect = ell->property("rect").toRectF(); - - QPointF point = ell->mapFromScene(x->value() - h->value()/2, y->value() - v->value()/2); - rect.setY(point.y()); - - if (rect != ell->property("rect")) - { - QPropertyUndoCommand *undo= new QPropertyUndoCommand(ell, "rect", ell->property("rect"), rect); - undo->setText("Modifier un arc"); - undo->enableAnimation(); - elementScene()->undoStack().push(undo); - } - - } - - m_locked = false; -} - -void EllipseEditor::editingFinishedH() -{ - if (m_locked) return; - m_locked = true; - - for (auto part: style_->currentParts()) { - - PartEllipse* ell = static_cast(part); - QRectF rect = ell->property("rect").toRectF(); - - if (rect.width() != h->value()) - { - rect.setWidth(h->value()); - QPropertyUndoCommand *undo= new QPropertyUndoCommand(ell, "rect", ell->property("rect"), rect); - undo->setText("Modifier un arc"); - undo->enableAnimation(); - elementScene()->undoStack().push(undo); - } - } - - m_locked = false; -} - -void EllipseEditor::editingFinishedV() -{ - if (m_locked) return; - m_locked = true; - - for (auto part: style_->currentParts()) { - - PartEllipse* ell = static_cast(part); - QRectF rect = ell->property("rect").toRectF(); - - if (rect.height() != v->value()) - { - rect.setHeight(v->value()); - QPropertyUndoCommand *undo= new QPropertyUndoCommand(ell, "rect", ell->property("rect"), rect); - undo->setText("Modifier un arc"); - undo->enableAnimation(); - elementScene()->undoStack().push(undo); - } - } - - m_locked = false; -} - -/** - Met a jour le formulaire d'edition -*/ -void EllipseEditor::updateForm() -{ - if (!part) return; - activeConnections(false); - QRectF rect = part->property("rect").toRectF(); - x->setValue(part->mapToScene(rect.topLeft()).x() + (rect.width()/2)); - y->setValue(part->mapToScene(rect.topLeft()).y() + (rect.height()/2)); - h->setValue(rect.width()); - v->setValue(rect.height()); - activeConnections(true); -} - -/** - Active ou desactive les connexionx signaux/slots entre les widgets internes. - @param active true pour activer les connexions, false pour les desactiver -*/ -void EllipseEditor::activeConnections(bool active) -{ - if (active) - { - connect(x, SIGNAL(editingFinished()), this, SLOT(editingFinishedX())); - connect(y, SIGNAL(editingFinished()), this, SLOT(editingFinishedY())); - connect(h, SIGNAL(editingFinished()), this, SLOT(editingFinishedH())); - connect(v, SIGNAL(editingFinished()), this, SLOT(editingFinishedV())); - } - else - { - disconnect(x, SIGNAL(editingFinished()), this, SLOT(editingFinishedX())); - disconnect(y, SIGNAL(editingFinished()), this, SLOT(editingFinishedY())); - disconnect(h, SIGNAL(editingFinished()), this, SLOT(editingFinishedH())); - disconnect(v, SIGNAL(editingFinished()), this, SLOT(editingFinishedV())); - } -} diff --git a/sources/editor/ui/ellipseeditor.cpp b/sources/editor/ui/ellipseeditor.cpp new file mode 100644 index 000000000..5f2cb65cd --- /dev/null +++ b/sources/editor/ui/ellipseeditor.cpp @@ -0,0 +1,177 @@ +/* + Copyright 2006-2020 The QElectroTech Team + This file is part of QElectroTech. + + QElectroTech is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + QElectroTech is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with QElectroTech. If not, see . +*/ +#include "ellipseeditor.h" +#include "ui_ellipseeditor.h" +#include "partellipse.h" +#include "styleeditor.h" +#include "QPropertyUndoCommand/qpropertyundocommand.h" +#include "elementscene.h" + +/** + * @brief EllipseEditor::EllipseEditor + * @param editor + * @param part + * @param parent + */ +EllipseEditor::EllipseEditor(QETElementEditor *editor, PartEllipse *part, QWidget *parent) : + ElementItemEditor(editor, parent), + ui(new Ui::EllipseEditor), + m_part(part) +{ + ui->setupUi(this); + m_style = new StyleEditor(editor); + ui->m_main_layout->insertWidget(0, m_style); + updateForm(); +} + +/** + * @brief EllipseEditor::~EllipseEditor + */ +EllipseEditor::~EllipseEditor() +{ + delete ui; +} + +/** + * @brief EllipseEditor::setPart + * @param part + * @return + */ +bool EllipseEditor::setPart(CustomElementPart *part) +{ + disconnectChangeConnections(); + if (!part) + { + m_part = nullptr; + return true; + } + if (PartEllipse *part_ellipse = dynamic_cast(part)) + { + if (m_part == part_ellipse) { + return true; + } + + m_part = part_ellipse; + setUpChangeConnections(); + updateForm(); + return true; + } + return false; +} + +/** + * @brief EllipseEditor::setParts + * @param parts + * @return + */ +bool EllipseEditor::setParts(QList parts) +{ + if (parts.isEmpty()) { + return false; + } + + if (!setPart(parts.first())) { + return false; + } + + return m_style->setParts(parts); +} + +/** + * @brief EllipseEditor::currentPart + * @return + */ +CustomElementPart *EllipseEditor::currentPart() const { + return m_part; +} + +/** + * @brief EllipseEditor::currentParts + * @return + */ +QList EllipseEditor::currentParts() const { + return m_style->currentParts(); +} + +/** + * @brief EllipseEditor::updateForm + */ +void EllipseEditor::updateForm() +{ + if (!m_part) { + return; + } + + QRectF rect = m_part->property("rect").toRectF(); + ui->m_x_sb->setValue(m_part->mapToScene(rect.topLeft()).x() + (rect.width()/2)); + ui->m_y_sb->setValue(m_part->mapToScene(rect.topLeft()).y() + (rect.height()/2)); + ui->m_horizontal_diameter_sb->setValue(rect.width()); + ui->m_vertical_diameter_sb->setValue(rect.height()); +} + +void EllipseEditor::on_m_x_sb_editingFinished() { updateRect(); } +void EllipseEditor::on_m_y_sb_editingFinished() { updateRect(); } +void EllipseEditor::on_m_horizontal_diameter_sb_editingFinished() { updateRect(); } +void EllipseEditor::on_m_vertical_diameter_sb_editingFinished() { updateRect(); } + +/** + * @brief EllipseEditor::updateRect + */ +void EllipseEditor::updateRect() +{ + QRectF rect; + + auto pos_ = m_part->mapFromScene(QPointF(ui->m_x_sb->value(), ui->m_y_sb->value())); + rect.setX(pos_.x() - ui->m_horizontal_diameter_sb->value()/2); + rect.setY(pos_.y() - ui->m_vertical_diameter_sb->value()/2); + rect.setWidth(ui->m_horizontal_diameter_sb->value()); + rect.setHeight(ui->m_vertical_diameter_sb->value()); + + for (auto part: m_style->currentParts()) + { + auto ellipse = static_cast(part); + if (rect != part->property("rect")) + { + auto undo= new QPropertyUndoCommand(ellipse, "rect", ellipse->property("rect"), rect); + undo->setText("Modifier un arc"); + undo->enableAnimation(); + elementScene()->undoStack().push(undo); + } + } +} + +/** + * @brief EllipseEditor::setUpChangeConnections + */ +void EllipseEditor::setUpChangeConnections() +{ + m_change_connections << connect(m_part, &PartEllipse::xChanged, this, &EllipseEditor::updateForm); + m_change_connections << connect(m_part, &PartEllipse::yChanged, this, &EllipseEditor::updateForm); + m_change_connections << connect(m_part, &PartEllipse::rectChanged, this, &EllipseEditor::updateForm); +} + +/** + * @brief EllipseEditor::disconnectChangeConnections + */ +void EllipseEditor::disconnectChangeConnections() +{ + for (QMetaObject::Connection c : m_change_connections) { + disconnect(c); + } + m_change_connections.clear(); +} diff --git a/sources/editor/ellipseeditor.h b/sources/editor/ui/ellipseeditor.h similarity index 56% rename from sources/editor/ellipseeditor.h rename to sources/editor/ui/ellipseeditor.h index 6dca2d015..c58d25ff9 100644 --- a/sources/editor/ellipseeditor.h +++ b/sources/editor/ui/ellipseeditor.h @@ -1,72 +1,67 @@ /* Copyright 2006-2020 The QElectroTech Team This file is part of QElectroTech. - + QElectroTech is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. - + QElectroTech is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with QElectroTech. If not, see . */ -#ifndef ELLIPSE_EDITOR_H -#define ELLIPSE_EDITOR_H +#ifndef ELLIPSEEDITOR_H +#define ELLIPSEEDITOR_H #include "elementitemeditor.h" +namespace Ui { + class EllipseEditor; +} + class PartEllipse; class StyleEditor; -class QDoubleSpinBox; /** - This class provides a widget to edit ellipses within the element editor. -*/ + * @brief The EllipseEditor class + * This class provide a widget used to edit the properties of a @PartEllipse + */ class EllipseEditor : public ElementItemEditor { - Q_OBJECT + Q_OBJECT - // constructors, destructor public: - EllipseEditor(QETElementEditor *, PartEllipse * = nullptr, QWidget * = nullptr); + explicit EllipseEditor (QETElementEditor *editor, PartEllipse *part = nullptr, QWidget *parent = nullptr); ~EllipseEditor() override; - private: - EllipseEditor(const EllipseEditor &); - - // attributes - private: - PartEllipse *part; - StyleEditor *style_; - QDoubleSpinBox *x, *y, *h, *v; - bool m_locked; - QList m_change_connections; - - // methods - public: - bool setPart(CustomElementPart *) override; - bool setParts(QList parts) override; + + bool setPart(CustomElementPart *part) override; + bool setParts(QList parts) override; CustomElementPart *currentPart() const override; QList currentParts() const override; - - public slots: - void editingFinishedX(); - void editingFinishedY(); - void editingFinishedH(); - void editingFinishedV(); void updateForm() override; - + + private slots: + void on_m_x_sb_editingFinished(); + void on_m_y_sb_editingFinished(); + void on_m_horizontal_diameter_sb_editingFinished(); + void on_m_vertical_diameter_sb_editingFinished(); + private: - void activeConnections(bool); - /** - @brief setUpChangeConnections - Setup the connection from the ellipse(s) to the widget, to update it when the ellipse(s) are changed (moved ...) - */ + void updateRect(); void setUpChangeConnections(); void disconnectChangeConnections(); + + private: + Ui::EllipseEditor *ui; + PartEllipse *m_part = nullptr; + StyleEditor *m_style = nullptr; + QList m_change_connections; + }; -#endif + +#endif // ELLIPSEEDITOR_H diff --git a/sources/editor/ui/ellipseeditor.ui b/sources/editor/ui/ellipseeditor.ui new file mode 100644 index 000000000..3f88c5c12 --- /dev/null +++ b/sources/editor/ui/ellipseeditor.ui @@ -0,0 +1,134 @@ + + + EllipseEditor + + + + 0 + 0 + 314 + 173 + + + + Form + + + + + + + + + Centre : + + + + + + + Y + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + -10000.000000000000000 + + + 10000.000000000000000 + + + + + + + -10000.000000000000000 + + + 10000.000000000000000 + + + + + + + X + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Vertical : + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + -10000.000000000000000 + + + 10000.000000000000000 + + + + + + + Horizontal : + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + -10000.000000000000000 + + + 10000.000000000000000 + + + + + + + Diamètres : + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + +