[qet] [4052] Element primitive decorator : the handlers keep the same size at screen, no matter the zoom

[ Thread Index | Date Index | More lists.tuxfamily.org/qet Archives ]


Revision: 4052
Author:   blacksun
Date:     2015-07-16 16:58:01 +0200 (Thu, 16 Jul 2015)
Log Message:
-----------
Element primitive decorator : the handlers keep the same size at screen, no matter the zoom

Modified Paths:
--------------
    trunk/sources/editor/elementprimitivedecorator.cpp
    trunk/sources/editor/elementprimitivedecorator.h

Modified: trunk/sources/editor/elementprimitivedecorator.cpp
===================================================================
--- trunk/sources/editor/elementprimitivedecorator.cpp	2015-07-15 17:10:36 UTC (rev 4051)
+++ trunk/sources/editor/elementprimitivedecorator.cpp	2015-07-16 14:58:01 UTC (rev 4052)
@@ -32,7 +32,8 @@
 	@param parent Parent QGraphicsItem
 */
 ElementPrimitiveDecorator::ElementPrimitiveDecorator(QGraphicsItem *parent):
-	QGraphicsObject(parent)
+	QGraphicsObject(parent),
+	m_handler(10)
 {
 	init();
 }
@@ -66,11 +67,13 @@
 /**
 	@return the outer bounds of the decorator as a rectangle.
 */
-QRectF ElementPrimitiveDecorator::boundingRect() const {
-	const qreal additional_margin = 2.5;
+QRectF ElementPrimitiveDecorator::boundingRect() const
+{
+	QVector<QRectF> rect_vector = m_handler.handlerRect(getResizingsPoints());
 	
 	QRectF rect = effective_bounding_rect_;
-	rect.adjust(-additional_margin, -additional_margin, additional_margin, additional_margin);
+	rect |= rect_vector.first();
+	rect |= rect_vector.last();
 	return(rect);
 }
 
@@ -83,7 +86,8 @@
 	widget that is being painted on; otherwise, it is 0. For cached painting,
 	widget is always 0.
 */
-void ElementPrimitiveDecorator::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {
+void ElementPrimitiveDecorator::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
+{
 	Q_UNUSED(option)
 	Q_UNUSED(widget)
 	painter -> save();
@@ -92,9 +96,10 @@
 	QPen pen(Qt::DashLine);
 	pen.setCosmetic(true);
 	painter -> setPen(pen);
-	//QGraphicsItemGroup::paint(painter, option, widget);
 	painter -> drawRect(modified_bounding_rect_);
-	drawSquares(painter, option, widget);
+		//Draw the handler
+	foreach (QPointF point, getResizingsPoints())
+		m_handler.DrawHandler(painter, point, decorated_items_.size()-1);
 	
 	// uncomment to draw the real bouding rect (=adjusted internal bounding rect)
 	// painter -> setBrush(QBrush(QColor(240, 0, 0, 127)));
@@ -184,42 +189,47 @@
 	Handle events generated when the mouse hovers over the decorator.
 	@param event Object describing the hover event.
 */
-void ElementPrimitiveDecorator::hoverMoveEvent(QGraphicsSceneHoverEvent *event) {
-	QList<QRectF> rects = getResizingSquares();
-	QPointF pos = event -> pos();
-	
-	if (rects.at(QET::ResizeFromTopLeftCorner).contains(pos) || rects.at(QET::ResizeFromBottomRightCorner).contains(pos)) {
+void ElementPrimitiveDecorator::hoverMoveEvent(QGraphicsSceneHoverEvent *event)
+{
+	int p = m_handler.pointIsHoverHandler(event->pos(), getResizingsPoints());
+
+	if (p == 0 || p == 7)
 		setCursor(Qt::SizeFDiagCursor);
-	} else if (rects.at(QET::ResizeFromTopRightCorner).contains(pos) || rects.at(QET::ResizeFromBottomLeftCorner).contains(pos)) {
+	else if (p == 2 || p == 5)
 		setCursor(Qt::SizeBDiagCursor);
-	} else if (rects.at(QET::ResizeFromTopCenterCorner).contains(pos) || rects.at(QET::ResizeFromBottomCenterCorner).contains(pos)) {
+	else if (p == 1 || p ==6)
 		setCursor(Qt::SizeVerCursor);
-	} else if (rects.at(QET::ResizeFromMiddleLeftCorner).contains(pos) || rects.at(QET::ResizeFromMiddleRightCorner).contains(pos)) {
+	else if (p == 3 || p == 4)
 		setCursor(Qt::SizeHorCursor);
-	} else if (internalBoundingRect().contains(pos)) {
+	else if (p == -1 && modified_bounding_rect_.normalized().contains(event->pos()))
 		setCursor(Qt::SizeAllCursor);
-	} else {
+	else
 		setCursor(Qt::ArrowCursor);
-	}
 }
 
 /**
 	Handle event generated when mouse buttons are pressed.
 	@param event Object describing the mouse event
 */
-void ElementPrimitiveDecorator::mousePressEvent(QGraphicsSceneMouseEvent *event) {
-	QList<QRectF> rects = getResizingSquares();
+void ElementPrimitiveDecorator::mousePressEvent(QGraphicsSceneMouseEvent *event)
+{
 	QPointF pos = event -> pos();
+	QVector <QPointF> points = getResizingsPoints();
 	
-	current_operation_square_ = resizingSquareAtPos(pos);
+	current_operation_square_ = m_handler.pointIsHoverHandler(pos, points);
 	bool accept = false;
-	if (current_operation_square_ != QET::NoOperation) {
+
+	if (current_operation_square_ != QET::NoOperation)
 		accept = true;
-	} else {
-		if (internalBoundingRect().contains(pos)) {
-			if (CustomElementPart *single_item = singleItem()) {
+	else
+	{
+		if (internalBoundingRect().contains(pos))
+		{
+			if (CustomElementPart *single_item = singleItem())
+			{
 				bool event_accepted = single_item -> singleItemPressEvent(this, event);
-				if (event_accepted) {
+				if (event_accepted)
+				{
 					event -> ignore();
 					return;
 				}
@@ -229,19 +239,21 @@
 		}
 	}
 	
-	if (accept) {
-		if (current_operation_square_ > QET::NoOperation) {
-			first_pos_ = latest_pos_ = mapToScene(rects.at(current_operation_square_).center());
-		} else {
+	if (accept)
+	{
+		if (current_operation_square_ > QET::NoOperation)
+			first_pos_ = latest_pos_ = mapToScene(points.at(current_operation_square_));
+		else
+		{
 			first_pos_ = decorated_items_.at(0) -> toItem() -> scenePos();
 			latest_pos_ = event -> scenePos();
 			mouse_offset_ = event -> scenePos() - first_pos_;
 		}
 		startMovement();
 		event -> accept();
-	} else {
-		event -> ignore();
 	}
+	else
+		event -> ignore();
 }
 
 /**
@@ -264,9 +276,8 @@
 	@param event Object describing the mouse event
 	@see QGraphicsScene::mouseGrabberItem()
 */
-void ElementPrimitiveDecorator::mouseMoveEvent(QGraphicsSceneMouseEvent *event) {
-	QList<QRectF> rects = getResizingSquares();
-	
+void ElementPrimitiveDecorator::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
+{
 	QPointF scene_pos = event -> scenePos();
 	QPointF movement = scene_pos - latest_pos_;
 	
@@ -299,7 +310,7 @@
 			QPointF rounded_scene_pos = first_pos_ + rounded_global_movement;
 			
 			// when scaling the selection, consider the center of the currently dragged resizing rectangle
-			QPointF current_position = mapToScene(rects.at(current_operation_square_).center());
+			QPointF current_position = mapToScene(getResizingsPoints().at(current_operation_square_));
 			// determine the final, effective movement
 			movement = rounded_scene_pos - current_position;
 		}
@@ -556,119 +567,30 @@
 	return(item -> mapRectToScene(item -> boundingRect()));
 }
 
-/**
-	Draw all known resizing squares using \a painter.
-	@param option The option parameter provides style options for the item, such
-	as its state, exposed area and its level-of-detail hints.
-	@param The widget argument is optional. If provided, it points to the
-	widget that is being painted on; otherwise, it is 0. For cached painting,
-	widget is always 0.
-*/
-void ElementPrimitiveDecorator::drawSquares(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {
-	foreach (QRectF rect, getResizingSquares()) {
-		drawResizeSquare(painter, option, widget, rect);
-	}
-}
-
-/**
-	Draw the provided resizing square \a rect using \a painter.
-	@param option The option parameter provides style options for the item, such
-	as its state, exposed area and its level-of-detail hints.
-	@param The widget argument is optional. If provided, it points to the
-	widget that is being painted on; otherwise, it is 0. For cached painting,
-	widget is always 0.
-*/
-void ElementPrimitiveDecorator::drawResizeSquare(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget, const QRectF &rect) {
-	QColor inner(0xFF, 0xFF, 0xFF);
-	QColor outer(0x00, 0x61, 0xFF);
-	if (decorated_items_.count() > 1) {
-		outer = QColor(0x1A, 0x5C, 0x14);
-	}
-	drawGenericSquare(painter, option, widget, rect, inner, outer);
-}
-
-/**
-	Draw a generic square \a rect using \a painter.
-	@param inner Color used to fill the square
-	@param outer Color usd to draw the outline
-	@param option The option parameter provides style options for the item, such
-	as its state, exposed area and its level-of-detail hints.
-	@param The widget argument is optional. If provided, it points to the
-	widget that is being painted on; otherwise, it is 0. For cached painting,
-	widget is always 0.
-*/
-void ElementPrimitiveDecorator::drawGenericSquare(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget, const QRectF &rect, const QColor &inner, const QColor &outer) {
-	Q_UNUSED(option)
-	Q_UNUSED(widget)
-	// 1.0px will end up to level_of_details px once rendered
-	// qreal level_of_details = option->levelOfDetailFromTransform(painter -> transform());
-	
-	painter -> save();
-	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(rect);
-	painter -> restore();
-}
-
-/**
-	@return A list containing all known resizing squares, based on the
-	modified_bounding_rect_ attribute. They are ordered following
-	QET::OperationAreas, so it is possible to use positive values from this enum
-	to fetch the corresponding square in the list.
-	@see QET::OperationAreas
-*/
-QList<QRectF> ElementPrimitiveDecorator::getResizingSquares() {
+QVector<QPointF> ElementPrimitiveDecorator::getResizingsPoints() const
+{
 	QRectF primitive_rect = modified_bounding_rect_;
-	QRectF half_primitive_rect1 = primitive_rect;
-	half_primitive_rect1.setHeight(half_primitive_rect1.height() / 2.0);
-	QRectF half_primitive_rect2 = primitive_rect;
-	half_primitive_rect2.setWidth(half_primitive_rect2.width() / 2.0);
-	
-	QList<QRectF> rects;
-	
-	rects << getGenericSquare(primitive_rect.topLeft());
-	rects << getGenericSquare(half_primitive_rect2.topRight());
-	rects << getGenericSquare(primitive_rect.topRight());
-	rects << getGenericSquare(half_primitive_rect1.bottomLeft());
-	rects << getGenericSquare(half_primitive_rect1.bottomRight());
-	rects << getGenericSquare(primitive_rect.bottomLeft());
-	rects << getGenericSquare(half_primitive_rect2.bottomRight());
-	rects << getGenericSquare(primitive_rect.bottomRight());
-	
-	/// TODO cache the rects instead of calculating them again and again?
-	return(rects);
-}
+	QVector <QPointF> vector;
+	QPointF half;
 
-/**
-	@return the square to be drawn to represent \a position
-*/
-QRectF ElementPrimitiveDecorator::getGenericSquare(const QPointF &position) {
-	const qreal square_half_size = 0.5;
-	return(
-		QRectF(
-			position.x() - square_half_size,
-			position.y() - square_half_size,
-			square_half_size * 2.0,
-			square_half_size * 2.0
-		)
-	);
-}
+	vector << primitive_rect.topLeft(); //top left
+	half = primitive_rect.center();
+	half.setY(primitive_rect.top());
+	vector << half; //middle top
+	vector << primitive_rect.topRight(); //top right
+	half = primitive_rect.center();
+	half.setX(primitive_rect.left());
+	vector << half; //middle left
+	half = primitive_rect.center();
+	half.setX(primitive_rect.right());
+	vector << half; //middle right
+	vector << primitive_rect.bottomLeft(); //bottom left
+	half = primitive_rect.center();
+	half.setY(primitive_rect.bottom());
+	vector << half; //middle bottom
+	vector << primitive_rect.bottomRight(); //bottom right
 
-/**
-	@return the index of the square containing the \a position point or -1 if
-	none matches.
-*/
-int ElementPrimitiveDecorator::resizingSquareAtPos(const QPointF &position) {
-	QList<QRectF> rects = getResizingSquares();
-	int current_square = QET::NoOperation;
-	for (int i = 0 ; i < rects.count() ; ++ i) {
-		if (rects.at(i).contains(position)) {
-			current_square = i;
-		}
-	}
-	return(current_square);
+	return vector;
 }
 
 /**

Modified: trunk/sources/editor/elementprimitivedecorator.h
===================================================================
--- trunk/sources/editor/elementprimitivedecorator.h	2015-07-15 17:10:36 UTC (rev 4051)
+++ trunk/sources/editor/elementprimitivedecorator.h	2015-07-16 14:58:01 UTC (rev 4052)
@@ -17,8 +17,11 @@
 */
 #ifndef ELEMENTPRIMITIVEDECORATOR_H
 #define ELEMENTPRIMITIVEDECORATOR_H
+
 #include <QGraphicsObject>
 #include "qet.h"
+#include "QetGraphicsItemModeler/qetgraphicshandlerutility.h"
+
 class ElementEditionCommand;
 class ElementScene;
 class CustomElementPart;
@@ -34,7 +37,8 @@
 	  - the new bounding rect, after the user moved or resized items
 	  - the former bounding rect, due to implementation details
 */
-class ElementPrimitiveDecorator : public QGraphicsObject {
+class ElementPrimitiveDecorator : public QGraphicsObject
+{
 	Q_OBJECT
 	
 	public:
@@ -83,12 +87,7 @@
 	void translateItems(const QPointF &);
 	void scaleItems(const QRectF &, const QRectF &);
 	QRectF getSceneBoundingRect(QGraphicsItem *) const;
-	void drawSquares(QPainter *, const QStyleOptionGraphicsItem *, QWidget *);
-	void drawResizeSquare(QPainter *, const QStyleOptionGraphicsItem *, QWidget *, const QRectF &);
-	void drawGenericSquare(QPainter *, const QStyleOptionGraphicsItem *, QWidget *, const QRectF &, const QColor &, const QColor &);
-	QList<QRectF> getResizingSquares();
-	QRectF getGenericSquare(const QPointF &);
-	int resizingSquareAtPos(const QPointF &);
+	QVector <QPointF> getResizingsPoints() const;
 	
 	// attributes
 	private:
@@ -109,6 +108,7 @@
 	QPointF mouse_offset_;         ///< Offset between the mouse position and the point to be snapped to grid when moving selection
 	bool moving_by_keys_;          ///< Whether we are currently moving our decorated items using the arrow keys
 	QPointF keys_movement_;           ///< Movement applied to our decorated items using the arrow keys
+	QetGraphicsHandlerUtility m_handler;
 };
 
 #endif


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