[qet] [970] Lors du deplacement d'un champ de texte rattache a un element, ce dernier est desormais mis en valeur par un halo bleute.

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


Revision: 970
Author:   xavier
Date:     2010-04-25 14:12:59 +0200 (Sun, 25 Apr 2010)
Log Message:
-----------
Lors du deplacement d'un champ de texte rattache a un element, ce dernier est desormais mis en valeur par un halo bleute.

Modified Paths:
--------------
    branches/0.3/sources/element.cpp
    branches/0.3/sources/element.h
    branches/0.3/sources/elementtextitem.cpp
    branches/0.3/sources/elementtextitem.h

Modified: branches/0.3/sources/element.cpp
===================================================================
--- branches/0.3/sources/element.cpp	2010-04-25 11:20:09 UTC (rev 969)
+++ branches/0.3/sources/element.cpp	2010-04-25 12:12:59 UTC (rev 970)
@@ -29,7 +29,8 @@
 Element::Element(QGraphicsItem *parent, Diagram *scene) :
 	QObject(),
 	QGraphicsItem(parent, scene),
-	internal_connections(false)
+	internal_connections(false),
+	must_highlight_(false)
 {
 	setZValue(10);
 }
@@ -41,6 +42,21 @@
 }
 
 /**
+	@return true si l'element est mis en evidence
+*/
+bool Element::isHighlighted() const {
+	return(must_highlight_);
+}
+
+/**
+	@param hl true pour mettre l'element en evidence, false sinon
+*/
+void Element::setHighlighted(bool hl) {
+	must_highlight_ = hl;
+	update();
+}
+
+/**
 	Methode principale de dessin de l'element
 	@param painter Le QPainter utilise pour dessiner l'elment
 	@param options Les options de style a prendre en compte
@@ -64,6 +80,8 @@
 		}
 	}
 #endif
+	if (must_highlight_) drawHighlight(painter, options);
+	
 	// Dessin de l'element lui-meme
 	paint(painter, options);
 	
@@ -227,6 +245,32 @@
 }
 
 /**
+	Dessine le cadre de selection de l'element de maniere systematiquement non antialiasee.
+	@param painter Le QPainter a utiliser pour dessiner les bornes.
+	@param options Les options de style a prendre en compte
+ */
+void Element::drawHighlight(QPainter *painter, const QStyleOptionGraphicsItem *options) {
+	Q_UNUSED(options);
+	painter -> save();
+	
+	qreal gradient_radius = qMin(boundingRect().width(), boundingRect().height()) / 2.0;
+	QRadialGradient gradient(
+		boundingRect().center(),
+		gradient_radius,
+		boundingRect().center()
+	);
+	gradient.setColorAt(0.0, QColor::fromRgb(69, 137, 255, 255));
+	gradient.setColorAt(1.0, QColor::fromRgb(69, 137, 255, 0));
+	QBrush brush(gradient);
+	
+	painter -> setPen(Qt::NoPen);
+	painter -> setBrush(brush);
+	// Le dessin se fait a partir du rectangle delimitant
+	painter -> drawRoundRect(boundingRect().adjusted(1, 1, -1, -1), 10, 10);
+	painter -> restore();
+}
+
+/**
 	Fonction initialisant et dessinant la pixmap de l'element.
 */
 void Element::updatePixmap() {

Modified: branches/0.3/sources/element.h
===================================================================
--- branches/0.3/sources/element.h	2010-04-25 11:20:09 UTC (rev 969)
+++ branches/0.3/sources/element.h	2010-04-25 12:12:59 UTC (rev 970)
@@ -87,6 +87,8 @@
 	virtual QString name() const = 0;
 	Diagram *diagram() const;
 	
+	virtual bool isHighlighted() const;
+	virtual void setHighlighted(bool);
 	void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *);
 	QRectF boundingRect() const;
 	QSize setSize(int, int);
@@ -126,7 +128,9 @@
 	
 	private:
 	bool internal_connections;
+	bool must_highlight_;
 	void drawSelection(QPainter *, const QStyleOptionGraphicsItem *);
+	void drawHighlight(QPainter *, const QStyleOptionGraphicsItem *);
 	void updatePixmap();
 };
 

Modified: branches/0.3/sources/elementtextitem.cpp
===================================================================
--- branches/0.3/sources/elementtextitem.cpp	2010-04-25 11:20:09 UTC (rev 969)
+++ branches/0.3/sources/elementtextitem.cpp	2010-04-25 12:12:59 UTC (rev 970)
@@ -29,7 +29,8 @@
 	DiagramTextItem(parent_element, parent_diagram),
 	parent_element_(parent_element),
 	follow_parent_rotations(false),
-	original_rotation_angle_(0.0)
+	original_rotation_angle_(0.0),
+	first_move_(true)
 {
 	// par defaut, les DiagramTextItem sont Selectable et Movable
 	// cela nous convient, on ne touche pas a ces flags
@@ -48,7 +49,8 @@
 	DiagramTextItem(text, parent_element, parent_diagram),
 	parent_element_(parent_element),
 	follow_parent_rotations(false),
-	original_rotation_angle_(0.0)
+	original_rotation_angle_(0.0),
+	first_move_(true)
 {
 	// par defaut, les DiagramTextItem sont Selectable et Movable
 	// cela nous convient, on ne touche pas a ces flags
@@ -243,14 +245,24 @@
 		QPointF parent_movement = mapMovementToParent(movement);
 		setPos(pos() + parent_movement);
 		
-		/*
-			Comme setPos() n'est pas oblige d'appliquer exactement la valeur
-			qu'on lui fournit, on calcule le mouvement reellement applique.
-		*/
-		QPointF effective_movement = pos() - old_pos;
-		QPointF scene_effective_movement = mapMovementToScene(mapMovementFromParent(effective_movement));
-		
 		if (Diagram *diagram_ptr = diagram()) {
+			int moved_texts_count = diagram_ptr -> elementTextsToMove().count();
+			// s'il n'y a qu'un seul texte deplace, on met en valeur l'element parent
+			if (moved_texts_count == 1 && parent_element_ && first_move_) {
+				parent_element_ -> setHighlighted(true);
+				parent_element_ -> update();
+				first_move_ = false;
+			}
+			
+			/*
+				Comme setPos() n'est pas oblige d'appliquer exactement la
+				valeur qu'on lui fournit, on calcule le mouvement reellement
+				applique.
+			*/
+			QPointF effective_movement = pos() - old_pos;
+			QPointF scene_effective_movement = mapMovementToScene(mapMovementFromParent(effective_movement));
+			
+			// on applique le mouvement subi aux autres textes a deplacer
 			diagram_ptr -> moveElementsTexts(scene_effective_movement, this);
 		}
 	} else e -> ignore();
@@ -262,6 +274,17 @@
 */
 void ElementTextItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) {
 	if (Diagram *diagram_ptr = diagram()) {
+		int moved_texts_count = diagram_ptr -> elementTextsToMove().count();
+		
+		// s'il n'y a qu'un seul texte deplace, on arrete de mettre en valeur l'element parent
+		if (moved_texts_count == 1) {
+			first_move_ = true;
+			if (parent_element_) {
+				parent_element_ -> setHighlighted(false);
+			}
+		}
+		
+		// on cree un objet d'annulation correspondant au deplacement qui s'acheve
 		if ((flags() & QGraphicsItem::ItemIsMovable) && (!diagram_ptr -> current_movement.isNull())) {
 			diagram_ptr -> undoStack().push(
 				new MoveElementsTextsCommand(

Modified: branches/0.3/sources/elementtextitem.h
===================================================================
--- branches/0.3/sources/elementtextitem.h	2010-04-25 11:20:09 UTC (rev 969)
+++ branches/0.3/sources/elementtextitem.h	2010-04-25 12:12:59 UTC (rev 970)
@@ -47,6 +47,7 @@
 	QPointF original_position;
 	QPointF known_position_;
 	qreal original_rotation_angle_;
+	bool first_move_;
 	
 	// methodes
 	public:


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