Text item : minor improvement

git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@3380 bfdf4180-ca20-0410-9c96-a3a8aa849046
This commit is contained in:
blacksun
2014-10-18 12:25:16 +00:00
parent 243cd16e72
commit 58c280be2a
6 changed files with 54 additions and 160 deletions

View File

@@ -29,12 +29,8 @@ ConductorTextItem::ConductorTextItem(Conductor *parent_conductor, Diagram *paren
DiagramTextItem(parent_conductor, parent_diagram), DiagramTextItem(parent_conductor, parent_diagram),
parent_conductor_(parent_conductor), parent_conductor_(parent_conductor),
moved_by_user_(false), moved_by_user_(false),
rotate_by_user_(false), rotate_by_user_(false)
first_move_(true) {}
{
// par defaut, les DiagramTextItem sont Selectable et Movable
// cela nous convient, on ne touche pas a ces flags
}
/** /**
Constructeur Constructeur
@@ -46,12 +42,8 @@ ConductorTextItem::ConductorTextItem(const QString &text, Conductor *parent_cond
DiagramTextItem(text, parent_conductor, parent_diagram), DiagramTextItem(text, parent_conductor, parent_diagram),
parent_conductor_(parent_conductor), parent_conductor_(parent_conductor),
moved_by_user_(false), moved_by_user_(false),
rotate_by_user_(false), rotate_by_user_(false)
first_move_(true) {}
{
// par defaut, les DiagramTextItem sont Selectable et Movable
// cela nous convient, on ne touche pas a ces flags
}
/** /**
Destructeur Destructeur
@@ -149,65 +141,54 @@ void ConductorTextItem::forceRotateByUser(bool rotate_by_user) {
} }
/** /**
Gere les clics de souris lies au champ de texte * @brief ConductorTextItem::mousePressEvent
@param e Objet decrivant l'evenement souris * @param event
*/ */
void ConductorTextItem::mousePressEvent(QGraphicsSceneMouseEvent *e) { void ConductorTextItem::mousePressEvent(QGraphicsSceneMouseEvent *event) {
if ((flags() & QGraphicsItem::ItemIsMovable) && (e -> buttons() & Qt::LeftButton)) {
before_mov_pos_ = pos(); before_mov_pos_ = pos();
} DiagramTextItem::mousePressEvent(event);
first_move_ = true;
DiagramTextItem::mousePressEvent(e);
} }
/** /**
Gere les mouvements de souris lies au champ de texte * @brief ConductorTextItem::mouseMoveEvent
@param e Objet decrivant l'evenement souris * @param event
*/ */
void ConductorTextItem::mouseMoveEvent(QGraphicsSceneMouseEvent *e) { void ConductorTextItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) {
if (textInteractionFlags() & Qt::TextEditable) { if (textInteractionFlags() & Qt::TextEditable) QGraphicsTextItem::mouseMoveEvent(event);
QGraphicsTextItem::mouseMoveEvent(e);
} else if ((flags() & QGraphicsItem::ItemIsMovable) && (e -> buttons() & Qt::LeftButton)) { else if ((flags() & QGraphicsItem::ItemIsMovable) && (event -> buttons() & Qt::LeftButton)) {
if (first_move_) {
mouse_to_origin_movement_ = before_mov_pos_ - mapToParent(e -> buttonDownPos(Qt::LeftButton)); QPointF intended_pos = event ->scenePos() + m_mouse_to_origin_movement;
}
QPointF intended_pos = mapToParent(e -> pos()) + mouse_to_origin_movement_;
// si ce texte est attache a un conducteur, alors ses mouvements seront
// limites a une certaine distance du trace de ce conducteur
if (parent_conductor_) { if (parent_conductor_) {
if (parent_conductor_ -> isNearConductor(intended_pos)) { if (parent_conductor_ -> isNearConductor(intended_pos)) {
setPos(intended_pos); event->modifiers() == Qt::ControlModifier ? setPos(intended_pos) : setPos(Diagram::snapToGrid(intended_pos));
parent_conductor_ -> setHighlighted(Conductor::Normal); parent_conductor_ -> setHighlighted(Conductor::Normal);
} else { } else {
parent_conductor_ -> setHighlighted(Conductor::Alert); parent_conductor_ -> setHighlighted(Conductor::Alert);
} }
} }
} else e -> ignore();
if (first_move_) {
first_move_ = false;
} }
else event -> ignore();
} }
/** /**
Gere le relachement de souris * @brief ConductorTextItem::mouseReleaseEvent
Cette methode cree un objet d'annulation pour le deplacement * @param e
@param e Objet decrivant l'evenement souris
*/ */
void ConductorTextItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) { void ConductorTextItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) {
if (flags() & QGraphicsItem::ItemIsMovable) { if (flags() & QGraphicsItem::ItemIsMovable) {
if (Diagram *diagram_ptr = diagram()) { if (Diagram *diagram_ptr = diagram()) {
// on cree un objet d'annulation correspondant au deplacement qui s'acheve
QPointF applied_movement = pos() - before_mov_pos_; QPointF applied_movement = pos() - before_mov_pos_;
if (!applied_movement.isNull()) { if (!applied_movement.isNull()) {
// on cree un objet d'annulation seulement pour ce champ de texte //Create an undo object
MoveConductorsTextsCommand *undo_object = new MoveConductorsTextsCommand(diagram_ptr); MoveConductorsTextsCommand *undo_object = new MoveConductorsTextsCommand(diagram_ptr);
undo_object -> addTextMovement(this, before_mov_pos_, pos(), moved_by_user_); undo_object -> addTextMovement(this, before_mov_pos_, pos(), moved_by_user_);
// on active le flag indiquant que ce champ de texte a ete explicitement repositionne par l'utilisateur
moved_by_user_ = true; moved_by_user_ = true;
diagram_ptr -> undoStack().push(undo_object); diagram_ptr -> undoStack().push(undo_object);

View File

@@ -53,9 +53,9 @@ class ConductorTextItem : public DiagramTextItem {
virtual void forceRotateByUser(bool); virtual void forceRotateByUser(bool);
protected: protected:
virtual void mousePressEvent(QGraphicsSceneMouseEvent *); virtual void mousePressEvent (QGraphicsSceneMouseEvent *event);
virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *); virtual void mouseMoveEvent (QGraphicsSceneMouseEvent *event);
virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *); virtual void mouseReleaseEvent (QGraphicsSceneMouseEvent *event);
// attributes // attributes
private: private:
@@ -63,7 +63,5 @@ class ConductorTextItem : public DiagramTextItem {
bool moved_by_user_; bool moved_by_user_;
bool rotate_by_user_; bool rotate_by_user_;
QPointF before_mov_pos_; QPointF before_mov_pos_;
bool first_move_;
QPointF mouse_to_origin_movement_;
}; };
#endif #endif

View File

@@ -32,16 +32,7 @@ DiagramTextItem::DiagramTextItem(QGraphicsItem *parent, Diagram *parent_diagram)
rotation_angle_(0.0), rotation_angle_(0.0),
m_first_move (true) m_first_move (true)
{ {
//set Zvalue at 10 to be upper than the DiagramImageItem build();
setZValue(10);
setDefaultTextColor(Qt::black);
setFont(QETApp::diagramTextsFont());
setFlags(QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsMovable);
setNoEditable(false);
#if QT_VERSION >= 0x040600
setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
#endif
connect(this, SIGNAL(lostFocus()), this, SLOT(setNonFocusable()));
} }
/** /**
@@ -55,22 +46,31 @@ DiagramTextItem::DiagramTextItem(const QString &text, QGraphicsItem *parent, Dia
previous_text_(text), previous_text_(text),
rotation_angle_(0.0) rotation_angle_(0.0)
{ {
build();
}
/// Destructeur
DiagramTextItem::~DiagramTextItem() {
}
/**
* @brief DiagramTextItem::build
* Build this item with default value
*/
void DiagramTextItem::build() {
//set Zvalue at 10 to be upper than the DiagramImageItem //set Zvalue at 10 to be upper than the DiagramImageItem
setZValue(10); setZValue(10);
setDefaultTextColor(Qt::black); setDefaultTextColor(Qt::black);
setFont(QETApp::diagramTextsFont()); setFont(QETApp::diagramTextsFont());
setFlags(QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsMovable); setFlags(QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsMovable);
setNoEditable(false); setNoEditable(false);
setToolTip(tr("Maintenir ctrl pour un d\351placer librement"));
#if QT_VERSION >= 0x040600 #if QT_VERSION >= 0x040600
setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
#endif #endif
connect(this, SIGNAL(lostFocus()), this, SLOT(setNonFocusable())); connect(this, SIGNAL(lostFocus()), this, SLOT(setNonFocusable()));
} }
/// Destructeur
DiagramTextItem::~DiagramTextItem() {
}
/** /**
@return le Diagram auquel ce texte appartient, ou 0 si ce texte n'est @return le Diagram auquel ce texte appartient, ou 0 si ce texte n'est
rattache a aucun schema rattache a aucun schema
@@ -110,25 +110,6 @@ void DiagramTextItem::rotateBy(const qreal &added_rotation) {
applyRotation(applied_added_rotation); applyRotation(applied_added_rotation);
} }
/**
Traduit en coordonnees de la scene un mouvement / vecteur initialement
exprime en coordonnees locales.
@param movement Vecteur exprime en coordonnees locales
@return le meme vecteur, exprime en coordonnees de la scene
*/
QPointF DiagramTextItem::mapMovementToScene(const QPointF &movement) const {
// on definit deux points en coordonnees locales
QPointF local_origin(0.0, 0.0);
QPointF local_movement_point(movement);
// on les mappe sur la scene
QPointF scene_origin(mapToScene(local_origin));
QPointF scene_movement_point(mapToScene(local_movement_point));
// on calcule le vecteur represente par ces deux points
return(scene_movement_point - scene_origin);
}
/** /**
Traduit en coordonnees locales un mouvement / vecteur initialement Traduit en coordonnees locales un mouvement / vecteur initialement
exprime en coordonnees de la scene. exprime en coordonnees de la scene.
@@ -167,25 +148,6 @@ QPointF DiagramTextItem::mapMovementToParent(const QPointF &movement) const {
return(parent_movement_point - parent_origin); return(parent_movement_point - parent_origin);
} }
/**
Traduit en coordonnees locales un mouvement / vecteur initialement
exprime en coordonnees du parent.
@param movement Vecteur exprime en coordonnees du parent
@return le meme vecteur, exprime en coordonnees locales
*/
QPointF DiagramTextItem::mapMovementFromParent(const QPointF &movement) const {
// on definit deux points sur le parent
QPointF parent_origin(0.0, 0.0);
QPointF parent_movement_point(movement);
// on les mappe sur ce QGraphicsItem
QPointF local_origin(mapFromParent(parent_origin));
QPointF local_movement_point(mapFromParent(parent_movement_point));
// on calcule le vecteur represente par ces deux points
return(local_movement_point - local_origin);
}
void DiagramTextItem::setFontSize(int &s) { void DiagramTextItem::setFontSize(int &s) {
setFont(QETApp::diagramTextsFont(s)); setFont(QETApp::diagramTextsFont(s));
} }
@@ -269,6 +231,8 @@ void DiagramTextItem::mousePressEvent (QGraphicsSceneMouseEvent *event) {
if (event -> modifiers() & Qt::ControlModifier) { if (event -> modifiers() & Qt::ControlModifier) {
setSelected(!isSelected()); setSelected(!isSelected());
} }
//Save the pos of item at the beggining of the movement
m_mouse_to_origin_movement = pos() - event->scenePos();
QGraphicsTextItem::mousePressEvent(event); QGraphicsTextItem::mousePressEvent(event);
} }
@@ -288,12 +252,10 @@ void DiagramTextItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) {
QPointF old_pos = pos(); QPointF old_pos = pos();
//Save the pos of item at the beggining of the movement
if (m_first_move)
m_mouse_to_origin_movement = old_pos - event->buttonDownScenePos(Qt::LeftButton);
//Set the actual pos //Set the actual pos
setPos(event->scenePos() + m_mouse_to_origin_movement); QPointF new_pos = event->scenePos() + m_mouse_to_origin_movement;
event->modifiers() == Qt::ControlModifier ? setPos(new_pos) : setPos(Diagram::snapToGrid(new_pos));
//Update the actual movement for other selected item //Update the actual movement for other selected item
if (diagram_) if (diagram_)
@@ -328,33 +290,6 @@ void DiagramTextItem::applyRotation(const qreal &angle) {
setRotation(QET::correctAngle(rotation()+angle)); setRotation(QET::correctAngle(rotation()+angle));
} }
/**
Change la position du champ de texte en veillant a ce qu'il
reste sur la grille du schema auquel il appartient.
@param p Nouvelles coordonnees de l'element
*/
void DiagramTextItem::setPos(const QPointF &p) {
if (p == pos()) return;
// pas la peine de positionner sur la grille si l'element n'est pas sur un Diagram
if (scene()) {
// arrondit l'abscisse a 10 px pres
int p_x = qRound(p.x() / (Diagram::xGrid * 1.0)) * Diagram::xGrid;
// arrondit l'ordonnee a 10 px pres
int p_y = qRound(p.y() / (Diagram::yGrid * 1.0)) * Diagram::yGrid;
QGraphicsTextItem::setPos(p_x, p_y);
} else QGraphicsTextItem::setPos(p);
}
/**
Change la position du champ de texte en veillant a ce que l'il
reste sur la grille du schema auquel il appartient.
@param x Nouvelle abscisse de l'element
@param y Nouvelle ordonnee de l'element
*/
void DiagramTextItem::setPos(qreal x, qreal y) {
setPos(QPointF(x, y));
}
/// Rend le champ de texte non focusable /// Rend le champ de texte non focusable
void DiagramTextItem::setNonFocusable() { void DiagramTextItem::setNonFocusable() {
setFlag(QGraphicsTextItem::ItemIsFocusable, false); setFlag(QGraphicsTextItem::ItemIsFocusable, false);

View File

@@ -37,6 +37,9 @@ class DiagramTextItem : public QGraphicsTextItem {
DiagramTextItem(const QString &, QGraphicsItem * = 0, Diagram * = 0); DiagramTextItem(const QString &, QGraphicsItem * = 0, Diagram * = 0);
virtual ~DiagramTextItem(); virtual ~DiagramTextItem();
private:
void build();
// attributes // attributes
public: public:
enum { Type = UserType + 1004 }; enum { Type = UserType + 1004 };
@@ -52,16 +55,12 @@ class DiagramTextItem : public QGraphicsTextItem {
Diagram *diagram() const; Diagram *diagram() const;
virtual void fromXml(const QDomElement &) = 0; virtual void fromXml(const QDomElement &) = 0;
virtual QDomElement toXml(QDomDocument &) const = 0; virtual QDomElement toXml(QDomDocument &) const = 0;
virtual void setPos(const QPointF &);
virtual void setPos(qreal, qreal);
qreal rotationAngle() const; qreal rotationAngle() const;
void setRotationAngle(const qreal &); void setRotationAngle(const qreal &);
void rotateBy(const qreal &); void rotateBy(const qreal &);
void edit(); void edit();
QPointF mapMovementToScene(const QPointF &) const;
QPointF mapMovementFromScene(const QPointF &) const; QPointF mapMovementFromScene(const QPointF &) const;
QPointF mapMovementToParent(const QPointF &) const; QPointF mapMovementToParent(const QPointF &) const;
QPointF mapMovementFromParent(const QPointF &) const;
void setFontSize(int &s); void setFontSize(int &s);
void setNoEditable(bool e = true) {no_editable = e;} void setNoEditable(bool e = true) {no_editable = e;}

View File

@@ -62,23 +62,6 @@ Element *ElementTextItem::parentElement() const {
return(parent_element_); return(parent_element_);
} }
/**
Modifie la position du champ de texte
@param pos La nouvelle position du champ de texte
*/
void ElementTextItem::setPos(const QPointF &pos) {
QGraphicsTextItem::setPos(pos);
}
/**
Modifie la position du champ de texte
@param x La nouvelle abscisse du champ de texte
@param y La nouvelle ordonnee du champ de texte
*/
void ElementTextItem::setPos(qreal x, qreal y) {
setPos(QPointF(x, y));
}
/** /**
Permet de lire le texte a mettre dans le champ a partir d'un element XML. Permet de lire le texte a mettre dans le champ a partir d'un element XML.
Cette methode se base sur la position du champ pour assigner ou non la Cette methode se base sur la position du champ pour assigner ou non la

View File

@@ -57,8 +57,6 @@ class ElementTextItem : public DiagramTextItem {
void setFollowParentRotations(bool); void setFollowParentRotations(bool);
void fromXml(const QDomElement &); void fromXml(const QDomElement &);
QDomElement toXml(QDomDocument &) const; QDomElement toXml(QDomDocument &) const;
void setPos(const QPointF &);
void setPos(qreal, qreal);
void setOriginalPos(const QPointF &); void setOriginalPos(const QPointF &);
QPointF originalPos() const; QPointF originalPos() const;
void setOriginalRotationAngle(const qreal &); void setOriginalRotationAngle(const qreal &);