[qet] [4722] Element editor : add new handler for arc to resize angle with mouse. |
[ Thread Index |
Date Index
| More lists.tuxfamily.org/qet Archives
]
Revision: 4722
Author: blacksun
Date: 2016-09-25 10:14:29 +0200 (Sun, 25 Sep 2016)
Log Message:
-----------
Element editor : add new handler for arc to resize angle with mouse.
Modified Paths:
--------------
trunk/sources/QetGraphicsItemModeler/qetgraphicshandlerutility.cpp
trunk/sources/QetGraphicsItemModeler/qetgraphicshandlerutility.h
trunk/sources/editor/arceditor.cpp
trunk/sources/editor/graphicspart/abstractpartellipse.h
trunk/sources/editor/graphicspart/partarc.cpp
trunk/sources/editor/graphicspart/partarc.h
Modified: trunk/sources/QetGraphicsItemModeler/qetgraphicshandlerutility.cpp
===================================================================
--- trunk/sources/QetGraphicsItemModeler/qetgraphicshandlerutility.cpp 2016-09-20 02:28:07 UTC (rev 4721)
+++ trunk/sources/QetGraphicsItemModeler/qetgraphicshandlerutility.cpp 2016-09-25 08:14:29 UTC (rev 4722)
@@ -169,7 +169,29 @@
return (QVector<QPointF> {line.p1(), line.p2()});
}
+#include <QDebug>
/**
+ * @brief QetGraphicsHandlerUtility::pointsForArc
+ * Return the points for the given arc.
+ * The first value in the vector is the start point, the second the end point.
+ * @param rect
+ * @param start_angle : start angle in degree
+ * @param span_angle : span angle in degree;
+ * @return
+ */
+QVector<QPointF> QetGraphicsHandlerUtility::pointsForArc(const QRectF &rect, qreal start_angle, qreal span_angle)
+{
+ QVector<QPointF> vector;
+ QPainterPath path;
+ path.arcTo(rect, start_angle, 0);
+ vector.append(path.currentPosition());
+ path.arcTo(rect, start_angle, span_angle);
+ vector.append(path.currentPosition());
+ return vector;
+
+}
+
+/**
* @brief QetGraphicsHandlerUtility::rectForPosAtIndex
* Return a rectangle after modification of the point '@pos' at index '@index' of original rectangle '@old_rect'.
* @param old_rect - the rectangle befor modification
Modified: trunk/sources/QetGraphicsItemModeler/qetgraphicshandlerutility.h
===================================================================
--- trunk/sources/QetGraphicsItemModeler/qetgraphicshandlerutility.h 2016-09-20 02:28:07 UTC (rev 4721)
+++ trunk/sources/QetGraphicsItemModeler/qetgraphicshandlerutility.h 2016-09-25 08:14:29 UTC (rev 4722)
@@ -54,6 +54,7 @@
public:
static QVector <QPointF> pointsForRect (const QRectF &rect);
static QVector <QPointF> pointsForLine (const QLineF &line);
+ static QVector <QPointF> pointsForArc (const QRectF &rect, qreal start_angle, qreal span_angle);
static QRectF rectForPosAtIndex (const QRectF &old_rect, const QPointF &pos, int index);
static QRectF mirrorRectForPosAtIndex (const QRectF &old_rect, const QPointF &pos, int index);
static QLineF lineForPosAtIndex (const QLineF &old_line, const QPointF &pos, int index);
Modified: trunk/sources/editor/arceditor.cpp
===================================================================
--- trunk/sources/editor/arceditor.cpp 2016-09-20 02:28:07 UTC (rev 4721)
+++ trunk/sources/editor/arceditor.cpp 2016-09-25 08:14:29 UTC (rev 4722)
@@ -135,7 +135,7 @@
{
if (m_locked) return;
m_locked = true;
- double value = ((start_angle -> value() * -1) + 90) * 16;
+ double value = start_angle->value() * 16;
if (value != part->property("startAngle"))
{
@@ -156,7 +156,7 @@
{
if (m_locked) return;
m_locked = true;
- double value = angle -> value() * -16;
+ double value = angle->value() * 16;
if (value != part->property("spanAngle"))
{
@@ -204,8 +204,8 @@
y->setValue(part->mapToScene(rect.topLeft()).y() + (rect.height()/2));
h->setValue(rect.width());
v->setValue(rect.height());
- start_angle -> setValue(((part->property("startAngle").toInt() / 16) - 90) * -1);
- angle -> setValue(part->property("spanAngle").toInt() / -16);
+ start_angle->setValue(part->property("startAngle").toInt()/16);
+ angle->setValue(part->property("spanAngle").toInt()/16);
activeConnections(true);
}
Modified: trunk/sources/editor/graphicspart/abstractpartellipse.h
===================================================================
--- trunk/sources/editor/graphicspart/abstractpartellipse.h 2016-09-20 02:28:07 UTC (rev 4721)
+++ trunk/sources/editor/graphicspart/abstractpartellipse.h 2016-09-25 08:14:29 UTC (rev 4722)
@@ -73,8 +73,8 @@
protected:
QList<QPointF> saved_points_;
QRectF m_rect;
- int m_start_angle;
- int m_span_angle;
+ qreal m_start_angle;
+ qreal m_span_angle;
};
#endif // ABSTRACTPARTELLIPSE_H
Modified: trunk/sources/editor/graphicspart/partarc.cpp
===================================================================
--- trunk/sources/editor/graphicspart/partarc.cpp 2016-09-20 02:28:07 UTC (rev 4721)
+++ trunk/sources/editor/graphicspart/partarc.cpp 2016-09-25 08:14:29 UTC (rev 4722)
@@ -27,10 +27,7 @@
* @param parent : parent item
*/
PartArc::PartArc(QETElementEditor *editor, QGraphicsItem *parent) :
- AbstractPartEllipse(editor, parent),
- m_handler(10),
- m_handler_index(-1),
- m_undo_command(nullptr)
+ AbstractPartEllipse(editor, parent)
{
m_start_angle = 0;
m_span_angle = -1440;
@@ -87,8 +84,12 @@
if (isSelected())
{
drawCross(m_rect.center(), painter);
- if (scene()->selectedItems().size() == 1)
- m_handler.drawHandler(painter, m_handler.pointsForRect(m_rect));
+ if (scene()->selectedItems().size() == 1) {
+ if (m_resize_mode == 3)
+ m_handler.drawHandler(painter, m_handler.pointsForArc(m_rect, m_start_angle/16, m_span_angle/16));
+ else
+ m_handler.drawHandler(painter, m_handler.pointsForRect(m_rect));
+ }
}
}
@@ -124,8 +125,8 @@
QSizeF(qde.attribute("width", "0").toDouble(),
qde.attribute("height", "0").toDouble()) );
- m_start_angle = qde.attribute("start", "0").toInt() * 16;
- m_span_angle = qde.attribute("angle", "-1440").toInt() * 16;
+ m_start_angle = qde.attribute("start", "0").toDouble() * 16;
+ m_span_angle = qde.attribute("angle", "-1440").toDouble() * 16;
}
QRectF PartArc::boundingRect() const
@@ -179,19 +180,28 @@
return;
}
- int handler = m_handler.pointIsHoverHandler(event->pos(), m_handler.pointsForRect(m_rect));
+ if (m_resize_mode == 1 || m_resize_mode == 2) {
+ int handler = m_handler.pointIsHoverHandler(event->pos(), m_handler.pointsForRect(m_rect));
- if (handler >= 0)
- {
- if (handler == 0 || handler == 2 || handler == 5 || handler == 7)
+ if (handler >= 0)
+ {
+ if (handler == 0 || handler == 2 || handler == 5 || handler == 7)
+ setCursor(Qt::SizeAllCursor);
+ else if (handler == 1 || handler == 6)
+ setCursor(Qt::SizeVerCursor);
+ else if (handler == 3 || handler == 4)
+ setCursor(Qt::SizeHorCursor);
+
+ return;
+ }
+ }
+ else if (m_resize_mode == 3) {
+ if (m_handler.pointIsHoverHandler(event->pos(), m_handler.pointsForArc(m_rect, m_start_angle, m_span_angle)) >= 0)
setCursor(Qt::SizeAllCursor);
- else if (handler == 1 || handler == 6)
- setCursor(Qt::SizeVerCursor);
- else if (handler == 3 || handler == 4)
- setCursor(Qt::SizeHorCursor);
+ return;
}
- else
- CustomElementGraphicPart::hoverMoveEvent(event);
+
+ CustomElementGraphicPart::hoverMoveEvent(event);
}
/**
@@ -206,15 +216,43 @@
setCursor(Qt::ClosedHandCursor);
if (isSelected())
{
- m_handler_index = m_handler.pointIsHoverHandler(event->pos(), m_handler.pointsForRect(m_rect));
+ //resize rect
+ if (m_resize_mode == 1 || m_resize_mode == 2) {
+ m_handler_index = m_handler.pointIsHoverHandler(event->pos(), m_handler.pointsForRect(m_rect));
- if(m_handler_index >= 0 && m_handler_index <= 7) //User click on an handler
- {
- m_undo_command = new QPropertyUndoCommand(this, "rect", QVariant(m_rect));
- m_undo_command->setText(tr("Modifier un arc"));
- m_undo_command->enableAnimation();
- return;
+ if(m_handler_index >= 0 && m_handler_index <= 7) //User click on an handler
+ {
+ m_undo_command = new QPropertyUndoCommand(this, "rect", QVariant(m_rect));
+ m_undo_command->setText(tr("Modifier un arc"));
+ m_undo_command->enableAnimation();
+ return;
+ }
}
+ //resize angle
+ if (m_resize_mode == 3) {
+ m_handler_index = m_handler.pointIsHoverHandler(event->pos(), m_handler.pointsForArc(m_rect, m_start_angle/16, m_span_angle/16));
+ if (m_handler_index == 0) {
+ m_span_point = m_handler.pointsForArc(m_rect, m_start_angle/16, m_span_angle/16).at(1);
+
+ m_undo_command = new QPropertyUndoCommand(this, "startAngle", QVariant(m_start_angle));
+ m_undo_command->setText(tr("Modifier un arc"));
+ m_undo_command->enableAnimation();
+
+ m_undo_command2 = new QPropertyUndoCommand(this, "spanAngle", QVariant(m_span_angle), m_undo_command);
+ m_undo_command2->setText(tr("Modifier un arc"));
+ m_undo_command2->enableAnimation();
+
+ return;
+ }
+ else if (m_handler_index == 1) {
+ m_undo_command = new QPropertyUndoCommand(this, "spanAngle", QVariant(m_span_angle));
+ m_undo_command->setText(tr("Modifier un arc"));
+ m_undo_command->enableAnimation();
+
+ return;
+ }
+ }
+
}
}
@@ -228,18 +266,38 @@
*/
void PartArc::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
- if(m_handler_index >= 0 && m_handler_index <= 7)
- {
- QPointF pos_ = event->modifiers() == Qt::ControlModifier ? event->pos() : mapFromScene(elementScene()->snapToGrid(event->scenePos()));
- prepareGeometryChange();
+ if (m_resize_mode == 1 || m_resize_mode == 2) {
+ if (m_handler_index >= 0 && m_handler_index <= 7) {
+ QPointF pos_ = event->modifiers() == Qt::ControlModifier ? event->pos() : mapFromScene(elementScene()->snapToGrid(event->scenePos()));
+ prepareGeometryChange();
- if (m_resize_mode == 1)
- setRect(m_handler.rectForPosAtIndex(m_rect, pos_, m_handler_index));
- else
- setRect(m_handler.mirrorRectForPosAtIndex(m_rect, pos_, m_handler_index));
+ if (m_resize_mode == 1)
+ setRect(m_handler.rectForPosAtIndex(m_rect, pos_, m_handler_index));
+ else
+ setRect(m_handler.mirrorRectForPosAtIndex(m_rect, pos_, m_handler_index));
+
+ return;
+ }
}
- else
- CustomElementGraphicPart::mouseMoveEvent(event);
+ else if (m_resize_mode == 3) {
+ if (m_handler_index == 0 || m_handler_index == 1) {
+ QLineF line(m_rect.center(), event->pos());
+ prepareGeometryChange();
+
+ if (m_handler_index == 0) {
+ setStartAngle(line.angle()*16);
+ setSpanAngle(line.angleTo(QLineF(m_rect.center(), m_span_point))*16);
+ }
+ else if (m_handler_index == 1) {
+ QLineF line2(m_rect.center(), m_handler.pointsForArc(m_rect, m_start_angle/16, m_span_angle/16).at(0));
+ setSpanAngle (line2.angleTo(line)*16);
+ }
+
+ return;
+ }
+ }
+
+ CustomElementGraphicPart::mouseMoveEvent(event);
}
/**
@@ -255,18 +313,38 @@
switchResizeMode();
}
- if (m_handler_index >= 0 && m_handler_index <= 7)
- {
- if (!m_rect.isValid())
- m_rect = m_rect.normalized();
+ if (m_resize_mode == 1 || m_resize_mode == 2) {
+ if (m_handler_index >= 0 && m_handler_index <= 7) {
+ if (!m_rect.isValid())
+ m_rect = m_rect.normalized();
- m_undo_command->setNewValue(QVariant(m_rect));
- elementScene()->undoStack().push(m_undo_command);
- m_undo_command = nullptr;
- m_handler_index = -1;
+ m_undo_command->setNewValue(QVariant(m_rect));
+ elementScene()->undoStack().push(m_undo_command);
+ m_undo_command = nullptr;
+ m_handler_index = -1;
+ return;
+ }
}
- else
- CustomElementGraphicPart::mouseReleaseEvent(event);
+ else if (m_resize_mode == 3) {
+ if (m_handler_index == 0) {
+ m_undo_command->setNewValue(QVariant(m_start_angle));
+ m_undo_command2->setNewValue(QVariant(m_span_angle));
+ elementScene()->undoStack().push(m_undo_command);
+ m_undo_command = nullptr;
+ m_undo_command2 = nullptr;
+ m_handler_index = -1;
+ return;
+ }
+ else if (m_handler_index == 1) {
+ m_undo_command->setNewValue(QVariant(m_span_angle));
+ elementScene()->undoStack().push(m_undo_command);
+ m_undo_command = nullptr;
+ m_handler_index = -1;
+ return;
+ }
+ }
+
+ CustomElementGraphicPart::mouseReleaseEvent(event);
}
void PartArc::switchResizeMode()
@@ -275,6 +353,10 @@
m_resize_mode = 2;
m_handler.setOuterColor(Qt::darkGreen);
}
+ else if (m_resize_mode == 2 ) {
+ m_resize_mode = 3;
+ m_handler.setOuterColor(Qt::magenta);
+ }
else {
m_resize_mode = 1;
m_handler.setOuterColor(Qt::blue);
Modified: trunk/sources/editor/graphicspart/partarc.h
===================================================================
--- trunk/sources/editor/graphicspart/partarc.h 2016-09-20 02:28:07 UTC (rev 4721)
+++ trunk/sources/editor/graphicspart/partarc.h 2016-09-25 08:14:29 UTC (rev 4722)
@@ -68,9 +68,11 @@
void switchResizeMode();
private:
- QetGraphicsHandlerUtility m_handler;
- int m_handler_index;
- QPropertyUndoCommand *m_undo_command;
+ QetGraphicsHandlerUtility m_handler = 10;
+ int m_handler_index = -1;
+ QPropertyUndoCommand *m_undo_command = nullptr;
+ QPropertyUndoCommand *m_undo_command2 = nullptr;
int m_resize_mode = 1;
+ QPointF m_span_point;
};
#endif