[qet] [4050] QetShapeItem -> handler : handler is draw at the same size at screen, no matter the curent zoom |
[ Thread Index |
Date Index
| More lists.tuxfamily.org/qet Archives
]
Revision: 4050
Author: blacksun
Date: 2015-07-15 18:54:30 +0200 (Wed, 15 Jul 2015)
Log Message:
-----------
QetShapeItem -> handler : handler is draw at the same size at screen, no matter the curent zoom
Modified Paths:
--------------
trunk/sources/QetGraphicsItemModeler/qetgraphicshandlerutility.cpp
trunk/sources/QetGraphicsItemModeler/qetgraphicshandlerutility.h
trunk/sources/qetgraphicsitem/qetshapeitem.cpp
trunk/sources/qetgraphicsitem/qetshapeitem.h
Modified: trunk/sources/QetGraphicsItemModeler/qetgraphicshandlerutility.cpp
===================================================================
--- trunk/sources/QetGraphicsItemModeler/qetgraphicshandlerutility.cpp 2015-07-13 12:01:02 UTC (rev 4049)
+++ trunk/sources/QetGraphicsItemModeler/qetgraphicshandlerutility.cpp 2015-07-15 16:54:30 UTC (rev 4050)
@@ -16,50 +16,41 @@
along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
*/
#include "qetgraphicshandlerutility.h"
-#include <QPixmapCache>
#include <QPainter>
-#define QetGraphicsHandlerSquareSize 10
-
/**
- * @brief QetGraphicsHandlerUtility::pixmapHandler
- * @return The pixmap of an handler
+ * @brief QetGraphicsHandlerUtility::QetGraphicsHandlerUtility
+ * Constructor
+ * @param size : the size of the handler
*/
-QPixmap QetGraphicsHandlerUtility::pixmapHandler()
-{
- QPixmap handler(QetGraphicsHandlerSquareSize, QetGraphicsHandlerSquareSize);
+QetGraphicsHandlerUtility::QetGraphicsHandlerUtility(qreal size) :
+ m_size (size),
+ m_zoom_factor(1)
+{}
- if (!QPixmapCache::find("QetGraphicsHandler", handler))
- { //Pixmap isn't store in the QPixmapCache, we create it
- QColor inner(0xFF, 0xFF, 0xFF);
- QColor outer(0x00, 0x61, 0xFF);
-
- QPainter painter_(&handler);
- painter_.setBrush(QBrush(inner));
- QPen square_pen(QBrush(outer), 2.0, Qt::SolidLine, Qt::SquareCap, Qt::MiterJoin);
- square_pen.setCosmetic(true);
- painter_.setPen(square_pen);
- painter_.drawRect(0,0,10,10);
-
- //Store the pixmap in the QPixmapCache
- QPixmapCache::insert("QetGraphicsHandler", handler);
- }
- return handler;
-}
-
/**
- * @brief QetGraphicsHandlerUtility::posForHandler
- * Returns a QPointF at the good coordinates
- * for draw the handler pixmap centered on the point to modify
- * @param point : the point to modify
- * @return : point at the good coordinates to draw handler centered in @point
+ * @brief QetGraphicsHandlerUtility::DrawHandler
+ * Draw the handler at pos @point, using the QPainter @painter.
+ * @param painter : painter to use for drawing the handler
+ * @param point : point to draw the handler
*/
-QPointF QetGraphicsHandlerUtility::posForHandler(const QPointF &point)
+void QetGraphicsHandlerUtility::DrawHandler(QPainter *painter, const QPointF &point, bool color2)
{
- QPointF snap_point = point;
- snap_point.rx() -= QetGraphicsHandlerSquareSize/2;
- snap_point.ry() -= QetGraphicsHandlerSquareSize/2;
- return snap_point;
+ //Color of handler
+ QColor inner(0xFF, 0xFF, 0xFF);
+ QColor outer(0x00, 0x61, 0xFF);
+ if(color2) outer = QColor(0x1A, 0x5C, 0x14);
+ //Setup the zoom factor to draw the handler in the same size at screen,
+ //no matter the zoom of the QPainter
+ m_zoom_factor = 1.0/painter->transform().m11();
+
+ painter->save();
+ painter->setBrush(QBrush(inner));
+ QPen square_pen(QBrush(outer), 2, Qt::SolidLine, Qt::SquareCap, Qt::MiterJoin);
+ square_pen.setCosmetic(true);
+ painter->setPen(square_pen);
+ painter->drawRect(getRect(point));
+ painter->restore();
}
/**
@@ -68,10 +59,8 @@
* @param key_point : point at the center of handler (the point to modify, for exemple the corner of a rectangle)
* @return true if point is in a handler. else false
*/
-bool QetGraphicsHandlerUtility::pointIsInHandler(const QPointF &point, const QPointF &key_point)
-{
- QRectF handler (posForHandler(key_point), QSize(QetGraphicsHandlerSquareSize, QetGraphicsHandlerSquareSize));
- return handler.contains(point);
+bool QetGraphicsHandlerUtility::pointIsInHandler(const QPointF &point, const QPointF &key_point) const {
+ return (getRect(key_point).contains(point));
}
/**
@@ -80,7 +69,7 @@
* @param vector : vector of key_point (the point to modify, for exemple the corners of a rectangle)
* @return if point is hover an handler, return the index of the hovered key_point in the vector, else return -1
*/
-int QetGraphicsHandlerUtility::pointIsHoverHandler(const QPointF &point, const QVector<QPointF> &vector)
+int QetGraphicsHandlerUtility::pointIsHoverHandler(const QPointF &point, const QVector<QPointF> &vector) const
{
foreach (QPointF key_point, vector)
if (pointIsInHandler(point, key_point))
@@ -91,18 +80,44 @@
/**
* @brief QetGraphicsHandlerUtility::handlerRect
- * Return the rect of pixmap handler for all key_point in vector (the point to modify, for exemple the corners of a rectangle)
+ * Return the rect of the handler for all key_point in vector (the point to modify, for exemple the corners of a rectangle)
* The order of rect in the returned vector is the same as the given vector.
* @param vector
* @return
*/
-QVector<QRectF> QetGraphicsHandlerUtility::handlerRect(const QVector<QPointF> &vector)
+QVector<QRectF> QetGraphicsHandlerUtility::handlerRect(const QVector<QPointF> &vector) const
{
QVector <QRectF> rect_vector;
- QSize size(QetGraphicsHandlerSquareSize, QetGraphicsHandlerSquareSize);
foreach(QPointF point, vector)
- rect_vector << QRectF(posForHandler(point), size);
+ rect_vector << getRect(point);
return rect_vector;
}
+
+/**
+ * @brief QetGraphicsHandlerUtility::getRect
+ * @param point
+ * @return
+ */
+QRectF QetGraphicsHandlerUtility::getRect(const QPointF &point) const
+{
+ qreal rect_size = m_size * m_zoom_factor;
+ QRectF rect(point.x() - rect_size/2, point.y() - rect_size/2, rect_size, rect_size);
+ return rect;
+}
+
+/**
+ * @brief QetGraphicsHandlerUtility::pointsForRect
+ * Return the point of the rect in vector.
+ * The point are stored like this :
+ * top left, top right, bottom left, bottom right;
+ * @param rect
+ * @return
+ */
+QVector<QPointF> QetGraphicsHandlerUtility::pointsForRect(const QRectF &rect)
+{
+ QVector<QPointF> vector;
+ vector << rect.topLeft() << rect.topRight() << rect.bottomLeft() << rect.bottomRight();
+ return vector;
+}
Modified: trunk/sources/QetGraphicsItemModeler/qetgraphicshandlerutility.h
===================================================================
--- trunk/sources/QetGraphicsItemModeler/qetgraphicshandlerutility.h 2015-07-13 12:01:02 UTC (rev 4049)
+++ trunk/sources/QetGraphicsItemModeler/qetgraphicshandlerutility.h 2015-07-15 16:54:30 UTC (rev 4050)
@@ -18,21 +18,34 @@
#ifndef QETGRAPHICSHANDLERUTILITY_H
#define QETGRAPHICSHANDLERUTILITY_H
-#include <QPixmap>
+#include <QPointF>
+#include <QRectF>
+class QPainter;
+
/**
* @brief The QetGraphicsHandlerUtility class
- * This class provide some static methods to create and use handler for
+ * This class provide some methods to create and use handler for
* modify graphics shape like line rectangle etc...
*/
class QetGraphicsHandlerUtility
{
public:
- static QPixmap pixmapHandler();
- static QPointF posForHandler(const QPointF &point);
- static bool pointIsInHandler (const QPointF &point, const QPointF &key_point);
- static int pointIsHoverHandler (const QPointF &point, const QVector<QPointF> &vector);
- static QVector<QRectF> handlerRect (const QVector<QPointF> &vector);
+ QetGraphicsHandlerUtility (qreal size = 1);
+ void setSize(qreal size) {m_size = size;}
+ void DrawHandler (QPainter *painter, const QPointF & point, bool color2 = false);
+ QPointF posForHandler(const QPointF &point) const;
+ bool pointIsInHandler (const QPointF &point, const QPointF &key_point) const;
+ int pointIsHoverHandler (const QPointF &point, const QVector<QPointF> &vector) const;
+ QVector<QRectF> handlerRect (const QVector<QPointF> &vector) const;
+
+ private:
+ QRectF getRect (const QPointF &point) const;
+ qreal m_size;
+ qreal m_zoom_factor;
+
+ public:
+ static QVector <QPointF> pointsForRect (const QRectF & rect);
};
#endif // QETGRAPHICSHANDLERUTILITY_H
Modified: trunk/sources/qetgraphicsitem/qetshapeitem.cpp
===================================================================
--- trunk/sources/qetgraphicsitem/qetshapeitem.cpp 2015-07-13 12:01:02 UTC (rev 4049)
+++ trunk/sources/qetgraphicsitem/qetshapeitem.cpp 2015-07-15 16:54:30 UTC (rev 4050)
@@ -21,11 +21,8 @@
#include "qet.h"
#include "shapegraphicsitempropertieswidget.h"
#include "PropertiesEditor/propertieseditordialog.h"
-#include "QetGraphicsItemModeler/qetgraphicshandlerutility.h"
#include "qetshapegeometrycommand.h"
-typedef QetGraphicsHandlerUtility QGHU;
-
/**
* @brief QetShapeItem::QetShapeItem
* Constructor of shape item. point 1 and 2 must be in scene coordinate
@@ -42,8 +39,8 @@
m_P2 (p2),
m_hovered(false),
m_mouse_grab_handler(false),
- m_undo_command(nullptr)
-
+ m_undo_command(nullptr),
+ m_handler(10)
{
if (type == Polyline) m_polygon << m_P1 << m_P2;
setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
@@ -224,7 +221,7 @@
else
vector = m_polygon;
- foreach(QRectF r, QGHU::handlerRect(vector))
+ foreach(QRectF r, m_handler.handlerRect(vector))
path.addRect(r);
}
@@ -304,7 +301,7 @@
//Draw handler if shape is selected
if (isSelected())
foreach(QPointF point, point_vector)
- painter->drawPixmap(QGHU::posForHandler(point), QGHU::pixmapHandler());
+ m_handler.DrawHandler(painter, point);
}
/**
@@ -344,28 +341,13 @@
QVector <QPointF> vector;
switch (m_shapeType)
{
- case Line:
- vector << m_P1 << m_P2;
- break;
-
- case Rectangle: {
- QRectF rect (m_P1, m_P2);
- vector << rect.topLeft() << rect.topRight() << rect.bottomLeft() << rect.bottomRight();
- }
- break;
-
- case Ellipse: {
- QRectF rect (m_P1, m_P2);
- vector << rect.topLeft() << rect.topRight() << rect.bottomLeft() << rect.bottomRight();
- }
- break;
-
- case Polyline:
- vector = m_polygon;
- break;
+ case Line: vector << m_P1 << m_P2; break;
+ case Rectangle: vector = m_handler.pointsForRect(QRectF(m_P1, m_P2)); break;
+ case Ellipse: vector = m_handler.pointsForRect(QRectF(m_P1, m_P2)); break;
+ case Polyline: vector = m_polygon; break;
}
- m_vector_index = QGHU::pointIsHoverHandler(event->pos(), vector);
+ m_vector_index = m_handler.pointIsHoverHandler(event->pos(), vector);
if (m_vector_index != -1)
{
//User click on an handler
Modified: trunk/sources/qetgraphicsitem/qetshapeitem.h
===================================================================
--- trunk/sources/qetgraphicsitem/qetshapeitem.h 2015-07-13 12:01:02 UTC (rev 4049)
+++ trunk/sources/qetgraphicsitem/qetshapeitem.h 2015-07-15 16:54:30 UTC (rev 4050)
@@ -19,6 +19,7 @@
#define QETSHAPEITEM_H
#include "qetgraphicsitem.h"
+#include "QetGraphicsItemModeler/qetgraphicshandlerutility.h"
class QDomElement;
class QDomDocument;
@@ -94,5 +95,6 @@
m_mouse_grab_handler;
int m_vector_index;
QetShapeGeometryCommand *m_undo_command;
+ QetGraphicsHandlerUtility m_handler;
};
#endif // QETSHAPEITEM_H