From 020d4f575cfd4f4f7b262e428b12f7af6a900b5e Mon Sep 17 00:00:00 2001 From: blacksun Date: Mon, 3 Mar 2014 17:31:45 +0000 Subject: [PATCH] add cross reference graphic item, only for master element. (basic implementation, need to be improved) git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@2906 bfdf4180-ca20-0410-9c96-a3a8aa849046 --- sources/qetgraphicsitem/crossrefitem.cpp | 175 ++++++++++++++++++++++ sources/qetgraphicsitem/crossrefitem.h | 41 +++++ sources/qetgraphicsitem/masterelement.cpp | 15 +- sources/qetgraphicsitem/masterelement.h | 4 + sources/qetgraphicsitem/qetgraphicsitem.h | 2 +- 5 files changed, 235 insertions(+), 2 deletions(-) create mode 100644 sources/qetgraphicsitem/crossrefitem.cpp create mode 100644 sources/qetgraphicsitem/crossrefitem.h diff --git a/sources/qetgraphicsitem/crossrefitem.cpp b/sources/qetgraphicsitem/crossrefitem.cpp new file mode 100644 index 000000000..e0720d146 --- /dev/null +++ b/sources/qetgraphicsitem/crossrefitem.cpp @@ -0,0 +1,175 @@ +#include "crossrefitem.h" +#include "element.h" +#include "qetapp.h" +#include "diagramposition.h" + +/** + * @brief CrossRefItem::CrossRefItem + * Default constructor + * @param elmt element to dispaly the cross ref + * @param parent parent QetGraphicsItem + */ +CrossRefItem::CrossRefItem(Element *elmt, QetGraphicsItem *parent) : + QetGraphicsItem(parent), + element_ (elmt) +{ + setFlags(QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsMovable); + connect(elmt, SIGNAL(positionChange(QPointF)), this, SLOT(autoPos())); + connect(diagram()->project(), SIGNAL(projectDiagramsOrderChanged(QETProject*,int,int)), this, SLOT(updateLabel())); + updateLabel(); + autoPos(); +} + +/** + * @brief CrossRefItem::~CrossRefItem + * Default destructor + */ +CrossRefItem::~CrossRefItem() { + disconnect(element_, SIGNAL(positionChange(QPointF)), this, SLOT(autoPos())); + disconnect(diagram()->project(), SIGNAL(projectDiagramsOrderChanged(QETProject*,int,int)), this, SLOT(updateLabel())); +} + +/** + * @brief CrossRefItem::updateLabel + * Update the content of the item + */ +void CrossRefItem::updateLabel() { + //init the painter + QPainter qp(&drawing_); + QPen pen_; + pen_.setWidth(1); + qp.setPen(pen_); + + //draw the cross + qp.drawLine(30,0, 30,50); //vertical line + qp.drawLine(0,10, 60,10); //horizontal line + + //draw the header + qp.setFont(QETApp::diagramTextsFont(7)); + QRectF header_rect (0,0,30,10); + qp.drawText(header_rect, Qt::AlignCenter, "NO"); + header_rect.setRect(30, 0, 30, 10); + qp.drawText(header_rect, Qt::AlignCenter, "NC"); + + //and fill it + fillCrossRef(&qp); + update(); +} + +/** + * @brief CrossRefItem::autoPos + * Calculate and set position automaticaly. + */ +void CrossRefItem::autoPos() { + if (isSelected() && element_->isSelected()) return; + QRectF border= element_->diagram()->border(); + QPointF point; + + //if this item have parent calcule + //te position by using mapped point. + if(parentItem()) { + point = element_->boundingRect().center(); + QPointF ypoint_ = mapToParent(mapFromScene(0, border.height() - element_->diagram()->border_and_titleblock.titleBlockHeight() - boundingRect().height())); + point.setY(ypoint_.y()); + } + else { + point = element_->sceneBoundingRect().center(); + point.setY(border.height() - element_->diagram()->border_and_titleblock.titleBlockHeight() - boundingRect().height()); + } + + point.setX(point.x() - boundingRect().width()/2); + setPos(point); +} + +/** + * @brief CrossRefItem::boundingRect + * @return the bounding rect of this item + */ +QRectF CrossRefItem::boundingRect() const { + return (QRectF(QPointF(0,0), QSizeF(60,50))); +} + +/** + * @brief CrossRefItem::paint + * Paint this item + * @param painter + * @param option + * @param widget + */ +void CrossRefItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { + Q_UNUSED(option); + Q_UNUSED(widget); + + //draw the selection rect + if (isSelected()) { + painter->save(); + QPen t(Qt::black); + t.setStyle(Qt::DashLine); + painter -> setPen(t); + painter->drawRect(boundingRect()); + painter->restore(); + } + drawing_.play(painter); +} + +/** + * @brief CrossRefItem::mouseMoveEvent + * handle mouse move event + * @param e event + */ +void CrossRefItem::mouseMoveEvent(QGraphicsSceneMouseEvent *e) { + element_->setHighlighted(true); + QetGraphicsItem::mouseMoveEvent(e); +} + +/** + * @brief CrossRefItem::mouseReleaseEvent + * handle mouse release event + * @param e event + */ +void CrossRefItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) { + element_->setHighlighted(false); + QetGraphicsItem::mouseReleaseEvent(e); +} + +/** + * @brief CrossRefItem::fillCrossRef + * Fill the content of the cross ref + * @param painter painter to use. + */ +void CrossRefItem::fillCrossRef(QPainter *painter) { + if (element_->isFree()) return; + + QList NO_list; + QList NC_list; + + //find each no and nc of connected element to element_ + foreach (Element *elmt, element_->linkedElements()) { + QString state = elmt->kindInformations()["state"].toString(); + if (state == "NO") NO_list << elmt; + else if (state == "NC") NC_list << elmt; + } + + painter->setFont(QETApp::diagramTextsFont(6)); + //fill the NO + QString contact_str; + foreach (Element *elmt, NO_list) { + contact_str += QString::number(elmt->diagram()->folioIndex() + 1); + contact_str += "-"; + contact_str += elmt->diagram()->convertPosition(elmt -> scenePos()).toString(); + contact_str += "\n"; + } + QRectF rect_(0, 13, 30, 40); + painter->drawText(rect_, Qt::AlignHCenter, contact_str); + + //fill the NC + contact_str.clear(); + foreach (Element *elmt, NC_list) { + contact_str += QString::number(elmt->diagram()->folioIndex() + 1); + contact_str += "-"; + contact_str += elmt->diagram()->convertPosition(elmt -> scenePos()).toString(); + contact_str += "\n"; + } + rect_.setRect(30, 13, 30, 40); + painter->drawText(rect_, Qt::AlignHCenter, contact_str); +} diff --git a/sources/qetgraphicsitem/crossrefitem.h b/sources/qetgraphicsitem/crossrefitem.h new file mode 100644 index 000000000..a9b93cbb0 --- /dev/null +++ b/sources/qetgraphicsitem/crossrefitem.h @@ -0,0 +1,41 @@ +#ifndef CROSSREFITEM_H +#define CROSSREFITEM_H + +#include "qetgraphicsitem/qetgraphicsitem.h" +class element; + + +class CrossRefItem : public QetGraphicsItem +{ + Q_OBJECT + + //Methods + public: + explicit CrossRefItem(Element *elmt, QetGraphicsItem *parent = 0); + ~CrossRefItem(); + + QRectF boundingRect() const; + + signals: + + public slots: + void updateLabel(); + void autoPos(); + + protected: + virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); + virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *e); + virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *e); + + private: + void fillCrossRef(QPainter *painter); + + //Attributes + private: + Element *element_; //element to display the cross reference + QPicture drawing_; + bool b; + +}; + +#endif // CROSSREFITEM_H diff --git a/sources/qetgraphicsitem/masterelement.cpp b/sources/qetgraphicsitem/masterelement.cpp index 77db6cc72..98cc6c1f0 100644 --- a/sources/qetgraphicsitem/masterelement.cpp +++ b/sources/qetgraphicsitem/masterelement.cpp @@ -29,6 +29,7 @@ MasterElement::MasterElement(const ElementsLocation &location, QGraphicsItem *qg CustomElement(location, qgi, s, state) { link_type_ = Master; + cri_ = 0; } /** @@ -48,9 +49,12 @@ MasterElement::~MasterElement() { void MasterElement::linkToElement(Element *elmt) { // check if element is slave and if isn't already linked if (elmt->linkType() == Slave && !connected_elements.contains(elmt)) { - ///TODO create the cross ref and connection connected_elements << elmt; elmt->linkToElement(this); + //create cross ref item if not yet + if (!cri_) cri_ = new CrossRefItem(this, this); + connect(elmt, SIGNAL(positionChange(QPointF)), cri_, SLOT(updateLabel())); + cri_->updateLabel(); } } @@ -77,5 +81,14 @@ void MasterElement::unlinkElement(Element *elmt) { if (connected_elements.contains(elmt)) { connected_elements.removeOne(elmt); elmt->unlinkElement(this); + //update the graphics cross ref + disconnect(elmt, SIGNAL(positionChange(QPointF)), cri_, SLOT(updateLabel())); + if (isFree()) { + delete cri_; + cri_ = 0; + } + else { + cri_->updateLabel(); + } } } diff --git a/sources/qetgraphicsitem/masterelement.h b/sources/qetgraphicsitem/masterelement.h index 5217c0466..508e1e070 100644 --- a/sources/qetgraphicsitem/masterelement.h +++ b/sources/qetgraphicsitem/masterelement.h @@ -19,6 +19,7 @@ #define MASTERELEMENT_H #include "customelement.h" +#include "crossrefitem.h" class MasterElement : public CustomElement { @@ -35,6 +36,9 @@ class MasterElement : public CustomElement public slots: + private: + CrossRefItem *cri_; + }; #endif // MASTERELEMENT_H diff --git a/sources/qetgraphicsitem/qetgraphicsitem.h b/sources/qetgraphicsitem/qetgraphicsitem.h index cb157b76b..be5c28250 100644 --- a/sources/qetgraphicsitem/qetgraphicsitem.h +++ b/sources/qetgraphicsitem/qetgraphicsitem.h @@ -34,7 +34,7 @@ class QetGraphicsItem : public QGraphicsObject { virtual void setPos(qreal x, qreal y); virtual void rotateBy(const qreal &); virtual void applyRotation(const qreal &); - virtual void editProperty ()=0; + virtual void editProperty (){} signals: void positionChange(QPointF);