RoseGraphicsView.cpp

Go to the documentation of this file.
00001 #include "rose.h"
00002 
00003 #include "RoseGraphicsView.h"
00004 
00005 
00006 #include "AstFilters.h"
00007 #include "SageMimeData.h"
00008 
00009 #include <QApplication>
00010 #include <QDataStream>
00011 #include <QDragEnterEvent>
00012 #include <QDragMoveEvent>
00013 #include <QDropEvent>
00014 #include <QWheelEvent>
00015 
00016 #include "DisplayNode.h"
00017 
00018 #include <cmath>
00019 
00020 #include <QDebug>
00021 
00022 
00023 RoseGraphicsView::RoseGraphicsView(QWidget * par)
00024     : QGraphicsView(par),
00025       dragEnabled(true),
00026       dropEnabled(true),
00027       curFilter(NULL),
00028       curNode(NULL)
00029 {
00030     setAcceptDrops(true);
00031     viewport()->setAcceptDrops(true);
00032 
00033     setRenderHints(QPainter::Antialiasing);
00034     setDragMode(QGraphicsView::ScrollHandDrag);
00035 
00036     connect ( this, SIGNAL(nodeDropped(SgNode*,QPoint)),
00037               this, SLOT(setNode(SgNode*)) );
00038 
00039 }
00040 
00041 
00042 RoseGraphicsView::~RoseGraphicsView()
00043 {
00044     if(curFilter)
00045         delete curFilter;
00046 }
00047 void RoseGraphicsView::setNode(SgNode * node)
00048 {
00049     curNode = node;
00050     updateGraph(curNode,curFilter);
00051 }
00052 
00053 void RoseGraphicsView::setFilter(AstFilterInterface * filter)
00054 {
00055     if(curFilter)
00056         delete curFilter;
00057 
00058     curFilter = filter->copy();
00059     updateGraph(curNode,curFilter);
00060 }
00061 
00062 
00063 
00064 void RoseGraphicsView::setFileFilter(int id)
00065 {
00066     if(id==-1)
00067         setFilter(NULL);
00068     else
00069         setFilter(new AstFilterFileById(id));
00070 }
00071 
00072 
00073 void RoseGraphicsView::mousePressEvent(QMouseEvent * ev)
00074 {
00075     DisplayNode * node = dynamic_cast<DisplayNode*>(itemAt(ev->pos()));
00076 
00077     if(node)
00078     {
00079         SgNode * sgNode = node->getSgNode();
00080         nodeActivated(sgNode);
00081 
00082         SgLocatedNode* sgLocNode = isSgLocatedNode(sgNode);
00083         if(sgLocNode)
00084         {
00085             Sg_File_Info* fi = sgLocNode->get_file_info();
00086 
00087             emit clicked(QString(fi->get_filenameString().c_str()),
00088                          fi->get_line(),fi->get_col());
00089         }
00090     }
00091 
00092     // start drag&drop on right mouse button
00093     if (ev->button() == Qt::RightButton)
00094         dragStartPosition = ev->pos();
00095 
00096 
00097     QGraphicsView::mousePressEvent(ev);
00098 }
00099 
00100 
00101 // ------------------------- Drag and Drop Functions --------------------------
00102 
00103 
00104 void RoseGraphicsView::mouseMoveEvent(QMouseEvent *ev)
00105 {
00106     if(!dragEnabled)
00107         return  QGraphicsView::mouseMoveEvent(ev);
00108 
00109     if (!(ev->buttons() & Qt::RightButton))
00110         return QGraphicsView::mouseMoveEvent(ev);;
00111     if ((ev->pos() - dragStartPosition).manhattanLength() < QApplication::startDragDistance())
00112         return QGraphicsView::mouseMoveEvent(ev);;
00113 
00114 
00115     // get the sgnode
00116     DisplayNode * dispNode = dynamic_cast<DisplayNode*>(itemAt(dragStartPosition));
00117     if(!dispNode)
00118         return;
00119 
00120     SgNode * sgNode = dispNode->getSgNode();
00121     if(!sgNode)
00122         return;
00123 
00124     // create drag object, set pixmap and data
00125     QDrag *drag = new QDrag(viewport());
00126 
00127     drag->setMimeData( createSageMimeData( sgNode ) );
00128     drag->exec();
00129 
00130     QGraphicsView::mouseMoveEvent(ev);
00131 }
00132 
00133 void RoseGraphicsView::dragEnterEvent(QDragEnterEvent * ev)
00134 {
00135     if( acceptMimeData( ev->mimeData() ) && this != ev->source() )
00136         ev->accept();
00137     else
00138         ev->ignore();
00139 
00140     QGraphicsView::dragEnterEvent(ev);
00141 }
00142 
00143 void RoseGraphicsView::dragMoveEvent(QDragMoveEvent * ev)
00144 {
00145     QWidget::dragMoveEvent(ev);
00146 }
00147 
00148 
00149 void RoseGraphicsView::dropEvent(QDropEvent *ev)
00150 {
00151     if(ev->source()==this ||  ev->source()== viewport() ||  !dropEnabled )
00152         return;
00153 
00154     handleMimeData( ev->mimeData(), ev->pos() );
00155     ev->acceptProposedAction();
00156 }
00157 
00158 bool RoseGraphicsView::acceptMimeData( const QMimeData *mimeData )
00159 {
00160     return mimeData->hasFormat(SG_NODE_MIMETYPE) && dropEnabled ;
00161 }
00162 
00163 void RoseGraphicsView::handleMimeData( const QMimeData *mimeData, const QPoint& pos )
00164 {
00165     SgNode *node( getGeneralNode( mimeData ) );
00166     emit nodeDropped( node, pos );
00167 }
00168 
00169 
00170 
00171 
00172 void RoseGraphicsView::scaleView(qreal scaleFactor)
00173 {
00174     qreal factor = matrix().scale(scaleFactor, scaleFactor).mapRect(QRectF(0, 0, 1, 1)).width();
00175     if (factor < 0.07 || factor > 100)
00176         return;
00177 
00178     scale(scaleFactor, scaleFactor);
00179 }
00180 
00181 void RoseGraphicsView::wheelEvent(QWheelEvent *ev)
00182 {
00183     scaleView(  std::pow((double)2, ev->delta() / 240.0));
00184 }
00185 

Generated on Tue Sep 15 14:48:47 2009 for RoseQtWidgets by  doxygen 1.4.7