00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "MoveNode.h"
00022 #include "GraphScene.h"
00023 #include "graph.h"
00024 #include "node.h"
00025 #include "edge.h"
00026 #include "graphDocument.h"
00027 #include "NodeItem.h"
00028 #include "OrientedEdgeItem.h"
00029 #include <KLocale>
00030 #include <QGraphicsView>
00031 #include <QList>
00032 #include <QListIterator>
00033
00034 #include <KDebug>
00035
00036 #include <QtCore/QList>
00037
00038 MoveNodeAction::MoveNodeAction( GraphScene* scene, QObject* parent )
00039 : AbstractAction( scene, parent )
00040 {
00041 setText( i18n( "Move Node" ) );
00042 setToolTip( i18n( "Moves a node around the drawing area." ) );
00043 setIcon( KIcon( "arrow" ) );
00044 _movableNode = 0;
00045 _svgFrom = 0;
00046 _svgAt = 0;
00047 _tmpLine = 0;
00048 _name = "move";
00049 _graphScene = scene;
00050 }
00051
00052 MoveNodeAction::~MoveNodeAction()
00053 {
00054 kDebug() << "Destroyed";
00055 }
00056
00057 void MoveNodeAction::executePress( QPointF pos )
00058 {
00059 if( _graph == 0 )
00060 {
00061 return;
00062 }
00063 if( _graph->readOnly() ) return;
00064 _itemsUnderCursor = _graphScene->items( pos );
00065 QListIterator<QGraphicsItem*> list( _itemsUnderCursor );
00066 while( list.hasNext() )
00067 {
00068 QGraphicsItem* item = list.next();
00069 if( item->type() == 65578 ) _movableNode = qgraphicsitem_cast<NodeItem*>( item );
00070 else if( item->type() == 13 ) _svgFrom = qgraphicsitem_cast<QGraphicsSvgItem*>( item );
00071 }
00072
00073 if( !_movableNode && !_svgFrom )
00074 {
00075 return;
00076 }
00077 else if( !_movableNode )
00078 {
00079 _node = qgraphicsitem_cast<NodeItem*>( _svgFrom->parentItem() )->node();
00080 }
00081 else
00082 {
00083 _node = _movableNode->node();
00084 }
00085 if( _svgFrom != 0 )
00086 {
00087 _startPos = QPointF( _svgFrom->parentItem()->mapToScene( _svgFrom->x() + ( _svgFrom->boundingRect().width() / 2 ), _svgFrom->y() + ( _svgFrom->boundingRect().height() / 2 ) ) );
00088 }
00089 connect( this, SIGNAL( addEdge( Node*, Node*, QGraphicsSvgItem*, QGraphicsSvgItem* ) ), _graph, SLOT( addEdge( Node*, Node*, QGraphicsSvgItem*, QGraphicsSvgItem* ) ) );
00090 }
00091
00092 void MoveNodeAction::executeMove( QPointF pos )
00093 {
00094 if( _svgFrom != 0 )
00095 {
00096 if( !_tmpLine )
00097 {
00098 _tmpLine = new QGraphicsLineItem( _startPos.x(), _startPos.y(), pos.x(), pos.y() );
00099 _graphScene->addItem( _tmpLine );
00100 }
00101 else
00102 {
00103 _tmpLine->setLine( _startPos.x(), _startPos.y(), pos.x(), pos.y() );
00104 }
00105 _node->setPos( _node->x() + 1, _node->y() );
00106 _node->setPos( _node->x() - 1, _node->y() );
00107 }
00108 else
00109 {
00110 if( ! _movableNode )
00111 {
00112 return;
00113 }
00114 if(( pos.x() < 0 ) || ( pos.x() > _graphDocument->width() ) )
00115 {
00116 if(( pos.y() > 0 ) && ( pos.y() < _graphDocument->height() ) )
00117 {
00118 _node -> setY( pos.y() );
00119 }
00120 }
00121 else if(( pos.y() < 0 ) || ( pos.y() > _graphDocument->height() ) )
00122 {
00123 if(( pos.x() > 0 ) && ( pos.x() < _graphDocument->width() ) )
00124 {
00125 _node -> setX( pos.x() );
00126 }
00127 }
00128 else
00129 {
00130 _node -> setPos( pos.x(), pos.y() );
00131 }
00132 }
00133 }
00134
00135 void MoveNodeAction::executeRelease( QPointF pos )
00136 {
00137 if( _svgFrom != 0 )
00138 {
00139 if( _tmpLine )
00140 {
00141 delete _tmpLine;
00142 _tmpLine = 0;
00143 }
00144 _itemsUnderCursor = _graphScene->items( pos );
00145 QListIterator<QGraphicsItem*> list( _itemsUnderCursor );
00146 while( list.hasNext() )
00147 {
00148 QGraphicsItem* item = list.next();
00149 if( item->type() == 65578 ) _nodeTo = qgraphicsitem_cast<NodeItem*>( item );
00150 else if( item->type() == 13 ) _svgAt = qgraphicsitem_cast<QGraphicsSvgItem*>( item );
00151 }
00152 if( _svgAt != 0 && _svgFrom != 0 )
00153 {
00154 emit addEdge( qgraphicsitem_cast<NodeItem*>( _svgFrom->parentItem() )->node(), qgraphicsitem_cast<NodeItem*>( _svgAt->parentItem() )->node() , _svgFrom, _svgAt );
00155 }
00156 }
00157 else
00158 {
00159 if( !_movableNode )
00160 {
00161 return;
00162 }
00163 if( !(( pos.x() < 0 ) || ( pos.y() < 0 ) || ( pos.x() > _graphDocument->width() ) || ( pos.y() > _graphDocument->height() ) ) )
00164 {
00165 _node -> setY( pos.y() );
00166 _node -> setX( pos.x() );
00167 }
00168 }
00169 _movableNode = 0;
00170 _nodeTo = 0;
00171 disconnect( this, 0, _graph, 0 );
00172 _svgFrom = 0;
00173 _svgAt = 0;
00174 }