From 4cd9d5f830467459919b6c7bd4088e2af5f379c3 Mon Sep 17 00:00:00 2001 From: xavier Date: Sun, 25 Apr 2010 12:12:59 +0000 Subject: [PATCH] Lors du deplacement d'un champ de texte rattache a un element, ce dernier est desormais mis en valeur par un halo bleute. git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/branches/0.3@970 bfdf4180-ca20-0410-9c96-a3a8aa849046 --- sources/element.cpp | 46 ++++++++++++++++++++++++++++++++++++- sources/element.h | 4 ++++ sources/elementtextitem.cpp | 41 +++++++++++++++++++++++++-------- sources/elementtextitem.h | 1 + 4 files changed, 82 insertions(+), 10 deletions(-) diff --git a/sources/element.cpp b/sources/element.cpp index 30502ad84..c89e5c1c0 100644 --- a/sources/element.cpp +++ b/sources/element.cpp @@ -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); } @@ -40,6 +41,21 @@ Element::Element(QGraphicsItem *parent, Diagram *scene) : Element::~Element() { } +/** + @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 @@ -64,6 +80,8 @@ void Element::paint(QPainter *painter, const QStyleOptionGraphicsItem *options, } } #endif + if (must_highlight_) drawHighlight(painter, options); + // Dessin de l'element lui-meme paint(painter, options); @@ -226,6 +244,32 @@ void Element::drawSelection(QPainter *painter, const QStyleOptionGraphicsItem *o painter -> restore(); } +/** + 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. */ diff --git a/sources/element.h b/sources/element.h index d3cede735..896a30a29 100644 --- a/sources/element.h +++ b/sources/element.h @@ -87,6 +87,8 @@ class Element : public QObject, public QGraphicsItem { 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 @@ class Element : public QObject, public QGraphicsItem { private: bool internal_connections; + bool must_highlight_; void drawSelection(QPainter *, const QStyleOptionGraphicsItem *); + void drawHighlight(QPainter *, const QStyleOptionGraphicsItem *); void updatePixmap(); }; diff --git a/sources/elementtextitem.cpp b/sources/elementtextitem.cpp index c5fb65afc..7eff454f3 100644 --- a/sources/elementtextitem.cpp +++ b/sources/elementtextitem.cpp @@ -29,7 +29,8 @@ ElementTextItem::ElementTextItem(Element *parent_element, Diagram *parent_diagra 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 @@ ElementTextItem::ElementTextItem(const QString &text, Element *parent_element, D 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 @@ void ElementTextItem::mouseMoveEvent(QGraphicsSceneMouseEvent *e) { 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::mouseMoveEvent(QGraphicsSceneMouseEvent *e) { */ 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( diff --git a/sources/elementtextitem.h b/sources/elementtextitem.h index 806abf900..d3a3cb6ff 100644 --- a/sources/elementtextitem.h +++ b/sources/elementtextitem.h @@ -47,6 +47,7 @@ class ElementTextItem : public DiagramTextItem { QPointF original_position; QPointF known_position_; qreal original_rotation_angle_; + bool first_move_; // methodes public: