//Copyright (C) 2006 Dominic Letourneau (Dominic.Letourneau@USherbrooke.ca) #include "QtNetwork.h" #include "QtTerminal.h" #include "QtNode.h" #include "QtLink.h" #include "QtNetTerminal.h" #include #include #include #include #include #include "UINetTerminal.h" #include "UINetwork.h" #include "UIProbeLink.h" using namespace std; namespace FD { QtTerminal::QtTerminal ( QtNode *node, std::string name, int type, float x, float y ) : QGraphicsRectItem ( QRectF ( 0,0,5.0,5.0 ),node ),m_node ( node ), m_type ( type ), m_virtualQtTerminal ( NULL ), m_virtualQtLink ( NULL ), m_linking ( false ) { setPos ( x,y ); m_label = new QGraphicsTextItem ( name.c_str(),this ); QRectF rect = m_label->boundingRect(); float offset_x = 0; float offset_y = -1 * rect.height() / 2.0 + 5.0 / 2.0; switch ( m_type ) { case INPUT: offset_x = -1 * rect.width(); break; case OUTPUT: offset_x = 5.0; break; } m_label->setPos ( offset_x, offset_y ); setBrush ( QBrush ( QColor ( 255,0,0,128 ) ) ); } QtTerminal::QtTerminal ( QtNode *node, UITerminal *uiTerminal ) : QGraphicsRectItem ( QRectF ( 0,0,5.0,5.0 ),node ), m_node ( node ), m_virtualQtTerminal ( NULL ), m_virtualQtLink ( NULL ), m_linking ( false ), m_uiTerminal ( uiTerminal ), m_netTerminal ( NULL ) { if ( m_uiTerminal ) { //double posx, posy; //m_uiTerminal->getPos(posx,posy); //cerr<<"Terminal name "<getName()<<" pos "<getName().c_str(),this ); QRectF rect = m_label->boundingRect(); float offset_x = 0; float offset_y = 0;//-1 * rect.height() / 2.0 + 5.0 / 2.0; if ( m_uiTerminal->isInputTerminal() ) { offset_x = 5;//-1 * rect.width(); cerr<<"terminal is input"<setPos ( offset_x, offset_y ); setBrush ( QBrush ( QColor ( 255,0,0,128 ) ) ); } } void QtTerminal::mousePressEvent ( QGraphicsSceneMouseEvent *event ) { update(); if ( event->button() == Qt::LeftButton ) { if ( event->modifiers() == Qt::NoModifier ) { QGraphicsItem::mousePressEvent ( event ); cerr<<"mousePressEvent on terminal "<hide(); m_virtualQtTerminal->setPos ( event->scenePos() ); m_virtualQtLink = new QtLink ( this,m_virtualQtTerminal,NULL ); scene()->addItem ( m_virtualQtLink ); scene()->addItem ( m_virtualQtTerminal ); m_virtualQtLink->adjust(); m_linking = true; event->accept(); } else if ( event->modifiers() == Qt::ShiftModifier ) { if ( m_uiTerminal && m_uiTerminal->getNetTerminal() == NULL ) { //CREATING A NET TERMINAL bool ok; QString name = QInputDialog::getText ( NULL,QString ( "Network Terminal Name" ), QString ( "Terminal Name : " ),QLineEdit::Normal, QString ( m_uiTerminal->getName().c_str() ),&ok ); //TODO : LOOK FOR DUPLICATED NAMES if ( ok && !name.isEmpty() ) { if ( m_uiTerminal ) { UINode *myNode = m_uiTerminal->getNode(); if ( myNode ) { if ( m_uiTerminal->isInputTerminal() ) { myNode->newNetTerminal ( m_uiTerminal,UINetTerminal::INPUT,name.toStdString() ); } else { myNode->newNetTerminal ( m_uiTerminal,UINetTerminal::OUTPUT,name.toStdString() ); } } } /* //CREATE NET TERMINAL UINetTerminal *netTerminal = NULL; if (m_uiTerminal->isInputTerminal()) { netTerminal = new UINetTerminal(m_uiTerminal,UINetTerminal::INPUT,name.toStdString()); } else { netTerminal = new UINetTerminal(m_uiTerminal,UINetTerminal::OUTPUT,name.toStdString()); } //CONNECT NET TERMINAL m_uiTerminal->connectNetTerminal(netTerminal); //CREATE GUI PART cerr << "QtTerminal Scene pos x :"<getNetTerminal()); scene()->addItem(m_netTerminal); */ } m_linking = false; event->accept(); } } else if ( event->modifiers() == Qt::ControlModifier ) { cerr<<"**** 1 ****"<getNetTerminal() == NULL && !m_uiTerminal->isInputTerminal()) { cerr<<"**** 2 ****"<getNode(); if ( myNode ) { cerr<<"**** 3 ****"<newNetTerminal( m_uiTerminal,UINetTerminal::CONDITION,"CONDITION"); } } cerr<<"**** 4 ****"<accept(); } } } void QtTerminal::mouseReleaseEvent ( QGraphicsSceneMouseEvent *event ) { update(); if ( event->button() == Qt::LeftButton && m_linking) { QGraphicsItem::mousePressEvent ( event ); cerr<<"mouseReleaseEvent on terminal "< ( scene()->itemAt ( event->scenePos() ) ); //TERMINAL NEAR BY? if ( destinationQtTerminal ) { cerr<<"found terminal"<getName() <getQtNode(); //QtNode* sourceNode = m_virtualQtLink->get QtTerminal *sourceQtTerminal = m_virtualQtLink->sourceQtTerminal(); if (sourceQtTerminal->getType() != destinationQtTerminal->getType()) { cerr<<"TODO : CALL MODEL"<getType() == INPUT) { emit newLinkCreated(sourceQtTerminal->getUITerminal(),destinationQtTerminal->getUITerminal()); m_uiTerminal->getNode()->getNetwork()->newLink(destinationQtTerminal->getUITerminal(),sourceQtTerminal->getUITerminal(),NULL); } else { emit newLinkCreated(destinationQtTerminal->getUITerminal(),sourceQtTerminal->getUITerminal()); m_uiTerminal->getNode()->getNetwork()->newLink(sourceQtTerminal->getUITerminal(),destinationQtTerminal->getUITerminal(),NULL); } } } m_linking = false; delete m_virtualQtTerminal; m_virtualQtTerminal = NULL; delete m_virtualQtLink; m_virtualQtLink = NULL; } } void QtTerminal::mouseMoveEvent ( QGraphicsSceneMouseEvent * event ) { update(); cerr<<"mouseMoveEvent on terminal "<setPos ( event->scenePos() ); m_virtualQtLink->adjust(); } else { m_node->getQtNetwork()->ensureVisible ( this ); QGraphicsItem::mouseMoveEvent ( event ); } } std::string QtTerminal::getName() { return m_uiTerminal->getName(); } QtNetTerminal* QtTerminal::addNetTerminal ( UINetTerminal *netTerminal ) { QtNetTerminal* myNetTerminal = new QtNetTerminal ( this,netTerminal ); scene()->addItem ( myNetTerminal ); return myNetTerminal; } QVariant QtTerminal::itemChange ( GraphicsItemChange change, const QVariant & value ) { cerr<<"QtTerminal::itemChange ( GraphicsItemChange change, const QVariant & value )"<sceneRect(); //if (!rect.contains(newPos)) { // Keep the item inside the scene rect. // newPos.setX(qMin(rect.right(), qMax(newPos.x(), rect.left()))); // newPos.setY(qMin(rect.bottom(), qMax(newPos.y(), rect.top()))); // return newPos; //} } return QGraphicsItem::itemChange ( change, value ); } } //namespace FD