[qet] qet/qet: [5000] Element editor : Element primitive decorator doesn' t manage anymore the text field when a single text is selected

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


Revision: 5000
Author:   blacksun
Date:     2017-08-01 21:37:04 +0200 (Tue, 01 Aug 2017)
Log Message:
-----------
Element editor : Element primitive decorator doesn't manage anymore the text field when a single text is selected 

Modified Paths:
--------------
    trunk/sources/editor/elementprimitivedecorator.cpp
    trunk/sources/editor/elementprimitivedecorator.h
    trunk/sources/editor/elementscene.cpp
    trunk/sources/editor/elementscene.h
    trunk/sources/editor/graphicspart/customelementgraphicpart.h
    trunk/sources/editor/graphicspart/customelementpart.cpp
    trunk/sources/editor/graphicspart/customelementpart.h
    trunk/sources/editor/graphicspart/parttext.cpp
    trunk/sources/editor/graphicspart/parttext.h
    trunk/sources/editor/graphicspart/parttextfield.cpp
    trunk/sources/editor/graphicspart/parttextfield.h

Modified: trunk/sources/editor/elementprimitivedecorator.cpp
===================================================================
--- trunk/sources/editor/elementprimitivedecorator.cpp	2017-08-01 19:09:31 UTC (rev 4999)
+++ trunk/sources/editor/elementprimitivedecorator.cpp	2017-08-01 19:37:04 UTC (rev 5000)
@@ -109,31 +109,10 @@
 /**
 	@param items the new list of items this decorator is suposed to manipulate.
 */
-void ElementPrimitiveDecorator::setItems(const QList<CustomElementPart *> &items) {
-	if (CustomElementPart *single_item = singleItem()) {
-		if (items.count() == 1 && items.first() == single_item) {
-			// no actual change
-			goto end_setItems;
-		}
-		
-		// break any connection between the former single selected item (if any) and
-		// the decorator
-		single_item -> setDecorator(0);
-		if (QGraphicsObject *single_object = dynamic_cast<QGraphicsObject *>(single_item)) {
-			disconnect(single_object, 0, this, 0);
-		}
-	}
-	
+void ElementPrimitiveDecorator::setItems(const QList<CustomElementPart *> &items)
+{
 	decorated_items_ = items;
-	
-	// when only a single primitive is selected, the decorator behaves specially
-	// to enable extra features, such as text edition, internal points movements,
-	// etc.
-	if (CustomElementPart *single_item = singleItem()) {
-		single_item -> setDecorator(this);
-	}
-	
-	end_setItems:
+
 	adjust();
 	show();
 	if (focusItem() != this) {
@@ -224,15 +203,6 @@
 	{
 		if (internalBoundingRect().contains(pos))
 		{
-			if (CustomElementPart *single_item = singleItem())
-			{
-				bool event_accepted = single_item -> singleItemPressEvent(this, event);
-				if (event_accepted)
-				{
-					event -> ignore();
-					return;
-				}
-			}
 			current_operation_square_ = QET::MoveArea;
 			accept = true;
 		}
@@ -256,21 +226,6 @@
 }
 
 /**
-	Handle events generated when mouse buttons are double clicked.
-	@param event Object describing the mouse event
-*/
-void ElementPrimitiveDecorator::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) {
-	//QGraphicsObject::mouseDoubleClickEvent(event);
-	if (CustomElementPart *single_item = singleItem()) {
-		bool event_accepted = single_item -> singleItemDoubleClickEvent(this, event);
-		if (event_accepted) {
-			event -> ignore();
-			return;
-		}
-	}
-}
-
-/**
 	Handle event generated when the mouse is moved and the decorator is the mouse grabber item.
 	@param event Object describing the mouse event
 	@see QGraphicsScene::mouseGrabberItem()
@@ -320,17 +275,6 @@
 		QPointF rounded_current_position = snapConstPointToGrid(current_position);
 		movement = rounded_current_position - decorated_items_.at(0) -> toItem() -> scenePos();
 	}
-	else {
-		// Neither a movement nor a scaling operation -- perhaps the underlying item
-		// is interested in the mouse event for custom operations?
-		if (CustomElementPart *single_item = singleItem()) {
-			bool event_accepted = single_item -> singleItemMoveEvent(this, event);
-			if (event_accepted) {
-				event -> ignore();
-				return;
-			}
-		}
-	}
 	
 	QRectF bounding_rect = modified_bounding_rect_;
 	applyMovementToRect(current_operation_square_, movement, modified_bounding_rect_);
@@ -370,15 +314,7 @@
 			MovePartsCommand *move_command = new MovePartsCommand(movement, 0, graphicsItems());
 			command = move_command;
 		}
-	} else {
-		if (CustomElementPart *single_item = singleItem()) {
-			bool event_accepted = single_item -> singleItemReleaseEvent(this, event);
-			if (event_accepted) {
-				event -> ignore();
-				return;
-			}
-		}
-	}
+    }
 	
 	if (command) {
 		emit(actionFinished(command));

Modified: trunk/sources/editor/elementprimitivedecorator.h
===================================================================
--- trunk/sources/editor/elementprimitivedecorator.h	2017-08-01 19:09:31 UTC (rev 4999)
+++ trunk/sources/editor/elementprimitivedecorator.h	2017-08-01 19:37:04 UTC (rev 5000)
@@ -66,7 +66,6 @@
 	protected:
 	void hoverMoveEvent(QGraphicsSceneHoverEvent *);
 	void mousePressEvent(QGraphicsSceneMouseEvent *);
-	void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *);
 	void mouseMoveEvent(QGraphicsSceneMouseEvent *);
 	void mouseReleaseEvent(QGraphicsSceneMouseEvent *);
 	void keyPressEvent(QKeyEvent *);

Modified: trunk/sources/editor/elementscene.cpp
===================================================================
--- trunk/sources/editor/elementscene.cpp	2017-08-01 19:09:31 UTC (rev 4999)
+++ trunk/sources/editor/elementscene.cpp	2017-08-01 19:37:04 UTC (rev 5000)
@@ -1064,12 +1064,8 @@
 	
 		// should we hide the decorator?
 	QList<QGraphicsItem *> selected_items = zItems(ElementScene::Selected | ElementScene::IncludeTerminals);
-	if (selected_items.size() == 0)
+    if (selected_items.size() <= 1)
 		m_decorator -> hide();
-	else if (selected_items.size() == 1 &&
-			 selected_items.first()->type() != PartText::Type &&
-			 selected_items.first()->type() != PartTextField::Type)
-		m_decorator->hide();
 	else
 	{
 		m_decorator -> setZValue(1000000);

Modified: trunk/sources/editor/elementscene.h
===================================================================
--- trunk/sources/editor/elementscene.h	2017-08-01 19:09:31 UTC (rev 4999)
+++ trunk/sources/editor/elementscene.h	2017-08-01 19:37:04 UTC (rev 5000)
@@ -44,14 +44,14 @@
 	public:
 		enum Behavior { Normal, PasteArea, AddPart };
 		enum ItemOption {
-			SortByZValue = 1,
-			IncludeTerminals = 2,
-			IncludeHelperItems = 4,
-			Selected = 8,
-			NonSelected = 16,
-			SelectedOrNot = 24
-		};
-	Q_DECLARE_FLAGS(ItemOptions, ItemOption)
+				SortByZValue = 1,
+				IncludeTerminals = 2,
+				IncludeHelperItems = 4,
+				Selected = 8,
+				NonSelected = 16,
+				SelectedOrNot = 24
+			};
+		Q_DECLARE_FLAGS(ItemOptions, ItemOption)
 	
 		// constructors, destructor
 	public:
@@ -168,15 +168,15 @@
 		void stackAction(ElementEditionCommand *);
 	
 	signals:
-			/// Signal emitted after one or several parts were added
+		/// Signal emitted after one or several parts were added
 		void partsAdded();
-			/// Signal emitted after one or several parts were removed
+		/// Signal emitted after one or several parts were removed
 		void partsRemoved();
-			/// Signal emitted when the zValue of one or several parts change
+		/// Signal emitted when the zValue of one or several parts change
 		void partsZValueChanged();
-			/// Signal emitted when users have defined the copy/paste area
+		/// Signal emitted when users have defined the copy/paste area
 		void pasteAreaDefined(const QRectF &);
-			/// Signal emitted when need zoomFit
+		/// Signal emitted when need zoomFit
 		void needZoomFit();
 };
 

Modified: trunk/sources/editor/graphicspart/customelementgraphicpart.h
===================================================================
--- trunk/sources/editor/graphicspart/customelementgraphicpart.h	2017-08-01 19:09:31 UTC (rev 4999)
+++ trunk/sources/editor/graphicspart/customelementgraphicpart.h	2017-08-01 19:37:04 UTC (rev 5000)
@@ -118,7 +118,7 @@
 		Filling _filling ;
 		Color _color;
 		bool _antialiased;
-		QPointF m_origin_pos, m_mouse_to_origin_pos;
+        QPointF m_origin_pos;
 };
 
 typedef CustomElementGraphicPart CEGP;

Modified: trunk/sources/editor/graphicspart/customelementpart.cpp
===================================================================
--- trunk/sources/editor/graphicspart/customelementpart.cpp	2017-08-01 19:09:31 UTC (rev 4999)
+++ trunk/sources/editor/graphicspart/customelementpart.cpp	2017-08-01 19:37:04 UTC (rev 5000)
@@ -50,16 +50,6 @@
 }
 
 /**
-	This method is called by the decorator when it manages only a single
-	primitive. This brings the possibility to implement custom behaviour, such
-	as text edition, points edition or specific resizing.
-	The default implementation does nothing.
-*/
-void CustomElementPart::setDecorator(ElementPrimitiveDecorator *decorator) {
-	Q_UNUSED(decorator)
-}
-
-/**
 	This method is called by the decorator when it needs to determine the best
 	way to interactively scale a primitive. It is typically called when only a
 	single primitive is being scaled.
@@ -71,46 +61,6 @@
 }
 
 /**
-	This method is called by the decorator when it manages only a single
-	primitive and it received a mouse press event.
-	The implementation should return true if the primitive accepts the event, false otherwise.
-	The default implementation returns false.
-*/
-bool CustomElementPart::singleItemPressEvent(ElementPrimitiveDecorator *, QGraphicsSceneMouseEvent *) {
-	return(false);
-}
-
-/**
-	This method is called by the decorator when it manages only a single
-	primitive and it received a mouse move event.
-	The implementation should return true if the primitive accepts the event, false otherwise.
-	The default implementation returns false.
-*/
-bool CustomElementPart::singleItemMoveEvent(ElementPrimitiveDecorator *, QGraphicsSceneMouseEvent *) {
-	return(false);
-}
-
-/**
-	This method is called by the decorator when it manages only a single
-	primitive and it received a mouse release event.
-	The implementation should return true if the primitive accepts the event, false otherwise.
-	The default implementation returns false.
-*/
-bool CustomElementPart::singleItemReleaseEvent(ElementPrimitiveDecorator *, QGraphicsSceneMouseEvent *) {
-	return(false);
-}
-
-/**
-	This method is called by the decorator when it manages only a single
-	primitive and it received a mouse double click event.
-	The implementation should return true if the primitive accepts the event, false otherwise.
-	The default implementation returns false.
-*/
-bool CustomElementPart::singleItemDoubleClickEvent(ElementPrimitiveDecorator *, QGraphicsSceneMouseEvent *) {
-	return(false);
-}
-
-/**
 	Helper method to map points in CustomElementPart::handleUserTransformation()
 	@param initial_selection_rect Selection rectangle when the movement started, in scene coordinates
 	@param new_selection_rect New selection rectangle, in scene coordinates

Modified: trunk/sources/editor/graphicspart/customelementpart.h
===================================================================
--- trunk/sources/editor/graphicspart/customelementpart.h	2017-08-01 19:09:31 UTC (rev 4999)
+++ trunk/sources/editor/graphicspart/customelementpart.h	2017-08-01 19:37:04 UTC (rev 5000)
@@ -103,12 +103,7 @@
 	
 	virtual QGraphicsItem *toItem();
 	
-	virtual void setDecorator(ElementPrimitiveDecorator *);
 	virtual QET::ScalingMethod preferredScalingMethod() const;
-	virtual bool singleItemPressEvent(ElementPrimitiveDecorator *, QGraphicsSceneMouseEvent *);
-	virtual bool singleItemMoveEvent(ElementPrimitiveDecorator *, QGraphicsSceneMouseEvent *);
-	virtual bool singleItemReleaseEvent(ElementPrimitiveDecorator *, QGraphicsSceneMouseEvent *);
-	virtual bool singleItemDoubleClickEvent(ElementPrimitiveDecorator *, QGraphicsSceneMouseEvent *);
 	
 	protected:
 	QList<QPointF> mapPoints(const QRectF &, const QRectF &, const QList<QPointF> &);

Modified: trunk/sources/editor/graphicspart/parttext.cpp
===================================================================
--- trunk/sources/editor/graphicspart/parttext.cpp	2017-08-01 19:09:31 UTC (rev 4999)
+++ trunk/sources/editor/graphicspart/parttext.cpp	2017-08-01 19:37:04 UTC (rev 5000)
@@ -26,20 +26,17 @@
 	Constructeur
 	@param editor L'editeur d'element concerne
 	@param parent Le QGraphicsItem parent de ce texte statique
-	@param scene La scene sur laquelle figure ce texte statique
 */
-PartText::PartText(QETElementEditor *editor, QGraphicsItem *parent, ElementScene *scene) :
+PartText::PartText(QETElementEditor *editor, QGraphicsItem *parent) :
 	QGraphicsTextItem(parent),
 	CustomElementPart(editor),
-	previous_text(),
-	decorator_(0)
+    previous_text()
 {
-	Q_UNUSED(scene)
 	document() -> setDocumentMargin(1.0);
 	setDefaultTextColor(Qt::black);
 	setFont(QETApp::diagramTextsFont());
 	real_font_size_ = font().pointSize();
-	setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemSendsGeometryChanges);
+    setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemSendsGeometryChanges | QGraphicsItem::ItemIsMovable);
 	setAcceptHoverEvents(true);
 	setDefaultTextColor(Qt::black);
 	setPlainText(QObject::tr("T", "default text when adding a text in the element editor"));
@@ -231,153 +228,40 @@
 	setProperty("real_size", qMax(1, qRound(new_font_size)));
 }
 
-/**
-	Dessine le texte statique.
-	@param painter QPainter a utiliser pour effectuer le rendu
-	@param qsogi   Pptions de dessin
-	@param widget  Widget sur lequel on dessine (facultatif)
-*/
-void PartText::paint(QPainter *painter, const QStyleOptionGraphicsItem *qsogi, QWidget *widget) {
-	// According to the source code of QGraphicsTextItem::paint(), this should
-	// avoid the drawing of the dashed rectangle around the text.
-	QStyleOptionGraphicsItem our_qsogi(*qsogi);
-	our_qsogi.state = QStyle::State_None;
-	
-	QGraphicsTextItem::paint(painter, &our_qsogi, widget);
-	
-#ifdef QET_DEBUG_EDITOR_TEXTS
-	painter -> setPen(Qt::blue);
-	painter -> drawRect(boundingRect());
-	
-	painter -> setPen(Qt::red);
-	drawPoint(painter, QPointF(0, 0));
-	
-	painter -> setPen(Qt::green);
-	drawPoint(painter, mapFromScene(pos()));
-#endif
-}
 
-/**
-	Handle context menu events.
-	@param event Object describing the context menu event to handle.
-*/
-void PartText::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) {
-	Q_UNUSED(event);
+void PartText::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
+{
+    if((event->buttons() & Qt::LeftButton) && (flags() & QGraphicsItem::ItemIsMovable))
+    {
+        QPointF pos = event->scenePos() + (m_origine_pos - event->buttonDownScenePos(Qt::LeftButton));
+        event->modifiers() == Qt::ControlModifier ? setPos(pos) : setPos(elementScene()->snapToGrid(pos));
+    }
+    else
+        QGraphicsObject::mouseMoveEvent(event);
 }
 
-/**
-	Handle events generated when the mouse hovers over the decorator.
-	@param event Object describing the hover event.
-*/
-void PartText::hoverMoveEvent(QGraphicsSceneHoverEvent *event) {
-	// force the cursor when the text is being edited
-	if (hasFocus() && decorator_) {
-		decorator_ -> setCursor(Qt::IBeamCursor);
-	}
-	QGraphicsTextItem::hoverMoveEvent(event);
-}
+void PartText::mousePressEvent(QGraphicsSceneMouseEvent *event)
+{
+    if(event->button() == Qt::LeftButton)
+        m_origine_pos = this->pos();
 
-/**
-	@reimp CustomElementPart::setDecorator(ElementPrimitiveDecorator *)
-	Install or remove a sceneEventFilter on the decorator and ensure it will
-	adjust itself while the text is being edited.
-*/
-void PartText::setDecorator(ElementPrimitiveDecorator *decorator) {
-	if (decorator) {
-		decorator -> installSceneEventFilter(this);
-		// ensure the decorator will adjust itself when the text area expands or shrinks
-		connect(document(), SIGNAL(contentsChanged()), decorator, SLOT(adjust()));
-	}
-	else {
-		decorator_ -> removeSceneEventFilter(this);
-		endEdition();
-	}
-	decorator_ = decorator;
+    QGraphicsObject::mousePressEvent(event);
 }
 
-/**
-	@reimp QGraphicsItem::sceneEventFilter(QGraphicsItem *, QEvent *).
-	Intercepts events before they reach the watched target, i.e. typically the
-	primitives decorator.
-	This method mainly works with key strokes (F2, escape) and double clicks to
-	begin or end text edition.
-*/
-bool PartText::sceneEventFilter(QGraphicsItem *watched, QEvent *event) {
-	if (watched != decorator_) return(false);
-	
-	QPointF event_scene_pos = QET::graphicsSceneEventPos(event);
-	if (!event_scene_pos.isNull()) {
-		if (contains(mapFromScene(event_scene_pos))) {
-			if (hasFocus()) {
-				return sceneEvent(event); // manually deliver the event to this item
-				return(true); // prevent this event from being delivered to any item
-			} else {
-				if (event -> type() == QEvent::GraphicsSceneMouseDoubleClick) {
-					mouseDoubleClickEvent(static_cast<QGraphicsSceneMouseEvent *>(event));
-				}
-			}
-		}
-	}
-	else if (event -> type() == QEvent::KeyRelease || event -> type() == QEvent::KeyPress) {
-		// Intercept F2 and escape keystrokes to focus in and out
-		QKeyEvent *key_event = static_cast<QKeyEvent *>(event);
-		if (!hasFocus() && key_event -> key() == Qt::Key_F2) {
-			setEditable(true);
-			QTextCursor qtc = textCursor();
-			qtc.setPosition(qMax(0, document()->characterCount() - 1));
-			setTextCursor(qtc);
-		} else if (hasFocus() && key_event -> key() == Qt::Key_Escape) {
-			endEdition();
-		}
-		if (hasFocus()) {
-			sceneEvent(event); // manually deliver the event to this item
-			return(true); // prevent this event from being delivered to any item
-		}
-	}
-	return(false);
-}
+void PartText::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
+{
+    if((event->button() & Qt::LeftButton) && (flags() & QGraphicsItem::ItemIsMovable) && m_origine_pos != pos())
+    {
+        QPropertyUndoCommand *undo = new QPropertyUndoCommand(this, "pos", QVariant(m_origine_pos), QVariant(pos()));
+        undo->setText(tr("Déplacer un texte"));
+        undo->enableAnimation();
+        elementScene()->undoStack().push(undo);
+    }
 
-/**
-	Accept the mouse \a event relayed by \a decorator if this text item has focus.
-*/
-bool PartText::singleItemPressEvent(ElementPrimitiveDecorator *decorator, QGraphicsSceneMouseEvent *event) {
-	Q_UNUSED(decorator)
-	Q_UNUSED(event)
-	return(hasFocus());
+    QGraphicsObject::mouseReleaseEvent(event);
 }
 
 /**
-	Accept the mouse \a event relayed by \a decorator if this text item has focus.
-*/
-bool PartText::singleItemMoveEvent(ElementPrimitiveDecorator *decorator, QGraphicsSceneMouseEvent *event) {
-	Q_UNUSED(decorator)
-	Q_UNUSED(event)
-	return(hasFocus());
-}
-
-/**
-	Accept the mouse \a event relayed by \a decorator if this text item has focus.
-*/
-bool PartText::singleItemReleaseEvent(ElementPrimitiveDecorator *decorator, QGraphicsSceneMouseEvent *event) {
-	Q_UNUSED(decorator)
-	Q_UNUSED(event)
-	return(hasFocus());
-}
-
-/**
-	Accept the mouse \a event relayed by \a decorator if this text item has focus.
-*/
-bool PartText::singleItemDoubleClickEvent(ElementPrimitiveDecorator *decorator, QGraphicsSceneMouseEvent *event) {
-	Q_UNUSED(decorator)
-	// calling mouseDoubleClickEvent() will set this text item editable and grab keyboard focus
-	if (event -> button() == Qt::LeftButton) {
-		mouseDoubleClickEvent(event);
-		return(true);
-	}
-	return(false);
-}
-
-/**
 	Cette methode s'assure que la position du champ de texte est coherente
 	en repositionnant son origine (c-a-d le milieu du bord gauche du champ de
 	texte) a la position originale. Cela est notamment utile lorsque le champ
@@ -442,27 +326,4 @@
 	setTextCursor(qtc);
 
 	setEditable(false);
-	if (decorator_) {
-		decorator_ -> setFocus();
-	}
 }
-
-#ifdef QET_DEBUG_EDITOR_TEXTS
-/**
-	Dessine deux petites fleches pour mettre un point en valeur
-	@param painter QPainter a utiliser pour effectuer le rendu
-	@param point   Point a dessiner
-*/
-void PartText::drawPoint(QPainter *painter, const QPointF &point) {
-	qreal px = point.x();
-	qreal py = point.y();
-	qreal size_1 = 5.0;
-	qreal size_2 = 1.0;
-	painter -> drawLine(QLineF(px, py, px + size_1, py));
-	painter -> drawLine(QLineF(px + size_1 - size_2, py - size_2, px + size_1, py));
-	painter -> drawLine(QLineF(px + size_1 - size_2, py + size_2, px + size_1, py));
-	painter -> drawLine(QLineF(px, py, px, py + size_1));
-	painter -> drawLine(QLineF(px, py + size_1, px - size_2, py + size_1 - size_2));
-	painter -> drawLine(QLineF(px, py + size_1, px + size_2, py + size_1 - size_2));
-}
-#endif

Modified: trunk/sources/editor/graphicspart/parttext.h
===================================================================
--- trunk/sources/editor/graphicspart/parttext.h	2017-08-01 19:09:31 UTC (rev 4999)
+++ trunk/sources/editor/graphicspart/parttext.h	2017-08-01 19:37:04 UTC (rev 5000)
@@ -31,7 +31,7 @@
 	
 	// constructors, destructor
 	public:
-	PartText(QETElementEditor *, QGraphicsItem * = 0, ElementScene * = 0);
+    PartText(QETElementEditor *, QGraphicsItem * = 0);
 	virtual ~PartText();
 	
 	private:
@@ -55,12 +55,6 @@
 	virtual QRectF sceneGeometricRect() const;
 	virtual void startUserTransformation(const QRectF &);
 	virtual void handleUserTransformation(const QRectF &, const QRectF &);
-	virtual void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget * = 0 );
-	virtual void setDecorator(ElementPrimitiveDecorator *);
-	virtual bool singleItemPressEvent(ElementPrimitiveDecorator *, QGraphicsSceneMouseEvent *);
-	virtual bool singleItemMoveEvent(ElementPrimitiveDecorator *, QGraphicsSceneMouseEvent *);
-	virtual bool singleItemReleaseEvent(ElementPrimitiveDecorator *, QGraphicsSceneMouseEvent *);
-	virtual bool singleItemDoubleClickEvent(ElementPrimitiveDecorator *, QGraphicsSceneMouseEvent *);
 
 	///PROPERTY
 	void setProperty(const char *name, const QVariant &value) {QGraphicsTextItem::setProperty(name, value);}
@@ -81,31 +75,29 @@
 	Q_PROPERTY(QString text READ toPlainText WRITE setPlainText)
 	
 	public slots:
-	void adjustItemPosition(int = 0);
-	void setEditable(bool);
-	void startEdition();
-	void endEdition();
+        void adjustItemPosition(int = 0);
+        void setEditable(bool);
+        void startEdition();
+        void endEdition();
 	
 	protected:
-	virtual void contextMenuEvent(QGraphicsSceneContextMenuEvent *);
-	virtual void hoverMoveEvent(QGraphicsSceneHoverEvent *);
-	virtual bool sceneEventFilter(QGraphicsItem *, QEvent *);
-	virtual void focusInEvent(QFocusEvent *);
-	virtual void focusOutEvent(QFocusEvent *);
-	virtual void keyPressEvent(QKeyEvent *);
-	virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *);
-	virtual QVariant itemChange(GraphicsItemChange, const QVariant &);
-	QRectF boundingRect() const;
+        virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
+        virtual void mousePressEvent(QGraphicsSceneMouseEvent *event);
+        virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
+        virtual void focusInEvent(QFocusEvent *);
+        virtual void focusOutEvent(QFocusEvent *);
+        virtual void keyPressEvent(QKeyEvent *);
+        virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *);
+        virtual QVariant itemChange(GraphicsItemChange, const QVariant &);
+        QRectF boundingRect() const;
 	
 	private:
-	QPointF margin() const;
-#ifdef QET_DEBUG_EDITOR_TEXTS
-	void drawPoint(QPainter *, const QPointF &);
-#endif
-	QString previous_text;
-	qreal real_font_size_;
-	QPointF saved_point_;
-	qreal saved_font_size_;
-	QGraphicsItem *decorator_;
+        QPointF margin() const;
+        QString previous_text;
+        qreal real_font_size_;
+        QPointF saved_point_;
+        qreal saved_font_size_;
+        QGraphicsItem *decorator_;
+        QPointF m_origine_pos;
 };
 #endif

Modified: trunk/sources/editor/graphicspart/parttextfield.cpp
===================================================================
--- trunk/sources/editor/graphicspart/parttextfield.cpp	2017-08-01 19:09:31 UTC (rev 4999)
+++ trunk/sources/editor/graphicspart/parttextfield.cpp	2017-08-01 19:37:04 UTC (rev 5000)
@@ -20,26 +20,24 @@
 #include "elementprimitivedecorator.h"
 #include "qetapp.h"
 #include "QPropertyUndoCommand/qpropertyundocommand.h"
+#include "elementscene.h"
 
 /**
 	Constructeur
 	@param editor L'editeur d'element concerne
 	@param parent Le QGraphicsItem parent de ce champ de texte
-	@param scene La scene sur laquelle figure ce champ de texte
 */
-PartTextField::PartTextField(QETElementEditor *editor, QGraphicsItem *parent, QGraphicsScene *scene) :
+PartTextField::PartTextField(QETElementEditor *editor, QGraphicsItem *parent) :
 	QGraphicsTextItem(parent),
 	CustomElementPart(editor),
 	follow_parent_rotations(true),
 	m_tagg("none"),
-	previous_text(),
-	decorator_(0)
+    previous_text()
 {
-	Q_UNUSED(scene);
 	setDefaultTextColor(Qt::black);
 	setFont(QETApp::diagramTextsFont());
 	real_font_size_ = font().pointSize();
-	setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemSendsGeometryChanges);
+    setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemSendsGeometryChanges | QGraphicsItem::ItemIsMovable);
 	setAcceptHoverEvents(true);
 	setPlainText(QObject::tr("_", "default text when adding a textfield in the element editor"));
 	
@@ -112,73 +110,43 @@
 	return(QPointF(0.0, boundingRect().bottom() / 2.0));
 }
 
-/**
-	Handle context menu events.
-	@param event Object describing the context menu event to handle.
-*/
-void PartTextField::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) {
-	Q_UNUSED(event);
+void PartTextField::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
+{
+    if((event->buttons() & Qt::LeftButton) && (flags() & QGraphicsItem::ItemIsMovable))
+    {
+        QPointF pos = event->scenePos() + (m_origine_pos - event->buttonDownScenePos(Qt::LeftButton));
+        event->modifiers() == Qt::ControlModifier ? setPos(pos) : setPos(elementScene()->snapToGrid(pos));
+    }
+    else
+        QGraphicsObject::mouseMoveEvent(event);
 }
 
-/**
-	Handle events generated when the mouse hovers over the decorator.
-	@param event Object describing the hover event.
-*/
-void PartTextField::hoverMoveEvent(QGraphicsSceneHoverEvent *event) {
-	// force the cursor when the text is being edited
-	if (hasFocus() && decorator_) {
-		decorator_ -> setCursor(Qt::IBeamCursor);
-	}
-	QGraphicsTextItem::hoverMoveEvent(event);
+void PartTextField::mousePressEvent(QGraphicsSceneMouseEvent *event)
+{
+    if(event->button() == Qt::LeftButton)
+        m_origine_pos = this->pos();
+
+    QGraphicsObject::mousePressEvent(event);
 }
 
-/**
-	@reimp QGraphicsItem::sceneEventFilter(QGraphicsItem *, QEvent *).
-	Intercepts events before they reach the watched target, i.e. typically the
-	primitives decorator.
-	This method mainly works with key strokes (F2, escape) and double clicks to
-	begin or end text edition.
-*/
-bool PartTextField::sceneEventFilter(QGraphicsItem *watched, QEvent *event) {
-	if (watched != decorator_) return(false);
-	
-	QPointF event_scene_pos = QET::graphicsSceneEventPos(event);
-	if (!event_scene_pos.isNull()) {
-		if (contains(mapFromScene(event_scene_pos))) {
-			if (hasFocus()) {
-				return sceneEvent(event); // manually deliver the event to this item
-				return(true); // prevent this event from being delivered to any item
-			} else {
-				if (event -> type() == QEvent::GraphicsSceneMouseDoubleClick) {
-					mouseDoubleClickEvent(static_cast<QGraphicsSceneMouseEvent *>(event));
-				}
-			}
-		}
-	}
-	else if (event -> type() == QEvent::KeyRelease || event -> type() == QEvent::KeyPress) {
-		// Intercept F2 and escape keystrokes to focus in and out
-		QKeyEvent *key_event = static_cast<QKeyEvent *>(event);
-		if (!hasFocus() && key_event -> key() == Qt::Key_F2) {
-			setEditable(true);
-			QTextCursor qtc = textCursor();
-			qtc.setPosition(qMax(0, document()->characterCount() - 1));
-			setTextCursor(qtc);
-		} else if (hasFocus() && key_event -> key() == Qt::Key_Escape) {
-			endEdition();
-		}
-		if (hasFocus()) {
-			sceneEvent(event); // manually deliver the event to this item
-			return(true); // prevent this event from being delivered to any item
-		}
-	}
-	return(false);
+void PartTextField::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
+{
+    if((event->button() & Qt::LeftButton) && (flags() & QGraphicsItem::ItemIsMovable) && m_origine_pos != pos())
+    {
+        QPropertyUndoCommand *undo = new QPropertyUndoCommand(this, "pos", QVariant(m_origine_pos), QVariant(pos()));
+        undo->setText(tr("Déplacer un champ texte"));
+        undo->enableAnimation();
+        elementScene()->undoStack().push(undo);
+    }
+
+    QGraphicsObject::mouseReleaseEvent(event);
 }
 
-/*
-	@reimp QGraphicsItem::focusInEvent(QFocusEvent *)
-	@param e The QFocusEvent object describing the focus gain.
-	Start text edition when the item gains focus.
-*/
+/**
+ * @brief PartTextField::focusInEvent
+ * @param e The QFocusEvent object describing the focus gain.
+    Start text edition when the item gains focus.
+ */
 void PartTextField::focusInEvent(QFocusEvent *e) {
 	startEdition();
 	QGraphicsTextItem::focusInEvent(e);
@@ -286,90 +254,8 @@
 	qreal new_font_size = saved_font_size_ * sy;
 	setProperty("real_size", qMax(1, qRound(new_font_size)));
 }
-/**
-	Dessine le texte statique.
-	@param painter QPainter a utiliser pour effectuer le rendu
-	@param qsogi   Pptions de dessin
-	@param widget  Widget sur lequel on dessine (facultatif)
-*/
-void PartTextField::paint(QPainter *painter, const QStyleOptionGraphicsItem *qsogi, QWidget *widget) {
-	// According to the source code of QGraphicsTextItem::paint(), this should
-	// avoid the drawing of the dashed rectangle around the text.
-	QStyleOptionGraphicsItem our_qsogi(*qsogi);
-	our_qsogi.state = QStyle::State_None;
-	
-	QGraphicsTextItem::paint(painter, &our_qsogi, widget);
-#ifdef QET_DEBUG_EDITOR_TEXTS
-	painter -> setPen(Qt::blue);
-	painter -> drawRect(boundingRect());
-	
-	painter -> setPen(Qt::red);
-	drawPoint(painter, QPointF(0, 0));
-	
-	painter -> setPen(QColor("#800000"));
-	drawPoint(painter, mapFromScene(pos()));
-#endif
-}
 
 /**
-	@reimp CustomElementPart::setDecorator(ElementPrimitiveDecorator *)
-	Install or remove a sceneEventFilter on the decorator and ensure it will
-	adjust itself while the text is being edited.
-*/
-void PartTextField::setDecorator(ElementPrimitiveDecorator *decorator) {
-	if (decorator) {
-		decorator -> installSceneEventFilter(this);
-		// ensure the decorator will adjust itself when the text area expands or shrinks
-		connect(document(), SIGNAL(contentsChanged()), decorator, SLOT(adjust()));
-	}
-	else {
-		decorator_ -> removeSceneEventFilter(this);
-		endEdition();
-	}
-	decorator_ = decorator;
-}
-
-/**
-	Accept the mouse \a event relayed by \a decorator if this text item has focus.
-*/
-bool PartTextField::singleItemPressEvent(ElementPrimitiveDecorator *decorator, QGraphicsSceneMouseEvent *event) {
-	Q_UNUSED(decorator)
-	Q_UNUSED(event)
-	return(hasFocus());
-}
-
-/**
-	Accept the mouse \a event relayed by \a decorator if this text item has focus.
-*/
-bool PartTextField::singleItemMoveEvent(ElementPrimitiveDecorator *decorator, QGraphicsSceneMouseEvent *event) {
-	Q_UNUSED(decorator)
-	Q_UNUSED(event)
-	return(hasFocus());
-}
-
-/**
-	Accept the mouse \a event relayed by \a decorator if this text item has focus.
-*/
-bool PartTextField::singleItemReleaseEvent(ElementPrimitiveDecorator *decorator, QGraphicsSceneMouseEvent *event) {
-	Q_UNUSED(decorator)
-	Q_UNUSED(event)
-	return(hasFocus());
-}
-
-/**
-	Accept the mouse \a event relayed by \a decorator if this text item has focus.
-*/
-bool PartTextField::singleItemDoubleClickEvent(ElementPrimitiveDecorator *decorator, QGraphicsSceneMouseEvent *event) {
-	Q_UNUSED(decorator)
-	// calling mouseDoubleClickEvent() will set this text item editable and grab keyboard focus
-	if (event -> button() == Qt::LeftButton) {
-		mouseDoubleClickEvent(event);
-		return(true);
-	}
-	return(false);
-}
-
-/**
 	Cette methode s'assure que la position du champ de texte est coherente
 	en repositionnant son origine (c-a-d le milieu du bord gauche du champ de
 	texte) a la position originale. Cela est notamment utile lorsque le champ
@@ -434,27 +320,4 @@
 	setTextCursor(qtc);
 	
 	setEditable(false);
-	if (decorator_) {
-		decorator_ -> setFocus();
-	}
 }
-
-#ifdef QET_DEBUG_EDITOR_TEXTS
-/**
-	Dessine deux petites fleches pour mettre un point en valeur
-	@param painter QPainter a utiliser pour effectuer le rendu
-	@param point   Point a dessiner
-*/
-void PartTextField::drawPoint(QPainter *painter, const QPointF &point) {
-	qreal px = point.x();
-	qreal py = point.y();
-	qreal size_1 = 5.0;
-	qreal size_2 = 1.0;
-	painter -> drawLine(QLineF(px, py, px + size_1, py));
-	painter -> drawLine(QLineF(px + size_1 - size_2, py - size_2, px + size_1, py));
-	painter -> drawLine(QLineF(px + size_1 - size_2, py + size_2, px + size_1, py));
-	painter -> drawLine(QLineF(px, py, px, py + size_1));
-	painter -> drawLine(QLineF(px, py + size_1, px - size_2, py + size_1 - size_2));
-	painter -> drawLine(QLineF(px, py + size_1, px + size_2, py + size_1 - size_2));
-}
-#endif

Modified: trunk/sources/editor/graphicspart/parttextfield.h
===================================================================
--- trunk/sources/editor/graphicspart/parttextfield.h	2017-08-01 19:09:31 UTC (rev 4999)
+++ trunk/sources/editor/graphicspart/parttextfield.h	2017-08-01 19:37:04 UTC (rev 5000)
@@ -29,12 +29,13 @@
 	a default value. The field will remain editable once the element is added onto
 	a diagram. lorsque l'element sera pose sur un schema.
 */
-class PartTextField : public QGraphicsTextItem, public CustomElementPart {
+class PartTextField : public QGraphicsTextItem, public CustomElementPart
+{
 	Q_OBJECT
 	
 	// constructors, destructor
 	public:
-	PartTextField(QETElementEditor *, QGraphicsItem * = 0, QGraphicsScene * = 0);
+    PartTextField(QETElementEditor *, QGraphicsItem * = 0);
 	virtual ~PartTextField();
 	
 	private:
@@ -61,12 +62,6 @@
 	virtual QRectF sceneGeometricRect() const;
 	virtual void startUserTransformation(const QRectF &);
 	virtual void handleUserTransformation(const QRectF &, const QRectF &);
-	virtual void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget * = 0 );
-	virtual void setDecorator(ElementPrimitiveDecorator *);
-	virtual bool singleItemPressEvent(ElementPrimitiveDecorator *, QGraphicsSceneMouseEvent *);
-	virtual bool singleItemMoveEvent(ElementPrimitiveDecorator *, QGraphicsSceneMouseEvent *);
-	virtual bool singleItemReleaseEvent(ElementPrimitiveDecorator *, QGraphicsSceneMouseEvent *);
-	virtual bool singleItemDoubleClickEvent(ElementPrimitiveDecorator *, QGraphicsSceneMouseEvent *);
 
 	///PROPERTY
 	virtual void setProperty(const char *name, const QVariant &value) {QGraphicsTextItem::setProperty(name, value);}
@@ -101,26 +96,23 @@
 	void startEdition();
 	void endEdition();
 	
-	protected:
-	virtual void contextMenuEvent(QGraphicsSceneContextMenuEvent *);
-	virtual void hoverMoveEvent(QGraphicsSceneHoverEvent *);
-	virtual bool sceneEventFilter(QGraphicsItem *, QEvent *);
-	virtual void focusInEvent(QFocusEvent *);
-	virtual void focusOutEvent(QFocusEvent *);
-	virtual void keyPressEvent(QKeyEvent *);
-	virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *);
-	virtual QVariant itemChange(GraphicsItemChange, const QVariant &);
-	QRectF boundingRect() const;
+	protected:   
+        virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
+        virtual void mousePressEvent(QGraphicsSceneMouseEvent *event);
+        virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
+        virtual void focusInEvent(QFocusEvent *);
+        virtual void focusOutEvent(QFocusEvent *);
+        virtual void keyPressEvent(QKeyEvent *);
+        virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *);
+        virtual QVariant itemChange(GraphicsItemChange, const QVariant &);
+        QRectF boundingRect() const;
 	
 	private:
-	QPointF margin() const;
-#ifdef QET_DEBUG_EDITOR_TEXTS
-	void drawPoint(QPainter *, const QPointF &);
-#endif
-	QString previous_text;
-	qreal real_font_size_;
-	QPointF saved_point_;
-	qreal saved_font_size_;
-	QGraphicsItem *decorator_;
+        QPointF margin() const;
+        QString previous_text;
+        qreal real_font_size_;
+        QPointF saved_point_;
+        qreal saved_font_size_;
+        QPointF m_origine_pos;
 };
 #endif


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