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
This commit is contained in:
xavier
2010-04-25 12:12:59 +00:00
parent eb6780abdd
commit 4cd9d5f830
4 changed files with 82 additions and 10 deletions

View File

@@ -29,7 +29,8 @@
Element::Element(QGraphicsItem *parent, Diagram *scene) : Element::Element(QGraphicsItem *parent, Diagram *scene) :
QObject(), QObject(),
QGraphicsItem(parent, scene), QGraphicsItem(parent, scene),
internal_connections(false) internal_connections(false),
must_highlight_(false)
{ {
setZValue(10); setZValue(10);
} }
@@ -40,6 +41,21 @@ Element::Element(QGraphicsItem *parent, Diagram *scene) :
Element::~Element() { 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 Methode principale de dessin de l'element
@param painter Le QPainter utilise pour dessiner l'elment @param painter Le QPainter utilise pour dessiner l'elment
@@ -64,6 +80,8 @@ void Element::paint(QPainter *painter, const QStyleOptionGraphicsItem *options,
} }
} }
#endif #endif
if (must_highlight_) drawHighlight(painter, options);
// Dessin de l'element lui-meme // Dessin de l'element lui-meme
paint(painter, options); paint(painter, options);
@@ -226,6 +244,32 @@ void Element::drawSelection(QPainter *painter, const QStyleOptionGraphicsItem *o
painter -> restore(); 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. Fonction initialisant et dessinant la pixmap de l'element.
*/ */

View File

@@ -87,6 +87,8 @@ class Element : public QObject, public QGraphicsItem {
virtual QString name() const = 0; virtual QString name() const = 0;
Diagram *diagram() const; Diagram *diagram() const;
virtual bool isHighlighted() const;
virtual void setHighlighted(bool);
void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *); void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *);
QRectF boundingRect() const; QRectF boundingRect() const;
QSize setSize(int, int); QSize setSize(int, int);
@@ -126,7 +128,9 @@ class Element : public QObject, public QGraphicsItem {
private: private:
bool internal_connections; bool internal_connections;
bool must_highlight_;
void drawSelection(QPainter *, const QStyleOptionGraphicsItem *); void drawSelection(QPainter *, const QStyleOptionGraphicsItem *);
void drawHighlight(QPainter *, const QStyleOptionGraphicsItem *);
void updatePixmap(); void updatePixmap();
}; };

View File

@@ -29,7 +29,8 @@ ElementTextItem::ElementTextItem(Element *parent_element, Diagram *parent_diagra
DiagramTextItem(parent_element, parent_diagram), DiagramTextItem(parent_element, parent_diagram),
parent_element_(parent_element), parent_element_(parent_element),
follow_parent_rotations(false), 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 // par defaut, les DiagramTextItem sont Selectable et Movable
// cela nous convient, on ne touche pas a ces flags // 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), DiagramTextItem(text, parent_element, parent_diagram),
parent_element_(parent_element), parent_element_(parent_element),
follow_parent_rotations(false), 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 // par defaut, les DiagramTextItem sont Selectable et Movable
// cela nous convient, on ne touche pas a ces flags // cela nous convient, on ne touche pas a ces flags
@@ -243,14 +245,24 @@ void ElementTextItem::mouseMoveEvent(QGraphicsSceneMouseEvent *e) {
QPointF parent_movement = mapMovementToParent(movement); QPointF parent_movement = mapMovementToParent(movement);
setPos(pos() + parent_movement); setPos(pos() + parent_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 Comme setPos() n'est pas oblige d'appliquer exactement la
qu'on lui fournit, on calcule le mouvement reellement applique. valeur qu'on lui fournit, on calcule le mouvement reellement
applique.
*/ */
QPointF effective_movement = pos() - old_pos; QPointF effective_movement = pos() - old_pos;
QPointF scene_effective_movement = mapMovementToScene(mapMovementFromParent(effective_movement)); QPointF scene_effective_movement = mapMovementToScene(mapMovementFromParent(effective_movement));
if (Diagram *diagram_ptr = diagram()) { // on applique le mouvement subi aux autres textes a deplacer
diagram_ptr -> moveElementsTexts(scene_effective_movement, this); diagram_ptr -> moveElementsTexts(scene_effective_movement, this);
} }
} else e -> ignore(); } else e -> ignore();
@@ -262,6 +274,17 @@ void ElementTextItem::mouseMoveEvent(QGraphicsSceneMouseEvent *e) {
*/ */
void ElementTextItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) { void ElementTextItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) {
if (Diagram *diagram_ptr = diagram()) { 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())) { if ((flags() & QGraphicsItem::ItemIsMovable) && (!diagram_ptr -> current_movement.isNull())) {
diagram_ptr -> undoStack().push( diagram_ptr -> undoStack().push(
new MoveElementsTextsCommand( new MoveElementsTextsCommand(

View File

@@ -47,6 +47,7 @@ class ElementTextItem : public DiagramTextItem {
QPointF original_position; QPointF original_position;
QPointF known_position_; QPointF known_position_;
qreal original_rotation_angle_; qreal original_rotation_angle_;
bool first_move_;
// methodes // methodes
public: public: