mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2026-03-27 10:49:58 +01:00
Text item : reduce a lot of code for several text item
git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@3379 bfdf4180-ca20-0410-9c96-a3a8aa849046
This commit is contained in:
@@ -17,7 +17,6 @@
|
||||
*/
|
||||
#include "diagramtextitem.h"
|
||||
#include "diagramcommands.h"
|
||||
#include "qet.h"
|
||||
#include "qetapp.h"
|
||||
#include "richtext/richtexteditor_p.h"
|
||||
#include "diagram.h"
|
||||
@@ -30,7 +29,8 @@
|
||||
DiagramTextItem::DiagramTextItem(QGraphicsItem *parent, Diagram *parent_diagram) :
|
||||
QGraphicsTextItem(parent, parent_diagram),
|
||||
previous_text_(),
|
||||
rotation_angle_(0.0)
|
||||
rotation_angle_(0.0),
|
||||
m_first_move (true)
|
||||
{
|
||||
//set Zvalue at 10 to be upper than the DiagramImageItem
|
||||
setZValue(10);
|
||||
@@ -260,6 +260,64 @@ void DiagramTextItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief DiagramTextItem::mousePressEvent
|
||||
* @param event
|
||||
*/
|
||||
void DiagramTextItem::mousePressEvent (QGraphicsSceneMouseEvent *event) {
|
||||
m_first_move = true;
|
||||
if (event -> modifiers() & Qt::ControlModifier) {
|
||||
setSelected(!isSelected());
|
||||
}
|
||||
QGraphicsTextItem::mousePressEvent(event);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief DiagramTextItem::mouseMoveEvent
|
||||
* @param event
|
||||
*/
|
||||
void DiagramTextItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) {
|
||||
if (textInteractionFlags() & Qt::TextEditable) QGraphicsTextItem::mouseMoveEvent(event);
|
||||
|
||||
else if ((flags() & QGraphicsItem::ItemIsMovable) && (event -> buttons() & Qt::LeftButton)) {
|
||||
Diagram *diagram_ = diagram();
|
||||
|
||||
//This is first move, we signal it to parent diagram
|
||||
if(diagram_ && m_first_move)
|
||||
diagram_ -> beginMoveElements(this);
|
||||
|
||||
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
|
||||
setPos(event->scenePos() + m_mouse_to_origin_movement);
|
||||
|
||||
//Update the actual movement for other selected item
|
||||
if (diagram_)
|
||||
diagram_ -> continueMoveElements(pos() - old_pos);
|
||||
}
|
||||
|
||||
else event -> ignore();
|
||||
|
||||
m_first_move = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief DiagramTextItem::mouseReleaseEvent
|
||||
* @param event
|
||||
*/
|
||||
void DiagramTextItem::mouseReleaseEvent (QGraphicsSceneMouseEvent *event) {
|
||||
//Signal to diagram movement is finish
|
||||
if (diagram())
|
||||
diagram() -> endMoveElements();
|
||||
|
||||
if (!(event -> modifiers() & Qt::ControlModifier))
|
||||
QGraphicsTextItem::mouseReleaseEvent(event);
|
||||
}
|
||||
|
||||
/**
|
||||
Effectue la rotation du texte en elle-meme
|
||||
Pour les DiagramTextItem, la rotation s'effectue autour du point (0, 0).
|
||||
@@ -297,13 +355,6 @@ void DiagramTextItem::setPos(qreal x, qreal y) {
|
||||
setPos(QPointF(x, y));
|
||||
}
|
||||
|
||||
/**
|
||||
@return la position du champ de texte
|
||||
*/
|
||||
QPointF DiagramTextItem::pos() const {
|
||||
return(QGraphicsTextItem::pos());
|
||||
}
|
||||
|
||||
/// Rend le champ de texte non focusable
|
||||
void DiagramTextItem::setNonFocusable() {
|
||||
setFlag(QGraphicsTextItem::ItemIsFocusable, false);
|
||||
|
||||
@@ -54,7 +54,6 @@ class DiagramTextItem : public QGraphicsTextItem {
|
||||
virtual QDomElement toXml(QDomDocument &) const = 0;
|
||||
virtual void setPos(const QPointF &);
|
||||
virtual void setPos(qreal, qreal);
|
||||
virtual QPointF pos() const;
|
||||
qreal rotationAngle() const;
|
||||
void setRotationAngle(const qreal &);
|
||||
void rotateBy(const qreal &);
|
||||
@@ -70,7 +69,12 @@ class DiagramTextItem : public QGraphicsTextItem {
|
||||
virtual void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *);
|
||||
virtual void focusInEvent(QFocusEvent *);
|
||||
virtual void focusOutEvent(QFocusEvent *);
|
||||
virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *);
|
||||
|
||||
virtual void mouseDoubleClickEvent (QGraphicsSceneMouseEvent *event);
|
||||
virtual void mousePressEvent (QGraphicsSceneMouseEvent *event);
|
||||
virtual void mouseMoveEvent (QGraphicsSceneMouseEvent *event);
|
||||
virtual void mouseReleaseEvent (QGraphicsSceneMouseEvent *event);
|
||||
|
||||
virtual void applyRotation(const qreal &);
|
||||
|
||||
signals:
|
||||
@@ -83,11 +87,13 @@ class DiagramTextItem : public QGraphicsTextItem {
|
||||
void setNonFocusable();
|
||||
void setHtmlText(const QString &);
|
||||
|
||||
private:
|
||||
protected:
|
||||
/// Previous text value
|
||||
QString previous_text_;
|
||||
/// angle of rotation of the text field
|
||||
qreal rotation_angle_;
|
||||
bool no_editable;
|
||||
bool m_first_move;
|
||||
QPointF m_mouse_to_origin_movement;
|
||||
};
|
||||
#endif
|
||||
|
||||
@@ -16,9 +16,8 @@
|
||||
along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "elementtextitem.h"
|
||||
#include "diagram.h"
|
||||
#include "diagramcommands.h"
|
||||
#include "element.h"
|
||||
#include <QTextDocument>
|
||||
|
||||
/**
|
||||
Constructeur
|
||||
@@ -29,8 +28,7 @@ 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),
|
||||
first_move_(true)
|
||||
original_rotation_angle_(0.0)
|
||||
{build();}
|
||||
|
||||
/**
|
||||
@@ -43,13 +41,10 @@ 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),
|
||||
first_move_(true)
|
||||
original_rotation_angle_(0.0)
|
||||
{build();}
|
||||
|
||||
void ElementTextItem::build() {
|
||||
setFlag(QGraphicsItem::ItemIsMovable, false);
|
||||
setToolTip(tr("Maintenir ctrl pour d\351placer", "tool tip for element text item"));
|
||||
adjustItemPosition(1);
|
||||
// ajuste la position du QGraphicsItem lorsque le QTextDocument change
|
||||
connect(document(), SIGNAL(blockCountChanged(int)), this, SLOT(adjustItemPosition(int)));
|
||||
@@ -84,13 +79,6 @@ void ElementTextItem::setPos(qreal x, qreal y) {
|
||||
setPos(QPointF(x, y));
|
||||
}
|
||||
|
||||
/**
|
||||
@return La position (bidouillee) du champ de texte
|
||||
*/
|
||||
QPointF ElementTextItem::pos() const {
|
||||
return(QGraphicsTextItem::pos());
|
||||
}
|
||||
|
||||
/**
|
||||
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
|
||||
@@ -211,95 +199,23 @@ void ElementTextItem::applyRotation(const qreal &angle) {
|
||||
}
|
||||
|
||||
/**
|
||||
Gere le clic sur le champ de texte
|
||||
@param e Objet decrivant l'evenement souris
|
||||
*/
|
||||
void ElementTextItem::mousePressEvent(QGraphicsSceneMouseEvent *e) {
|
||||
first_move_ = true;
|
||||
if (e -> modifiers() & Qt::ControlModifier) {
|
||||
setSelected(true);
|
||||
setFlag(QGraphicsItem::ItemIsMovable, true);
|
||||
}
|
||||
else DiagramTextItem::mousePressEvent(e);
|
||||
* @brief ElementTextItem::mouseMoveEvent
|
||||
* @param event
|
||||
*/
|
||||
void ElementTextItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) {
|
||||
if (parent_element_)
|
||||
parent_element_->setHighlighted(true);
|
||||
|
||||
DiagramTextItem::mouseMoveEvent(event);
|
||||
}
|
||||
|
||||
/**
|
||||
Gere les mouvements de souris lies au champ de texte
|
||||
@param e Objet decrivant l'evenement souris
|
||||
*/
|
||||
void ElementTextItem::mouseMoveEvent(QGraphicsSceneMouseEvent *e) {
|
||||
if (textInteractionFlags() & Qt::TextEditable) {
|
||||
DiagramTextItem::mouseMoveEvent(e);
|
||||
} else if ((flags() & QGraphicsItem::ItemIsMovable) && (e -> buttons() & Qt::LeftButton)) {
|
||||
QPointF old_pos = pos();
|
||||
/*
|
||||
Utiliser e -> pos() directement aurait pour effet de positionner
|
||||
l'origine du champ de texte a la position indiquee par le curseur,
|
||||
ce qui n'est pas l'effet recherche
|
||||
Au lieu de cela, on applique a la position actuelle le vecteur
|
||||
definissant le mouvement effectue depuis la derniere position
|
||||
cliquee avec le bouton gauche
|
||||
*/
|
||||
QPointF movement = e -> pos() - e -> buttonDownPos(Qt::LeftButton);
|
||||
|
||||
/*
|
||||
Les methodes pos() et setPos() travaillent toujours avec les
|
||||
coordonnees de l'item parent (ou de la scene s'il n'y a pas d'item
|
||||
parent). On n'oublie donc pas de mapper le mouvement fraichement
|
||||
calcule sur l'item parent avant de l'appliquer.
|
||||
*/
|
||||
QPointF parent_movement = mapMovementToParent(movement);
|
||||
setPos(pos() + parent_movement);
|
||||
|
||||
Diagram *diagram_ptr = diagram();
|
||||
if (diagram_ptr) {
|
||||
if (first_move_) {
|
||||
// on signale le debut d'un deplacement d'ElementTextItems au schema parent
|
||||
int moved_texts_count = diagram_ptr -> beginMoveElementTexts(this);
|
||||
|
||||
// s'il n'y a qu'un seul texte deplace, on met en valeur l'element parent
|
||||
if (moved_texts_count == 1 && parent_element_) {
|
||||
parent_element_ -> setHighlighted(true);
|
||||
parent_element_ -> update();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
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 -> continueMoveElementTexts(scene_effective_movement);
|
||||
}
|
||||
} else e -> ignore();
|
||||
|
||||
if (first_move_) {
|
||||
first_move_ = false;
|
||||
}
|
||||
}
|
||||
* @brief ElementTextItem::mouseReleaseEvent
|
||||
* @param event
|
||||
*/
|
||||
void ElementTextItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) {
|
||||
if (parent_element_)
|
||||
parent_element_->setHighlighted(false);
|
||||
|
||||
/**
|
||||
Gere le relachement de souris
|
||||
Cette methode cree un objet d'annulation pour le deplacement
|
||||
@param e Objet decrivant l'evenement souris
|
||||
*/
|
||||
void ElementTextItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) {
|
||||
if (Diagram *diagram_ptr = diagram()) {
|
||||
// on arrete de mettre en valeur l'element parent
|
||||
if (parent_element_) {
|
||||
if (parent_element_ -> isHighlighted()) {
|
||||
parent_element_ -> setHighlighted(false);
|
||||
}
|
||||
}
|
||||
|
||||
diagram_ptr -> endMoveElementTexts();
|
||||
}
|
||||
if (!(e -> modifiers() & Qt::ControlModifier)) {
|
||||
QGraphicsTextItem::mouseReleaseEvent(e);
|
||||
}
|
||||
setFlag(QGraphicsItem::ItemIsMovable, false);
|
||||
DiagramTextItem::mouseReleaseEvent(event);
|
||||
}
|
||||
|
||||
@@ -45,7 +45,6 @@ class ElementTextItem : public DiagramTextItem {
|
||||
bool follow_parent_rotations;
|
||||
QPointF original_position;
|
||||
qreal original_rotation_angle_;
|
||||
bool first_move_;
|
||||
QString tagg_;
|
||||
|
||||
// methods
|
||||
@@ -60,7 +59,6 @@ class ElementTextItem : public DiagramTextItem {
|
||||
QDomElement toXml(QDomDocument &) const;
|
||||
void setPos(const QPointF &);
|
||||
void setPos(qreal, qreal);
|
||||
virtual QPointF pos() const;
|
||||
void setOriginalPos(const QPointF &);
|
||||
QPointF originalPos() const;
|
||||
void setOriginalRotationAngle(const qreal &);
|
||||
@@ -74,10 +72,9 @@ class ElementTextItem : public DiagramTextItem {
|
||||
|
||||
protected:
|
||||
virtual void applyRotation(const qreal &);
|
||||
virtual void mousePressEvent(QGraphicsSceneMouseEvent *);
|
||||
virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *);
|
||||
virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *);
|
||||
virtual void focusOutEvent(QFocusEvent *e) {DiagramTextItem::focusOutEvent(e); setFlag(QGraphicsItem::ItemIsMovable, false);}
|
||||
|
||||
virtual void mouseMoveEvent (QGraphicsSceneMouseEvent *event);
|
||||
virtual void mouseReleaseEvent (QGraphicsSceneMouseEvent *event);
|
||||
|
||||
private:
|
||||
void build();
|
||||
|
||||
@@ -16,17 +16,15 @@
|
||||
along with QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "independenttextitem.h"
|
||||
#include "diagram.h"
|
||||
#include <QDomElement>
|
||||
|
||||
/**
|
||||
Constructeur
|
||||
@param parent_diagram Le schema auquel est rattache le champ de texte
|
||||
*/
|
||||
IndependentTextItem::IndependentTextItem(Diagram *parent_diagram) :
|
||||
DiagramTextItem(0, parent_diagram),
|
||||
first_move_(true)
|
||||
{
|
||||
}
|
||||
DiagramTextItem(0, parent_diagram)
|
||||
{}
|
||||
|
||||
/**
|
||||
Constructeur
|
||||
@@ -34,10 +32,8 @@ IndependentTextItem::IndependentTextItem(Diagram *parent_diagram) :
|
||||
@param parent_diagram Le schema auquel est rattache le champ de texte
|
||||
*/
|
||||
IndependentTextItem::IndependentTextItem(const QString &text, Diagram *parent_diagram) :
|
||||
DiagramTextItem(text, 0, parent_diagram),
|
||||
first_move_(true)
|
||||
{
|
||||
}
|
||||
DiagramTextItem(text, 0, parent_diagram)
|
||||
{}
|
||||
|
||||
/// Destructeur
|
||||
IndependentTextItem::~IndependentTextItem() {
|
||||
@@ -69,72 +65,3 @@ QDomElement IndependentTextItem::toXml(QDomDocument &document) const {
|
||||
}
|
||||
return(result);
|
||||
}
|
||||
|
||||
/**
|
||||
Gere le clic sur le champ de texte
|
||||
@param e Objet decrivant l'evenement souris
|
||||
*/
|
||||
void IndependentTextItem::mousePressEvent(QGraphicsSceneMouseEvent *e) {
|
||||
first_move_ = true;
|
||||
if (e -> modifiers() & Qt::ControlModifier) {
|
||||
setSelected(!isSelected());
|
||||
}
|
||||
DiagramTextItem::mousePressEvent(e);
|
||||
}
|
||||
|
||||
/**
|
||||
Gere les mouvements de souris lies au champ de texte
|
||||
@param e Objet decrivant l'evenement souris
|
||||
*/
|
||||
void IndependentTextItem::mouseMoveEvent(QGraphicsSceneMouseEvent *e) {
|
||||
if (textInteractionFlags() & Qt::TextEditable) {
|
||||
DiagramTextItem::mouseMoveEvent(e);
|
||||
} else if ((flags() & QGraphicsItem::ItemIsMovable) && isSelected() && (e -> buttons() & Qt::LeftButton)) {
|
||||
// le champ de texte est en train d'etre deplace
|
||||
Diagram *diagram_ptr = diagram();
|
||||
if (diagram_ptr) {
|
||||
if (first_move_) {
|
||||
// il s'agit du premier mouvement du deplacement, on le signale
|
||||
// au schema parent
|
||||
diagram_ptr -> beginMoveElements(this);
|
||||
}
|
||||
}
|
||||
|
||||
// on applique le mouvement impose par la souris
|
||||
QPointF old_pos = pos();
|
||||
if (first_move_) {
|
||||
mouse_to_origin_movement_ = old_pos - e -> buttonDownScenePos(Qt::LeftButton);
|
||||
}
|
||||
QPointF expected_pos = e-> scenePos() + mouse_to_origin_movement_;
|
||||
setPos(expected_pos); // setPos() will snap the expected position to the grid
|
||||
|
||||
// on calcule le mouvement reellement applique par setPos()
|
||||
QPointF effective_movement = pos() - old_pos;
|
||||
if (diagram_ptr) {
|
||||
// on signale le mouvement ainsi applique au schema parent, qui
|
||||
// l'appliquera aux autres items selectionnes selon son bon vouloir
|
||||
diagram_ptr -> continueMoveElements(effective_movement);
|
||||
}
|
||||
} else e -> ignore();
|
||||
|
||||
if (first_move_) {
|
||||
first_move_ = false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Gere le relachement de souris
|
||||
Cette methode a ete reimplementee pour tenir a jour la liste des elements
|
||||
et conducteurs a deplacer au niveau du schema.
|
||||
@param e Objet decrivant l'evenement souris
|
||||
*/
|
||||
void IndependentTextItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) {
|
||||
if (flags() & QGraphicsItem::ItemIsMovable) {
|
||||
if (Diagram *diagram_ptr = diagram()) {
|
||||
diagram_ptr -> endMoveElements();
|
||||
}
|
||||
}
|
||||
if (!(e -> modifiers() & Qt::ControlModifier)) {
|
||||
DiagramTextItem::mouseReleaseEvent(e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,13 +47,7 @@ class IndependentTextItem : public DiagramTextItem {
|
||||
virtual void fromXml(const QDomElement &);
|
||||
virtual QDomElement toXml(QDomDocument &) const;
|
||||
|
||||
protected:
|
||||
virtual void mousePressEvent(QGraphicsSceneMouseEvent *);
|
||||
virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *);
|
||||
virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *);
|
||||
|
||||
private:
|
||||
bool first_move_;
|
||||
QPointF mouse_to_origin_movement_;
|
||||
};
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user