ellipse editor : use QPropertyUndoCommand instead of ChangePartCommand

git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@4067 bfdf4180-ca20-0410-9c96-a3a8aa849046
This commit is contained in:
blacksun
2015-07-23 09:57:09 +00:00
parent a00bfdf00f
commit 65d4b08c86
5 changed files with 106 additions and 161 deletions

View File

@@ -135,10 +135,16 @@ void ArcEditor::updateArcS()
{
if (m_locked) return;
m_locked = true;
QPropertyUndoCommand *undo= new QPropertyUndoCommand(part, "startAngle", part->property("startAngle"), ((start_angle -> value() * -1) + 90) * 16);
double value = ((start_angle -> value() * -1) + 90) * 16;
if (value != part->property("startAngle"))
{
QPropertyUndoCommand *undo= new QPropertyUndoCommand(part, "startAngle", part->property("startAngle"), value);
undo->setText("Modifier l'angle de depart d'un arc");
undo->enableAnimation();
elementScene()->undoStack().push(undo);
}
m_locked = false;
}
@@ -150,10 +156,16 @@ void ArcEditor::updateArcA()
{
if (m_locked) return;
m_locked = true;
QPropertyUndoCommand *undo= new QPropertyUndoCommand(part, "spanAngle", part->property("spanAngle"), angle -> value() * -16);
double value = angle -> value() * -16;
if (value != part->property("spanAngle"))
{
QPropertyUndoCommand *undo= new QPropertyUndoCommand(part, "spanAngle", part->property("spanAngle"), value);
undo->setText("Modifier l'angle d'un arc");
undo->enableAnimation();
elementScene()->undoStack().push(undo);
}
m_locked = false;
}
@@ -167,10 +179,15 @@ void ArcEditor::updateArcRect()
m_locked = true;
QPointF point = part->mapFromScene(x->value() - h->value()/2, y->value() - v->value()/2);
QRectF rect(point, QSizeF(h->value(), v->value()));
if (rect != part->property("rect"))
{
QPropertyUndoCommand *undo= new QPropertyUndoCommand(part, "rect", part->property("rect"), rect);
undo->setText("Modifier un arc");
undo->enableAnimation();
elementScene()->undoStack().push(undo);
}
m_locked = false;
}

View File

@@ -18,6 +18,8 @@
#include "ellipseeditor.h"
#include "styleeditor.h"
#include "partellipse.h"
#include "QPropertyUndoCommand/qpropertyundocommand.h"
#include "elementscene.h"
/**
Constructeur
@@ -27,7 +29,8 @@
*/
EllipseEditor::EllipseEditor(QETElementEditor *editor, PartEllipse *ellipse, QWidget *parent) :
ElementItemEditor(editor, parent),
part(ellipse)
part(ellipse),
m_locked(false)
{
style_ = new StyleEditor(editor);
@@ -74,20 +77,28 @@ EllipseEditor::~EllipseEditor() {
@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) {
bool EllipseEditor::setPart(CustomElementPart *new_part)
{
if (!new_part)
{
if (part)
disconnect(part, &PartEllipse::rectChanged, this, &EllipseEditor::updateForm);
part = 0;
style_ -> setPart(0);
return(true);
}
if (PartEllipse *part_ellipse = dynamic_cast<PartEllipse *>(new_part)) {
if (PartEllipse *part_ellipse = dynamic_cast<PartEllipse *>(new_part))
{
if (part == part_ellipse) return true;
if (part)
disconnect(part, &PartEllipse::rectChanged, this, &EllipseEditor::updateForm);
part = part_ellipse;
style_ -> setPart(part);
updateForm();
connect(part, &PartEllipse::rectChanged, this, &EllipseEditor::updateForm);
return(true);
} else {
return(false);
}
return(false);
}
/**
@@ -97,36 +108,36 @@ 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("centerX", x -> value());
part -> setProperty("centerY", y -> value());
part -> setProperty("diameter_h", h -> value());
part -> setProperty("diameter_v", v -> value());
}
void EllipseEditor::editingFinished()
{
if (m_locked) return;
m_locked = true;
QPointF point = part->mapFromScene(x->value() - h->value()/2, y->value() - v->value()/2);
QRectF rect(point, QSizeF(h->value(), v->value()));
/// Met a jour l'abscisse du centre de l'ellipse et cree un objet d'annulation
void EllipseEditor::updateEllipseX() { addChangePartCommand(tr("abscisse"), part, "centerX", x -> value()); }
/// Met a jour l'ordonnee du centre de l'ellipse et cree un objet d'annulation
void EllipseEditor::updateEllipseY() { addChangePartCommand(tr("ordonnée"), part, "centerY", y -> value()); }
/// Met a jour le diametre horizontal de l'ellipse et cree un objet d'annulation
void EllipseEditor::updateEllipseH() { addChangePartCommand(tr("diamètre horizontal"), part, "diameter_h", h -> value()); }
/// Met a jour le diametre vertical de l'ellipse et cree un objet d'annulation
void EllipseEditor::updateEllipseV() { addChangePartCommand(tr("diamètre vertical"), part, "diameter_v", v -> value()); }
if (rect != part->property("rect"))
{
QPropertyUndoCommand *undo= new QPropertyUndoCommand(part, "rect", part->property("rect"), rect);
undo->setText("Modifier une ellipse");
undo->enableAnimation();
elementScene()->undoStack().push(undo);
}
m_locked = false;
}
/**
Met a jour le formulaire d'edition
*/
void EllipseEditor::updateForm() {
void EllipseEditor::updateForm()
{
if (!part) return;
activeConnections(false);
x->setValue(part->property("centerX").toReal());
y->setValue(part->property("centerY").toReal());
h->setValue(part->property("diameter_h").toReal());
v->setValue(part->property("diameter_v").toReal());
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);
}
@@ -134,16 +145,20 @@ void EllipseEditor::updateForm() {
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(updateEllipseX()));
connect(y, SIGNAL(editingFinished()), this, SLOT(updateEllipseY()));
connect(h, SIGNAL(editingFinished()), this, SLOT(updateEllipseH()));
connect(v, SIGNAL(editingFinished()), this, SLOT(updateEllipseV()));
} else {
disconnect(x, SIGNAL(editingFinished()), this, SLOT(updateEllipseX()));
disconnect(y, SIGNAL(editingFinished()), this, SLOT(updateEllipseY()));
disconnect(h, SIGNAL(editingFinished()), this, SLOT(updateEllipseH()));
disconnect(v, SIGNAL(editingFinished()), this, SLOT(updateEllipseV()));
void EllipseEditor::activeConnections(bool active)
{
if (active)
{
connect(x, SIGNAL(editingFinished()), this, SLOT(editingFinished()));
connect(y, SIGNAL(editingFinished()), this, SLOT(editingFinished()));
connect(h, SIGNAL(editingFinished()), this, SLOT(editingFinished()));
connect(v, SIGNAL(editingFinished()), this, SLOT(editingFinished()));
}
else
{
disconnect(x, SIGNAL(editingFinished()), this, SLOT(editingFinished()));
disconnect(y, SIGNAL(editingFinished()), this, SLOT(editingFinished()));
disconnect(h, SIGNAL(editingFinished()), this, SLOT(editingFinished()));
disconnect(v, SIGNAL(editingFinished()), this, SLOT(editingFinished()));
}
}

View File

@@ -17,15 +17,20 @@
*/
#ifndef ELLIPSE_EDITOR_H
#define ELLIPSE_EDITOR_H
#include <QtWidgets>
#include "elementitemeditor.h"
class PartEllipse;
class StyleEditor;
class QDoubleSpinBox;
/**
This class provides a widget to edit ellipses within the element editor.
*/
class EllipseEditor : public ElementItemEditor {
class EllipseEditor : public ElementItemEditor
{
Q_OBJECT
// constructors, destructor
public:
EllipseEditor(QETElementEditor *, PartEllipse * = 0, QWidget * = 0);
@@ -38,6 +43,7 @@ class EllipseEditor : public ElementItemEditor {
PartEllipse *part;
StyleEditor *style_;
QDoubleSpinBox *x, *y, *h, *v;
bool m_locked;
// methods
public:
@@ -45,11 +51,7 @@ class EllipseEditor : public ElementItemEditor {
virtual CustomElementPart *currentPart() const;
public slots:
void updateEllipse();
void updateEllipseX();
void updateEllipseY();
void updateEllipseH();
void updateEllipseV();
void editingFinished();
void updateForm();
private:

View File

@@ -159,74 +159,3 @@ void AbstractPartEllipse::setSpanAngle(const int &span_angle)
m_span_angle = span_angle;
emit spanAngleChanged();
}
/**
* @brief AbstractPartEllipse::setCenterX
* Like setCenter but Y keep unchanged
* See setCenter(const QPointF &center)
* @param x
*/
void AbstractPartEllipse::setCenterX(const qreal x)
{
QPointF pos = mapToParent(m_rect.center());
pos.setX(x);
setCenter(pos);
}
/**
* @brief AbstractPartEllipse::setCenterY
* Like setCenter but X keep unchanged
* See setCenter(const QPointF &center)
* @param y
*/
void AbstractPartEllipse::setCenterY(const qreal y)
{
QPointF pos = mapToParent(m_rect.center());
pos.setY(y);
setCenter(pos);
}
/**
* @brief AbstractPartEllipse::setCenter
* This is a convenience method to setPos().
* Adjust the position of this item,
* so that the center of the rectangle is at the given position(position in parent coordinates).
* @param center
*/
void AbstractPartEllipse::setCenter(const QPointF &center)
{
QPointF pos = center - m_rect.center();
setPos(pos);
}
/**
* @brief AbstractPartEllipse::setWidth
* Set new width for rectangle.
* The center of rectangle is unchanged,
* The coordinates of the left side and right side of the rectangle change
* @param w
*/
void AbstractPartEllipse::setWidth(const qreal w)
{
qreal new_width = qAbs(w);
QRectF current_rect = rect();
current_rect.translate((new_width - current_rect.width()) / -2.0, 0.0);
current_rect.setWidth(new_width);
setRect(current_rect);
}
/**
* @brief AbstractPartEllipse::setHeight
* Set new height for rectangle
* The center of rectangle is unchanged
* The coordinates of the top side and bottom side of the rectangle change
* @param h
*/
void AbstractPartEllipse::setHeight(const qreal h)
{
qreal new_height = qAbs(h);
QRectF current_rect = rect();
current_rect.translate(0.0, (new_height - current_rect.height()) / -2.0);
current_rect.setHeight(new_height);
setRect(current_rect);
}

View File

@@ -35,10 +35,6 @@ class AbstractPartEllipse : public CustomElementGraphicPart
Q_OBJECT
Q_PROPERTY(int startAngle READ startAngle WRITE setStartAngle)
Q_PROPERTY(int spanAngle READ spanAngle WRITE setSpanAngle)
Q_PROPERTY(qreal centerX READ centerX WRITE setCenterX)
Q_PROPERTY(qreal centerY READ centerY WRITE setCenterY)
Q_PROPERTY(qreal diameter_h READ width WRITE setWidth)
Q_PROPERTY(qreal diameter_v READ height WRITE setHeight)
Q_PROPERTY(QRectF rect READ rect WRITE setRect)
// constructors, destructor
@@ -74,20 +70,6 @@ class AbstractPartEllipse : public CustomElementGraphicPart
int spanAngle () const {return m_span_angle;}
void setSpanAngle (const int &span_angle);
qreal centerX() const {return mapToScene(rect().center()).x() ;}
void setCenterX(const qreal x);
qreal centerY() const {return mapToScene(rect().center()).y();}
void setCenterY(const qreal y);
void setCenter (const QPointF &center);
qreal width() const {return rect().width();}
void setWidth(const qreal w);
qreal height() const {return rect().height();}
void setHeight (const qreal h);
protected:
QList<QPointF> saved_points_;
QRectF m_rect;