cross ref item : show the master comment at the bottom of cross

element : improve the function to sort an element list
qet graphics item : add a bool to disable the snap to grid (used for cross ref item, to be exactly at the bottom of element)


git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@2948 bfdf4180-ca20-0410-9c96-a3a8aa849046
This commit is contained in:
blacksun
2014-03-26 10:41:06 +00:00
parent b69bbbe3f7
commit 0c486bcb09
6 changed files with 116 additions and 47 deletions

View File

@@ -33,8 +33,10 @@ CrossRefItem::CrossRefItem(Element *elmt, QetGraphicsItem *parent) :
QetGraphicsItem(parent), QetGraphicsItem(parent),
element_ (elmt) element_ (elmt)
{ {
snap_to_grid_=false;
setFlags(QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsMovable); setFlags(QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsMovable);
connect(elmt, SIGNAL(positionChange(QPointF)), this, SLOT(autoPos())); connect(elmt, SIGNAL(positionChange(QPointF)), this, SLOT(autoPos()));
connect(elmt, SIGNAL(elementInfoChange(DiagramContext)), this, SLOT(updateLabel()));
connect(diagram()->project(), SIGNAL(projectDiagramsOrderChanged(QETProject*,int,int)), this, SLOT(updateLabel())); connect(diagram()->project(), SIGNAL(projectDiagramsOrderChanged(QETProject*,int,int)), this, SLOT(updateLabel()));
updateLabel(); updateLabel();
} }
@@ -45,47 +47,73 @@ CrossRefItem::CrossRefItem(Element *elmt, QetGraphicsItem *parent) :
*/ */
CrossRefItem::~CrossRefItem() { CrossRefItem::~CrossRefItem() {
disconnect(element_, SIGNAL(positionChange(QPointF)), this, SLOT(autoPos())); disconnect(element_, SIGNAL(positionChange(QPointF)), this, SLOT(autoPos()));
disconnect(element_, SIGNAL(elementInfoChange(DiagramContext)), this, SLOT(updateLabel()));
disconnect(diagram()->project(), SIGNAL(projectDiagramsOrderChanged(QETProject*,int,int)), this, SLOT(updateLabel())); disconnect(diagram()->project(), SIGNAL(projectDiagramsOrderChanged(QETProject*,int,int)), this, SLOT(updateLabel()));
} }
/**
* @brief CrossRefItem::boundingRect
* @return the bounding rect of this item
*/
QRectF CrossRefItem::boundingRect() const {
return bounding_rect_;
}
/**
* @brief CrossRefItem::shape
* @return the shape of this item
*/
QPainterPath CrossRefItem::shape() const{
return shape_path_;
}
/** /**
* @brief CrossRefItem::updateLabel * @brief CrossRefItem::updateLabel
* Update the content of the item * Update the content of the item
*/ */
void CrossRefItem::updateLabel() { void CrossRefItem::updateLabel() {
//init the shape
shape_path_= QPainterPath();
//init the painter //init the painter
QPainter qp(&drawing_); QPainter qp;
qp.begin(&drawing_);
QPen pen_; QPen pen_;
pen_.setWidthF(0.2); pen_.setWidthF(0.2);
qp.setPen(pen_); qp.setPen(pen_);
//calcul the size //calcul the size
setUpBoundingRect(); setUpBoundingRect(qp);
//draw the cross //draw the cross
qp.drawLine(boundingRect().width()/2, 0, boundingRect().width()/2, boundingRect().height()); //vertical line QRectF br = boundingRect();
qp.drawLine(0, header, boundingRect().width(), header); //horizontal line qp.drawLine(br.width()/2, 0, br.width()/2, br.height()-9); //vertical line
qp.drawLine(br.width()/2-25, header, br.width()/2+25, header); //horizontal line
//draw the symbolic NO //draw the symbolic NO
qp.drawLine(5, 3, 10, 3); qreal xoffset = br.width()/2 - 25;
static const QPointF p1[3] = { qp.drawLine(xoffset+5, 3, xoffset+10, 3);
QPointF(10, 0), QPointF p1[3] = {
QPointF(15, 3), QPointF(xoffset+10, 0),
QPointF(20, 3), QPointF(xoffset+15, 3),
QPointF(xoffset+20, 3),
}; };
qp.drawPolyline(p1,3); qp.drawPolyline(p1,3);
//draw the symbolic NC //draw the symbolic NC
static const QPointF p2[3] = { xoffset = br.width()/2;
QPointF(30, 3), QPointF p2[3] = {
QPointF(xoffset+5, 3),
QPointF(xoffset+10, 3),
QPointF(xoffset+10, 0)
/*QPointF(30, 3),
QPointF(35, 3), QPointF(35, 3),
QPointF(35, 0), QPointF(35, 0),*/
}; };
qp.drawPolyline(p2,3); qp.drawPolyline(p2,3);
static const QPointF p3[3] = { QPointF p3[3] = {
QPointF(34, 0), QPointF(xoffset+9, 0),
QPointF(40, 3), QPointF(xoffset+15, 3),
QPointF(45, 3), QPointF(xoffset+20, 3),
}; };
qp.drawPolyline(p3,3); qp.drawPolyline(p3,3);
@@ -99,7 +127,8 @@ void CrossRefItem::updateLabel() {
qp.drawText(header_rect, Qt::AlignCenter, "NC");*/ qp.drawText(header_rect, Qt::AlignCenter, "NC");*/
//and fill it //and fill it
fillCrossRef(&qp); fillCrossRef(qp);
qp.end();
autoPos(); autoPos();
update(); update();
@@ -114,8 +143,7 @@ void CrossRefItem::autoPos() {
QRectF border= element_->diagram()->border(); QRectF border= element_->diagram()->border();
QPointF point; QPointF point;
//if this item have parent calcule //if this item have parent calcule the position by using mapped point.
//te position by using mapped point.
if(parentItem()) { if(parentItem()) {
point = element_->boundingRect().center(); point = element_->boundingRect().center();
QPointF ypoint_ = mapToParent(mapFromScene(0, border.height() - element_->diagram()->border_and_titleblock.titleBlockHeight() - boundingRect().height())); QPointF ypoint_ = mapToParent(mapFromScene(0, border.height() - element_->diagram()->border_and_titleblock.titleBlockHeight() - boundingRect().height()));
@@ -126,18 +154,10 @@ void CrossRefItem::autoPos() {
point.setY(border.height() - element_->diagram()->border_and_titleblock.titleBlockHeight() - boundingRect().height()); point.setY(border.height() - element_->diagram()->border_and_titleblock.titleBlockHeight() - boundingRect().height());
} }
point.setX(point.x() - boundingRect().width()/2); point.setX(point.x() - bounding_rect_.width()/2);
setPos(point); setPos(point);
} }
/**
* @brief CrossRefItem::boundingRect
* @return the bounding rect of this item
*/
QRectF CrossRefItem::boundingRect() const {
return bounding_rect_;
}
/** /**
* @brief CrossRefItem::paint * @brief CrossRefItem::paint
* Paint this item * Paint this item
@@ -157,7 +177,7 @@ void CrossRefItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *opti
t.setCosmetic(true); t.setCosmetic(true);
painter -> setPen(t); painter -> setPen(t);
painter -> setRenderHint(QPainter::Antialiasing, false); painter -> setRenderHint(QPainter::Antialiasing, false);
painter -> drawRect(boundingRect()); painter -> drawPath(shape_path_);
painter -> restore(); painter -> restore();
} }
drawing_.play(painter); drawing_.play(painter);
@@ -187,9 +207,10 @@ void CrossRefItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) {
* @brief CrossRefItem::setUpBoundingRect * @brief CrossRefItem::setUpBoundingRect
* Get the numbers of slaves elements linked to this parent element, * Get the numbers of slaves elements linked to this parent element,
* for calculate the size of the bounding rect. * for calculate the size of the bounding rect.
* Add size of comment text if needed
* The cross ref item is drawing according to the size of the bounding rect. * The cross ref item is drawing according to the size of the bounding rect.
*/ */
void CrossRefItem::setUpBoundingRect() { void CrossRefItem::setUpBoundingRect(QPainter &painter) {
//this is the default size of cross ref item //this is the default size of cross ref item
QRectF default_bounding(0, 0, 50, 40); QRectF default_bounding(0, 0, 50, 40);
@@ -216,8 +237,31 @@ void CrossRefItem::setUpBoundingRect() {
default_bounding.setHeight(default_bounding.height() + (i*8)); default_bounding.setHeight(default_bounding.height() + (i*8));
} }
} }
shape_path_.addRect(default_bounding);
bounding_rect_ = default_bounding; bounding_rect_ = default_bounding;
//check if need to show the comment of @element_
//and add rect of text to the boundingrect
QString comment = element_-> elementInformations()["comment"].toString();
bool must_show = element_-> elementInformations().keyMustShow("comment");
if (!comment.isEmpty() && must_show) {
painter.save();
painter.setFont(QETApp::diagramTextsFont(6));
//calcule the size au graphic text
text_rect_ = QRectF(default_bounding.bottomLeft(), QPointF(default_bounding.bottomRight().x(), default_bounding.bottomRight().y()-9));
text_rect_ = painter.boundingRect(text_rect_, Qt::AlignHCenter ,comment);
bounding_rect_.setSize(default_bounding.united(text_rect_).size());
shape_path_.addRect(text_rect_);
//translate content of shape_path_ if text_rect width
//is bigger than default_bounding width
if(text_rect_.width() > default_bounding.width()) {
int offset = (text_rect_.width()-default_bounding.width())/2;
shape_path_.translate(offset,0);
text_rect_.translate(offset,0);
}
painter.restore();
}
} }
/** /**
@@ -225,7 +269,7 @@ void CrossRefItem::setUpBoundingRect() {
* Fill the content of the cross ref * Fill the content of the cross ref
* @param painter painter to use. * @param painter painter to use.
*/ */
void CrossRefItem::fillCrossRef(QPainter *painter) { void CrossRefItem::fillCrossRef(QPainter &painter) {
if (element_->isFree()) return; if (element_->isFree()) return;
QList <Element *> NO_list; QList <Element *> NO_list;
@@ -238,8 +282,8 @@ void CrossRefItem::fillCrossRef(QPainter *painter) {
else if (state == "NC") NC_list << elmt; else if (state == "NC") NC_list << elmt;
} }
painter -> setFont(QETApp::diagramTextsFont(5)); painter.setFont(QETApp::diagramTextsFont(5));
qreal half_cross = boundingRect().width()/2; qreal half_cross = bounding_rect_.width()/2;
//fill the NO //fill the NO
QString contact_str; QString contact_str;
foreach (Element *elmt, NO_list) { foreach (Element *elmt, NO_list) {
@@ -248,8 +292,8 @@ void CrossRefItem::fillCrossRef(QPainter *painter) {
contact_str += elmt->diagram()->convertPosition(elmt -> scenePos()).toString(); contact_str += elmt->diagram()->convertPosition(elmt -> scenePos()).toString();
contact_str += "\n"; contact_str += "\n";
} }
QRectF rect_(3, header, half_cross, (boundingRect().height()-header)); QRectF rect_(half_cross-22, header, half_cross, (bounding_rect_.height()-header));
painter->drawText(rect_, Qt::AlignTop | Qt::AlignLeft, contact_str); painter.drawText(rect_, Qt::AlignTop | Qt::AlignLeft, contact_str);
//fill the NC //fill the NC
contact_str.clear(); contact_str.clear();
@@ -259,6 +303,25 @@ void CrossRefItem::fillCrossRef(QPainter *painter) {
contact_str += elmt->diagram()->convertPosition(elmt -> scenePos()).toString(); contact_str += elmt->diagram()->convertPosition(elmt -> scenePos()).toString();
contact_str += "\n"; contact_str += "\n";
} }
rect_.setRect(half_cross+3 , header, half_cross, (boundingRect().height()-header)); rect_.setRect(half_cross+3 , header, half_cross+22, (bounding_rect_.height()-header));
painter -> drawText(rect_, Qt::AlignTop | Qt::AlignLeft, contact_str); painter.drawText(rect_, Qt::AlignTop | Qt::AlignLeft, contact_str);
fillExtraInfo(painter);
}
/**
* @brief CrossRefItem::fillExtraInfo
* Fill the comment info of the parent item if needed.
* @param painter painter to use for draw the text
*/
void CrossRefItem::fillExtraInfo(QPainter &painter) {
//check if need to show the comment of @element_
QString comment = element_-> elementInformations()["comment"].toString();
bool must_show = element_-> elementInformations().keyMustShow("comment");
if (!comment.isEmpty() && must_show) {
painter.setFont(QETApp::diagramTextsFont(6));
//draw text inside a roundedrect
painter.drawText(text_rect_, Qt::AlignHCenter, comment);
painter.drawRoundedRect(text_rect_, 2, 2);
}
} }

View File

@@ -39,6 +39,7 @@ class CrossRefItem : public QetGraphicsItem
~CrossRefItem(); ~CrossRefItem();
QRectF boundingRect() const; QRectF boundingRect() const;
virtual QPainterPath shape() const;
signals: signals:
@@ -52,15 +53,16 @@ class CrossRefItem : public QetGraphicsItem
virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *e); virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *e);
private: private:
void setUpBoundingRect(); void setUpBoundingRect(QPainter &painter);
void fillCrossRef(QPainter *painter); void fillCrossRef(QPainter &painter);
void fillExtraInfo(QPainter &painter);
//Attributes //Attributes
private: private:
Element *element_; //element to display the cross reference Element *element_; //element to display the cross reference
QRectF bounding_rect_; QRectF bounding_rect_ , text_rect_;
QPicture drawing_; QPicture drawing_;
bool b; QPainterPath shape_path_;
}; };

View File

@@ -525,11 +525,13 @@ bool comparPos(const Element *elmt1, const Element *elmt2) {
//Compare folio first //Compare folio first
if (elmt1->diagram()->folioIndex() != elmt2->diagram()->folioIndex()) if (elmt1->diagram()->folioIndex() != elmt2->diagram()->folioIndex())
return elmt1->diagram()->folioIndex() < elmt2->diagram()->folioIndex(); return elmt1->diagram()->folioIndex() < elmt2->diagram()->folioIndex();
//Compare the row in second //Compare the row(in letter pos) in second
QString a = elmt1->diagram()->convertPosition(elmt1->scenePos()).letter(); QString a = elmt1->diagram()->convertPosition(elmt1->scenePos()).letter();
QString b = elmt2->diagram()->convertPosition(elmt2->scenePos()).letter(); QString b = elmt2->diagram()->convertPosition(elmt2->scenePos()).letter();
if (a != b) if (a != b)
return a<b; return a<b;
//In last compare the line //In last compare the line, if line is egal, return sorted by row in real pos
if (elmt1->pos().x() == elmt2->pos().x())
return elmt1->y() <= elmt2->pos().y();
return elmt1->pos().x() <= elmt2->pos().x(); return elmt1->pos().x() <= elmt2->pos().x();
} }

View File

@@ -121,7 +121,7 @@ class Element : public QetGraphicsItem {
//METHODS related to information //METHODS related to information
public: public:
DiagramContext elementInformations()const {return element_informations_;} DiagramContext elementInformations()const {return element_informations_;}
void setElementInformations(DiagramContext dc);//{element_informations_ = dc; emit elementInfoChange(dc);} virtual void setElementInformations(DiagramContext dc);
DiagramContext kindInformations() const {return kind_informations_;} //@kind_information_ is used to store more information DiagramContext kindInformations() const {return kind_informations_;} //@kind_information_ is used to store more information
//about the herited class like contactelement for know //about the herited class like contactelement for know
// kind of contact (simple tempo) or number of contact show by the element. // kind of contact (simple tempo) or number of contact show by the element.

View File

@@ -26,7 +26,8 @@
QetGraphicsItem::QetGraphicsItem(QGraphicsItem *parent): QetGraphicsItem::QetGraphicsItem(QGraphicsItem *parent):
QGraphicsObject(parent), QGraphicsObject(parent),
is_movable_(true), is_movable_(true),
first_move_(true) first_move_(true),
snap_to_grid_(true)
{ {
} }
@@ -48,7 +49,7 @@ Diagram* QetGraphicsItem::diagram() const{
*/ */
void QetGraphicsItem::setPos(const QPointF &p) { void QetGraphicsItem::setPos(const QPointF &p) {
if (p == pos() || !is_movable_) return; if (p == pos() || !is_movable_) return;
if (scene()) { if (scene() && snap_to_grid_) {
// arrondit l'abscisse a 10 px pres // arrondit l'abscisse a 10 px pres
int p_x = qRound(p.x() / (Diagram::xGrid * 1.0)) * Diagram::xGrid; int p_x = qRound(p.x() / (Diagram::xGrid * 1.0)) * Diagram::xGrid;
// arrondit l'ordonnee a 10 px pres // arrondit l'ordonnee a 10 px pres

View File

@@ -51,6 +51,7 @@ class QetGraphicsItem : public QGraphicsObject {
protected: protected:
bool is_movable_; bool is_movable_;
bool first_move_; bool first_move_;
bool snap_to_grid_;
QPointF mouse_to_origin_movement_; QPointF mouse_to_origin_movement_;
}; };