[qet] qet/qet: [4786] Cross ref item : clickable link work when Xref is displayed as a cross

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


Revision: 4786
Author:   blacksun
Date:     2016-11-17 15:42:07 +0100 (Thu, 17 Nov 2016)
Log Message:
-----------
Cross ref item : clickable link work when Xref is displayed as a cross

Modified Paths:
--------------
    trunk/sources/qetgraphicsitem/crossrefitem.cpp
    trunk/sources/qetgraphicsitem/crossrefitem.h

Modified: trunk/sources/qetgraphicsitem/crossrefitem.cpp
===================================================================
--- trunk/sources/qetgraphicsitem/crossrefitem.cpp	2016-11-16 21:11:28 UTC (rev 4785)
+++ trunk/sources/qetgraphicsitem/crossrefitem.cpp	2016-11-17 14:42:07 UTC (rev 4786)
@@ -25,9 +25,9 @@
 #include "assignvariables.h"
 
 //define the height of the header.
-#define header 5
+static int header = 5;
 //define the minimal height of the cross (without header)
-#define cross_min_heigth 33
+static int cross_min_heigth = 33;
 
 /**
  * @brief CrossRefItem::CrossRefItem
@@ -107,51 +107,6 @@
 }
 
 /**
- * @brief CrossRefItem::allElementsPositionText
- * Return the text of all elements linked to @m_element, in several QString
- * according to the type of linked elements. Each text of elements are separate by "\n"
- * @param no_str the string of NO contacts
- * @param nc_str the string of NC contacts
- * @param add_prefix must add prefix to text (true) or not (false);
- */
-void CrossRefItem::allElementsPositionText(QString &no_str, QString &nc_str, const bool &add_prefix) const
-{
-	QString *tmp_str = nullptr;
-	foreach (Element *elmt, m_element->linkedElements())
-	{
-			//We continue if element is a power contact and xref propertie
-			//is set to don't show power contact
-		if (m_properties.displayHas() == XRefProperties::Cross &&
-			!m_properties.showPowerContact() &&
-			elmt -> kindInformations()["type"].toString() == "power")
-			continue;
-
-		QString state = elmt->kindInformations()["state"].toString();
-
-		//NO and NC are displayed in single place in the cross
-		if (state == "NO" || state == "NC")
-		{
-			if (state == "NO") tmp_str = &no_str;
-			else if (state == "NC") tmp_str = &nc_str;
-
-			if (!tmp_str->isEmpty()) *tmp_str += "\n";
-			*tmp_str += elementPositionText(elmt, add_prefix);
-		}
-
-		//SW are displayed in NC and NO column in the cross
-		else if (state == "SW")
-		{
-			for (int i = 0; i < 2; i++)
-			{
-				tmp_str = i==0? &no_str : &nc_str;
-				if (!tmp_str->isEmpty()) *tmp_str += "\n";
-				*tmp_str += elementPositionText(elmt, add_prefix);
-			}
-		}
-	}
-}
-
-/**
  * @brief CrossRefItem::updateProperties
  * update the curent properties
  */
@@ -195,7 +150,8 @@
 	qp.setFont(QETApp::diagramTextsFont(5));
 
 		//Draw cross or contact, only if master element is linked.
-	if (! m_element->linkedElements().isEmpty()) {
+	if (! m_element->linkedElements().isEmpty())
+	{
 		XRefProperties::DisplayHas dh = m_properties.displayHas();
 
 		if (dh == XRefProperties::Cross)
@@ -260,10 +216,6 @@
 			view->fitInView(fit, Qt::KeepAspectRatioByExpanding);
 		}
 	}
-	else
-	{
-		m_element->editProperty();
-	}
 }
 
 void CrossRefItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
@@ -278,42 +230,49 @@
 
 	if (m_hovered_contact)
 	{
-		QRectF rect = m_hovered_contacts_map.value(m_hovered_contact);
-			//Mouse hover the same rect than previous hover event
-		if (rect.contains(pos))
+		foreach(QRectF rect, m_hovered_contacts_map.values(m_hovered_contact))
 		{
-			QGraphicsObject::hoverMoveEvent(event);
-			return;
+				//Mouse hover the same rect than previous hover event
+			if (rect.contains(pos))
+			{
+				QGraphicsObject::hoverMoveEvent(event);
+				return;
+			}
 		}
-			//Mouse don't hover previous rect
-		else
+
+			//At this point, mouse don't hover previous rect
+		m_hovered_contact = nullptr;
+
+		foreach (Element *elmt, m_hovered_contacts_map.keys())
 		{
-			m_hovered_contact = nullptr;
-
-			foreach (Element *elmt, m_hovered_contacts_map.keys())
+			foreach(QRectF rect, m_hovered_contacts_map.values(elmt))
 			{
 					//Mouse hover a contact
-				if (m_hovered_contacts_map.value(elmt).contains(pos))
+				if (rect.contains(pos))
 				{
 					m_hovered_contact = elmt;
 				}
 			}
-			updateLabel();
-			QGraphicsObject::hoverMoveEvent(event);
-			return;
 		}
+
+		updateLabel();
+		QGraphicsObject::hoverMoveEvent(event);
+		return;
 	}
 	else
 	{
 		foreach (Element *elmt, m_hovered_contacts_map.keys())
 		{
-				//Mouse hover a contact
-			if (m_hovered_contacts_map.value(elmt).contains(pos))
+			foreach(QRectF rect, m_hovered_contacts_map.values(elmt))
 			{
-				m_hovered_contact = elmt;
-				updateLabel();
-				QGraphicsObject::hoverMoveEvent(event);
-				return;
+					//Mouse hover a contact
+				if (rect.contains(pos))
+				{
+					m_hovered_contact = elmt;
+					updateLabel();
+					QGraphicsObject::hoverMoveEvent(event);
+					return;
+				}
 			}
 		}
 	}
@@ -378,43 +337,56 @@
  * for calculate the size of the cross bounding rect.
  * The cross ref item is drawing according to the size of the cross bounding rect.
  */
-void CrossRefItem::setUpCrossBoundingRect(QPainter &painter) {
+void CrossRefItem::setUpCrossBoundingRect(QPainter &painter)
+{
 		//No need to calcul if nothing is linked
-	if (!m_element->isFree()) {
+	if (m_element->isFree()) return;
 
-		QString no_str, nc_str;
-		allElementsPositionText(no_str, nc_str, true);
+	QStringList no_str, nc_str;
 
-			//There is no string to display, we return now
-		if (no_str.isEmpty() && nc_str.isEmpty()) return;
+	foreach (Element *elmt, NOElements())
+		no_str.append(elementPositionText(elmt, true));
+	foreach(Element *elmt, NCElements())
+		nc_str.append(elementPositionText(elmt, true));
 
-			//this is the default size of cross ref item
-		QRectF default_bounding(0, 0, 40, header + cross_min_heigth);
 
-			/*
-			 * Adjust the size of default_bounding if needed.
-			 * We calcule the size by using a single text
-			 * because in the method fillCrossRef, the text is draw like this (aka single text)
-			 */
+		//There is no string to display, we return now
+	if (no_str.isEmpty() && nc_str.isEmpty()) return;
 
-			//Adjust according to the NO
-		QRectF bounding = painter.boundingRect(QRectF (), Qt::AlignCenter, no_str);
-		if (bounding.height() > default_bounding.height() - header)
-			default_bounding.setHeight(bounding.height() + header); //adjust the height
-		if (bounding.width() > default_bounding.width()/2)
-			default_bounding.setWidth(bounding.width()*2);			//adjust the width
+		//this is the default size of cross ref item
+	QRectF default_bounding(0, 0, 40, header + cross_min_heigth);
 
-			//Adjust according to the NC
-		bounding = painter.boundingRect(QRectF (), Qt::AlignCenter, nc_str);
-		if (bounding.height() > default_bounding.height() - header)
-			default_bounding.setHeight(bounding.height() + header); //adjust the heigth
-		if (bounding.width() > default_bounding.width()/2)
-			default_bounding.setWidth(bounding.width()*2);			//adjust the width
+		//Bounding rect of the NO text
+	QRectF no_bounding;
+	foreach(QString str, no_str)
+	{
+		QRectF bounding = painter.boundingRect(QRectF (), Qt::AlignCenter, str);
+		no_bounding = no_bounding.united(bounding);
+	}
+		//Adjust according to the NO
+	if (no_bounding.height() > default_bounding.height() - header)
+		default_bounding.setHeight(no_bounding.height() + header); //adjust the height
+	if (no_bounding.width() > default_bounding.width()/2)
+		default_bounding.setWidth(no_bounding.width()*2);			//adjust the width
 
-		m_shape_path.addRect(default_bounding);
-		prepareGeometryChange();
-		m_bounding_rect = default_bounding;
+		//Bounding rect of the NC text
+	QRectF nc_bounding;
+	foreach(QString str, nc_str)
+	{
+		QRectF bounding = painter.boundingRect(QRectF (), Qt::AlignCenter, str);
+		nc_bounding = nc_bounding.united(bounding);
 	}
+		//Adjust according to the NC
+	if (nc_bounding.height() > default_bounding.height() - header)
+		default_bounding.setHeight(nc_bounding.height() + header); //adjust the heigth
+	if (nc_bounding.width() > default_bounding.width()/2)
+		default_bounding.setWidth(nc_bounding.width()*2);			//adjust the width
+
+		//Minor adjustement for better visual
+	default_bounding.adjust(0, 0, 4, 0);
+	m_shape_path.addRect(default_bounding);
+	prepareGeometryChange();
+	m_bounding_rect = default_bounding;
 }
 
 /**
@@ -422,9 +394,11 @@
  * Draw this crossref with a cross
  * @param painter, painter to use
  */
-void CrossRefItem::drawAsCross(QPainter &painter) {
+void CrossRefItem::drawAsCross(QPainter &painter)
+{
 		//calcul the size of the cross
 	setUpCrossBoundingRect(painter);
+	m_hovered_contacts_map.clear();
 
 		//Bounding rect is empty that mean there's no contact to draw
 	if (boundingRect().isEmpty()) return;
@@ -584,11 +558,9 @@
 		painter.drawText(text_rect, Qt::AlignLeft | Qt::AlignVCenter, str);
 		bounding_rect = bounding_rect.united(text_rect);
 
-			//If an element have several contact drawed, we united all bounding rect of contacts.
 		if (m_hovered_contacts_map.contains(elmt))
 		{
-			QRectF rect = m_hovered_contacts_map.value(elmt);
-			m_hovered_contacts_map.insert(elmt, rect.united(bounding_rect));
+			m_hovered_contacts_map.insertMulti(elmt, bounding_rect);
 		}
 		else
 		{
@@ -626,11 +598,9 @@
 		painter.drawText(text_rect, Qt::AlignLeft | Qt::AlignVCenter, str);
 		bounding_rect = bounding_rect.united(text_rect);
 
-			//If an element have several contact drawed, we united all bounding rect of contacts.
 		if (m_hovered_contacts_map.contains(elmt))
 		{
-			QRectF rect = m_hovered_contacts_map.value(elmt);
-			m_hovered_contacts_map.insert(elmt, rect.united(bounding_rect));
+			m_hovered_contacts_map.insertMulti(elmt, bounding_rect);
 		}
 		else
 		{
@@ -649,19 +619,59 @@
  * Fill the content of the cross ref
  * @param painter painter to use.
  */
-void CrossRefItem::fillCrossRef(QPainter &painter) {
+void CrossRefItem::fillCrossRef(QPainter &painter)
+{
 	if (m_element->isFree()) return;
 
-	QString no_str, nc_str;
-	allElementsPositionText(no_str, nc_str, true);
-
 	qreal middle_cross = m_bounding_rect.width()/2;
 
-	QRectF rect_(0, header, middle_cross, boundingRect().height()-header);
-	painter.drawText(rect_, Qt::AlignTop | Qt::AlignLeft, no_str);
+		//Fill NO
+	QPointF no_top_left(0, header);
+	foreach(Element *elmt, NOElements())
+	{
+		QPen pen = painter.pen();
+		m_hovered_contact == elmt ? pen.setColor(Qt::blue) :pen.setColor(Qt::black);
+		painter.setPen(pen);
 
-	rect_.moveTopLeft(QPointF (middle_cross, header));
-	painter.drawText(rect_, Qt::AlignTop | Qt::AlignRight, nc_str);
+		QString str = elementPositionText(elmt, true);
+		QRectF bounding = painter.boundingRect(QRectF(no_top_left, QSize(middle_cross, 1)), Qt::AlignLeft, str);
+		painter.drawText(bounding, Qt::AlignLeft, str);
+
+		if (m_hovered_contacts_map.contains(elmt))
+		{
+			m_hovered_contacts_map.insertMulti(elmt, bounding);
+		}
+		else
+		{
+			m_hovered_contacts_map.insert(elmt, bounding);
+		}
+
+		no_top_left.ry() += bounding.height();
+	}
+
+		//Fill NC
+	QPointF nc_top_left(middle_cross, header);
+	foreach(Element *elmt, NCElements())
+	{
+		QPen pen = painter.pen();
+		m_hovered_contact == elmt ? pen.setColor(Qt::blue) :pen.setColor(Qt::black);
+		painter.setPen(pen);
+
+		QString str = elementPositionText(elmt, true);
+		QRectF bounding = painter.boundingRect(QRectF(nc_top_left, QSize(middle_cross, 1)), Qt::AlignRight, str);
+		painter.drawText(bounding, Qt::AlignRight, str);
+
+		if (m_hovered_contacts_map.contains(elmt))
+		{
+			m_hovered_contacts_map.insertMulti(elmt, bounding);
+		}
+		else
+		{
+			m_hovered_contacts_map.insert(elmt, bounding);
+		}
+
+		nc_top_left.ry() += bounding.height();
+	}
 }
 
 /**
@@ -682,9 +692,10 @@
 
 		QRectF r, text_bounding;
 		qreal center = boundingRect().center().x();
+		qreal width = boundingRect().width() > 70 ? boundingRect().width()/2 : 35;
 
-		r = QRectF(QPointF(center - 35, boundingRect().bottom()),
-				   QPointF(center + 35, boundingRect().bottom() + 1));
+		r = QRectF(QPointF(center - width, boundingRect().bottom()),
+				   QPointF(center + width, boundingRect().bottom() + 1));
 
 		text_bounding = painter.boundingRect(r, Qt::TextWordWrap | Qt::AlignHCenter, text);
 		painter.drawText(text_bounding, Qt::TextWordWrap | Qt::AlignHCenter, text);
@@ -710,3 +721,62 @@
 	else qDebug() << "CrossRefItem,no text tagged 'label' found to set has parent";
 }
 
+/**
+ * @brief CrossRefItem::NOElements
+ * @return The linked elements of @m_element wich are open or switch contact.
+ * If linked element is a power contact, xref propertie is set to don't show power contact
+ * and this cross item must be drawed as cross, the element is not append in the list.
+ */
+QList<Element *> CrossRefItem::NOElements() const
+{
+	QList<Element *> no_list;
+
+	foreach (Element *elmt, m_element->linkedElements())
+	{
+			//We continue if element is a power contact and xref propertie
+			//is set to don't show power contact
+		if (m_properties.displayHas() == XRefProperties::Cross &&
+			!m_properties.showPowerContact() &&
+			elmt -> kindInformations()["type"].toString() == "power")
+			continue;
+
+		QString state = elmt->kindInformations()["state"].toString();
+
+		if (state == "NO" || state == "SW")
+		{
+			no_list.append(elmt);
+		}
+	}
+
+	return no_list;
+}
+
+/**
+ * @brief CrossRefItem::NCElements
+ * @return The linked elements of @m_element wich are close or switch contact
+ * If linked element is a power contact, xref propertie is set to don't show power contact
+ * and this cross item must be drawed as cross, the element is not append in the list.
+ */
+QList<Element *> CrossRefItem::NCElements() const
+{
+	QList<Element *> nc_list;
+
+	foreach (Element *elmt, m_element->linkedElements())
+	{
+			//We continue if element is a power contact and xref propertie
+			//is set to don't show power contact
+		if (m_properties.displayHas() == XRefProperties::Cross &&
+			!m_properties.showPowerContact() &&
+			elmt -> kindInformations()["type"].toString() == "power")
+			continue;
+
+		QString state = elmt->kindInformations()["state"].toString();
+
+		if (state == "NC" || state == "SW")
+		{
+			nc_list.append(elmt);
+		}
+	}
+
+	return nc_list;
+}

Modified: trunk/sources/qetgraphicsitem/crossrefitem.h
===================================================================
--- trunk/sources/qetgraphicsitem/crossrefitem.h	2016-11-16 21:11:28 UTC (rev 4785)
+++ trunk/sources/qetgraphicsitem/crossrefitem.h	2016-11-17 14:42:07 UTC (rev 4786)
@@ -61,12 +61,7 @@
 		QRectF boundingRect			() const;
 		virtual QPainterPath shape	() const;
 		QString elementPositionText (const Element *elmt, const bool &add_prefix = false) const;
-		void allElementsPositionText (QString &no_str, QString &nc_str,const bool &add_prefix = false) const;
-		void setTextLabel(QString label);
 
-
-	signals:
-
 	public slots:
 		void updateProperties ();
 		void updateLabel   ();
@@ -88,6 +83,8 @@
 		void fillCrossRef			(QPainter &painter);
 		void AddExtraInfo			(QPainter &painter, QString);
 		void setTextParent			();
+		QList<Element *> NOElements() const;
+		QList<Element *> NCElements() const;
 
 		//Attributes
 	private:
@@ -99,7 +96,6 @@
 		int			   m_drawed_contacts;
 		QMap <Element *, QRectF> m_hovered_contacts_map;
 		Element *m_hovered_contact = nullptr;
-		QRectF m_hover_text_rect;
 
 };
 


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