]> Creatis software - cpPlugins.git/blob - lib/cpPipelineEditor/Block.cxx
7263cad8f2559343f8b4a85c76672c95889c1c4c
[cpPlugins.git] / lib / cpPipelineEditor / Block.cxx
1 #include "Block.h"\r
2 \r
3 #include <QPen>\r
4 #include <QGraphicsScene>\r
5 #include <QGraphicsSceneContextMenuEvent>\r
6 #include <QFontMetrics>\r
7 #include <QMenu>\r
8 #include <QPainter>\r
9 #include <QStyleOptionGraphicsItem>\r
10 #include <QGraphicsWidget>\r
11 \r
12 #include "Port.h"\r
13 #include "Connection.h"\r
14 \r
15 // -------------------------------------------------------------------------\r
16 cpPipelineEditor::Block::\r
17 Block( TFilter* filter, QGraphicsItem* parent, QGraphicsScene* scene )\r
18   : Superclass( parent, scene ),\r
19     m_HorzMargin( 20 ),\r
20     m_VertMargin( 5 ),\r
21     m_NamePort( NULL ),\r
22     m_TypePort( NULL ),\r
23     m_Filter( filter )\r
24 {\r
25   QPainterPath p;\r
26   p.addRoundedRect( -50, -15, 100, 30, 5, 5 );\r
27 \r
28   this->setPath( p );\r
29   this->setPen( QPen( Qt::darkGreen ) );\r
30   this->setBrush( Qt::green );\r
31   this->setFlag( QGraphicsItem::ItemIsMovable );\r
32   this->setFlag( QGraphicsItem::ItemIsSelectable );\r
33 \r
34   this->m_Width = this->m_HorzMargin;\r
35   this->m_Height = this->m_VertMargin;\r
36 \r
37   // Configure names\r
38   this->setNamePort( this->m_Filter->GetName( ) );\r
39   this->_setTypePort( this->m_Filter->GetClassName( ) );\r
40 \r
41   // Add input ports\r
42   std::set< std::string > inputs;\r
43   this->m_Filter->GetInputsNames( inputs );\r
44   for( auto iIt = inputs.begin( ); iIt != inputs.end( ); ++iIt )\r
45     this->addInputPort( iIt->c_str( ) );\r
46 \r
47   // Add output ports\r
48   std::set< std::string > outputs;\r
49   this->m_Filter->GetOutputsNames( outputs );\r
50   for( auto oIt = outputs.begin( ); oIt != outputs.end( ); ++oIt )\r
51     this->addOutputPort( oIt->c_str( ) );\r
52 }\r
53 \r
54 // -------------------------------------------------------------------------\r
55 cpPipelineEditor::Block::\r
56 ~Block( )\r
57 {\r
58 }\r
59 \r
60 // -------------------------------------------------------------------------\r
61 void cpPipelineEditor::Block::\r
62 setNamePort( const QString& txt )\r
63 {\r
64   if( this->m_NamePort == NULL )\r
65     this->m_NamePort = new NamePort( this );\r
66   this->m_NamePort->setName( txt );\r
67   this->_configPort( this->m_NamePort );\r
68 }\r
69 \r
70 // -------------------------------------------------------------------------\r
71 cpPipelineEditor::InputPort* cpPipelineEditor::Block::\r
72 addInputPort( const QString& txt )\r
73 {\r
74   InputPort* ip = new InputPort( this );\r
75   ip->setExtendedName(\r
76     (\r
77       txt.toStdString( ) +\r
78       std::string( "@" ) +\r
79       this->namePort( ).toStdString( )\r
80       ).c_str( )\r
81     );\r
82   ip->setName( txt );\r
83   this->m_InputPorts[ txt.toStdString( ) ] = ip;\r
84   this->_configPort( ip );\r
85   return( ip );\r
86 }\r
87 \r
88 // -------------------------------------------------------------------------\r
89 cpPipelineEditor::OutputPort* cpPipelineEditor::Block::\r
90 addOutputPort( const QString& txt )\r
91 {\r
92   OutputPort* op = new OutputPort( this );\r
93   op->setExtendedName(\r
94     (\r
95       txt.toStdString( ) +\r
96       std::string( "@" ) +\r
97       this->namePort( ).toStdString( )\r
98       ).c_str( )\r
99     );\r
100   op->setName( txt );\r
101   this->m_OutputPorts[ txt.toStdString( ) ] = op;\r
102   this->_configPort( op );\r
103   return( op );\r
104 }\r
105 \r
106 // -------------------------------------------------------------------------\r
107 cpPipelineEditor::InputPort* cpPipelineEditor::Block::\r
108 inputPort( const QString& txt )\r
109 {\r
110   auto i = this->m_InputPorts.find( txt.toStdString( ) );\r
111   if( i != this->m_InputPorts.end( ) )\r
112     return( i->second );\r
113   else\r
114     return( NULL );\r
115 }\r
116 \r
117 // -------------------------------------------------------------------------\r
118 cpPipelineEditor::OutputPort* cpPipelineEditor::Block::\r
119 outputPort( const QString& txt )\r
120 {\r
121   auto o = this->m_OutputPorts.find( txt.toStdString( ) );\r
122   if( o != this->m_OutputPorts.end( ) )\r
123     return( o->second );\r
124   else\r
125     return( NULL );\r
126 }\r
127 \r
128 // -------------------------------------------------------------------------\r
129 QString cpPipelineEditor::Block::\r
130 namePort( ) const\r
131 {\r
132   return( this->m_NamePort->name( ) );\r
133 }\r
134 \r
135 // -------------------------------------------------------------------------\r
136 const cpPipelineEditor::InputPort* cpPipelineEditor::Block::\r
137 inputPort( const QString& txt ) const\r
138 {\r
139   auto i = this->m_InputPorts.find( txt.toStdString( ) );\r
140   if( i != this->m_InputPorts.end( ) )\r
141     return( i->second );\r
142   else\r
143     return( NULL );\r
144 }\r
145 \r
146 // -------------------------------------------------------------------------\r
147 const cpPipelineEditor::OutputPort* cpPipelineEditor::Block::\r
148 outputPort( const QString& txt ) const\r
149 {\r
150   auto o = this->m_OutputPorts.find( txt.toStdString( ) );\r
151   if( o != this->m_OutputPorts.end( ) )\r
152     return( o->second );\r
153   else\r
154     return( NULL );\r
155 }\r
156 \r
157 // -------------------------------------------------------------------------\r
158 void cpPipelineEditor::Block::\r
159 paint(\r
160   QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget\r
161   )\r
162 {\r
163   Q_UNUSED( option );\r
164   Q_UNUSED( widget );\r
165 \r
166   if( this->isSelected( ) )\r
167   {\r
168     painter->setPen( QPen( Qt::darkYellow ) );\r
169     painter->setBrush( Qt::yellow );\r
170   }\r
171   else\r
172   {\r
173     painter->setPen( QPen( Qt::darkGreen ) );\r
174     painter->setBrush( Qt::green );\r
175 \r
176   } // fi\r
177   painter->drawPath( this->path( ) );\r
178 }\r
179 \r
180 // -------------------------------------------------------------------------\r
181 QVariant cpPipelineEditor::Block::\r
182 itemChange( GraphicsItemChange change, const QVariant& value )\r
183 {\r
184   return( value );\r
185 }\r
186 \r
187 // -------------------------------------------------------------------------\r
188 void cpPipelineEditor::Block::\r
189 _setTypePort( const QString& txt )\r
190 {\r
191   if( this->m_TypePort == NULL )\r
192     this->m_TypePort = new TypePort( this );\r
193   this->m_TypePort->setName( txt );\r
194   this->_configPort( this->m_TypePort );\r
195 }\r
196 \r
197 // -------------------------------------------------------------------------\r
198 void cpPipelineEditor::Block::\r
199 _configPort( Port* port )\r
200 {\r
201   port->setBlock( this );\r
202 \r
203   QFontMetrics fm( this->scene( )->font( ) );\r
204   int w = fm.width( port->name( ) ) + ( 4 * port->radius( ) );\r
205   int h = fm.height( );\r
206   if( w > this->m_Width - this->m_HorzMargin )\r
207     this->m_Width = w + this->m_HorzMargin;\r
208   this->m_Height = this->m_InputPorts.size( ) + this->m_OutputPorts.size( );\r
209   this->m_Height += 4;\r
210   this->m_Height *= h;\r
211 \r
212   QPainterPath pth;\r
213   pth.addRoundedRect(\r
214     -this->m_Width / 2,\r
215     -this->m_Height / 2,\r
216     this->m_Width,\r
217     this->m_Height, 5, 5\r
218     );\r
219   this->setPath( pth );\r
220 \r
221   int y = -this->m_Height / 2 + this->m_VertMargin + port->radius( );\r
222   foreach( QGraphicsItem* i, this->children( ) )\r
223   {\r
224     Port* p = dynamic_cast< Port* >( i );\r
225     if( p == NULL )\r
226       continue;\r
227 \r
228     if( dynamic_cast< NamePort* >( i ) != NULL )\r
229       i->setPos( -this->m_Width / 2 + port->radius( ), y );\r
230     else if( dynamic_cast< TypePort* >( i ) != NULL )\r
231     {\r
232       i->setPos( -this->m_Width / 2 + port->radius( ), y );\r
233       y += h;\r
234     }\r
235     else if( dynamic_cast< InputPort* >( i ) != NULL )\r
236       i->setPos( -this->m_Width / 2 - 2 * port->radius( ), y );\r
237     else if( dynamic_cast< OutputPort* >( i ) != NULL )\r
238       i->setPos( this->m_Width / 2, y );\r
239     y += h;\r
240 \r
241   } // rof\r
242 }\r
243 \r
244 // -------------------------------------------------------------------------\r
245 void cpPipelineEditor::Block::\r
246 mouseReleaseEvent( QGraphicsSceneMouseEvent* evt )\r
247 {\r
248   if( this->m_Filter != NULL )\r
249     this->m_Filter->SetViewCoords(\r
250       this->scenePos( ).x( ), this->scenePos( ).y( )\r
251       );\r
252   this->Superclass::mouseReleaseEvent( evt );\r
253 }\r
254 \r
255 // -------------------------------------------------------------------------\r
256 void cpPipelineEditor::Block::\r
257 contextMenuEvent( QGraphicsSceneContextMenuEvent* evt )\r
258 {\r
259   QMenu menu;\r
260   QAction* configureAction = menu.addAction( "Configure" );\r
261   QAction* updateAction = menu.addAction( "Update" );\r
262   QAction* selectedAction = menu.exec( evt->screenPos( ) );\r
263 \r
264   if( selectedAction == configureAction )\r
265   {\r
266     auto res = this->m_Filter->ExecConfigurationDialog( NULL );\r
267   }\r
268   else if( selectedAction == updateAction )\r
269   {\r
270   } // fi\r
271 }\r
272 \r
273 // eof - $RCSfile$\r