5 #include <QTextDocument>
8 #include <QInputDialog>
10 #include <QGraphicsEllipseItem>
11 #include <association.h>
15 qDebug()<<
"destructeur du lien";
18 if(monIndexDansT1!=-1)
t1->
vectLiens.remove(monIndexDansT1,1);
20 if(monIndexDansT2!=-1)
t2->
vectLiens.remove(monIndexDansT2,1);
33 qDebug()<<
"lien::lien(Entite* pt1,Entite* pt2,QGraphicsItem * parent,QString typ, QString relationName, QString pRole)";
35 line=
new QGraphicsLineItem(pt1->pos().x()+pt1->boundingRect().width()/2,pt1->pos().y(),pt2->pos().x()+pt2->boundingRect().width()/2,pt2->pos().y(),
this);
39 this->setFlags(QGraphicsItem::ItemIsSelectable);
67 if(typ==QObject::tr(
"Cif") or typ==QObject::tr(
"Df") or typ==QObject::tr(
"Leak Relation"))
70 leRond=
new QGraphicsEllipseItem(
this);
72 leRond->setData(32,
"Lien");
73 leRond->setBrush(QBrush(QColor(
"#FFD4A3")));
77 int largeur=QFontMetrics(
leTexteDuRond->font()).width(
" CIF ");
81 position.setX(position.x()-largeur/2);
83 leRond->setRect(position.x(),position.y(),largeur,hauteur);
89 positionTexte.setX(positionTexte.x()-QFontMetrics(
leTexteDuRond->font()).width(
" CIF ")/2);
93 if(typ==QObject::tr(
"Cif"))
100 if(typ==QObject::tr(
"Df"))
108 if(typ==QObject::tr(
"Leak Relation"))
115 if(typ==QObject::tr(
"Leg"))
124 if(typ==QObject::tr(
"Leg"))
130 if(typ==QObject::tr(
"Relation"))
132 typ=QObject::tr(
"Leg");
136 QStringList listeVide;
140 float abcisse=(
t1->x()+
t1->boundingRect().width()+
t2->x()+
t2->boundingRect().width()-nouvelleAssoc->rect().width())/2.0;
141 float ordonnee=(
t1->y()+
t1->boundingRect().height()+
t2->y()+
t2->boundingRect().height()-nouvelleAssoc->boundingRect().height())/2.0;
146 Lien* nouveauLien=
new Lien(nouvelleAssoc,
t2,0,QObject::tr(
"Leg"));
151 t2->setPos(abcisse,ordonnee);
165 #warning attention a voir
173 void Lien::paint(QPainter *painter,
const QStyleOptionGraphicsItem *,
177 qDebug()<<
"void lien::paint(QPainter *painter, const QStyleOptionGraphicsItem *,QWidget *)";
180 painter->setRenderHint(QPainter::Antialiasing,
true);
182 QColor myColor(Qt::black);
186 painter->setBrush(myColor);
189 int ordonnee=10*noLien;
194 int ecartEntreDeuxLiensDansT1=(
t1->boundingRect().width()-20)/nbLiensEntreT1EtT2;
196 int abcisseDuCentreDansT1=
t1->boundingRect().width()/2;
197 int abcisseDuPremierDanT1=abcisseDuCentreDansT1-(nbLiensEntreT1EtT2-1)/2.0*ecartEntreDeuxLiensDansT1;
198 int monAbcisseDansT1=abcisseDuPremierDanT1+(noLien-1)*ecartEntreDeuxLiensDansT1;
199 QPointF origine=
t1->pos()+QPointF(monAbcisseDansT1,ordonnee);
201 int ecartEntreDeuxLiensDansT2=(
t2->boundingRect().width()-20)/nbLiensEntreT1EtT2;
203 int abcisseDuCentreDansT2=
t2->boundingRect().width()/2;
204 int abcisseDuPremierDanT2=abcisseDuCentreDansT2-(nbLiensEntreT1EtT2-1)/2.0*ecartEntreDeuxLiensDansT2;
205 int monAbcisseDansT2=abcisseDuPremierDanT2+(noLien-1)*ecartEntreDeuxLiensDansT2;
206 QPointF destination=
t2->pos()+QPointF(monAbcisseDansT2,ordonnee);
207 QLineF centerLine(origine,destination);
211 QPointF p1 = endPolygon.first()+
t2->pos() ;
213 QPointF intersectPointT2;
215 for (
int i = 1; i < endPolygon.count(); ++i)
217 p2 = endPolygon.at(i)+
t2->pos();
218 polyLine = QLineF(p1, p2);
219 QLineF::IntersectType intersectType =
220 polyLine.intersect(centerLine, &intersectPointT2);
221 if (intersectType == QLineF::BoundedIntersection)
225 p1 = beginPolygon.first()+
t1->pos() ;
227 QPointF intersectPointT1;
229 for (
int i = 1; i < beginPolygon.count(); ++i)
231 p2 = beginPolygon.at(i)+
t1->pos();
232 polyLine = QLineF(p1, p2);
233 QLineF::IntersectType intersectType =
234 polyLine.intersect(centerLine, &intersectPointT1);
235 if (intersectType == QLineF::BoundedIntersection)
240 if(
t2->association &&
t1->association)
242 QLineF myLine=QLineF(intersectPointT1,intersectPointT2);
243 QPointF destination(myLine.pointAt(0.1).x(),myLine.pointAt(0.1).y());
244 myLine.setP1(destination);
245 intersectPointT1=myLine.p1();
247 QLineF perpendiculaire=myLine.normalVector();
248 perpendiculaire.setLength(10);
250 deb=perpendiculaire.p2();
251 fin=perpendiculaire.p1();
252 perpendiculaire.setP1(deb);
253 perpendiculaire.setP2(fin);
255 perpendiculaire.setLength(perpendiculaire.length()*2);
256 painter->drawLine(perpendiculaire);
262 line->setLine(QLineF(intersectPointT1,intersectPointT2));
267 QPointF presquAuBout=
line->line().pointAt(0.99);
268 QLineF maLigne(presquAuBout,intersectPointT2);
269 QLineF normalVector=maLigne.normalVector();
270 QPointF bout1=normalVector.pointAt(1);
271 QLineF normalVector2=QLineF(intersectPointT2,bout1).normalVector();
272 QPointF bout2=normalVector2.pointAt(1);
273 QVector<QPointF> vectP;
274 vectP<<intersectPointT2<<bout1<<bout2;
275 painter->drawPolygon(QPolygonF(vectP));
282 QPointF position=
line->line().pointAt(0.5);
284 int largeur=
leRond->rect().width();
285 position.setX(position.x()-largeur/2);
286 position.setY(position.y()-largeur/2);
288 leRond->setRect(position.x(),position.y(),largeur,
leRond->rect().height());
294 if(
role!=NULL)tailleDuRole=
role->boundingRect().width();
297 QPointF posTexte1,posTexte2,posRole;
299 if(intersectPointT1.x()<intersectPointT2.x())
301 posTexte1.setX(intersectPointT1.x());
304 float position=(tailleDuRole+10)/
line->line().length();
307 posRole=
line->line().pointAt(1-position);
308 role->setRotation(-1*
line->line().angle());
310 if(intersectPointT1.y()<intersectPointT2.y())
312 posTexte1.setY(intersectPointT1.y());
315 if(
role!=NULL)posRole.setY(posRole.y()-25);
316 qDebug(
"haut/gauche");
321 posTexte2.setY(intersectPointT2.y());
322 posTexte1.setY(intersectPointT1.y()-
cardinalite1->boundingRect().height());
323 qDebug(
"bas gauche");
330 posTexte2.setX(intersectPointT2.x());
331 posTexte1.setX(intersectPointT1.x()-
cardinalite1->boundingRect().width());
335 posRole=
line->line().pointAt(0.9);
337 role->setRotation(180-
line->line().angle());
339 if(intersectPointT1.y()<intersectPointT2.y())
341 posTexte1.setY(intersectPointT1.y());
344 if(
role!=NULL)posRole.setY(posRole.y()-20);
345 qDebug()<<
"haut droite";
350 posTexte2.setY(intersectPointT2.y());
351 posTexte1.setY(intersectPointT1.y()-
cardinalite1->boundingRect().height());
355 posRole.setX(posRole.x()+20);
356 posRole.setY(posRole.y()-20);
358 qDebug()<<
"bas droite";
373 if(
role!=NULL)
role->setPos(posRole);
377 painter->drawLine(
line->line());
402 if(
line->line().p1().x()<
line->line().p2().x())
404 xmin=
line->line().p1().x();
405 xmax=
line->line().p2().x();
409 xmin=
line->line().p2().x();
410 xmax=
line->line().p1().x();
415 if(xmin>xDeCard1)xmin=xDeCard1;
416 if(xMaxDeCard1>xmax) xmax=xMaxDeCard1;
419 QGraphicsSimpleTextItem * lAutre;
426 qreal sonX=lAutre->boundingRect().x();
427 if(sonX<xmin)xmin=sonX;
428 qreal sonXMax=lAutre->boundingRect().x()+lAutre->boundingRect().width();
429 if(sonXMax>xmax)xmax=sonXMax;
441 if(
line->line().p1().y()<
line->line().p2().y())
443 ymin=
line->line().p1().y();
444 ymax=
line->line().p2().y();
448 ymin=
line->line().p2().y();
449 ymax=
line->line().p1().y();
462 if(ymin>lAutre->boundingRect().y())
463 ymin=lAutre->boundingRect().y();
464 if(ymax<lAutre->
boundingRect().y()+lAutre->boundingRect().height())
465 ymax=lAutre->boundingRect().y()+lAutre->boundingRect().height();
468 #warning en cours de dev
469 qreal extra = (
line->pen().width()+40)/ 2.0;
470 resultat.setCoords(xmin,ymin,xmax,ymax);
477 return QGraphicsItemGroup::boundingRect().normalized().adjusted(-extra,-extra,extra,extra);
485 qDebug()<<
"void lien::contextMenuEvent(QGraphicsSceneMouseEvent *event)";
486 QMenu menu(QObject::tr(
"Link Menu"));
488 this->setSelected(
true);
490 QAction* titre=
new QAction(menu.title(),scene());
491 titre->setDisabled(
true);
492 menu.addAction(titre);
494 titre->setFont(QFont(
"verdana",9,3,
true));
496 this->setSelected(!this->isSelected());
498 QAction *removeAction = menu.addAction(QObject::tr(
"&Remove"));
501 QAction* editRoleAction=menu.addAction(QObject::tr(
"&editRole"));
504 QAction * actionChoisie=menu.exec(event->screenPos());
507 if(actionChoisie==removeAction)
513 if(actionChoisie==editRoleAction)
516 QString text = QInputDialog::getText(0, QObject::tr(
"Edit Rôle"),
517 QObject::tr(
"Rôle:"), QLineEdit::Normal,
524 role=
new QGraphicsSimpleTextItem(text,
this);
537 return ((autreLien->
t1==
t1) or (autreLien->
t1==
t2) or (autreLien->
t2==
t1) or (autreLien->
t2==
t2));
Entite * t2
t2 second object
The QCustomGraphicsScene class This class is designed to deal with mouse events.
QCustomGraphicsScene * getScene()
getScene
QGraphicsLineItem * line
line the line
void supprimerLien(Lien *leLien)
supprimerLien
Lien(Entite *qg1, Entite *qg2, QGraphicsItem *parent, QString typ="Natural", QString relationName="", QString pRole="")
Lien.
int noLien(Entite *lAutre, Lien *leLien)
noLien
The Lien class a link is betwwen to objects it contains a line a role text cardinality ...
Entite * t1
t1 first object
QVector< Lien * > vectLiens
vectLiens this vector contains adresses of the links concerning entity
QGraphicsEllipseItem * leRond
leRond Pour les cifs et dfs et entités faibles le rond central
int nbLien(Entite *lAutre)
nbLien
The Association class Association inherit Entite Association is a relation between at least two entit...
QString texteDuRole
texteDuRole example: chief
QGraphicsSimpleTextItem * cardinalite1
cardinalite1 example:0,1 or 1,1 or 0,n
QGraphicsSimpleTextItem * cardinalite2
cardinalite2 example:0,1 or 1,1 or 0,n
QString typeDeJointure
typeDeJointure cif –1,1–CIF–0,n–> df –0,1–DF–0,n–>or leg --------—
QGraphicsTextItem * leTexteDuRond
leTexteDuRond text writen into central disk
QPolygonF polygon()
polygon
QGraphicsSimpleTextItem * role
role if there are several links between two same objects
void ajouteTable(Entite *t)
ajouteTable
void contextMenuEvent(QGraphicsSceneMouseEvent *event)
contextMenuEvent
void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
paint
The Entite class Entity is an object we have to deal with.
QVector< Lien * > vectLiens
vectLiens all links
QRectF boundingRect() const
boundingRect
bool estRelieA(Lien *autreLien)
estRelieA
MainWindow * maman
maman the main window