[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


Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/